{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "97cfff1b-1ccc-42d4-89e6-fee188714604", "metadata": {}, "outputs": [], "source": [ "####################################\n", "# This Sage worksheet is written by Bryan Curtis and Leslie Hogben hogben@aimath.org \n", "# using code written by numerous various people.\n", "# It includes computations for the paper\n", "# Zero forcing irredundant sets\n", "# by\n", "# Bryan Curtis, Leslie Hogben, and Riana Roux\n", "# \n", "# To run computations, you must first enter the function F- cells at the end of this file \n", "###################################" ] }, { "cell_type": "code", "execution_count": null, "id": "6afe0d86-1374-44f5-8621-044dc27bcd1f", "metadata": {}, "outputs": [], "source": [ "# Verify ZIR(P_4) (Observation 3.4)\n", "# up_low_ZIR(G) returns [ZIR(G), zir(G)]" ] }, { "cell_type": "code", "execution_count": 16, "id": "82cf9689-71f2-4d3e-80ed-7d92f9337b5a", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "Graphics object consisting of 8 graphics primitives" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "[2, 1]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g=graphs.PathGraph(4)\n", "show(g)\n", "up_low_ZIR(g)" ] }, { "cell_type": "code", "execution_count": null, "id": "3c64b6a0-2414-412e-b031-bbd252e25131", "metadata": {}, "outputs": [], "source": [ "# ZIRsets(G) redurns all maximal ZIr-sets of G" ] }, { "cell_type": "code", "execution_count": 17, "id": "3e209b82-b766-4e46-b966-339fa0f7812d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{1, 2}, {3}, {0}]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ZIRsets(g)" ] }, { "cell_type": "code", "execution_count": null, "id": "ad478914-2fc8-491e-b8ff-8a5784b3cd87", "metadata": {}, "outputs": [], "source": [ "# Verify zir(H(3,5)), Z(H(3,5)), Zbar(H(3,5)), ZIR(H(3,5)) (comment before Proposition 3.6)" ] }, { "cell_type": "code", "execution_count": 7, "id": "7ef4cc48-5a6a-4543-bc9e-d45459f4e052", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "Graphics object consisting of 20 graphics primitives" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "g=Graph({0:[1,2,3],4:[1,2,3,5],6:[5,7],8:[7]})\n", "show(g)" ] }, { "cell_type": "code", "execution_count": 8, "id": "31eceb8b-6e92-4554-b147-7c4f6e172bfa", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[5, 2]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "up_low_ZIR(g)" ] }, { "cell_type": "code", "execution_count": 9, "id": "34124890-afea-46a3-a19a-a1648bd74a55", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Z(g)" ] }, { "cell_type": "code", "execution_count": 10, "id": "3fb41029-ac30-422e-b853-04fd24220098", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "zbar(g)" ] }, { "cell_type": "code", "execution_count": null, "id": "708f255b-cc8e-4a76-8642-14344a4ee810", "metadata": {}, "outputs": [], "source": [ "# Example 7.2: Verify that zir(G)=3 for the graph G in Figure 7.2 (the pentasun)" ] }, { "cell_type": "code", "execution_count": 18, "id": "4a83e676-9637-4357-8f13-86178aa59493", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "Graphics object consisting of 21 graphics primitives" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "g=Graph({0:[1,5],1:[2,6],2:[3,7],3:[4,8],4:[0,9]})\n", "show(g)" ] }, { "cell_type": "code", "execution_count": 19, "id": "5c4adef9-a874-459d-b840-982e2af44831", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[5, 3]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "up_low_ZIR(g)" ] }, { "cell_type": "code", "execution_count": null, "id": "606cecdb-db6f-45b0-9dc9-60764de3db20", "metadata": {}, "outputs": [], "source": [ "# Example 7.4: Verify that zir(G)=4 for the graph G in Figure 7.2" ] }, { "cell_type": "code", "execution_count": 3, "id": "f91f87d5-8898-4bc3-873e-aba7a02f4873", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAB6CAYAAAC7p/QzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAAArJ0lEQVR4nO2de1hU5b7Hv2tmABGVUBS8hHgjLyjKaIoiYhambmmzS/IuWnkp8lK7vcusXacMc6vt0uyyLYYTouX2cgyPVl5QMe0oiIqVYUphCireEkWYmd/5wz1sWKy5rivD+3kenqdmFmvW8HXNd+az3vcdjojAYDAYDIYNndoHwGAwGAxtwYqBwWAwGHVgxcBgMBiMOrBiYDAYDEYdJCkGjuNYwXgpLFvvhOXqvUiRrUc74DgumuO4lb4+hgK9TlcFwKLX6ap8fQwFHMet5DguWuyBMdSBZeudsFy9Fzmy5dwZrspxXFeDXv+J2WKJC2kZZH54kNEQ1a0LWgQ0xY2KWzhW9DN2HMozl125ajDo9fvMFssTRHTa3YNiKA/L1jthuXovcmbrcjFwHDdRp+M+vbdNa/2KebMMY2MHwWDQ19vObLbgy9xDeO7dj8wlFy9ZrFaaTkTr3HvKDCVh2XonLFfvRe5sXSoGjuMmAsic/PAIfPCXZ7kA/yZOf6fidiXmLF1JmTt2AcBkIspy+ksMxWHZeicsV+9FiWydFgPHcd10Ou7ExIQHfE2vPM/pdK5flrBarUh5Yzllfb27ymqlSPYRVVuwbL0Tlqv3olS2TovBx2DY275N8ODCtR8ZhJpp9cYvsWztv3Ch/Ap6deqId+bPxtC+kTX3V9yuROTEmebfLpV/W202D3P5WTBkx162+46ewLK1/0LeqSJcuHwFm5a8ij8OG1zv91m22sRermkZ67F57wH8+Ms5+Pv5YnDvnljy9Azc1/HeOr/PctUu9rL9YFM2PtyUjeILFwEAvTqH4ZUZkzAqZkCd33c1W4d1w3Gc0WyxxK2YO1OwFD7fuRcL/vERFqaMR37G+4iNisTo5xbh19KLNdsE+DfB8nkzDWaLJY6NfNAOjrKtqKxEn26dsPL5px3ug2WrPRzluu/oCTz96Fgc/Oc7+PrdNJjNFoyc/zIqblfW2Y7lqk0cZduhdTDSnp6Bw+nv4XD6exhu7Is//uV1nDxTXGc7V7N19jkkJbRVkHls7CDBO99Ztwkzxo7Ek4mj0CM8DP9YMBv3tmmNDzZl19kuMTYGIS2DzACmO3k8hnLYzXZUzAC8OSsFf4qPdboTlq3msJvr9n8sRsqYBPTqHI6obp3x6aLn8GvpReT9WFRvW5arJrGb7dihgzB68P2ICOuAiLAOWDw7Bc38m+BQ4Y/1tnUlW4Ojo/Ax6IeOHGg0CF3trqquRt6pIvx1SnKd2x8aGI2DJ36o+yAGPUYONBq+v3g1FUCqo8dkKIMxOhqRoS0FRzK4A8tWW7iT6/WbtwAALVs0r3cfy1V7uJqtxWLBht37UVF5BzG9e9S735btuq/32H3n57AYLBZrz6huXQTvu3ztBiwWK0JaBtW5PSQoCKVXrtTbPqpbZ6zfZUJ+fr6jh2QoxInCQkwaKs2bwahunfH57gxJ9sUQR+HJk5g0NMXpdkSE59/7CLFRvRDZJVxwG5artnCW7YnTZzF45gJUVlWhmb8/Ni15BT07dRTcNqpbZ2Tu2NXL3r7sFsO/p1X7tAho6vBgOa7u/xMIHLh62wU2C0BVVRWMRqPD/TGUw1m2rhLYLAB37tyB1WqFO6MkGNJitVpx584dl3JNXfY+jp8+i/0fLbe7DctVO7iS7X0dO+Boxmpcu3kTG/fkIuWN5chZvVSwHAKbBcBK5MNxnI6IrPz77RYDEVn1Ol31jYpbPkL3B9/TAnq9DqXlV+vcfvHqtXqfIgDg+s0K+Pr44OChQ3afGEM5YmJicKPiliT7un6zAn5+fuzFQ2V0Oh38/Pyc5vrs8tX4MvcQ9n6wDB3atLa7HctVO1y7dg2+Pj4Os/X18UHXe9sBAPr3iMCRH37Cu59vwUcvzqu37fWbFdBxXLXFaq1XCoATlaTX674/VvRzlL2DMN7XDd8cPoqk+CE1t+/8v6NIHFr/4sixojOwWq2YMWMG4uPjER8fj7i4OLRs2dLRITBkondkJI4V/SzJvo4VnUHvyEjnGzJkp2f37nZzJSI8u3w1tuz9FntWL0WndqEO98VyVY8rV65g3759yMnJQU5ODo4fPw69TufWOUt091qwEMeKzkCv052097sOi6HabNm/41BeL7PZIngBesGEP2Hq639H/+7dENO7Bz7esh2/ll3E7KQxdbYzmy346rsj8G/aFP7+/tiyZQveffddcByHPn36sKJQgZjBg7H5i89hNlvqXcy6ees2Tp87X/P/Z8+XouCnn9GyRXOEhbaps60t23tah2DXrl0YPnw4e4epMFarFXv27IHJZMLxwkKcL2kumOszy97Huq/3YMvbf0Pzpv4oLb97LTAwIAD+TfzqbGs2W7Ar7xiSkh9X7Hk0ZoSKgIgQFhaGdu3aITw8HGfPnsWOQ3mC2S78IB2jYgbg3pBg/F5xG+t37kXO0ePY/s6b9R7r7jmbZ662WHLtHY/DCW7/HueatzHtlTqfCmqzeuOX+HvmBlwov4rIzh2xYt4sxPXrXWebTTm5eOylNxEXF4cDBw5Ar9djxIgR6NGjB8rLy7Fv3z6cPXuWFYWC5Ofnw2g0QijbnPxjeOCZv9b7nWmjH0T6K3+uc5st27CwMPz6668ICwvD1KlTMW3aNHTt2lXW59DYOX36NDIyMpCRkYGSkhJEREQgISEBq1atEsxVF/Ow4H4+XfQcUsYk1LnNlmteXh6io9lUBqmxVwSdOnWqed07deoUdu7cCYvFgjFjxmDo0KF44YUXBLN9YvEK7D5SgAvlVxHYrCn6dOmEv0xJxkP318/Oli0AIxEJjgZybeZz61aDC7M+Fpzk5oyK25XoPWkWwiO6Y09ODsrKypCVlYX09HScOHECoaGhmDJlCh566CFcuHCh5g/FikJebty4gfsiIuALK06u+yc8zbbP5DkIj7gPu3bvxqFDh2AymbB+/XrcuHEDsbGxSElJwbhx49CiRQsZnkXj48aNG9iwYQNMJhNyc3MRGBiI8ePHIyUlBQMHDgTHcTAao3H5/G84mfWxx7lGTpqFsK4R2LdvnwzPovHhqAhsr29t27bF119/jczMTJSWlqJ3796YPn06Jk6ciJCQEJjNZnTr2hXWyluizlnRM58BwGyxPFFy8ZLl6aUrYec6hV2sVivmLF2JX8su4vebN/Hbb78hJCQECxYswLFjx5Cfn4/k5GR8+umnSEhIwMqVK2E0GnHkyBEUFxfDZDIhOjoaW7duRVJSEoKDg9G3b1/Mnz8fW7ZswRWBYbEM5xw9ehTR0dG4WVGBsqvX4Wm2s5e+h19KS2Hs3x9EhJiYGHz00UcoLS1FVlYWmjZtiqeeeqqm/Hft2uX24zDu/q137dqFKVOmIDQ0FE899RQCAgKwbt06XLhwAR9++CEGDRoEIsKSJUtQUHAM5y+VY46Ic7ak7BJ++eUXHD16VKZn5d1cuXIFW7Zswfz589G3b18EBwcjKSkJW7duRXR0NEwmE4qLi3HkyBEYjUasXLkSCQkJSE9PR3JyMvLz83Hs2DEsWLAAISEhOHfuHIYPH45fS0pQeuWamGyp5OIli9liecLhxkTk9AfABI7jaMrDI+j33VvIenCH05/fd2+hKQ+PII7j6G9/+xu1b9+egoODafv27cTnzp07tGnTJkpMTCS9Xk++vr702GOP0bZt26i6upqIiIqLiykjI4OmT59OnTp1IgDEcRxFRUXRvHnzaPPmzVReXl5v34z/YLVaafXq1eTr60vR0dF0+vRpysrKIjHZPvLIIwSARo0aRZcuXar3mCUlJfTWW29RREQEAaCwsDBatGgRFRUVqfAXaFgUFRXRokWL6N577yUAFBERQWlpaVRSUlJv20uXLtHDDz9MAOjll1+mzz77TFSuK1asoH79+pGfnx998MEHZLVaVfgLNBzKy8tp8+bNNG/ePIqKiiKO4wgAderUiaZPn04ZGRlUXFxMRETV1dWUnZ1Njz32GPn6+pJer6fExETatGkT3blzp96+t2/fTsHBwdShQwfKzc0Vdc4CsAKYQM5e851tYPtZu3Yt+fv7U+f27ehfaYuoav82wQOo2r+N/pW2iDq3b0f+/v6UlZVFRHf/4Y4ePZoA0EsvvVTzgs+ntLSUVqxYQb179yYAFBoaSi+88AIVFhbW2Y4VhXtcv36dkpOTCQClpqZSZWVlzX1is7X9w23fvj3t379f8PGtVit9++23NHPmTGrRogUBoNjYWFqzZg1dv35dkb9BQ+D69eu0Zs0aio2NJQAUGBhIs2bNooMHD9p9cd6/f3/NG68dO3bU3C4219u3b9MzzzxDAOjxxx9nOdXCnSKwUVhYSH/+858pNDSUAFDv3r1pxYoVVFpaKvgY1dXV9OKLLxIAGj16dJ03Xp5m60opkDvFQHT3Hczw+HgCQO3btKapox6k5XNn0pqFC2j53Jk0ddSD1L5NawJADwwfXu9docViobfffpv0ej3FxsbSuXPn7P7hrVYr5efn09y5c6lVq1YEgPr370+rVq0SfMFnRWGf/Px86tKlC7Vo0YI2bNgguI3YbM+dO0dDhw4lvV5PS5YsIYvFYvd4bt26RVlZWZSQkEAcx5G/vz9NnjyZdu7c6fD3vBWLxUI7d+6kyZMnk7+/P3EcRyNHjqR169bRrVu3HP5eWloa6fV6iouLEzyfxOZKRPTFF19Q8+bNqWvXrpSfny/pc28oeFIEtt9btWoV9e/fnwBQq1ataO7cuZSfn+/wU1hJSQnFxsaSXq+npUuXCp4XHmbrmiVydcPaB5SXl0epqanU32gkX19fAkC+vr7U32ik1NRUysvLc/hHzs3NdaiW+LiimviwohBWR84Qk211dTUtXLjQoVri05hVkzuqiA9fHdk7D2yIPWeLiooalVrytAiI3FdFfPjqyBm1s/Xz8yMA5OfnZy9b+YqBf1AAnP7D4uOqWuLjqmri09iKwpE6chVPs3VFLfFpLKrJE1XEx546chVPc/VmtSSmCGy4q4r4OFJH7uDkU7e2i8H2BFxVS3zcVU18vLkoXFFHriAmW3fUEh9vU02eqiKh/ThTR64gJlci71BLUhSBbT+eqCI+rqgjidB+MdhwVy3x8UQ18fGGovBEHTlCbLaeqCU+DVk1iVFFfNxVR46Q4pxtaGpJqiIgEq+K+LirjkTScIqByHO1xMdT1cSnoRWFFOqIj1TZeqKW+DQU1SSFKuIjVh3xkSpXLaslKYvAhlhVxEcqdeQmDasYiMSpJT5iVRMfLReFVOqIj5TZilFLfLSmmqRSRUL7lUId8ZEyVyJtqCU5isC2XylUER8F1RGfhlcMNsSqJT5SqCY+WigKqdURH6mzlUIt8VFTNUmpivhIqY74yHHOKq2W5CoCIulVER+F1RGfhlsMRNKpJT5SqSY+SheFHOqIj1zZSqGW+CilmuRQRXykVkd85MpVTrUkZxHYkFoV8VFJHfFp2MVAJK1a4iO1auIjZ1HIpY74yJmtlGqJj9SqSS5VJPQ4cqgjPnLmSiSNWlKiCGyPI4cq4qOiOuLT8IvBhtRqiY8cqomPFEUhtzriI3e2cqglPmJUk5yqiI+c6oiPEuesu2pJqSIgkl8V8VFZHfHxnmIgkk8t8ZFLNfFxtyiUUEd8lMpWDrXEx1XVpIQq4iO3OuKjVK6O1JKSRWBDblXERyPqiI93FQORvGqJj9yqiY+jopgwYQKFhoZS8+bNZVVHfJTMVk61xIevmpo0aUIjRoygBx98UFZVxEcpdcRHyVyJ7qqlZs2aUWhoKE2YMEGxIiBSThXx0ZA64uN9xWBDbrXERwnVxKe4uJhMJhPFxMQQgJofJUc9KZ2tEmqpNkVFRTR37lwKDAys+fsGBgbS3LlzZR/VpKQ64qNErvY+EQCgmJgYMplMshQBkfKqiI/G1BEf7y0GIuXUEh+lVBNfHZ06dUrx4bFqZSunWrKnir799ls6cOCAIhPolFZHfOTI1RU19OOPP8o6IU5pVcRHo+qIj3cXA5GyaomPnKrJlVFHSgyPVTNbKdWSu6OK5JpAp5Y64iNFrmKuEUg5IU4tVcRHw+qIj/cXgw2l1RIfqVSTmFFHchSF2tmKVUtSjCqSagKdmuqIjye5Sn2xWMyEOLVVER+NqyM+jacYiNRTS3w8VU1SjzqSoii0kq07akmuUUViJtCprY74uJKrEqOG3J0Qp7Yq4tNA1BGfxlUMROqqJT7uqCYlJqx5UhRaytaRWlJqApoNV1WTVtQRH6Fc1Rg+asORWtKKKuLTgNQRn8ZXDDbUVkt87Kmm7OxsWrlypWIT1mrjSlHs3r1bU9ny1dJ3332n2AQ0e9hTTd99951m1BEf2zm7bNkyVYpAiNpqadWqVfTll19qRhXxaWDqiE/jLQYi7aglPjbV1LNnz5rhe/369VP9C0+EisL2M2HCBM0sM379+nWaP38+GQwGAkDNmjWTfQKaK9RWTU2bNiUAZDAYaP78+ZpYjrr2JwJbialZBELk5eVR3759a46tV69eqqoiPg1UHfFp3MVApC21VBubOmrWrBmNGjVKkQl07lJcXEyvv/46AaB27dopMjzWHkKqaNiwYXTfffeRTqeTfUKcO8dpU0fdu3enuLg41ZYFd6SGEhMTCQBlZ2crcizOjpOvikaNGkVNmzalLl26qP6GyUYDVkd8WDHY0IpasjfqSI0JdK5QO1s1lhl3NqpI6QlxjrA36kipZcHduUag9jnryqgiLX1DXANXR3xYMdTm0qVLNGrUKNXUkqujjpSaQOcKjrKVqyg8GVWkxFpLjnBl1JHUy4KLuVis1jnr7qgitb8hzkvUER9WDHwsFgstWbJEcbXkyagjpddqEsKdbMUUhRSjipRca8lGbXU0dOhQl/89eTKBTspRQ0qes1KMKlLjG+Jqq6O33367IasjPqwY7KGUWpJqmWy1VJOYbF0pisOHD0s6qkhJtSTVhDV7qunw4cOyDR9VYjl1qSegKamWvEwd8WHF4Ai51ZJcy2QrqZqkzNZWFJMmTaLg4OCakSc6nY4iIyNpyZIldPnyZQmOWn61JMeEtcuXL1NaWhpFRkaSTqer+fsEBwfT5MmTJR01JNc5K/cENLnVkpeqIz6sGJwhl1pSYsKaEqpJqmyFVFFcXBzNmTOHpkyZIsvFbDnUkqfqSAhHamjKlCk0e/ZsGjp0qCyjmqQ8Z9WYgCaHWvJidcSHFYOrSKWWlP6GNRtyqSax2bqzVpEcF7OlVEti1ZGn1wjkGNUkNlctrFUkpVrycnXEhxWDO4hVS2p8w5oQUqomT7KVaq0iKYtCrFryRB1JvcSElKOaPD1ntbZWkVi11EjUER9WDO7iqVpSQh25ixSqydVslVirSGxReKKW3FFHSq41JHZZcHfOWa2uVVQbT9RSI1JHfFgxeIqrakktdeQunqomZ9lKsay1p3hSFO6oJWfqSM1F52rjiWpylqsWVJG7uKOWGpk64sOKQQzO1JJW1JG7uKOahLKVa1lrsbhTFM7UkpA60koR2MMd1WTvnNWaKnIXZ2qpkaojPqwYxGJPLWlRHbmLK6rJlu3hw4cVXdZaCpwVxZo1aygmJqaOWqqtjgYNGkRr1qzRbBE4wplqqn3ONgRV5C5CaqkRqyM+rBikwqaWWrVqRc8884zm1ZG72FNNixYtIgAUEhKiuCqSGnurx7Zp04YAUM+ePalHjx41tzWkInCEkGqaPn06AaARI0Y0GFXkLrXVUmpqamNWR3xYMUjJmTNnaj5iG41GunnzptqHJAtFRUWUnJxcs3S0rRDWrl3bYN9BClFQUEBz586lnj17kl6vr3muer2eevbsSXPnzqWCggK1D1MyrFYrZWZmUp8+fWpKr0mTJpScnCz5gn5a4ffff6fo6GgCQG3btqUzZ86ofUhagBWDVNRWR5MmTdLcMt5iERpVlJCQUONrAwMDCQANGDCA3n//fU0sC+4u9q4RBAUFEcdxFBYWRh06dCCO4ygoKEjyCXdqIaSKxo0bRwBo4MCBqi0LLje11dGkSZOoWbNmiq61pGFYMYjF3qgjrSzjLRahUUVvvfVWjSqyZXvo0KF6qmncuHGqLwvuCGcXi1etWkXDhg2rM+qo9qil+Ph4WrlyJaWkpFB4eHiDKgpno4pqn7NKLQuuJEKjjrS0jLfKsGIQg7NRR2ov4+0p7owqEspWS8uC18adUUPOJqwJjVo6e/YsmUwmTReFq6OKhHKVellwNXA26kjtZbw1AisGT3F11JFay3i7iz1VlJWV5XBUkaNshUY1KamaPBk+6s6ENWcT4rRSFJ6MKnJ2zoqdQKcG7ow6UmMZbw3BisFdPJ2wplW15EwVOcPVbIVGNUmtmsTOI/BkrSN3JsQpWRRiJ6C5c842BNXkyYS1RqyWWDG4g9gJa1pRS1JOQPMkW6lUk5QTysQuk+3JWktyFIVUE9A8yVWLqknshLVGqpZYMbiKVBPW1FJLnqoiZ4jJ1l3VJMfMYimXyRa7jLenRSHHBDSx56wWVJOUE9YamVpixeAMudY6UkotiVVFzpAqWyHV9Mgjj9CiRYvo2WeflWVmsVTfsFYbKZfxdlQUzz77LL388suUmJgoywQ0Kc9ZNVSTHGsdNSK1xIrBEXKvdSSXWlJyrSKpv9Bl8+bN9NRTT1G7du3qTCiLjIykxYsXSzazWI5vWKuNHN8Qd/bsWVq8eDH16tWrzoS7du3a0ZNPPinpNQo5zlklVJPcax01ErXEisEeSq11JJVakksVOUNMts7UkMlkouzsbElHNUmpjpwh1TfE2VNF2dnZlJ6eLsvFbLnPWTlUk5JrHXm5WmLFwEetZbI9VUtyqyJnuLtuv6fXCKQY1SSHOnKGp2rJk1FFUl7MVvKclUI1qbFMtherJVYMtVF7mWxX1ZKWlrV2lK1cy1B7MqpJbnXkDFfVkpTLWospCjXOWU9Uk9rLZHupWmLFYEMry2TbU0tqqSJn8JdnVvL7CFwZ1aSkOnKGPbWk1LLW7hSF2uesK6pJS8tke5laYsWg1W9Ys6mloKAgmjBhgmqqyBHl5eW0bNmymuNScxlqIdWUmJhIRqNRUXXkjNpqyWg00tixY1Vb1tpRUUyYMIEA0O7duxU5FkcIqaYJEyZQUFCQppbJ9iK11LiLQW11ZA+bKho4cGDNyJN+/frR/v37Vf3HZu8TAQBKTEzUzPcRlJaWUmpqKhkMBgLuro6qhbWaiP6jimyrsxoMBkpNTdXEN6DVLoq2bdvWZKuVtZ6sVivt27eP+vbtW3NsAwcO1NRaTV6ilhpvMdjUUfPmzemLL75Q+3DsqqLMzEx64403VFlryRU1lJ2drals+epox44dqq3VZMOeKtq+fTsNGTJE9KglObCds6+99prqaz3ZqK2O3nzzTcrMzNTsWk0NXC01vmLgqyO113NxdVRR7Yunck2I8+QagZayrT3qaOHChXXUkRJrNdXG1VFF1dXV9NJLL0kyIU5KhHJVc1FAR6OOtLpWUwNWS42rGLSijjwdVST1hDgpLhZrJVt3Rh3JuSy4p6OK5JgQJwZXclWiKNwZdaTFtZoaqFpqPMWgtjqSalSRmAlxcowaUjtbMaOOpFoWXKpRRbVVidpqyZNcpS4KMaOOtLBWU20amFry/mJQWx3JNQHNFbWkxPBRNbN1pI7cxV3VJHZZa3toRS1JkauYopBywppWVFMDUkveXQxqqSOlJqDx1VJZWZmi8wiI1MtWzglrjlSTlBPQHKG2WpIjV1eKoqysTLYJa1pQTQ1ELXlvMSitjtSYgFZeXk4bN26kIUOG1AzfU3oegdLZKjlhzaaaZs6cSQEBATV/34CAAJo5c6bkE9D4qKmWlMhVqChsP0OGDKGNGzfKdjFbbdWkcbXkfcWgtDpScq0iR2po9OjRFBQUREFBQYp+Q5yS2UqpjpwhpIoGDBhAAwYMIJ1OJ/uoptrHoYZaUrrwt2/fTi1btqSWLVvSqFGjFB31pJZq0rBa8q5iUEodKaWK3L1GoMY3xCmVrVJrHbmiiuQc1WQPpdWSUrk6GnWk9PBYNVSTRtWS9xSD3OpICVUkxcVipb8hTu5slVBHno4qkmpUk6soqZaUOGfdHXWkZFEorZo0ppYafjHIrY7kVEVyjhpSYkIckbzZyqmOpB5VpNQEOqXUktzFIMWoI6WKQinVpCG11LCLQS51JJcqUnr1USXUklzZyqWOlBhVpIRqklstyZWrnMtky10USqgmjailhlsMUqsjOVSR0kUghNxqSeps5VBHSi1rzUdu1SSnWpLjnFV6mWw5i0Ju1aSyWmp4xSC1OpJSFWmhCOwhl1qSMlsp1ZFcE9A8RS7VJJdakroY1PiGNT5yFYVcqklFtdSwikEqdSSVKtJyEQghh1qSKlup1JFSE9DEIIdqklotSZWr2t+w5gipi0IO1aSSWmo4xSBWHUmhihpaEQghtVoSm60U6kgtVSQWqVWTlGpJinNWS9+w5gpSFoXUqklhtaT9YhCrjsSoIm8oAntIpZbEZCtGHWlNFYlFKtUklVoSWwxaUEdikaoopFJNCqolbReDp+rIU1XkzUUghBRqydNsPVVHDUEViUUK1SRWLXmaq5bVkVjEFoUUqkkhtaTdYnBXHXmiihpbEQghVi25m60n6qihqiKxiFVNYtSSJ+dsQ1NHYhFTFGJVk1i15OQx5CuGvLw8Sk1NJWN0NPn6+hIA8vX1JWN0NKWmptr9B+euOnJHFbEisI87asnTbN1RR96misTiqWpyRy15miuRd6gjsXhaFJ6qJnfUUu1s/fz8CAD5+fnZy1b6YigqKqLh8fEEgNq3aU3TRj9IK+bNojULF9CKebNo2ugHqX2b1gSAhsfH13nyrqojV1URKwL3cKaWxGTrqjpqDKpILJ6oJkdqSUyu3qyOxOJuUXiimpypJQ+zlbYY1q5dS/7+/tS5fTvamPYKVe3fRtaDO+r9VO3fRhvTXqHO7duRv78/ZWVlOVVHrqgiVgTisaeWPM02MzPTqTpqrKpILO6qJiG1JOacbWzqSCzuFIW7qklILXmaLYAJ5MLrPUdEcAbHcRM5jls7eeQDWP2XZxHg38Tp71TcrsTTS1ci86vd0Ol0iIqKwueff46uXbvWbHP69GlkZGQgIyMDJSUliIiIQEpKCqZMmYKmTZti3759yMnJQU5ODo4fPw4iQqdOnRAfH4/4+HgMGzYMHTt2dHosjLrk5uZi/PjxuHPnDmbMmIG///3vcDfbOUtXYu2OXSAACxcuxOuvvw6DwQAAMJvN+Oqrr2AymbB161ZYLBaMGTMGKSkpGDNmDHx9fWV+ht5FVVUVtm3bBpPJhG3btkGv1+ORRx5BSkoKEhIS6vzdX331VaSlpSEqKgrHjx93O1fbORsQEIB77rkH69evx5AhQ+R+il5HcXEx9u7dW/P6VVxcDI7j0KdPn5rXr7i4ONy6dQufffYZTCYTfvrpJ4SFhWHq1KmYNm1avdfK5ORkfP/995g4cSJMJpNH2X62YxcBmExEWY62d1oMHMd10+m4E5MSHvBLf+V56HQ61/4yAKxWK6b91zJ8sXsfCgqOoWfPnrhx4wY2bNgAk8mE3NxcBAYGYvz48UhKSsKtW7dq/pisCOTl8uXLePTRR5Gbux8TEx6AycNs/5VzAIWFhejatStOnjwJk8mEzMxMlJaWonfv3pg+fTomTpyIkJAQGZ9N46GsrAxZWVlIT0/HiRMnEBoaiilTpmDatGno1asXAOCTTz7BrJkzMf6heGS8+mePcv181z4cOHAA999/v1xPpVHhrCiGDRuGpk2bYtOmTVi/fj1u3LiB2NhYpKSkYNy4cWjRogUqKyvx5JNPYt26LExMGA7TK+5nm/LGcsr6eneV1UqRRHTa3rZOi8HHYNjbvk3w4MK1HxnsNVNaxnq8/KEJc5P/iH8smF3nvorblYia8jQCW7dBr8hIbNy4EZWVlYiPj0ffvn1RVVWF3NxcVgQq8MDw4Sj+6Uccz/yw5l3Ha2s+w399srbOdiEtg3Bh27p6v3832znwCWiO5i1a4MiRI2jVqhUmTZqElJQU9O3bFxzHKfJcGhtEhIKCAphMJqxduxbl5eUYMGAAUlJSsG7dOlwoPoOC/15d793kbxcv48XVn2D7wSO4facKEWHtsWbhAhi7d6vZxnbOduwWgd179ij91BoFjooiNjYWfn5+OHr0KHJyctCkSRM8+uijSElJweI338QvRadw7LMP6mTbKWkqfim9WO9x5vzpD3j/hdSa/6+4XYnIiTPNv10q/7babB5m7/gcFgPHcUYARzamvYKkeOGPk4e/P4XHF72FFgFNER8dVa8YAGBTTi4ee+lNBAcHIyIiAteuXcMPP/zAikBF8vLy0L9/f/CzfW3NZ9i4JxffvJdWc5tep0ProHsE92PLNi4uDvPnz2eqSAVqq6bs7GxYrdZ6uQLA1Ru/I3raMxhujMLspD+gTctA/HzuAsLbhqBLh3Z1trXlmpeXh+joaCWfTqPEXlF0794dQUFBKC4uxvnz5wFAMNtLV6/BYrXW/H/hz8VImLcQu99/G/HRUXW2tWULwEhE+ULHY3ByvCmhrYLMY2MHCW5389ZtTH5tKT5+cR4Wm+q/o7SRGBuDkJb3oOzyZTRv3hzx8fH461//yopARUwmEzqEtMHY2EH17jPo9Qht1dKl/STGxqB9m2D06dMHSUlJUh8mwwV8fX2RlJSEpKQkPPHEE9jx5f8I5vp25gbcG9Iany56vua28Lahgvu8m2trpKens2JQgPDwcISHh2PatGkA6heFrRRCWwUJZst/47bkv79Al/ZtMaxfn3rb3n09DjKXXbk6HYD7xeBj0A8dOdBoMBj0gvenLnsfowffjwfvj3ZYDAaDHiMH9kfBuTIcO37c0UMyFOLgt99ihLEPhLItKvkN7cdOhJ+PDwb26o7Fs1PQuX1bwf0YDHqMMPbFoYMH5T5khgscKyjAQwP6Ceb65f5DSBhoRPLCN7G34ATaBwdjzqN/wFOPjKq37d1co1iuKiFUFA88MBxxPboKZlubqupqrP1qNxaM/5Ogyr37emw0rPt6T6y9fTgsBovF2jOqWxfB+9Z/k4P8U6fxf5++5/AgbUR164z1u/YhP1+woBgKc6KwEJOGTq93+8Be3ZHx6guIuLc9yq5cxWLTOgyZ+RwKsz5Cq8AWgvuK6tYZn+/OkPuQGS5QePIkJg1NEbzvzPkL+HBzNhaM/xNemjYe//f9Kcxb8QH8fHwwdfSD9bZnuWqH8PBwnD9/AVGJI51uu2XvQVy7eRMpYx6yu01Ut87I3LGrl7377RYDx3E6AD4tAprWu6+k7BLmv/Mhvnr3LTTxc80nBzYLQFVVFYxGo0vbM+RHKNtRMQNq/rs3OiGmd090fWw6Mv73Gzw34VHB/QQ2C8CdO3dgtVrdGiXBkBar1Yo7d+4I5nr3fkL/7t3w1py7bwj63dcVJ8/+gg83ZwsWA8tVOzjLtjafZu/AqEED0K51K7vbBDYLgJXIh+M4HRFZ+ffbLQYisup1uuobFbd8+Pfl/ViEi1evof/0/1zttlis2FdQiPc3bkXl3i+h19f9uHP9ZgV8fX1xkH001QQxMTG4UXHL6XYB/k3Qu0s4ikrO293m+s0K+Pn5sRcPldHpdPDz87Oba9vglujRKazObT3Cw7BpzwHB7Vmu2sFZtjZ+uVCGnYcLsDHtFYfbXb9ZAR3HVVus1nqlADhRSXq97vtjRT9H8W8f0b8vjmd+WOe2GYuXo3vHe/GXycn1SgEAjhWdAVksBdHR0f0cHjFDEchqKRDKls+dqir8UFyC2KhIu9scKzoDq9lcAIBlqzJWi9lurkN698RPv56rc9tPv/6GjqFtBPfFctUWjrK1kb7ta7QJCsSYwY7nnxwrOgO9TnfS3v0O3wpUmy37dxzKM5vNljq3Nw9oisgu4XV+Apo0QcsWLRDZJbzefsxmC776Ls9cbbHkOjxahmLYy/bP7/0Te/OP4+z5Unx38keMW7gYNypuYZqAagBYtlrDXq4AMH98Eg4V/oi3TOtxuuQ8sr7ag3/+z//i6cfG1tuW5ao9HGUL3NVNpm3fYOrohxxeoHYlW2efEdPLrlw1fJl7yKUDt8fW3IMou3LVACBd1I4YUiKY7W+XLmPi35ag++NP4tEX34CvjwEH17yDjm2FZy6zbDWH3XN2QM/7sGnJq1j/TQ56T56FN9Oz8M782Zg08oF627JcNYnD1+Odh4/i19KLmPGHBIc7cSVb12Y+t241uDDrY7sznx3h6kw7hvKwbL0Tlqv3olS2Tq8qmS2WJ0ouXrLMWbqS7FynsIvVasWcpSup5OIli9liecKtX2bIDsvWO2G5ei9KZeu0GIjotNVK0zN37ELKG8up4nalSwdRcbsSKW8sp8wdu2C10nRHCzYx1IFl652wXL0XpbJ1adlt4O7S2zod9+m9bVrrl8+baUiMjRG8wGE2W7A19yCef/djc8nFS5Z/H4T9adEM1WHZeicsV+9F7mxdLoZ/H0xXg17/idliiQtpGWQeOdBoiOrWGYHNAnD9ZgWOFZ3BV9/lmcuuXDUY9Pq9ZovlSfauo2HAsvVOWK7ei5zZulUMtQ4oGsB0H4M+1mKx9rIS+eg4rlqv05389xCodHur9jG0DcvWO2G5ei9yZOtRMQgcmOC0akbDh2XrnbBcvRcpspWkGBgMBoPhPbBFUBgMBoNRB1YMDAaDwagDKwYGg8Fg1IEVA4PBYDDq8P/YmvpVShj0ZAAAAABJRU5ErkJggg==\n", "text/plain": [ "Graphics object consisting of 26 graphics primitives" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "g=graphs.CompleteBipartiteGraph(4,4)\n", "g.add_edges([(0,1),(5,4)])\n", "g.delete_edge([3,7])\n", "show(g)" ] }, { "cell_type": "code", "execution_count": 7, "id": "88520b09-450a-4004-8f85-338f770d5684", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[5, 4]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "up_low_ZIR(g)" ] }, { "cell_type": "code", "execution_count": 8, "id": "34b90e20-266b-432f-8703-ad0075493442", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.treewidth()" ] }, { "cell_type": "code", "execution_count": 4, "id": "71bf18b2-4c18-4a94-a694-54159bda2d7a", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/lib/python3/dist-packages/sage/misc/remote_file.py:46: DeprecationWarning: ssl.SSLContext() without protocol argument is deprecated.\n", " content = urlopen(req, timeout=1, context=SSLContext())\n", "/usr/lib/python3/dist-packages/sage/misc/remote_file.py:46: DeprecationWarning: ssl.PROTOCOL_TLS is deprecated\n", " content = urlopen(req, timeout=1, context=SSLContext())\n", "Compiling /home/jupyter-hogben@iastate.edu-c55cc/.sage/temp/sagemath2/464433/tmp_w27tzsmg.pyx...\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "xrange test failed: define xrange = range\n", "Loading Zq_c.pyx...\n", "Loading Zq.py...\n", "Loading zero_forcing_64.pyx...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Compiling /home/jupyter-hogben@iastate.edu-c55cc/.sage/temp/sagemath2/464433/tmp_ph4ft_98.pyx...\n", "Compiling /home/jupyter-hogben@iastate.edu-c55cc/.sage/temp/sagemath2/464433/tmp_90gk2z3z.pyx...\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Loading zero_forcing_wavefront.pyx...\n", "Loading minrank.py...\n", "Loading inertia.py...\n" ] } ], "source": [ "# Cell F-ZIR1\n", "# load main minimum rank/maximum nullity and zero forcing functions\n", "# developed by S. Butler, L. DeLoss, J. Grout, H.T. Hall, J. LaGrange, J.C.-H. Lin,T. McKay, J. Smith, G. Tims\n", "# updated and maintained by Jephian C.-H. Lin \n", "load(\"https://raw.githubusercontent.com/jephianlin/minrank_aux/master/load_all.py\")\n", "load_all(mr_JG=True, minrank_aux=False, timeout=5, load_func=\"loadurl\")" ] }, { "cell_type": "code", "execution_count": 5, "id": "3d874706-c5e9-47d2-b83c-c65d70f151d5", "metadata": {}, "outputs": [], "source": [ "# Cell F-ZIR2\n", "# Useful tools\n", "\n", "\n", "# function: is_fort(G,F)\n", "# input: graph G and set F of vertices \n", "# output: True if F is a fort, False if F is not a fort\n", "\n", "def is_fort(G,F):\n", " # initialize flag isFort\n", " if len(F) > 0: \n", " isFort = True\n", " else:\n", " isFort = False\n", " F = set(F)\n", " V = set(G.vertices())\n", " Z = V - F\n", " # check if a vertex in the complement of F is adjacent to exactly 1 vertex in F\n", " for v in Z:\n", " if len(set(G.neighbors(v)) & F) == 1:\n", " isFort = False\n", " break\n", " return isFort\n", "\n", "\n", "# function: kforts(G,k)\n", "# input: a graph G and a positive integer k \n", "# output: a list of all forts of G of size k\n", "\n", "def kforts(G,k):\n", " V = G.vertices()\n", " S = Subsets(V,k) \n", " forts = []\n", " for f in S:\n", " if is_fort(G,f):\n", " forts.append(set(f))\n", " return forts\n", "\n", "\n", "# function: all_forts(G)\n", "# input: a graph G\n", "# output: a list of all forts of G\n", "\n", "def all_forts(G):\n", " V = set(G.vertices())\n", " S = Subsets(V) \n", " forts = []\n", " for f in S:\n", " if is_fort(G,f):\n", " forts.append(set(f))\n", " return forts\n", " \n", "\n", "# function: is_ZIRset(G,T)\n", "# input: graph G and set of vertices T with at least 1 element\n", "# output: True if T is a ZIR set and False otherwise\n", "\n", "def is_ZIRset(G,T):\n", " T = set(T)\n", " S = set([])\n", " ZIR = False\n", " forts = all_forts(G)\n", " for F in forts:\n", " F_int = F.intersection(T)\n", " if len(F_int) == 1:\n", " S = S.union(F_int)\n", " if len(S) == len(T):\n", " ZIR = True\n", " break\n", " return ZIR\n", "\n", "\n", "# function: ZIRset_cert(G,T)\n", "# input: graph G and set T\n", "# output: False if T is not a ZIR set, otherwise private forts\n", "\n", "def ZIRset_cert(G,T):\n", " T = set(T)\n", " S = set([])\n", " ZIR = False\n", " cert = []\n", " forts = all_forts(G)\n", " for F in forts:\n", " F_int = set(F).intersection(T)\n", " if len(F_int) == 1:\n", " cert.append(F)\n", " S = S.union(F_int)\n", " if len(S) == len(T):\n", " ZIR = True\n", " break\n", " return cert if ZIR == True else ZIR\n", " \n", "\n", "# function: mult_ZIR_cert(G,T,forts)\n", "# input: graph G, set T, and list of all forts\n", "# output: False if T is not a ZIR set, otherwise private forts\n", "\n", "def mult_ZIRset_cert(G,T,forts):\n", " T = set(T)\n", " S = set([])\n", " ZIR = False\n", " cert = []\n", " for F in forts:\n", " F_int = set(F).intersection(T)\n", " if len(F_int) == 1:\n", " cert.append(F)\n", " S = S.union(F_int)\n", " if len(S) == len(T):\n", " ZIR = True\n", " break\n", " return cert if ZIR == True else ZIR" ] }, { "cell_type": "code", "execution_count": 6, "id": "51943646-038e-4263-a77f-05ea9ca82346", "metadata": {}, "outputs": [], "source": [ "# Cell F-ZIR3\n", "# Function for finding ZIR sets\n", "\n", "# Possible improvements: Carry fort data with vertices - would reduce checking if ZIR set\n", "# Incorporating bounds on lower zir number (min degree)\n", "\n", "\n", "\n", "# function: is_ZIRset_mult(G,T,forts)\n", "# input: graph G, set of vertices T with at least 1 element, list of all forts\n", "# output: True if T is a ZIR set and False otherwise\n", "\n", "def is_ZIRset_mult(G,T,forts):\n", " T = set(T)\n", " S = set([])\n", " ZIR = False\n", " for F in forts:\n", " F_int = F.intersection(T)\n", " if len(F_int) == 1:\n", " S = S.union(F_int)\n", " if len(S) == len(T):\n", " ZIR = True\n", " break\n", " return ZIR\n", "\n", "\n", "# function: extend(G,L,k)\n", "# input: graph G, list L, and integer k\n", "# output: add vertices to L to increase size of ZIR set\n", "\n", "def extend(G,L,forts):\n", " n = G.order()\n", " k = L[-1:][0] # last element of L\n", " new_L = list(L)\n", " for i in range(k+1,n+1): # add each vertex greater than k to L in consecutive order if resulting list is ZIR set \n", " if is_ZIRset_mult(G,new_L + [i],forts):\n", " new_L.append(i)\n", " return new_L\n", "\n", "\n", "# function: update(L,ord)\n", "# input: list L, positive integer ord\n", "# output: updates L to the next list that needs to be checked\n", "\n", "# function: update(L,ord)\n", "# input: list L, positive integer ord\n", "# output: updates L to the next list that needs to be checked\n", "\n", "def update(L,ord):\n", " n = len(L)\n", " flag = False\n", " if ord - L[-1:][0] > 1: # check if L contains the largest vertex and proceed if not\n", " new_L = [x for x in L if x < L[-1:][0]] # remove largest vertex v from L\n", " new_L.append(L[-1:][0] + 1) # add vertex v+1 to L\n", " flag = True\n", " else: # runs the following if L contains largest vertex\n", " for s,t in zip(reversed(L),reversed(L[:n-1])): # zip L and copy of L with last element removed\n", " if s - t > 1: # check for non consecutive vertices\n", " flag = True\n", " new_L = [x for x in L if x < t] # once non consecutive pair (t,s) is found (t < w), remove t and all vertices after t\n", " new_L.append(t+1) # append t+1\n", " break\n", " return new_L if flag == True else False\n", "\n", "\n", "# function: max_subsets(sets)\n", "# input: list of lists\n", "# output: removes subsets\n", "\n", "def max_subsets(sets):\n", " sets = reversed(sorted(map(set, sets), key=len))\n", " maximal_subsets = []\n", " for s in sets:\n", " if not any(s.issubset(maximal_subset) for maximal_subset in maximal_subsets):\n", " maximal_subsets.append(s)\n", " return maximal_subsets\n", "\n", "\n", "# function: ZIRsets(G)\n", "# input: graph G\n", "# output: all maximal ZIR sets\n", "\n", "def ZIRsets(G):\n", " ord = G.order()\n", " forts = all_forts(G)\n", " L = [0]\n", " zsets = [] # initialize all maximal ZIR sets\n", " flag1 = True\n", " while flag1 == True:\n", " L = extend(G,L,forts) # extend L to obtain maximal ZIR set\n", " zsets.append(L)\n", " flag2 = True\n", " while flag2 == True: # update L to next ZIR set (still needs to be extended) and check if done\n", " L = update(L,ord)\n", " if L == False:\n", " flag1 = False\n", " flag2 = False\n", " elif is_ZIRset_mult(G,L,forts):\n", " flag2 = False\n", " zsets = max_subsets(zsets) # remove ZIR sets that are not maximal\n", " return zsets\n", "\n", "\n", "# function: up_low_ZIR(G)\n", "# input: graph G\n", "# output: upper and lower ZIR number\n", "\n", "def up_low_ZIR(G):\n", " zsets = ZIRsets(G)\n", " return [len(zsets[0]),len(zsets[-1])]" ] }, { "cell_type": "code", "execution_count": 4, "id": "d0728432-fff0-4acb-b7cf-1a213563d3af", "metadata": {}, "outputs": [], "source": [ "# Cell F-ZIR4 Zero forcing sets \n", "#\n", "# Zero forcing number Z(G)\n", "def Z(g):\n", " z = len(zero_forcing_set_bruteforce(g))\n", " return z\n", "\n", "# All zero forcing sets of G of size k\n", "# input: a graph G and a positive integer k \n", "# output: a list of all zero forcing sets of G of size k\n", "def ZFsets(G,k):\n", " ord=G.order()\n", " V = G.vertices()\n", " AllSubs = set(Subsets(V,k))\n", " ZF=[]\n", " for s in AllSubs:\n", " A = zerosgame(G,s)\n", " if len(A) == ord:\n", " ZF.append(s)\n", " return ZF\n", "\n", "def all_ZFsets(G,k): \n", " S = []\n", " for i in [Z(G)..k]:\n", " ZFS_size_i = ZFsets(G,i)\n", " S = S + ZFS_size_i\n", " return S" ] }, { "cell_type": "code", "execution_count": 5, "id": "2228d372-ce06-47ef-8dd7-40773433d3fd", "metadata": {}, "outputs": [], "source": [ "# Cell F-ZIR5 \n", "#\n", "# Input: list of lists/sets/tuples\n", "# Output: list without super-lists/sets/tuples\n", " \n", "def get_minimal_subsets(sets):\n", " out = [x for x in sets if not any(set(x).issuperset(set(y)) and len(x)>len(y) for y in sets)]\n", " return out\n", "\n", "\n", "# Input: graph G\n", "# Output: all minimal zero forcing sets\n", "\n", "def ZF_min_sets(G):\n", " ord = G.order()\n", " ZFS = all_ZFsets(G,ord)\n", " mZFS = get_minimal_subsets(ZFS)\n", " return mZFS\n", "\n", "\n", "# Input: graph G\n", "# Output: the zero forcing number and upper minimal zero forcing number\n", "\n", "def zbar(G):\n", " min_list = ZF_min_sets(G)\n", " Zb = max(len(x) for x in min_list)\n", " return Zb\n" ] }, { "cell_type": "code", "execution_count": null, "id": "1c306c2b-00af-462f-90a3-2f2b5b7b68a6", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "SageMath 9.5", "language": "sage", "name": "sagemath" }, "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.10.12" } }, "nbformat": 4, "nbformat_minor": 5 }