{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "5b79eca0", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2022-02-11 16:43:08.366331: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", "2022-02-11 16:43:08.366351: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n" ] } ], "source": [ "from library.NNSearch import NNSearch\n", "from library.timing import timing\n", "from sklearn.neighbors import NearestNeighbors\n", "import numpy as np\n", "import tensorflow as tf\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "id": "fd8d89ea", "metadata": {}, "outputs": [], "source": [ "n_features = 100\n", "numPoints = 2000\n", "maxValue = 5000\n", "nbhSize = 5" ] }, { "cell_type": "code", "execution_count": 3, "id": "234f0cc7", "metadata": {}, "outputs": [], "source": [ "data = np.array([\n", " np.array([float(x) for x in np.random.randint(maxValue, size=n_features)])\n", " for _i in range(numPoints)])" ] }, { "cell_type": "code", "execution_count": 4, "id": "6388fa61", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2000" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(data)" ] }, { "cell_type": "code", "execution_count": 5, "id": "c5ef8b57", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/kristian/anaconda3/lib/python3.9/site-packages/sklearn/utils/validation.py:70: FutureWarning: Pass n_neighbors=5 as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an error\n", " warnings.warn(f\"Pass {args_msg} as keyword args. From version \"\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "NearestNeighbours: #1 0.9532s\n" ] } ], "source": [ "tNN = timing(\"NearestNeighbours\")\n", "tNN.start()\n", "nn = NearestNeighbors(nbhSize)\n", "nn.fit(data)\n", "for x in data:\n", " nbh = nn.kneighbors([x], nbhSize, return_distance=False)\n", "tNN.stop()\n", "print(tNN)" ] }, { "cell_type": "code", "execution_count": 6, "id": "84950ba8", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2022-02-11 16:43:11.312163: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory\n", "2022-02-11 16:43:11.312182: W tensorflow/stream_executor/cuda/cuda_driver.cc:269] failed call to cuInit: UNKNOWN ERROR (303)\n", "2022-02-11 16:43:11.312199: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (sbi-klabautermann): /proc/driver/nvidia/version does not exist\n", "2022-02-11 16:43:11.312430: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "NNSearch: #1 10.3314s\n" ] } ], "source": [ "tNNS = timing(\"NNSearch\")\n", "tNNS.start()\n", "nnb = NNSearch(nbhSize)\n", "nnb.fit(data)\n", "for x in range(len(data)):\n", " nbh = nnb.neighbourhoodOfItem(x)\n", "tNNS.stop()\n", "print(tNNS)" ] }, { "cell_type": "code", "execution_count": 7, "id": "b61b26cb", "metadata": { "scrolled": false }, "outputs": [], "source": [ "#tNNSH = timing(\"NNSearch\")\n", "#tNNSH.start()\n", "#nnh = NNSearch(nbhSize)\n", "#nnh.fit_heuristic(data)\n", "#for x in range(len(data)):\n", "# nbh = nnh.neighbourhoodOfItem(x)\n", "#tNNSH.stop()\n", "#print(tNNSH)" ] }, { "cell_type": "code", "execution_count": 8, "id": "686265dc", "metadata": {}, "outputs": [], "source": [ "#for i in range(len(data)):\n", "# nb = set(nnb.neighbourhoodOfItem(i))\n", "# nh = set(nnh.neighbourhoodOfItem(i))\n", "# if nb != nh:\n", "# print(f\"#{i}: {nb} != {nh}\")\n", "# break\n", "#print(f\"last: {nb} {nh}\")" ] }, { "cell_type": "code", "execution_count": 15, "id": "ca269d98", "metadata": {}, "outputs": [], "source": [ "def testNNSearchByQueries(nQueries):\n", " timingBf = {}\n", " timingCh = {}\n", " \n", " print(f\"\\n#Queries: {nQueries}\")\n", " tNN = timing(\"NearestNeighbours\")\n", " tNN.start()\n", " nn = NearestNeighbors(n_neighbors=nbhSize)\n", " nn.fit(data)\n", " n = 0\n", " while n < nQueries:\n", " for x in data:\n", " nbh = nn.kneighbors([x], nbhSize, return_distance=False)\n", " n += 1\n", " if n >= nQueries:\n", " break\n", " tNN.stop()\n", " print(tNN)\n", " \n", " tNN_bf = timing(\"NNSearch - brute force\")\n", " tNN_bf.start()\n", " nn = NNSearch(nbhSize, timingBf)\n", " nn.fit_bruteForce_np(data)\n", " n = 0\n", " while n < nQueries:\n", " for x in range(len(data)):\n", " nbh = nn.neighbourhoodOfItem(x)\n", " n += 1\n", " if n >= nQueries:\n", " break\n", " tNN_bf.stop()\n", " print(tNN_bf)\n", " for k in timingBf.keys():\n", " print(timingBf[k])\n", "\n", " \n", " tNN_ch = timing(\"NNSearch - chained\")\n", " tNN_ch.start()\n", " nn = NNSearch(nbhSize, timingCh)\n", " nn.fit_chained(data)\n", " n = 0\n", " while n < nQueries:\n", " for x in range(len(data)):\n", " nbh = nn.neighbourhoodOfItem(x)\n", " n += 1\n", " if n >= nQueries:\n", " break\n", " tNN_ch.stop()\n", " print(tNN_ch)\n", " for k in timingCh.keys():\n", " print(timingCh[k])\n", "\n", " return (tNN.duration, tNN_bf.duration, tNN_ch.duration)" ] }, { "cell_type": "code", "execution_count": 10, "id": "1fd643cc", "metadata": {}, "outputs": [], "source": [ "def showResults(results):\n", " xs = [r[0] for r in results]\n", " ys = [r[1][0] for r in results]\n", " zs_bf = [r[1][1] for r in results]\n", " zs_ch = [r[1][2] for r in results]\n", "\n", " plt.xscale(\"log\")\n", " #plt.yscale(\"log\")\n", " plt.plot(xs, ys, label=\"NN\")\n", " plt.plot(xs, zs_bf, label=\"NN - bf\")\n", " plt.plot(xs, zs_ch, label=\"NN - ch\")\n", " plt.legend()\n", " plt.show\n" ] }, { "cell_type": "code", "execution_count": 11, "id": "95b332a3", "metadata": { "scrolled": false }, "outputs": [], "source": [ "def randomPoint():\n", " return np.array([\n", " float(x)\n", " for x in np.random.randint(maxValue, size=n_features)\n", " ])\n", "\n", "def runTest():\n", " data = np.array([randomPoint() for _i in range(numPoints)])\n", " \n", " q = len(data) / 8\n", " results = []\n", " while q <= 8 * len(data):\n", " results.append((q, testNNSearchByQueries(q)))\n", " q *= 2\n", "\n", " showResults(results) \n", " \n", " return results" ] }, { "cell_type": "code", "execution_count": 16, "id": "61482cae", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#Queries: 250.0\n", "NearestNeighbours: #1 0.1009s\n", "NNSearch - brute force: #1 11.7175s\n", "NN_fit_bfnp_init: #1 0.0027s\n", "NN_fit_bfnp_loop: #1 11.7148s\n", "NN_fit_bfnp_dist: #2000 4.7026s\n", "NN_fit_bfnp_insert: #1999000 5.3951s\n", "NN_fit_bfnp_toList: #2000 0.0048s\n", "NNSearch - chained: #1 0.8066s\n", "NN_fit_chained_init: #1 0.0007s\n", "NN_fit_chained_toList: #1 0.8057s\n", "#Queries: 500.0\n", "NearestNeighbours: #1 0.2005s\n", "NNSearch - brute force: #1 11.6808s\n", "NN_fit_bfnp_init: #1 0.0025s\n", "NN_fit_bfnp_loop: #1 11.6781s\n", "NN_fit_bfnp_dist: #2000 4.6813s\n", "NN_fit_bfnp_insert: #1999000 5.3829s\n", "NN_fit_bfnp_toList: #2000 0.0046s\n", "NNSearch - chained: #1 0.8662s\n", "NN_fit_chained_init: #1 0.0007s\n", "NN_fit_chained_toList: #1 0.8652s\n", "#Queries: 1000.0\n", "NearestNeighbours: #1 0.4030s\n", "NNSearch - brute force: #1 11.7693s\n", "NN_fit_bfnp_init: #1 0.0690s\n", "NN_fit_bfnp_loop: #1 11.7001s\n", "NN_fit_bfnp_dist: #2000 4.7015s\n", "NN_fit_bfnp_insert: #1999000 5.3926s\n", "NN_fit_bfnp_toList: #2000 0.0047s\n", "NNSearch - chained: #1 0.8038s\n", "NN_fit_chained_init: #1 0.0005s\n", "NN_fit_chained_toList: #1 0.8028s\n", "#Queries: 2000.0\n", "NearestNeighbours: #1 0.8036s\n", "NNSearch - brute force: #1 11.7433s\n", "NN_fit_bfnp_init: #1 0.0027s\n", "NN_fit_bfnp_loop: #1 11.7403s\n", "NN_fit_bfnp_dist: #2000 4.7203s\n", "NN_fit_bfnp_insert: #1999000 5.4042s\n", "NN_fit_bfnp_toList: #2000 0.0046s\n", "NNSearch - chained: #1 0.8056s\n", "NN_fit_chained_init: #1 0.0006s\n", "NN_fit_chained_toList: #1 0.8044s\n", "#Queries: 4000.0\n", "NearestNeighbours: #1 1.6057s\n", "NNSearch - brute force: #1 11.7360s\n", "NN_fit_bfnp_init: #1 0.0027s\n", "NN_fit_bfnp_loop: #1 11.7325s\n", "NN_fit_bfnp_dist: #2000 4.6920s\n", "NN_fit_bfnp_insert: #1999000 5.3934s\n", "NN_fit_bfnp_toList: #2000 0.0046s\n", "NNSearch - chained: #1 0.8075s\n", "NN_fit_chained_init: #1 0.0006s\n", "NN_fit_chained_toList: #1 0.8059s\n", "#Queries: 8000.0\n", "NearestNeighbours: #1 3.1986s\n", "NNSearch - brute force: #1 11.6612s\n", "NN_fit_bfnp_init: #1 0.0024s\n", "NN_fit_bfnp_loop: #1 11.6574s\n", "NN_fit_bfnp_dist: #2000 4.6859s\n", "NN_fit_bfnp_insert: #1999000 5.3722s\n", "NN_fit_bfnp_toList: #2000 0.0045s\n", "NNSearch - chained: #1 0.8063s\n", "NN_fit_chained_init: #1 0.0006s\n", "NN_fit_chained_toList: #1 0.8041s\n", "#Queries: 16000.0\n", "NearestNeighbours: #1 6.4602s\n", "NNSearch - brute force: #1 12.2282s\n", "NN_fit_bfnp_init: #1 0.0025s\n", "NN_fit_bfnp_loop: #1 12.2229s\n", "NN_fit_bfnp_dist: #2000 4.9943s\n", "NN_fit_bfnp_insert: #1999000 5.5799s\n", "NN_fit_bfnp_toList: #2000 0.0051s\n", "NNSearch - chained: #1 0.8166s\n", "NN_fit_chained_init: #1 0.0006s\n", "NN_fit_chained_toList: #1 0.8131s\n", "(250.0, (0.10093569755554199, 11.717548370361328, 0.8066229820251465))\n", "(500.0, (0.20050740242004395, 11.680786848068237, 0.866196870803833))\n", "(1000.0, (0.40299034118652344, 11.769335508346558, 0.8037700653076172))\n", "(2000.0, (0.8035635948181152, 11.743326663970947, 0.8056142330169678))\n", "(4000.0, (1.6056647300720215, 11.736043930053711, 0.807450532913208))\n", "(8000.0, (3.1986196041107178, 11.661194562911987, 0.806293249130249))\n", "(16000.0, (6.460216283798218, 12.228201389312744, 0.8165764808654785))\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "results = runTest()\n", "for r in results:\n", " print(r)" ] }, { "cell_type": "code", "execution_count": 17, "id": "ace1968a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#Queries: 250.0\n", "NearestNeighbours: #1 0.1101s\n", "NNSearch - brute force: #1 34.5123s\n", "NN_fit_bfnp_init: #1 0.0023s\n", "NN_fit_bfnp_loop: #1 34.5095s\n", "NN_fit_bfnp_dist: #2000 5.5661s\n", "NN_fit_bfnp_insert: #1999000 26.7270s\n", "NN_fit_bfnp_toList: #2000 0.1024s\n", "NNSearch - chained: #1 0.9062s\n", "NN_fit_chained_init: #1 0.0003s\n", "NN_fit_chained_toList: #1 0.8980s\n", "#Queries: 500.0\n", "NearestNeighbours: #1 0.2221s\n", "NNSearch - brute force: #1 34.1902s\n", "NN_fit_bfnp_init: #1 0.0030s\n", "NN_fit_bfnp_loop: #1 34.1867s\n", "NN_fit_bfnp_dist: #2000 5.5106s\n", "NN_fit_bfnp_insert: #1999000 26.4723s\n", "NN_fit_bfnp_toList: #2000 0.1029s\n", "NNSearch - chained: #1 0.8933s\n", "NN_fit_chained_init: #1 0.0006s\n", "NN_fit_chained_toList: #1 0.8854s\n", "#Queries: 1000.0\n", "NearestNeighbours: #1 0.4374s\n", "NNSearch - brute force: #1 34.0280s\n", "NN_fit_bfnp_init: #1 0.0029s\n", "NN_fit_bfnp_loop: #1 34.0245s\n", "NN_fit_bfnp_dist: #2000 5.4840s\n", "NN_fit_bfnp_insert: #1999000 26.3614s\n", "NN_fit_bfnp_toList: #2000 0.1027s\n", "NNSearch - chained: #1 0.8961s\n", "NN_fit_chained_init: #1 0.0003s\n", "NN_fit_chained_toList: #1 0.8879s\n", "#Queries: 2000.0\n", "NearestNeighbours: #1 0.8844s\n", "NNSearch - brute force: #1 34.2027s\n", "NN_fit_bfnp_init: #1 0.0729s\n", "NN_fit_bfnp_loop: #1 34.1290s\n", "NN_fit_bfnp_dist: #2000 5.5232s\n", "NN_fit_bfnp_insert: #1999000 26.4227s\n", "NN_fit_bfnp_toList: #2000 0.1040s\n", "NNSearch - chained: #1 0.8959s\n", "NN_fit_chained_init: #1 0.0003s\n", "NN_fit_chained_toList: #1 0.8873s\n", "#Queries: 4000.0\n", "NearestNeighbours: #1 1.7675s\n", "NNSearch - brute force: #1 33.9383s\n", "NN_fit_bfnp_init: #1 0.0028s\n", "NN_fit_bfnp_loop: #1 33.9344s\n", "NN_fit_bfnp_dist: #2000 5.4702s\n", "NN_fit_bfnp_insert: #1999000 26.3020s\n", "NN_fit_bfnp_toList: #2000 0.1028s\n", "NNSearch - chained: #1 0.8841s\n", "NN_fit_chained_init: #1 0.0004s\n", "NN_fit_chained_toList: #1 0.8756s\n", "#Queries: 8000.0\n", "NearestNeighbours: #1 3.5655s\n", "NNSearch - brute force: #1 33.9516s\n", "NN_fit_bfnp_init: #1 0.0027s\n", "NN_fit_bfnp_loop: #1 33.9470s\n", "NN_fit_bfnp_dist: #2000 5.4770s\n", "NN_fit_bfnp_insert: #1999000 26.3011s\n", "NN_fit_bfnp_toList: #2000 0.1033s\n", "NNSearch - chained: #1 0.9640s\n", "NN_fit_chained_init: #1 0.0003s\n", "NN_fit_chained_toList: #1 0.9548s\n", "#Queries: 16000.0\n", "NearestNeighbours: #1 7.0631s\n", "NNSearch - brute force: #1 33.9494s\n", "NN_fit_bfnp_init: #1 0.0027s\n", "NN_fit_bfnp_loop: #1 33.9435s\n", "NN_fit_bfnp_dist: #2000 5.4798s\n", "NN_fit_bfnp_insert: #1999000 26.2945s\n", "NN_fit_bfnp_toList: #2000 0.1030s\n", "NNSearch - chained: #1 0.8982s\n", "NN_fit_chained_init: #1 0.0003s\n", "NN_fit_chained_toList: #1 0.8875s\n" ] }, { "data": { "text/plain": [ "[(250.0, (0.11011576652526855, 34.51230764389038, 0.9062139987945557)),\n", " (500.0, (0.2220914363861084, 34.19019532203674, 0.89328932762146)),\n", " (1000.0, (0.4374098777770996, 34.028005838394165, 0.8960974216461182)),\n", " (2000.0, (0.8843889236450195, 34.202696323394775, 0.8958609104156494)),\n", " (4000.0, (1.7675197124481201, 33.93833684921265, 0.8840756416320801)),\n", " (8000.0, (3.5654966831207275, 33.95157527923584, 0.964043140411377)),\n", " (16000.0, (7.063101530075073, 33.94935345649719, 0.8981528282165527))]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "n_features = 100\n", "numPoints = 2000\n", "maxValue = 5000\n", "nbhSize = 500\n", "runTest()" ] }, { "cell_type": "code", "execution_count": 18, "id": "f542bd77", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#Queries: 2000\n", "NearestNeighbours: #1 0.7690s\n", "NNSearch - brute force: #1 11.6225s\n", "NN_fit_bfnp_init: #1 0.0030s\n", "NN_fit_bfnp_loop: #1 11.6191s\n", "NN_fit_bfnp_dist: #2000 4.8411s\n", "NN_fit_bfnp_insert: #1999000 5.1438s\n", "NN_fit_bfnp_toList: #2000 0.0048s\n", "NNSearch - chained: #1 0.7762s\n", "NN_fit_chained_init: #1 0.0004s\n", "NN_fit_chained_toList: #1 0.7751s\n", "#Queries: 2000\n", "NearestNeighbours: #1 0.9258s\n", "NNSearch - brute force: #1 12.0495s\n", "NN_fit_bfnp_init: #1 0.0032s\n", "NN_fit_bfnp_loop: #1 12.0459s\n", "NN_fit_bfnp_dist: #2000 4.8804s\n", "NN_fit_bfnp_insert: #1999000 5.4840s\n", "NN_fit_bfnp_toList: #2000 0.0051s\n", "NNSearch - chained: #1 0.8090s\n", "NN_fit_chained_init: #1 0.0006s\n", "NN_fit_chained_toList: #1 0.8078s\n", "#Queries: 2000\n", "NearestNeighbours: #1 0.8089s\n", "NNSearch - brute force: #1 12.4359s\n", "NN_fit_bfnp_init: #1 0.0024s\n", "NN_fit_bfnp_loop: #1 12.4330s\n", "NN_fit_bfnp_dist: #2000 4.9303s\n", "NN_fit_bfnp_insert: #1999000 5.8403s\n", "NN_fit_bfnp_toList: #2000 0.0055s\n", "NNSearch - chained: #1 0.8682s\n", "NN_fit_chained_init: #1 0.0006s\n", "NN_fit_chained_toList: #1 0.8668s\n", "#Queries: 2000\n", "NearestNeighbours: #1 0.8091s\n", "NNSearch - brute force: #1 12.8205s\n", "NN_fit_bfnp_init: #1 0.0027s\n", "NN_fit_bfnp_loop: #1 12.8174s\n", "NN_fit_bfnp_dist: #2000 4.8571s\n", "NN_fit_bfnp_insert: #1999000 6.3160s\n", "NN_fit_bfnp_toList: #2000 0.0056s\n", "NNSearch - chained: #1 0.8214s\n", "NN_fit_chained_init: #1 0.0003s\n", "NN_fit_chained_toList: #1 0.8202s\n", "#Queries: 2000\n", "NearestNeighbours: #1 0.8118s\n", "NNSearch - brute force: #1 13.9575s\n", "NN_fit_bfnp_init: #1 0.0024s\n", "NN_fit_bfnp_loop: #1 13.9546s\n", "NN_fit_bfnp_dist: #2000 4.8472s\n", "NN_fit_bfnp_insert: #1999000 7.4357s\n", "NN_fit_bfnp_toList: #2000 0.0073s\n", "NNSearch - chained: #1 0.8309s\n", "NN_fit_chained_init: #1 0.0003s\n", "NN_fit_chained_toList: #1 0.8291s\n", "#Queries: 2000\n", "NearestNeighbours: #1 0.8521s\n", "NNSearch - brute force: #1 16.9347s\n", "NN_fit_bfnp_init: #1 0.0029s\n", "NN_fit_bfnp_loop: #1 16.9314s\n", "NN_fit_bfnp_dist: #2000 5.2314s\n", "NN_fit_bfnp_insert: #1999000 9.9072s\n", "NN_fit_bfnp_toList: #2000 0.0106s\n", "NNSearch - chained: #1 0.8430s\n", "NN_fit_chained_init: #1 0.0006s\n", "NN_fit_chained_toList: #1 0.8406s\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def testNbhSize():\n", " global nbhSize\n", " data = np.array([randomPoint() for _i in range(numPoints)])\n", " q = len(data)\n", " nbhSize = 2\n", " results = []\n", " while nbhSize < 100:\n", " results.append((nbhSize, testNNSearchByQueries(q)))\n", " nbhSize *= 2\n", " showResults(results)\n", " \n", "n_features = 100\n", "numPoints = 2000\n", "maxValue = 5000\n", "nbhSize = 500\n", "\n", "testNbhSize()" ] }, { "cell_type": "code", "execution_count": 19, "id": "1254b22c", "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#Queries: 4000\n", "NearestNeighbours: #1 1.1085s\n", "NNSearch - brute force: #1 9.4616s\n", "NN_fit_bfnp_init: #1 0.0033s\n", "NN_fit_bfnp_loop: #1 9.4576s\n", "NN_fit_bfnp_dist: #2000 2.7834s\n", "NN_fit_bfnp_insert: #1999000 5.0853s\n", "NN_fit_bfnp_toList: #2000 0.0045s\n", "NNSearch - chained: #1 0.5445s\n", "NN_fit_chained_init: #1 0.0007s\n", "NN_fit_chained_toList: #1 0.5430s\n", "#Queries: 4000\n", "NearestNeighbours: #1 1.0871s\n", "NNSearch - brute force: #1 9.0770s\n", "NN_fit_bfnp_init: #1 0.0025s\n", "NN_fit_bfnp_loop: #1 9.0738s\n", "NN_fit_bfnp_dist: #2000 2.6923s\n", "NN_fit_bfnp_insert: #1999000 4.8391s\n", "NN_fit_bfnp_toList: #2000 0.0043s\n", "NNSearch - chained: #1 0.5439s\n", "NN_fit_chained_init: #1 0.0008s\n", "NN_fit_chained_toList: #1 0.5423s\n", "#Queries: 4000\n", "NearestNeighbours: #1 1.1404s\n", "NNSearch - brute force: #1 9.3360s\n", "NN_fit_bfnp_init: #1 0.0027s\n", "NN_fit_bfnp_loop: #1 9.3326s\n", "NN_fit_bfnp_dist: #2000 2.8080s\n", "NN_fit_bfnp_insert: #1999000 4.9728s\n", "NN_fit_bfnp_toList: #2000 0.0044s\n", "NNSearch - chained: #1 0.5750s\n", "NN_fit_chained_init: #1 0.0012s\n", "NN_fit_chained_toList: #1 0.5729s\n", "#Queries: 4000\n", "NearestNeighbours: #1 1.1007s\n", "NNSearch - brute force: #1 9.8054s\n", "NN_fit_bfnp_init: #1 0.0027s\n", "NN_fit_bfnp_loop: #1 9.8019s\n", "NN_fit_bfnp_dist: #2000 3.0390s\n", "NN_fit_bfnp_insert: #1999000 5.1741s\n", "NN_fit_bfnp_toList: #2000 0.0048s\n", "NNSearch - chained: #1 0.5635s\n", "NN_fit_chained_init: #1 0.0002s\n", "NN_fit_chained_toList: #1 0.5624s\n", "#Queries: 4000\n", "NearestNeighbours: #1 1.4287s\n", "NNSearch - brute force: #1 9.8580s\n", "NN_fit_bfnp_init: #1 0.0027s\n", "NN_fit_bfnp_loop: #1 9.8546s\n", "NN_fit_bfnp_dist: #2000 3.2576s\n", "NN_fit_bfnp_insert: #1999000 5.0551s\n", "NN_fit_bfnp_toList: #2000 0.0046s\n", "NNSearch - chained: #1 0.5933s\n", "NN_fit_chained_init: #1 0.0002s\n", "NN_fit_chained_toList: #1 0.5922s\n", "#Queries: 4000\n", "NearestNeighbours: #1 1.3954s\n", "NNSearch - brute force: #1 11.3182s\n", "NN_fit_bfnp_init: #1 0.0028s\n", "NN_fit_bfnp_loop: #1 11.3148s\n", "NN_fit_bfnp_dist: #2000 4.2247s\n", "NN_fit_bfnp_insert: #1999000 5.4614s\n", "NN_fit_bfnp_toList: #2000 0.0051s\n", "NNSearch - chained: #1 0.8187s\n", "NN_fit_chained_init: #1 0.0004s\n", "NN_fit_chained_toList: #1 0.8172s\n", "#Queries: 4000\n", "NearestNeighbours: #1 1.9051s\n", "NNSearch - brute force: #1 12.1622s\n", "NN_fit_bfnp_init: #1 0.0032s\n", "NN_fit_bfnp_loop: #1 12.1582s\n", "NN_fit_bfnp_dist: #2000 4.7477s\n", "NN_fit_bfnp_insert: #1999000 5.7415s\n", "NN_fit_bfnp_toList: #2000 0.0054s\n", "NNSearch - chained: #1 1.0140s\n", "NN_fit_chained_init: #1 0.0006s\n", "NN_fit_chained_toList: #1 1.0124s\n", "#Queries: 4000\n", "NearestNeighbours: #1 3.0180s\n", "NNSearch - brute force: #1 13.7916s\n", "NN_fit_bfnp_init: #1 0.0026s\n", "NN_fit_bfnp_loop: #1 13.7882s\n", "NN_fit_bfnp_dist: #2000 6.2045s\n", "NN_fit_bfnp_insert: #1999000 5.9177s\n", "NN_fit_bfnp_toList: #2000 0.0054s\n", "NNSearch - chained: #1 1.3896s\n", "NN_fit_chained_init: #1 0.0004s\n", "NN_fit_chained_toList: #1 1.3882s\n", "#Queries: 4000\n", "NearestNeighbours: #1 5.3106s\n", "NNSearch - brute force: #1 17.8478s\n", "NN_fit_bfnp_init: #1 0.0030s\n", "NN_fit_bfnp_loop: #1 17.8439s\n", "NN_fit_bfnp_dist: #2000 9.7354s\n", "NN_fit_bfnp_insert: #1999000 6.2943s\n", "NN_fit_bfnp_toList: #2000 0.0058s\n", "NNSearch - chained: #1 2.6400s\n", "NN_fit_chained_init: #1 0.0007s\n", "NN_fit_chained_toList: #1 2.6383s\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def testFeatureCount():\n", " global n_features\n", " global data\n", " q = 2 * len(data)\n", " n_features = 2\n", " results = []\n", " while n_features < 1000:\n", " data = np.array([randomPoint() for _i in range(numPoints)])\n", " results.append((n_features, testNNSearchByQueries(q)))\n", " n_features *= 2\n", " showResults(results)\n", " \n", "n_features = 100\n", "numPoints = 2000\n", "maxValue = 5000\n", "nbhSize = 5\n", "\n", "testFeatureCount()" ] }, { "cell_type": "code", "execution_count": 21, "id": "fb158f8c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-- #points: 100\n", "#Queries: 40000\n", "NearestNeighbours: #1 8.1218s\n", "NNSearch - brute force: #1 0.1501s\n", "NN_fit_bfnp_init: #1 0.0003s\n", "NN_fit_bfnp_loop: #1 0.1446s\n", "NN_fit_bfnp_dist: #100 0.1235s\n", "NN_fit_bfnp_insert: #4950 0.0162s\n", "NN_fit_bfnp_toList: #100 0.0002s\n", "NNSearch - chained: #1 0.0267s\n", "NN_fit_chained_init: #1 0.0001s\n", "NN_fit_chained_toList: #1 0.0210s\n", "-- #points: 200\n", "#Queries: 40000\n", "NearestNeighbours: #1 9.2971s\n", "NNSearch - brute force: #1 0.3586s\n", "NN_fit_bfnp_init: #1 0.0017s\n", "NN_fit_bfnp_loop: #1 0.3515s\n", "NN_fit_bfnp_dist: #200 0.2714s\n", "NN_fit_bfnp_insert: #19900 0.0616s\n", "NN_fit_bfnp_toList: #200 0.0004s\n", "NNSearch - chained: #1 0.0531s\n", "NN_fit_chained_init: #1 0.0007s\n", "NN_fit_chained_toList: #1 0.0467s\n", "-- #points: 400\n", "#Queries: 40000\n", "NearestNeighbours: #1 10.1838s\n", "NNSearch - brute force: #1 0.8746s\n", "NN_fit_bfnp_init: #1 0.0007s\n", "NN_fit_bfnp_loop: #1 0.8681s\n", "NN_fit_bfnp_dist: #400 0.5734s\n", "NN_fit_bfnp_insert: #79800 0.2253s\n", "NN_fit_bfnp_toList: #400 0.0008s\n", "NNSearch - chained: #1 0.1097s\n", "NN_fit_chained_init: #1 0.0002s\n", "NN_fit_chained_toList: #1 0.1035s\n", "-- #points: 800\n", "#Queries: 40000\n", "NearestNeighbours: #1 12.1831s\n", "NNSearch - brute force: #1 2.4842s\n", "NN_fit_bfnp_init: #1 0.0015s\n", "NN_fit_bfnp_loop: #1 2.4768s\n", "NN_fit_bfnp_dist: #800 1.3524s\n", "NN_fit_bfnp_insert: #319600 0.8589s\n", "NN_fit_bfnp_toList: #800 0.0018s\n", "NNSearch - chained: #1 0.2493s\n", "NN_fit_chained_init: #1 0.0003s\n", "NN_fit_chained_toList: #1 0.2422s\n", "-- #points: 1600\n", "#Queries: 40000\n", "NearestNeighbours: #1 15.5947s\n", "NNSearch - brute force: #1 7.9417s\n", "NN_fit_bfnp_init: #1 0.0024s\n", "NN_fit_bfnp_loop: #1 7.9337s\n", "NN_fit_bfnp_dist: #1600 3.4632s\n", "NN_fit_bfnp_insert: #1279200 3.4460s\n", "NN_fit_bfnp_toList: #1600 0.0038s\n", "NNSearch - chained: #1 0.6226s\n", "NN_fit_chained_init: #1 0.0006s\n", "NN_fit_chained_toList: #1 0.6152s\n", "-- #points: 3200\n", "#Queries: 40000\n", "NearestNeighbours: #1 22.3059s\n", "NNSearch - brute force: #1 27.4864s\n", "NN_fit_bfnp_init: #1 0.0044s\n", "NN_fit_bfnp_loop: #1 27.4758s\n", "NN_fit_bfnp_dist: #3200 9.0934s\n", "NN_fit_bfnp_insert: #5118400 14.2796s\n", "NN_fit_bfnp_toList: #3200 0.0082s\n", "NNSearch - chained: #1 1.6651s\n", "NN_fit_chained_init: #1 0.0003s\n", "NN_fit_chained_toList: #1 1.6578s\n", "-- #points: 6400\n", "#Queries: 40000\n", "NearestNeighbours: #1 34.0944s\n", "NNSearch - brute force: #1 104.0090s\n", "NN_fit_bfnp_init: #1 0.0849s\n", "NN_fit_bfnp_loop: #1 103.9171s\n", "NN_fit_bfnp_dist: #6400 26.1141s\n", "NN_fit_bfnp_insert: #20476800 60.7503s\n", "NN_fit_bfnp_toList: #6400 0.0198s\n", "NNSearch - chained: #1 5.3554s\n", "NN_fit_chained_init: #1 0.0005s\n", "NN_fit_chained_toList: #1 5.3477s\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def testPointCount():\n", " global numPoints\n", " global data\n", " q = 40000\n", " numPoints = 100\n", " results = []\n", " while numPoints < 10000:\n", " print(f\"-- #points: {numPoints}\")\n", " data = np.array([randomPoint() for _i in range(numPoints)])\n", " results.append((numPoints, testNNSearchByQueries(q)))\n", " numPoints *= 2\n", " showResults(results)\n", " \n", "n_features = 100\n", "numPoints = 2000\n", "maxValue = 5000\n", "nbhSize = 5\n", "\n", "testPointCount()" ] }, { "cell_type": "code", "execution_count": null, "id": "2332a58c", "metadata": {}, "outputs": [], "source": [ "a = np.array([[1,2,3],[4,5,6]])\n", "b = np.array([[1,4],[2,5],[3,6]])" ] }, { "cell_type": "code", "execution_count": null, "id": "9b1ae45a", "metadata": {}, "outputs": [], "source": [ "t = timing(\"test\")\n", "t.start()\n", "for d in data:\n", " #np.matmul(data - d, data[0])\n", " pass\n", "t.stop()\n", "print(t)" ] }, { "cell_type": "code", "execution_count": null, "id": "b6d70eab", "metadata": {}, "outputs": [], "source": [ "np.transpose(a)" ] }, { "cell_type": "code", "execution_count": null, "id": "05c918c4", "metadata": {}, "outputs": [], "source": [ "t = timing(\"test\")\n", "t.start()\n", "w = np.array(np.repeat([data[0]], len(data), axis=0))\n", "d = tf.keras.layers.Subtract()([w, data])\n", "r = tf.keras.layers.Dot(axes=(1,1))([d,d]).numpy()\n", "t.stop()\n", "print(t)" ] }, { "cell_type": "code", "execution_count": null, "id": "c25c1615", "metadata": {}, "outputs": [], "source": [ "r.shape" ] } ], "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.9.7" } }, "nbformat": 4, "nbformat_minor": 5 }