{ "cells": [ { "cell_type": "markdown", "id": "24a5832a", "metadata": {}, "source": [ "# Neighbouring Change in Feasibility (N∆Feas)" ] }, { "cell_type": "code", "execution_count": 1, "id": "023e937a", "metadata": {}, "outputs": [], "source": [ "import math\n", "\n", "from pyxla import ncf\n", "from pyxla.util import load_data\n", "from pyxla.sampling import HilbertCurveSampler" ] }, { "cell_type": "code", "execution_count": 2, "id": "44c56636", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:root:The Hilbert curve with dimension 1 is just a number line. You are sampling around points on a number line.\n", "WARNING:root:The Hilbert curve with dimension 1 is just a number line. You are sampling around points on a number line.\n", "WARNING:root:The Hilbert curve with dimension 1 is just a number line. You are sampling around points on a number line.\n" ] } ], "source": [ "sphere_sample_all_v = {\n", " \"name\": \"Sphere\",\n", " \"X\": HilbertCurveSampler(sample_size=100, dim=1, l_bound=-5, u_bound=5, seed=42),\n", " \"F\": lambda x: x**2,\n", " \"V\": [lambda x: x**2 - 2, lambda x: 8 * math.sin(20 * x)]\n", "}\n", "\n", "sphere_sample_v0 = {\n", " \"name\": \"Sphere\",\n", " \"X\": HilbertCurveSampler(sample_size=100, dim=1, l_bound=-5, u_bound=5, seed=42),\n", " \"F\": lambda x: x**2,\n", " \"V\": [lambda x: x**2 - 2]\n", "}\n", "\n", "sphere_sample_v1 = {\n", " \"name\": \"Sphere\",\n", " \"X\": HilbertCurveSampler(sample_size=100, dim=1, l_bound=-5, u_bound=5, seed=42),\n", " \"F\": lambda x: x**2,\n", " \"V\": [lambda x: 8 * math.sin(20 * x)]\n", "}\n", "\n", "load_data(sphere_sample_all_v)\n", "load_data(sphere_sample_v0)\n", "load_data(sphere_sample_v1)" ] }, { "cell_type": "markdown", "id": "e0996286", "metadata": {}, "source": [ "The constrained sphere problem has 2 constraints:\n", "```{math}\n", ":label: sphere-constraint-ncf\n", "v_0(x) = x^2 - 2 \\leq 0,~\\text{and}\n", "```\n", "\n", "```{math}\n", ":label: sine-constraint-ncf\n", "v_1(x) = 8 \\cdot \\sin(20 \\cdot x) \\leq 0.\n", "```" ] }, { "cell_type": "markdown", "id": "c329aa2b", "metadata": {}, "source": [ "`NCF` with both constraints:" ] }, { "cell_type": "code", "execution_count": 3, "id": "d136c3d0", "metadata": {}, "outputs": [ { "data": { "image/png": "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b77ZXP7oo48UExMjX19f1ahRQ7GxscrNzS32Pp+dsjh27JgGDRokm81mnrHbtm2b/vCHPyggIEDh4eHq37+/MjIyzG2XLVumG264wXy9d911l/bu3Wuuz8/P1/Dhw1W7dm35+Piofv365kO9z0pJSdEf/vAH+fr6qmHDhvroo4+K1XZ2OuVcv59OmT9/viZOnKgtW7bIZrOZr2PQoEG66667XLYrKChQrVq1XL5HcHVwOp166aWX1LhxY9ntdkVFRWny5Mnm+q1bt+rWW281f24eeeQR5eTkmOvP/uz94x//UO3atVWjRg0NGzZMBQUFks6MJQcPHtTo0aPN70Op5Km/F154QbVq1VJgYKAGDx6sp59+2mU8OffyFEnq1auXHn74YXP5+PHjio+PV/Xq1eXn56c//OEP2r17t7m+pDNR06dPN8cw6cw0ZceOHeXv76+QkBB17dpVBw8eLPH9s9ls2rhxoyZNmiSbzWaOW4cOHdL999+vkJAQhYaGqmfPnjpw4IC53Q8//KDbb79dYWFhCg4OVrdu3bRp0yZz/cXG+JLGTcaOKwvBzuKefPJJff311/r000+1fPlyrV692uWH/Fwff/yxXnnlFf3zn//U7t27tWTJEsXExJjr4+Pj9f777+u1117T9u3b9c9//tM8k3bkyBF1795d1113nbZs2aKZM2dqzpw5euGFF1yO8fbbb8vf31/r1q3TSy+9pEmTJmnFihWSzgxKkjRv3jylpKSYy+d68cUX9e9//1vz5s3TmjVr5HA4LngdSEmcTqd69uypzMxMff3111qxYoX27dunPn36lHofKSkp6tu3rwYNGqTt27dr9erV+tOf/qSSHg95dsoiKChI06dPV0pKivr06aMTJ07o1ltvVdu2bbVhwwYtW7ZMaWlpuv/++81tc3NzlZCQoA0bNigxMVEeHh6655575HQ6JUmvvfaaPvvsMy1atEg7d+7Uv//9b5dfKJI0btw43XvvvdqyZYv69eunBx54QNu3by/TeyadmVp5/PHH1bJlS6WkpJivY/DgwVq2bJlSUlLMvv/973918uTJMr2nsIaxY8fqb3/7m8aNG6dffvlF7733nvng+dzcXMXFxal69er64Ycf9OGHH2rlypUaPny4yz5WrVqlvXv3atWqVXr77bc1f/5884+hTz75RPXq1dOkSZPM78OS/Pvf/9bkyZP14osvauPGjYqKitLMmTPL/HoefvhhbdiwQZ999pmSkpJkGIa6d+9uBs2LKSwsVK9evdStWzf99NNPSkpK0iOPPGIG0nOlpKSoZcuWevzxx5WSkqInnnhCBQUFiouLU2BgoL799lutWbNGAQEBuvPOO5Wfny9Jys7O1oABA/Tdd99p7dq1atKkibp3767s7GxJFx/jS8LYcYUxYFnZ2dmGt7e3sWjRIrPt2LFjhq+vrzFq1CizrX79+sYrr7xiGIZhvPzyy0bTpk2N/Pz8YvvbuXOnIclYsWJFicd75plnjGbNmhlOp9NsmzFjhhEQEGAUFRUZhmEY3bp1M2644QaX7a677jpjzJgx5rIkY/HixS59JkyYYLRu3dpcDg8PN/7+97+by4WFhUZUVJTRs2fPEl/XWa1btzYmTJhgGIZhLF++3PD09DSSk5PN9T///LMhyVi/fr1hGIYxYMAAl30ahmGMGjXK6Natm2EYhrFx40ZDknHgwIES35OSBAcHG/PmzTOXn3/+eeOOO+5w6XPo0CFDkrFz584S93H06FFDkrF161bDMAxjxIgRxq233ury3v+eJGPo0KEubZ06dTIeffRRwzAMY//+/YYk48cffzQMwzBWrVplSDKOHz9uGIZhzJs3zwgODja3Pfff46wWLVoYL774ornco0cP4+GHHy6xJliXw+Ew7Ha7MXv27BLXv/XWW0b16tWNnJwcs23p0qWGh4eHkZqaahjGmZ+9+vXrG4WFhWaf3r17G3369DGXS/oZP/d7tVOnTsawYcNc+nTt2tXl+7dbt24uY6JhGEbPnj2NAQMGGIZhGLt27TIkGWvWrDHXZ2RkGL6+vub4WtLPxCuvvGLUr1/fMIwzY68kY/Xq1SW+JyX5/XhlGIaxYMGCYmNsXl6e4evra3z55Zcl7qOoqMgIDAw0/vOf/xiGceEx3jCKv6eMHVcezthZ2N69e5Wfn69OnTqZbaGhoWrWrNl5t+ndu7dOnTqlhg0basiQIVq8eLE5lbp582Z5enqqW7duJW67fft2de7c2eUv0K5duyonJ0eHDx8221q1auWyXe3atZWenl7q15WVlaW0tDR17NjRbPP09FT79u1LvY+z9UZGRioyMtJsa9GihUJCQkr912jr1q112223KSYmRr1799bs2bN1/PjxMtWxZcsWrVq1yryOMCAgQNdcc40kmdOtu3fvVt++fdWwYUMFBQWZZ+OSk5MlnTmbsHnzZjVr1kwjR47U8uXLix2nc+fOxZbL81f3hQwePFjz5s2TJKWlpemLL77QoEGDKvQYqPq2b9+uvLw83Xbbbedd37p1a/n7+5ttXbt2ldPp1M6dO822li1bytPT01wu61ghSTt37nQZKyQVW76Y7du3q1q1ai5jaY0aNdSsWbNS/wyFhobq4YcfVlxcnHr06KFXX331vGcZz2fLli3as2ePAgMDzbEiNDRUp0+fNseKtLQ0DRkyRE2aNFFwcLCCgoKUk5NjjhUXGuPPh7HjykKwg4vIyEjt3LlTb775pnx9ffWXv/xFN910kwoKCirsAlgvLy+XZZvNZk4pViQPD49iU6KlnTYp7T48PT21YsUKffHFF2rRooVef/11NWvWTPv37y/1MXJyctSjRw9t3rzZ5Wv37t266aabJEk9evRQZmamZs+erXXr1mndunWSZE6/tGvXTvv379fzzz+vU6dO6f7779d9991XptdaEeLj47Vv3z4lJSXp3XffVYMGDXTjjTdWeh1wL8aKkvcxb948JSUlqUuXLlq4cKGaNm2qtWvXlvoYOTk5at++fbGxYteuXXrwwQclSQMGDNDmzZv16quv6vvvv9fmzZtVo0YNc6y40BjvTowdFYdgZ2GNGjWSl5eXGQKkMxcAX+xRAL6+vurRo4dee+01rV69WklJSdq6datiYmLkdDr19ddfl7hd8+bNzWtPzlqzZo0CAwPLdAeol5eXioqKzrs+ODhY4eHhLtffFRUVFbt2sGbNmi5/ETscDpfA1bx5cx06dEiHDh0y23755RedOHFCLVq0KHEfkopdJGyz2dS1a1dNnDhRP/74o7y9vbV48eJSv9527drp559/VnR0tBo3buzy5e/vr2PHjmnnzp169tlnddttt6l58+YlnhUMCgpSnz59NHv2bC1cuFAff/yxMjMzzfXn/gJZu3atmjdvXuo6f8/b27vEf6MaNWqoV69emjdvnubPn6+BAweWa/+4sjVp0kS+vr7nfURH8+bNtWXLFpebjNasWSMPD48Lziic63zfh7/XrFmzYtfqnrt87s95UVGRtm3b5lJvYWGhy1h69ufy92NFamqqy/hX0g0Fbdu21dixY/X999/r2muv1XvvvXfxF/o/7dq10+7du1WrVq1iY0VwcLCkM+/jyJEj1b17d7Vs2VJ2u93lRizp/GP8+TB2XFkIdhYWEBCgP//5z3ryySf11Vdfadu2bXr44Yfl4XH+f/b58+drzpw52rZtm/bt26d3331Xvr6+ql+/vqKjozVgwAANGjRIS5Ys0f79+7V69WotWrRIkvSXv/xFhw4d0ogRI7Rjxw59+umnmjBhghISEi54zHNFR0crMTFRqamp553WHDFihKZOnapPP/1UO3fu1KhRo3T8+HGXaeBbb71VCxYs0LfffqutW7dqwIABLtM6sbGxiomJUb9+/bRp0yatX79e8fHx6tatmzp06GDuY8OGDXrnnXe0e/duTZgwwWXAX7dunaZMmaINGzYoOTlZn3zyiY4ePVqmQW/YsGHKzMxU37599cMPP2jv3r368ssvNXDgQBUVFal69eqqUaOG3nrrLe3Zs0dfffWVEhISXPYxbdo0vf/++9qxY4d27dqlDz/8UBERES53B3744YeaO3eudu3apQkTJmj9+vXFLlYvrejoaO3fv1+bN29WRkaG8vLyzHWDBw/W22+/re3bt2vAgAHl2j+ubD4+PhozZoyeeuopvfPOO9q7d6/Wrl1r3uHYr18/+fj4aMCAAdq2bZtWrVqlESNGqH///uYNFqURHR2tb775RkeOHCkWXs4aMWKE5syZo7ffflu7d+/WCy+8oJ9++qnYWLF06VItXbpUO3bs0KOPPmo+YFc6E1R79uypIUOG6LvvvtOWLVv00EMPqW7duurZs6ekM3fWHj16VC+99JL27t2rGTNm6IsvvjD3sX//fo0dO1ZJSUk6ePCgli9frt27d5dprOjXr5/CwsLUs2dPffvtt+YYPHLkSPNylyZNmmjBggXavn271q1bp379+rmcQb3QGH8+jB1XGHde4IfLLzs723jooYcMPz8/Izw83HjppZeKXSj8+4tlFy9ebHTq1MkICgoy/P39jeuvv95YuXKl2ffUqVPG6NGjjdq1axve3t5G48aNjblz55rrV69ebVx33XWGt7e3ERERYYwZM8YoKCgw11/sImXDMIzPPvvMaNy4sVGtWjXzwuNzL7gtKCgwhg8fbgQFBRnVq1c3xowZY/Tu3dt44IEHzD5ZWVlGnz59jKCgICMyMtKYP39+sYuRDx48aNx9992Gv7+/ERgYaPTu3du8ePus8ePHG+Hh4UZwcLAxevRoY/jw4ebNE7/88osRFxdn1KxZ07Db7UbTpk2N119//YL/JufePGEYZy7Ovueee4yQkBDD19fXuOaaa4zHHnvMvEh6xYoVRvPmzQ273W60atXKWL16tctNJm+99ZbRpk0bw9/f3wgKCjJuu+02Y9OmTeb+JRkzZswwbr/9dsNutxvR0dHGwoULzfVlvQD69OnTxr333muEhIQYklxej9PpNOrXr2907979gu8DrK2oqMh44YUXjPr16xteXl5GVFSUMWXKFHP9Tz/9ZNxyyy2Gj4+PERoaagwZMsTIzs4211/sxiXDMIykpCSjVatWht1uN87+Ojv3e9UwDGPSpElGWFiYERAQYAwaNMgYOXKkcf3115vr8/PzjUcffdQIDQ01atWqZUydOrXYuJSZmWn079/fCA4ONnx9fY24uDhj165dLseZOXOmERkZafj7+xvx8fHG5MmTzTEsNTXV6NWrlzl21q9f3xg/frx5Y1lJzh2vDMMwUlJSjPj4eCMsLMyw2+1Gw4YNjSFDhhhZWVmGYRjGpk2bjA4dOhg+Pj5GkyZNjA8//LBMY3xJN08wdlxZbIZRwnMZgCuM0+lU8+bNdf/99+v55593dzlXtZycHNWtW1fz5s3Tn/70J3eXAxRz++23KyIiQgsWLHB3Kfgdxo6KwSdP4Ip0diqjW7duysvL0xtvvKH9+/ebFxCj8jmdTmVkZOjll19WSEiI7r77bneXBOjkyZOaNWuW4uLi5Onpqffff18rV640n50J92PsqFgEO1yRPDw8NH/+fD3xxBMyDEPXXnutVq5cWe4LenHpkpOT1aBBA9WrV0/z589XtWoML3A/m82mzz//XJMnT9bp06fVrFkzffzxx4qNjXV3afgfxo6KxVQsAACARXBXLAAAgEUQ7AAAACyCYAcAAGARBDsAAACLINgBAABYBMEOAADAIgh2AAAAFkGwAwAAsAiCHQAAgEX8P/tQEPK2GllxAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "proportions, plot = ncf(sphere_sample_all_v, title=False)\n", "plot.figure.savefig('ncf-all-v.png', dpi=300)" ] }, { "cell_type": "markdown", "id": "3901e896", "metadata": {}, "source": [ "For the spherical constraint:" ] }, { "cell_type": "code", "execution_count": 5, "id": "324afa6f", "metadata": {}, "outputs": [ { "data": { "image/png": "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yhITE+Xv76/du3dX2fhX3t8HjB3Vj9tvdwL3q1OnjrtLOK+AgAAFBAS4u4xKsW/fPt1///1q2LChu0uxeHp6nvXpLZLk5+cnPz+/KqwIqBg7fa/u27dPt956qxo3blxl+yzv7wPGjuqHI3Y2d+LECcXHxysgIED16tXTM888U6LP7//qNcboscceU6NGjeTj46P69etrzJgxVt/8/HyNHz9ekZGR8vHxUbNmzfTKK69Yyz/77DN16dJFPj4+qlevniZMmKCioiJr+XXXXacxY8boH//4h0JDQxUREaHHHnvMpRZJuv322+VwOKzXZ/6VV1RUpDFjxigkJES1a9fW+PHjNXToUJepzdL+mm/fvr3L/tLS0tSvXz8FBAQoKChIAwcOdHlk3d13311iuvTBBx/UddddZ71+9913FR0dLT8/P9WuXVsxMTE6ceJEic/59JTFL7/8onvuuUcOh8M6Yrdjxw7dcsstCggIUHh4uIYMGaKsrCxr3RUrVujaa6+13u9tt92mffv2WcsLCgo0atQo1atXT76+vmrcuLF1U+/T0tPTdcstt8jPz09NmzbVu+++W6K209MpZ/r9dMrChQs1ZcoUbdu2TQ6Hw3of99xzj2677TaX9QoLC1W3bl2X7xFcHpxOp55++mk1a9ZMPj4+atSokaZNm2Yt3759u2644Qbr5+a+++5TXl6etfz0z96//vUv1atXT7Vr19bIkSNVWFgo6dRYcvDgQY0bN876PpRKn/p74oknVLduXQUGBmr48OGaMGGCy3hy5ukpktS/f3/dfffd1uujR48qPj5etWrVUs2aNXXLLbdo79691vLSjkTNmjXLGsOkU9OUXbp0kb+/v0JCQtSjRw8dPHiw1M/P4XBoy5Ytmjp1qhwOhzVuHTp0SAMHDlRISIhCQ0PVr18//fDDD9Z6mzZtUq9evRQWFqbg4GD17NlTqamp1vLzjfGljZuMHZcWgp3N/f3vf9dnn32mDz74QCtXrlRycrLLD/mZ3nvvPT377LP697//rb1792rZsmWKjo62lsfHx+utt97S888/r507d+rf//63dSTtp59+Uu/evXX11Vdr27ZtmjNnjl555RU98cQTLvt49dVX5e/vrw0bNujpp5/W1KlTtWrVKkmnBiVJWrBggdLT063XZ3rqqaf0xhtvaMGCBVq/fr1yc3PPeR5IaZxO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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "proportions, plot = ncf(sphere_sample_v0, title=False)\n", "plot.figure.savefig('ncf-v0.png', dpi=300)" ] }, { "cell_type": "markdown", "id": "e440eb5a", "metadata": {}, "source": [ "For the sinusodial constraint:" ] }, { "cell_type": "code", "execution_count": 6, "id": "ce0a4ffb", "metadata": {}, "outputs": [ { "data": { "image/png": "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wwbNnDlTc+fO1WOPPeZ2jJdfflmBgYFatWqVnnzySU2cOFHLli2TdHRQkqR58+YpPT3dWj7eE088oddee03z5s3TypUrlZube9LrQMrjcrnUv39/ZWdn67PPPtOyZcu0c+dODRw4sML7SE9P16BBg3Tbbbdp8+bNSklJ0V//+leV93jIY1MWwcHBmjZtmtLT0zVw4EAdPHhQV1xxhTp37qw1a9Zo6dKlyszM1E033WT1LSgoUGJiotasWaPk5GR5eXnphhtukMvlkiQ999xz+uCDD/TWW29p69ateu2119x+oEjSuHHjdOONN2rDhg0aPHiwbr75Zm3evLlS75l0dGrlvvvuU9u2bZWenm69jjvuuENLly5Venq6te3//d//6dChQ5V6T2EPY8eO1eOPP65x48bphx9+0Ouvv249eL6goECxsbGqU6eOvvnmG7399ttavny5hg8f7raPFStWaMeOHVqxYoVefvllzZ8/3/pl6L333lPjxo01ceJE6+uwPK+99pomTZqkJ554QmvXrlWTJk00c+bMSr+eW2+9VWvWrNEHH3yg1NRUGWPUt29fK2ieSklJieLi4tS7d2999913Sk1N1Z133mkF0uOlp6erbdu2uu+++5Senq77779fxcXFio2NVe3atfXFF19o5cqVCgoK0jXXXKOioiJJUl5enhISEvTll1/q66+/VsuWLdW3b1/l5eVJOvUYXx7GjrOMgW3l5eUZX19f89Zbb1ltv/76q/H39zejRo2y2qKjo80zzzxjjDHm6aefNuedd54pKioqs7+tW7caSWbZsmXlHu+hhx4yrVq1Mi6Xy2qbMWOGCQoKMqWlpcYYY3r37m0uvvhit34XXnihGTNmjLUsySxatMhtm6SkJNOxY0drOTw83Dz11FPWcklJiWnSpInp379/ua/rmI4dO5qkpCRjjDGffPKJ8fb2Nmlpadb677//3kgyq1evNsYYk5CQ4LZPY4wZNWqU6d27tzHGmLVr1xpJZvfu3eW+J+UJCQkx8+bNs5YfffRRc/XVV7tts3fvXiPJbN26tdx97N+/30gyGzduNMYYM2LECHPFFVe4vfd/JMncddddbm3du3c3d999tzHGmF27dhlJ5ttvvzXGGLNixQojyRw4cMAYY8y8efNMSEiI1ff4/49j2rRpY5544glruV+/fubWW28ttybYV25urnE6nWbOnDnlrp89e7apU6eOyc/Pt9qWLFlivLy8TEZGhjHm6PdedHS0KSkpsbYZMGCAGThwoLVc3vf48V+r3bt3N8OGDXPbplevXm5fv71793YbE40xpn///iYhIcEYY8y2bduMJLNy5UprfVZWlvH397fG1/K+J5555hkTHR1tjDk69koyKSkp5b4n5fnjeGWMMQsWLCgzxhYWFhp/f3/z8ccfl7uP0tJSU7t2bfO///3PGHPyMd6Ysu8pY8fZhzN2NrZjxw4VFRWpe/fuVlvdunXVqlWrE/YZMGCADh8+rGbNmmno0KFatGiRNZW6fv16eXt7q3fv3uX23bx5s3r06OH2G2ivXr2Un5+vn376yWrr0KGDW7/IyEjt27evwq8rJydHmZmZ6tatm9Xm7e2tLl26VHgfx+qNiopSVFSU1damTRuFhoZW+LfRjh076sorr1T79u01YMAAzZkzRwcOHKhUHRs2bNCKFSus6wiDgoJ0/vnnS5I13bp9+3YNGjRIzZo1U3BwsHU2Li0tTdLRswnr169Xq1atNHLkSH3yySdljtOjR48yy1X5rftk7rjjDs2bN0+SlJmZqY8++ki33XZbtR4DZ77NmzersLBQV1555QnXd+zYUYGBgVZbr1695HK5tHXrVqutbdu28vb2tpYrO1ZI0tatW93GCklllk9l8+bNqlWrlttYWq9ePbVq1arC30N169bVrbfeqtjYWPXr10/PPvvsCc8ynsiGDRv0448/qnbt2tZYUbduXR05csQaKzIzMzV06FC1bNlSISEhCg4OVn5+vjVWnGyMPxHGjrMLwQ5uoqKitHXrVr3wwgvy9/fXPffco0svvVTFxcXVdgGsj4+P27LD4bCmFKuTl5dXmSnRik6bVHQf3t7eWrZsmT766CO1adNG06dPV6tWrbRr164KHyM/P1/9+vXT+vXr3T62b9+uSy+9VJLUr18/ZWdna86cOVq1apVWrVolSdb0ywUXXKBdu3bp0Ucf1eHDh3XTTTfpb3/7W6Vea3WIj4/Xzp07lZqaqldffVVNmzbVJZdcUuN1wLMYK8rfx7x585SamqqePXtq4cKFOu+88/T1119X+Bj5+fnq0qVLmbFi27Zt+vvf/y5JSkhI0Pr16/Xss8/qq6++0vr161WvXj1rrDjZGO9JjB3Vh2BnY82bN5ePj48VAqSjFwCf6lEA/v7+6tevn5577jmlpKQoNTVVGzduVPv27eVyufTZZ5+V269169bWtSfHrFy5UrVr167UHaA+Pj4qLS094fqQkBCFh4e7XX9XWlpa5trB+vXru/1GnJub6xa4Wrdurb1792rv3r1W2w8//KCDBw+qTZs25e5DUpmLhB0Oh3r16qUJEybo22+/la+vrxYtWlTh13vBBRfo+++/V0xMjFq0aOH2ERgYqF9//VVbt27Vww8/rCuvvFKtW7cu96xgcHCwBg4cqDlz5mjhwoV69913lZ2dba0//gfI119/rdatW1e4zj/y9fUt9/+oXr16iouL07x58zR//nwNGTKkSvvH2a1ly5by9/c/4SM6WrdurQ0bNrjdZLRy5Up5eXmddEbheCf6OvyjVq1alblW9/jl47/PS0tLtWnTJrd6S0pK3MbSY9+XfxwrMjIy3Ma/8m4o6Ny5s8aOHauvvvpK7dq10+uvv37qF/qbCy64QNu3b1eDBg3KjBUhISGSjr6PI0eOVN++fdW2bVs5nU63G7GkE4/xJ8LYcXYh2NlYUFCQbr/9dj3wwAP69NNPtWnTJt16663y8jrxf/v8+fM1d+5cbdq0STt37tSrr74qf39/RUdHKyYmRgkJCbrtttu0ePFi7dq1SykpKXrrrbckSffcc4/27t2rESNGaMuWLXr//feVlJSkxMTEkx7zeDExMUpOTlZGRsYJpzVHjBihKVOm6P3339fWrVs1atQoHThwwG0a+IorrtCCBQv0xRdfaOPGjUpISHCb1unTp4/at2+vwYMHa926dVq9erXi4+PVu3dvde3a1drHmjVr9Morr2j79u1KSkpyG/BXrVqlyZMna82aNUpLS9N7772n/fv3V2rQGzZsmLKzszVo0CB988032rFjhz7++GMNGTJEpaWlqlOnjurVq6fZs2frxx9/1KeffqrExES3fUydOlVvvPGGtmzZom3btuntt99WRESE292Bb7/9tl566SVt27ZNSUlJWr16dZmL1SsqJiZGu3bt0vr165WVlaXCwkJr3R133KGXX35ZmzdvVkJCQpX2j7Obn5+fxowZo3/961965ZVXtGPHDn399dfWHY6DBw+Wn5+fEhIStGnTJq1YsUIjRozQLbfcYt1gURExMTH6/PPP9fPPP5cJL8eMGDFCc+fO1csvv6zt27frscce03fffVdmrFiyZImWLFmiLVu26O6777YesCsdDar9+/fX0KFD9eWXX2rDhg36xz/+oUaNGql///6Sjt5Zu3//fj355JPasWOHZsyYoY8++sjax65duzR27FilpqZqz549+uSTT7R9+/ZKjRWDBw9WWFiY+vfvry+++MIag0eOHGld7tKyZUstWLBAmzdv1qpVqzR48GC3M6gnG+NPhLHjLOPJC/zw58vLyzP/+Mc/TEBAgAkPDzdPPvlkmQuF/3ix7KJFi0z37t1NcHCwCQwMNBdddJFZvny5te3hw4fN6NGjTWRkpPH19TUtWrQwL730krU+JSXFXHjhhcbX19dERESYMWPGmOLiYmv9qS5SNsaYDz74wLRo0cLUqlXLuvD4+Atui4uLzfDhw01wcLCpU6eOGTNmjBkwYIC5+eabrW1ycnLMwIEDTXBwsImKijLz588vczHynj17zPXXX28CAwNN7dq1zYABA6yLt48ZP368CQ8PNyEhIWb06NFm+PDh1s0TP/zwg4mNjTX169c3TqfTnHfeeWb69Okn/T85/uYJY45enH3DDTeY0NBQ4+/vb84//3xz7733WhdJL1u2zLRu3do4nU7ToUMHk5KS4naTyezZs02nTp1MYGCgCQ4ONldeeaVZt26dtX9JZsaMGeaqq64yTqfTxMTEmIULF1rrK3sB9JEjR8yNN95oQkNDjSS31+NyuUx0dLTp27fvSd8H2Ftpaal57LHHTHR0tPHx8TFNmjQxkydPttZ/99135vLLLzd+fn6mbt26ZujQoSYvL89af6obl4wxJjU11XTo0ME4nU5z7MfZ8V+rxhgzceJEExYWZoKCgsxtt91mRo4caS666CJrfVFRkbn77rtN3bp1TYMGDcyUKVPKjEvZ2dnmlltuMSEhIcbf39/Exsaabdu2uR1n5syZJioqygQGBpr4+HgzadIkawzLyMgwcXFx1tgZHR1txo8fb91YVp7jxytjjElPTzfx8fEmLCzMOJ1O06xZMzN06FCTk5NjjDFm3bp1pmvXrsbPz8+0bNnSvP3225Ua48u7eYKx4+ziMKac5zIAZxmXy6XWrVvrpptu0qOPPurpcs5p+fn5atSokebNm6e//vWvni4HKOOqq65SRESEFixY4OlS8AeMHdWDvzyBs9KxqYzevXursLBQzz//vHbt2mVdQIya53K5lJWVpaefflqhoaG6/vrrPV0SoEOHDmnWrFmKjY2Vt7e33njjDS1fvtx6diY8j7GjehHscFby8vLS/Pnzdf/998sYo3bt2mn58uVVvqAXpy8tLU1NmzZV48aNNX/+fNWqxfACz3M4HPrwww81adIkHTlyRK1atdK7776rPn36eLo0/Iaxo3oxFQsAAGAT3BULAABgEwQ7AAAAmyDYAQAA2ATBDgAAwCYIdgAAADZBsAMAALAJgh0AAIBNEOwAAABsgmAHAABgE/8PrnsqLoewfEcAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "proportions, plot = ncf(sphere_sample_v1, title=False)\n", "plot.figure.savefig('ncf-v1.png', dpi=300)" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }