diff --git a/docs/examples/C2.h5 b/docs/examples/C2.h5 index 443672aa..dc0632d1 100644 Binary files a/docs/examples/C2.h5 and b/docs/examples/C2.h5 differ diff --git a/docs/examples/C2.svg b/docs/examples/C2.svg index e0c0d5c9..6ce6a47b 100644 --- a/docs/examples/C2.svg +++ b/docs/examples/C2.svg @@ -6,7 +6,7 @@ - 2023-11-23T11:14:38.174767 + 2023-11-25T15:35:54.097458 image/svg+xml @@ -39,30 +39,30 @@ L 162 392.123697 z " style="fill: none"/> - + +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" id="image7aae0fa287" transform="scale(1 -1) translate(0 -274.32)" x="162" y="-117.803697" width="274.32" height="274.32"/> - - + - - + @@ -98,12 +98,12 @@ z - + - + @@ -191,22 +191,22 @@ z - - + - - + @@ -219,12 +219,12 @@ L 3.5 0 - + - + @@ -348,20 +348,20 @@ L 516.494118 392.123697 z " style="fill: none"/> - + +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" id="image187fb025de" transform="scale(1 -1) translate(0 -275.04)" x="516.494118" y="-117.083697" width="275.04" height="275.04"/> - + - + @@ -387,12 +387,12 @@ z - + - + @@ -405,12 +405,12 @@ z - + - + @@ -452,12 +452,12 @@ z - + - + @@ -472,12 +472,12 @@ z - + - + @@ -490,12 +490,12 @@ z - + - + @@ -615,12 +615,12 @@ z - + - + @@ -635,12 +635,12 @@ z - + - + @@ -653,12 +653,12 @@ z - + - + @@ -681,12 +681,12 @@ z - + - + @@ -699,12 +699,12 @@ z - + - + @@ -745,12 +745,12 @@ z - + - + @@ -771,12 +771,12 @@ z +" clip-path="url(#p77787fdcf4)" style="fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000"/> +" clip-path="url(#p77787fdcf4)" style="fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000"/> +" clip-path="url(#p77787fdcf4)" style="fill: none; stroke: #0000ff; stroke-width: 2; stroke-linecap: square"/> - + +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" id="image3a3fbca3d5" transform="scale(1 -1) translate(0 -274.32)" x="162" y="-480.683697" width="274.32" height="274.32"/> - + - + @@ -939,12 +939,12 @@ iVBORw0KGgoAAAANSUhEUgAAAX0AAAF9CAYAAADoebhRAABHCUlEQVR4nO2de9A9RXnnn+aSmBAvkVIk - + - + @@ -967,12 +967,12 @@ iVBORw0KGgoAAAANSUhEUgAAAX0AAAF9CAYAAADoebhRAABHCUlEQVR4nO2de9A9RXnnn+aSmBAvkVIk - + - + @@ -985,12 +985,12 @@ iVBORw0KGgoAAAANSUhEUgAAAX0AAAF9CAYAAADoebhRAABHCUlEQVR4nO2de9A9RXnnn+aSmBAvkVIk - + - + @@ -1199,20 +1199,20 @@ L 516.494118 755.003697 z " style="fill: none"/> - + +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IPK7XBvP1ewzbxt8AxPXy0ZK/7KmoeSZ7j9vGtfnxhb+95vHLvO5MLr/m9SPr9m8CZ/wAySj8AMko/ADJyPin1fnozG0aS+ln/ktu07jmbwBG1zR6+xpl+qN1/vX7iK8b9xXnw2fwfKYf0cza8tlsvXfLw5lcfrTtmrn9zLr+0evsat3+aN/0OOMHSEbhB0hG1LPIzFLPUvrRxujf1tHS0J6ZuGaJ0T0N43yML2Kc03vuIOrpbjvz2e2yvcFsjLTkOGa23WWb5iWO5ThuPmf8AMko/ADJKPwAycj4VzWb+c/sK5q5PrBLvSWpo4y/t7xxlOlHM3/KM5n/bN49s/RxtK81c/qfu+3LvHZv3zPPZV+c8QMko/ADJKPwAyQj49+pmfYHo69ipmXDmpn/KKefaRc983uC0Zr/JddPZizNrHvPn9n3mscxe8xLMv0lrNvfFWf8AMko/ADJKPwAycj492rm1otLMv+RXfXumf0dQ+89jJ67y8x/yWe7pA3xrp47ev4us3Tr9o+RM36AZBR+gGQUfoBkZPxHa5SN9nr17Kv/fnzt2Uy/t/3M+79q3/uy5LaWM/uafX+77Kezq9spWre/L874AZJR+AGSEfUc1ExMEvXaPRwy+llyHDN/jqNYYK3lnUvjhzWjoJn9rhnHiGBOjTN+gGQUfoBkFH6AZGT8R2PJbRtHWflMHr50X0ssueYRHWOrgDWXZM7u+1DXGjhGzvgBklH4AZJR+AGSkfEfrV1m/r3Xml3z32sdscSSNf7Hap/tDHaV6c/ue83XZS3O+AGSUfgBklH4AZI5heA0iTUz/2gmpz9U358M9rV+XraenTN+gGQUfoBkRD03Vu/f9TVbPM+87ug4ZuKJY7nD1iGtGaMt+fyO5ThYizN+gGQUfoBkFH6AZGT8J2mXSz+j3p/QktsjrpkrH/LP/FC3uVzCEt1T54wfIBmFHyAZhR8gGRl/Cksy/5FeHrzmbwKiXV63OBa7WvO+z8/Duv1j5IwfIBmFHyAZhR8gGRl/Skv67cxY8zcBkey471DXNXwvN4EzfoBkFH6AZBR+gGRk/Aws6bcz61T68+zDsfw2QaZ/EznjB0hG4QdI5tT/H2bn9rU0dNaxRCGnSLxz0znjB0hG4QdIRuEHSEbGzx6tmQ3v83pBNjL8U+eMHyAZhR8gGYUfIBkZPzfUoXLoU7i2IMPPzhk/QDIKP0AyCj9AMjJ+mCIf5+Zzxg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5CMwg+QjMIPkIzCD5DM/wONAmckKch2ZQAAAABJRU5ErkJggg==" id="imaged262915010" transform="scale(1 -1) translate(0 -275.04)" x="516.494118" y="-479.963697" width="275.04" height="275.04"/> - + - + @@ -1227,12 +1227,12 @@ iVBORw0KGgoAAAANSUhEUgAAAX4AAAF+CAYAAACF2nH8AAAWrElEQVR4nO3dQZMcRXYH8GQFSMCsdrwi - + - + @@ -1245,12 +1245,12 @@ iVBORw0KGgoAAAANSUhEUgAAAX4AAAF+CAYAAACF2nH8AAAWrElEQVR4nO3dQZMcRXYH8GQFSMCsdrwi - + - + @@ -1273,12 +1273,12 @@ iVBORw0KGgoAAAANSUhEUgAAAX4AAAF+CAYAAACF2nH8AAAWrElEQVR4nO3dQZMcRXYH8GQFSMCsdrwi - + - + @@ -1293,12 +1293,12 @@ iVBORw0KGgoAAAANSUhEUgAAAX4AAAF+CAYAAACF2nH8AAAWrElEQVR4nO3dQZMcRXYH8GQFSMCsdrwi - + - + @@ -1311,12 +1311,12 @@ iVBORw0KGgoAAAANSUhEUgAAAX4AAAF+CAYAAACF2nH8AAAWrElEQVR4nO3dQZMcRXYH8GQFSMCsdrwi - + - + @@ -1401,12 +1401,12 @@ z - + - + @@ -1421,12 +1421,12 @@ z - + - + @@ -1439,12 +1439,12 @@ z - + - + @@ -1467,12 +1467,12 @@ z - + - + @@ -1485,12 +1485,12 @@ z - + - + @@ -1522,81 +1522,81 @@ L 897.575294 768.779874 L 900.529412 768.682092 L 903.483529 768.56887 L 906.437647 768.440209 -L 909.391765 768.270376 -L 912.345882 768.090251 -L 915.3 767.884393 -L 918.254118 767.652803 -L 921.208235 767.369748 -L 924.162353 766.927154 -L 927.116471 766.386777 -L 930.070588 765.753764 -L 933.024706 765.038408 -L 935.978824 764.220124 -L 938.932941 763.257738 -L 941.887059 762.14096 -L 944.841176 760.80803 -L 947.795294 759.264096 -L 950.749412 757.591502 -L 953.703529 755.785099 -L 956.657647 753.855182 -L 959.611765 751.590746 -L 962.565882 749.187356 -L 965.52 744.931245 -L 968.474118 740.587645 -L 971.428235 733.995048 -L 974.382353 727.448769 -L 977.336471 718.849059 -L 980.290588 710.305959 -L 983.244706 698.777921 -L 986.198824 687.332226 -L 989.152941 673.25155 -L 992.107059 659.232632 -L 995.061176 641.919989 -L 998.015294 624.694836 -L 1000.969412 604.469304 -L 1003.923529 584.171722 -L 1006.877647 562.165521 -L 1009.831765 540.159319 -L 1012.785882 517.489226 +L 909.391765 768.280669 +L 912.345882 768.110836 +L 915.3 767.925564 +L 918.254118 767.704267 +L 921.208235 767.431506 +L 924.162353 767.035229 +L 927.116471 766.55661 +L 930.070588 765.995647 +L 933.024706 765.357488 +L 935.978824 764.621546 +L 938.932941 763.741504 +L 941.887059 762.727654 +L 944.841176 761.497654 +L 947.795294 760.061795 +L 950.749412 758.507569 +L 953.703529 756.829828 +L 956.657647 755.028572 +L 959.611765 752.892797 +L 962.565882 750.618068 +L 965.52 746.464886 +L 968.474118 742.208776 +L 971.428235 735.703668 +L 974.382353 729.193414 +L 977.336471 720.593704 +L 980.290588 712.014579 +L 983.244706 700.435076 +L 986.198824 688.891599 +L 989.152941 674.687409 +L 992.107059 660.529537 +L 995.061176 643.057354 +L 998.015294 625.657221 +L 1000.969412 605.246417 +L 1003.923529 584.753271 +L 1006.877647 562.587529 +L 1009.831765 540.396056 +L 1012.785882 517.576716 L 1015.74 494.654447 L 1018.694118 466.56 L 1021.648235 494.654447 -L 1024.602353 517.489226 -L 1027.556471 540.159319 -L 1030.510588 562.165521 -L 1033.464706 584.171722 -L 1036.418824 604.469304 -L 1039.372941 624.694836 -L 1042.327059 641.919989 -L 1045.281176 659.232632 -L 1048.235294 673.25155 -L 1051.189412 687.332226 -L 1054.143529 698.777921 -L 1057.097647 710.305959 -L 1060.051765 718.849059 -L 1063.005882 727.448769 -L 1065.96 733.995048 -L 1068.914118 740.587645 -L 1071.868235 744.931245 -L 1074.822353 749.187356 -L 1077.776471 751.590746 -L 1080.730588 753.855182 -L 1083.684706 755.785099 -L 1086.638824 757.591502 -L 1089.592941 759.264096 -L 1092.547059 760.80803 -L 1095.501176 762.14096 -L 1098.455294 763.257738 -L 1101.409412 764.220124 -L 1104.363529 765.038408 -L 1107.317647 765.753764 -L 1110.271765 766.386777 -L 1113.225882 766.927154 -L 1116.18 767.369748 -L 1119.134118 767.652803 -L 1122.088235 767.884393 -L 1125.042353 768.090251 -L 1127.996471 768.270376 +L 1024.602353 517.576716 +L 1027.556471 540.396056 +L 1030.510588 562.587529 +L 1033.464706 584.753271 +L 1036.418824 605.246417 +L 1039.372941 625.657221 +L 1042.327059 643.057354 +L 1045.281176 660.529537 +L 1048.235294 674.687409 +L 1051.189412 688.891599 +L 1054.143529 700.435076 +L 1057.097647 712.014579 +L 1060.051765 720.593704 +L 1063.005882 729.193414 +L 1065.96 735.703668 +L 1068.914118 742.208776 +L 1071.868235 746.464886 +L 1074.822353 750.618068 +L 1077.776471 752.892797 +L 1080.730588 755.028572 +L 1083.684706 756.829828 +L 1086.638824 758.507569 +L 1089.592941 760.061795 +L 1092.547059 761.497654 +L 1095.501176 762.727654 +L 1098.455294 763.741504 +L 1101.409412 764.621546 +L 1104.363529 765.357488 +L 1107.317647 765.995647 +L 1110.271765 766.55661 +L 1113.225882 767.035229 +L 1116.18 767.431506 +L 1119.134118 767.704267 +L 1122.088235 767.925564 +L 1125.042353 768.110836 +L 1127.996471 768.280669 L 1130.950588 768.440209 L 1133.904706 768.56887 L 1136.858824 768.682092 @@ -1610,7 +1610,7 @@ L 1157.537647 768.96 L 1160.491765 768.96 L 1163.445882 768.96 L 1166.4 768.96 -" clip-path="url(#pcd69c3a34b)" style="fill: none; stroke: #0000ff; stroke-width: 2; stroke-linecap: square"/> +" clip-path="url(#pbd245fd908)" style="fill: none; stroke: #0000ff; stroke-width: 2; stroke-linecap: square"/> +" clip-path="url(#p4c5c2dd45c)"/> +" clip-path="url(#p4c5c2dd45c)" style="fill: #ffffff"/> - + @@ -1675,7 +1675,7 @@ L 443.687395 254.88 - + @@ -1730,13 +1730,13 @@ z " style="fill: none"/> +iVBORw0KGgoAAAANSUhEUgAAABMAAAF+CAYAAABgTSH8AAABt0lEQVR4nO2aAW7DIBAEz/Hl3/1346ZvWDQSJzH7gBXDYMCyr6qfb0F5UUVVVV3VZNkbKxMzj5hLZWKGoTG5kaFzJmYeMZfKxAwjZh4ac+6Bcsi5yWFeVd+ZbyiW5em6uDJ4ZDdZxj2aNCb3aNJloAB4zkCb6JxNXhraTKPNPNpcKdNmGm3m0eZKmTbTaDOPNjeX+fKa5xibYm4t89nMc4xNMTeXeaVKc8jSoDGxz07V1Q9WRmNyI+vX/cHKWMx+g5j3WJvkyPrusTZRzNdYm0VigmU0JrfOugdjajMt02ac0ZhjDxRtLpRpM4w282hzc5nXgzzaXCjT5t4yl0YebS6UaTPOaExvjmG0mUebS2XaDDPa5lxMrwc7y7SZ5xybHihp2WCbD4n5GWvz+ePKwL9SaJvgyPriVgb9kxGJSZZNxtRmXuacpZmMqc00MCYoYDKmi3Zr2WRMbaZxC8rjot1cNhlTm2ncgvJoc6VsLqZb0NYyF20eba6UzcWcugU5Z3kmY2ozDYv5S2KCXyRpTHILGoyJ2uS6aMypZSwmKUDMPGLmEXOhbC4mutMecqCIGUfMPIdg/gMLILlpFu5/gQAAAABJRU5ErkJggg==" id="image2cffceeadd" transform="scale(1 -1) translate(0 -275.04)" x="798.48" y="-117.36" width="13.68" height="275.04"/> - + @@ -1749,7 +1749,7 @@ iVBORw0KGgoAAAANSUhEUgAAABMAAAF+CAYAAABgTSH8AAABt0lEQVR4nO2aAW7DIBAEz/Hl3/1346Zv - + @@ -1784,7 +1784,7 @@ z " style="fill: none"/> +iVBORw0KGgoAAAANSUhEUgAAABMAAAF+CAYAAABgTSH8AAABvElEQVR4nO2aAW7DIBAEz/Hl5/11k7pvWDQSJzH7gBXDYMCyr+d5noLyooqqqq6qH2xkXfWmuljMrmqyTMwwYuY5B5MbGTpnYuYRc6lMzDBi5qEx5x4oh5ybHOZVNfQNxbI8XRdXBo/sJsu4R5PG5B5NugwUAM8ZaBOds8lLQ5tptJlHmytl2kyjzTzaXCnTZhpt5tHm5jJfXvMcY1PMrWU+m3mOsSnm5jKvVGkOWRo0JvbZqbr6i5XRmNzI+nV/sDIWs98g5j3WJjmyvnusTRTzNdZmkZhgGY3JrbPuwZjaTMu0GWc05tgDRZsLZdoMo8082txc5vUgjzYXyrS5t8ylkUebC2XajDMa05tjGG3m0eZSmTbDjLY5F9Prwc4ybeY5x6YHSlo22OaXxPyMtfn948rAv1Jom+DI+uJWBv2TEYlJlk3G1GZe5pylmYypzTQwJihgMqaLdmvZZExtpnELyuOi3Vw2GVObadyC8mhzpWwuplvQ1jIXbR5trpTNxZy6BTlneSZjajMNi/lLYoJfJGlMcgsajIna5LpozKllLCYpQMw8YuYRc6FsLia60x5yoIgZR8w8h2D+A6rxvWJPnDrKAAAAAElFTkSuQmCC" id="imagee98c7bc44b" transform="scale(1 -1) translate(0 -275.04)" x="443.52" y="-480.24" width="13.68" height="275.04"/> @@ -1811,13 +1811,13 @@ z " style="fill: none"/> +iVBORw0KGgoAAAANSUhEUgAAABMAAAF+CAYAAABgTSH8AAABt0lEQVR4nO2aAW7DIBAEz/Hl3/1346ZvWDQSJzH7gBXDYMCyr6qfb0F5UUVVVV3VZNkbKxMzj5hLZWKGoTG5kaFzJmYeMZfKxAwjZh4ac+6Bcsi5yWFeVd+ZbyiW5em6uDJ4ZDdZxj2aNCb3aNJloAB4zkCb6JxNXhraTKPNPNpcKdNmGm3m0eZKmTbTaDOPNjeX+fKa5xibYm4t89nMc4xNMTeXeaVKc8jSoDGxz07V1Q9WRmNyI+vX/cHKWMx+g5j3WJvkyPrusTZRzNdYm0VigmU0JrfOugdjajMt02ac0ZhjDxRtLpRpM4w282hzc5nXgzzaXCjT5t4yl0YebS6UaTPOaExvjmG0mUebS2XaDDPa5lxMrwc7y7SZ5xybHihp2WCbD4n5GWvz+ePKwL9SaJvgyPriVgb9kxGJSZZNxtRmXuacpZmMqc00MCYoYDKmi3Zr2WRMbaZxC8rjot1cNhlTm2ncgvJoc6VsLqZb0NYyF20eba6UzcWcugU5Z3kmY2ozDYv5S2KCXyRpTHILGoyJ2uS6aMypZSwmKUDMPGLmEXOhbC4mutMecqCIGUfMPIdg/gMLILlpFu5/gQAAAABJRU5ErkJggg==" id="image20a4d04994" transform="scale(1 -1) translate(0 -275.04)" x="798.48" y="-480.24" width="13.68" height="275.04"/> - + @@ -1830,7 +1830,7 @@ iVBORw0KGgoAAAANSUhEUgAAABMAAAF+CAYAAABgTSH8AAABt0lEQVR4nO2aAW7DIBAEz/Hl3/1346Zv - + @@ -1856,25 +1856,25 @@ z - + - + - + - + - + - + - + diff --git a/docs/examples/clusters.h5 b/docs/examples/clusters.h5 index a20691a0..029f3341 100644 Binary files a/docs/examples/clusters.h5 and b/docs/examples/clusters.h5 differ diff --git a/docs/examples/clusters.py b/docs/examples/clusters.py index de2f0962..5f3a1952 100644 --- a/docs/examples/clusters.py +++ b/docs/examples/clusters.py @@ -22,6 +22,7 @@ parser.add_argument("--save", action="store_true") parser.add_argument("--check", action="store_true") parser.add_argument("--plot", action="store_true") + parser.add_argument("--show", action="store_true") args = parser.parse_args() if args.save: @@ -44,6 +45,7 @@ import matplotlib.pyplot as plt import matplotlib as mpl import matplotlib.cm as cm + import prrng from mpl_toolkits.axes_grid1 import make_axes_locatable # color-scheme: modify such that the background is white @@ -52,12 +54,30 @@ cmap[0, :3] = 1.0 cmap = mpl.colors.ListedColormap(cmap) + # reshuffle for better visualisation + assert np.all(np.diff(np.unique(clusters)) == 1) + assert np.all(np.diff(np.unique(clusters_periodic)) == 1) + assert np.unique(clusters).size >= np.unique(clusters_periodic).size + rng = prrng.pcg32() + lab = np.unique(clusters) + lab = lab[lab != 0] + new = np.copy(lab).astype(np.int64) + rng.shuffle(new) + rename = np.array(([0] + list(lab), [0] + list(new))).T + clusters = GooseEYE.labels_rename(clusters, rename) + lmap = GooseEYE.labels_map(clusters_periodic, clusters) + unq, unq_idx, unq_cnt = np.unique(lmap[:, 1], return_inverse=True, return_counts=True) + assert np.all(np.in1d(np.unique(clusters_periodic), lmap[:, 0])) + assert np.all(np.equal(np.sort(lmap[:, 0]), np.unique(lmap[:, 0]))) + assert np.all(np.equal(np.sort(lmap[:, 1]), np.unique(lmap[:, 1]))) + clusters_periodic = GooseEYE.labels_rename(clusters_periodic, lmap) + try: plt.style.use(["goose", "goose-latex"]) except OSError: pass - fig, axes = plt.subplots(figsize=(18, 6), nrows=1, ncols=3) + fig, axes = plt.subplots(figsize=(8 * 4, 6), nrows=1, ncols=4) ax = axes[0] im = ax.imshow(img, clim=(0, 1), cmap=mpl.colors.ListedColormap(cm.gray([0, 255]))) @@ -82,13 +102,9 @@ ax.set_xlabel(r"$x$") ax.set_ylabel(r"$y$") ax.set_title(r"clusters") - div = make_axes_locatable(ax) - cax = div.append_axes("right", size="5%", pad=0.1) - cbar = plt.colorbar(im, cax=cax) - cbar.set_ticks([]) ax = axes[2] - im = ax.imshow(clusters_periodic, clim=(0, np.max(clusters) + 1), cmap=cmap) + im = ax.imshow(clusters_periodic, clim=(0, np.max(clusters_periodic) + 1), cmap=cmap) ax.xaxis.set_ticks([0, 500]) ax.yaxis.set_ticks([0, 500]) ax.set_xlim([0, 500]) @@ -96,10 +112,23 @@ ax.set_xlabel(r"$x$") ax.set_ylabel(r"$y$") ax.set_title(r"clusters (periodic)") - div = make_axes_locatable(ax) - cax = div.append_axes("right", size="5%", pad=0.1) - cbar = plt.colorbar(im, cax=cax) - cbar.set_ticks([]) - fig.savefig(root / "clusters.svg") + ax = axes[3] + im = ax.imshow( + np.where(clusters_periodic != clusters, clusters_periodic, 0), + clim=(0, np.max(clusters_periodic) + 1), + cmap=cmap, + ) + ax.xaxis.set_ticks([0, 500]) + ax.yaxis.set_ticks([0, 500]) + ax.set_xlim([0, 500]) + ax.set_ylim([0, 500]) + ax.set_xlabel(r"$x$") + ax.set_ylabel(r"$y$") + ax.set_title(r"difference") + + if args.show: + plt.show() + else: + fig.savefig(root / "clusters.svg") plt.close(fig) diff --git a/docs/examples/clusters.svg b/docs/examples/clusters.svg index 810b33d7..c8b7b301 100644 --- a/docs/examples/clusters.svg +++ b/docs/examples/clusters.svg @@ -1,12 +1,12 @@ - + - 2023-11-23T11:19:40.956742 + 2023-11-25T15:34:51.371528 image/svg+xml @@ -22,8 +22,8 @@ - - + +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" id="imagee213e97c12" transform="scale(1 -1) translate(0 -332.64)" x="303.850957" y="-51.84" width="332.64" height="332.64"/> - - + - - + - + - + - + - + - + - - + - - + - + @@ -219,17 +219,17 @@ L 3.5 0 - + - + - + @@ -238,7 +238,7 @@ L 3.5 0 - + - - - - - + - - + +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" id="image3a77c0ba7d" transform="scale(1 -1) translate(0 -332.64)" x="781.575652" y="-51.84" width="332.64" height="332.64"/> - + - + - + @@ -497,17 +497,17 @@ iVBORw0KGgoAAAANSUhEUgAAAX0AAAF9CAYAAADoebhRAABHH0lEQVR4nO2df9AERXnnn+ZHxHgiJxXU - + - + - + @@ -516,7 +516,7 @@ iVBORw0KGgoAAAANSUhEUgAAAX0AAAF9CAYAAADoebhRAABHH0lEQVR4nO2df9AERXnnn+ZHxHgiJxXU - + @@ -525,17 +525,17 @@ iVBORw0KGgoAAAANSUhEUgAAAX0AAAF9CAYAAADoebhRAABHH0lEQVR4nO2df9AERXnnn+ZHxHgiJxXU - + - + - + @@ -543,17 +543,17 @@ iVBORw0KGgoAAAANSUhEUgAAAX0AAAF9CAYAAADoebhRAABHH0lEQVR4nO2df9AERXnnn+ZHxHgiJxXU - + - + - + @@ -562,34 +562,34 @@ iVBORw0KGgoAAAANSUhEUgAAAX0AAAF9CAYAAADoebhRAABHH0lEQVR4nO2df9AERXnnn+ZHxHgiJxXU - + - - - - - + - - + +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" id="image3155caf88c" transform="scale(1 -1) translate(0 -332.64)" x="1247.384348" y="-51.84" width="332.64" height="332.64"/> - + - + - + @@ -764,17 +764,17 @@ iVBORw0KGgoAAAANSUhEUgAAAX0AAAF9CAYAAADoebhRAABGsklEQVR4nO2de/BtRXXnV/NQCAGNlK8h - + - + - + @@ -783,7 +783,7 @@ iVBORw0KGgoAAAANSUhEUgAAAX0AAAF9CAYAAADoebhRAABGsklEQVR4nO2de/BtRXXnV/NQCAGNlK8h - + @@ -792,17 +792,17 @@ iVBORw0KGgoAAAANSUhEUgAAAX0AAAF9CAYAAADoebhRAABGsklEQVR4nO2de/BtRXXnV/NQCAGNlK8h - + - + - + @@ -810,17 +810,17 @@ iVBORw0KGgoAAAANSUhEUgAAAX0AAAF9CAYAAADoebhRAABGsklEQVR4nO2de/BtRXXnV/NQCAGNlK8h - + - + - + @@ -829,34 +829,34 @@ iVBORw0KGgoAAAANSUhEUgAAAX0AAAF9CAYAAADoebhRAABGsklEQVR4nO2de/BtRXXnV/NQCAGNlK8h - + - - - - - + - - - - + + - - - + + - + + + + + + - + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + + + + - - + + - - + + - - + + diff --git a/environment.yaml b/environment.yaml index 5d354713..291e0a3c 100644 --- a/environment.yaml +++ b/environment.yaml @@ -3,7 +3,6 @@ channels: dependencies: - catch2 - cmake -- docopt - doxygen - enstat >=0.9.7 - h5py @@ -16,6 +15,7 @@ dependencies: - python - python-prrng - scikit-build +- scipy - setuptools_scm - xsimd - xtensor diff --git a/include/GooseEYE/Ensemble.hpp b/include/GooseEYE/Ensemble.hpp index 185d1e1c..3ef1162b 100644 --- a/include/GooseEYE/Ensemble.hpp +++ b/include/GooseEYE/Ensemble.hpp @@ -14,7 +14,7 @@ namespace GooseEYE { inline Ensemble::Ensemble(const std::vector& roi, bool periodic, bool variance) : m_periodic(periodic), m_variance(variance), m_shape_orig(roi) { - GOOSEEYE_ASSERT(m_shape_orig.size() <= MAX_DIM); + GOOSEEYE_ASSERT(m_shape_orig.size() <= MAX_DIM, std::out_of_range); m_first = xt::atleast_3d(xt::zeros(m_shape_orig)); m_second = zeros_like(m_first); @@ -70,7 +70,7 @@ inline array_type::array Ensemble::norm() const inline array_type::array Ensemble::distance(size_t axis) const { - GOOSEEYE_ASSERT(axis < m_shape_orig.size()); + GOOSEEYE_ASSERT(axis < m_shape_orig.size(), std::out_of_range); axis = detail::atleast_3d_axis(m_shape_orig.size(), axis); array_type::tensor dist = xt::empty(m_shape); @@ -113,7 +113,7 @@ inline array_type::array Ensemble::distance() const inline array_type::array Ensemble::distance(const std::vector& h) const { - GOOSEEYE_ASSERT(m_shape_orig.size() == h.size()); + GOOSEEYE_ASSERT(m_shape_orig.size() == h.size(), std::out_of_range); array_type::array ret = xt::zeros(m_shape_orig); @@ -126,7 +126,7 @@ inline array_type::array Ensemble::distance(const std::vector& h inline array_type::array Ensemble::distance(const std::vector& h, size_t axis) const { - GOOSEEYE_ASSERT(m_shape_orig.size() == h.size()); + GOOSEEYE_ASSERT(m_shape_orig.size() == h.size(), std::out_of_range); return this->distance(axis) * h[axis]; } diff --git a/include/GooseEYE/Ensemble_C2.hpp b/include/GooseEYE/Ensemble_C2.hpp index 285d7864..94b73e1c 100644 --- a/include/GooseEYE/Ensemble_C2.hpp +++ b/include/GooseEYE/Ensemble_C2.hpp @@ -20,13 +20,13 @@ inline void Ensemble::C2(const T& f, const T& g, const M& fmask, const M& gmask) static_assert(std::is_integral::value, "Integral image required."); static_assert(std::is_integral::value, "Integral mask required."); - GOOSEEYE_ASSERT(xt::has_shape(f, g.shape())); - GOOSEEYE_ASSERT(xt::has_shape(f, fmask.shape())); - GOOSEEYE_ASSERT(xt::has_shape(f, gmask.shape())); - GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size()); - GOOSEEYE_ASSERT(xt::all(xt::equal(fmask, 0) || xt::equal(fmask, 1))); - GOOSEEYE_ASSERT(xt::all(xt::equal(gmask, 0) || xt::equal(gmask, 1))); - GOOSEEYE_ASSERT(m_stat == Type::C2 || m_stat == Type::Unset); + GOOSEEYE_ASSERT(xt::has_shape(f, g.shape()), std::out_of_range); + GOOSEEYE_ASSERT(xt::has_shape(f, fmask.shape()), std::out_of_range); + GOOSEEYE_ASSERT(xt::has_shape(f, gmask.shape()), std::out_of_range); + GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size(), std::out_of_range); + GOOSEEYE_ASSERT(xt::all(xt::equal(fmask, 0) || xt::equal(fmask, 1)), std::out_of_range); + GOOSEEYE_ASSERT(xt::all(xt::equal(gmask, 0) || xt::equal(gmask, 1)), std::out_of_range); + GOOSEEYE_ASSERT(m_stat == Type::C2 || m_stat == Type::Unset, std::out_of_range); // lock statistic m_stat = Type::C2; diff --git a/include/GooseEYE/Ensemble_L.hpp b/include/GooseEYE/Ensemble_L.hpp index fdff9847..c7786e03 100644 --- a/include/GooseEYE/Ensemble_L.hpp +++ b/include/GooseEYE/Ensemble_L.hpp @@ -18,8 +18,8 @@ inline void Ensemble::L(const T& f, path_mode mode) static_assert(std::is_integral::value, "Integral image required."); - GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size()); - GOOSEEYE_ASSERT(m_stat == Type::L || m_stat == Type::Unset); + GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size(), std::out_of_range); + GOOSEEYE_ASSERT(m_stat == Type::L || m_stat == Type::Unset, std::out_of_range); // lock statistics m_stat = Type::L; diff --git a/include/GooseEYE/Ensemble_S2.hpp b/include/GooseEYE/Ensemble_S2.hpp index 0355e75a..a350471a 100644 --- a/include/GooseEYE/Ensemble_S2.hpp +++ b/include/GooseEYE/Ensemble_S2.hpp @@ -19,13 +19,13 @@ inline void Ensemble::S2(const T& f, const T& g, const M& fmask, const M& gmask) static_assert(std::is_integral::value, "Integral mask required."); - GOOSEEYE_ASSERT(xt::has_shape(f, g.shape())); - GOOSEEYE_ASSERT(xt::has_shape(f, fmask.shape())); - GOOSEEYE_ASSERT(xt::has_shape(f, gmask.shape())); - GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size()); - GOOSEEYE_ASSERT(xt::all(xt::equal(fmask, 0) || xt::equal(fmask, 1))); - GOOSEEYE_ASSERT(xt::all(xt::equal(gmask, 0) || xt::equal(gmask, 1))); - GOOSEEYE_ASSERT(m_stat == Type::S2 || m_stat == Type::Unset); + GOOSEEYE_ASSERT(xt::has_shape(f, g.shape()), std::out_of_range); + GOOSEEYE_ASSERT(xt::has_shape(f, fmask.shape()), std::out_of_range); + GOOSEEYE_ASSERT(xt::has_shape(f, gmask.shape()), std::out_of_range); + GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size(), std::out_of_range); + GOOSEEYE_ASSERT(xt::all(xt::equal(fmask, 0) || xt::equal(fmask, 1)), std::out_of_range); + GOOSEEYE_ASSERT(xt::all(xt::equal(gmask, 0) || xt::equal(gmask, 1)), std::out_of_range); + GOOSEEYE_ASSERT(m_stat == Type::S2 || m_stat == Type::Unset, std::out_of_range); // lock statistic m_stat = Type::S2; diff --git a/include/GooseEYE/Ensemble_W2.hpp b/include/GooseEYE/Ensemble_W2.hpp index 29f86cf2..4354dfe5 100644 --- a/include/GooseEYE/Ensemble_W2.hpp +++ b/include/GooseEYE/Ensemble_W2.hpp @@ -19,11 +19,11 @@ inline void Ensemble::W2(const T& f, const T& g, const M& gmask) static_assert(std::is_integral::value, "Integral mask required."); - GOOSEEYE_ASSERT(xt::has_shape(f, g.shape())); - GOOSEEYE_ASSERT(xt::has_shape(f, gmask.shape())); - GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size()); - GOOSEEYE_ASSERT(xt::all(xt::equal(gmask, 0) || xt::equal(gmask, 1))); - GOOSEEYE_ASSERT(m_stat == Type::W2 || m_stat == Type::Unset); + GOOSEEYE_ASSERT(xt::has_shape(f, g.shape()), std::out_of_range); + GOOSEEYE_ASSERT(xt::has_shape(f, gmask.shape()), std::out_of_range); + GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size(), std::out_of_range); + GOOSEEYE_ASSERT(xt::all(xt::equal(gmask, 0) || xt::equal(gmask, 1)), std::out_of_range); + GOOSEEYE_ASSERT(m_stat == Type::W2 || m_stat == Type::Unset, std::out_of_range); // lock statistic m_stat = Type::W2; diff --git a/include/GooseEYE/Ensemble_W2c.hpp b/include/GooseEYE/Ensemble_W2c.hpp index 922467f0..1b7c5bff 100644 --- a/include/GooseEYE/Ensemble_W2c.hpp +++ b/include/GooseEYE/Ensemble_W2c.hpp @@ -22,12 +22,12 @@ Ensemble::W2c(const C& clusters, const C& centers, const T& f, const M& fmask, p static_assert(std::is_integral::value, "Integral clusters required."); static_assert(std::is_integral::value, "Integral mask required."); - GOOSEEYE_ASSERT(f.shape() == clusters.shape()); - GOOSEEYE_ASSERT(f.shape() == centers.shape()); - GOOSEEYE_ASSERT(xt::has_shape(f, fmask.shape())); - GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size()); - GOOSEEYE_ASSERT(xt::all(xt::equal(fmask, 0) || xt::equal(fmask, 1))); - GOOSEEYE_ASSERT(m_stat == Type::W2c || m_stat == Type::Unset); + GOOSEEYE_ASSERT(f.shape() == clusters.shape(), std::out_of_range); + GOOSEEYE_ASSERT(f.shape() == centers.shape(), std::out_of_range); + GOOSEEYE_ASSERT(xt::has_shape(f, fmask.shape()), std::out_of_range); + GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size(), std::out_of_range); + GOOSEEYE_ASSERT(xt::all(xt::equal(fmask, 0) || xt::equal(fmask, 1)), std::out_of_range); + GOOSEEYE_ASSERT(m_stat == Type::W2c || m_stat == Type::Unset, std::out_of_range); // lock statistic m_stat = Type::W2c; diff --git a/include/GooseEYE/Ensemble_heightheight.hpp b/include/GooseEYE/Ensemble_heightheight.hpp index e5b8d6ca..319709d5 100644 --- a/include/GooseEYE/Ensemble_heightheight.hpp +++ b/include/GooseEYE/Ensemble_heightheight.hpp @@ -18,10 +18,10 @@ inline void Ensemble::heightheight(const T& f, const M& fmask) static_assert(std::is_integral::value, "Integral mask required."); - GOOSEEYE_ASSERT(xt::has_shape(f, fmask.shape())); - GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size()); - GOOSEEYE_ASSERT(xt::all(xt::equal(fmask, 0) || xt::equal(fmask, 1))); - GOOSEEYE_ASSERT(m_stat == Type::heightheight || m_stat == Type::Unset); + GOOSEEYE_ASSERT(xt::has_shape(f, fmask.shape()), std::out_of_range); + GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size(), std::out_of_range); + GOOSEEYE_ASSERT(xt::all(xt::equal(fmask, 0) || xt::equal(fmask, 1)), std::out_of_range); + GOOSEEYE_ASSERT(m_stat == Type::heightheight || m_stat == Type::Unset, std::out_of_range); // lock statistic m_stat = Type::heightheight; diff --git a/include/GooseEYE/Ensemble_mean.hpp b/include/GooseEYE/Ensemble_mean.hpp index e0ca2d02..d5582c1f 100644 --- a/include/GooseEYE/Ensemble_mean.hpp +++ b/include/GooseEYE/Ensemble_mean.hpp @@ -14,8 +14,8 @@ namespace GooseEYE { template void Ensemble::mean(const T& f) { - GOOSEEYE_ASSERT(m_shape == std::vector(MAX_DIM, 1)); - GOOSEEYE_ASSERT(m_stat == Type::mean || m_stat == Type::Unset); + GOOSEEYE_ASSERT(m_shape == std::vector(MAX_DIM, 1), std::out_of_range); + GOOSEEYE_ASSERT(m_stat == Type::mean || m_stat == Type::Unset, std::out_of_range); m_stat = Type::mean; @@ -29,10 +29,10 @@ void Ensemble::mean(const T& f, const M& fmask) { static_assert(std::is_integral::value, "Integral mask required."); - GOOSEEYE_ASSERT(xt::has_shape(f, fmask.shape())); - GOOSEEYE_ASSERT(xt::all(xt::equal(fmask, 0) || xt::equal(fmask, 1))); - GOOSEEYE_ASSERT(m_shape == std::vector(MAX_DIM, 1)); - GOOSEEYE_ASSERT(m_stat == Type::mean || m_stat == Type::Unset); + GOOSEEYE_ASSERT(xt::has_shape(f, fmask.shape()), std::out_of_range); + GOOSEEYE_ASSERT(xt::all(xt::equal(fmask, 0) || xt::equal(fmask, 1)), std::out_of_range); + GOOSEEYE_ASSERT(m_shape == std::vector(MAX_DIM, 1), std::out_of_range); + GOOSEEYE_ASSERT(m_stat == Type::mean || m_stat == Type::Unset, std::out_of_range); m_stat = Type::mean; diff --git a/include/GooseEYE/GooseEYE.h b/include/GooseEYE/GooseEYE.h index 483e4484..ba207944 100644 --- a/include/GooseEYE/GooseEYE.h +++ b/include/GooseEYE/GooseEYE.h @@ -14,6 +14,41 @@ namespace GooseEYE { +namespace detail { + +/** + * @brief Get identifier of the namespace. + */ +inline std::string get_namespace() +{ + std::string ret = "GooseEYE"; +#ifdef GOOSEEYE_USE_XTENSOR_PYTHON + return ret + "."; +#else + return ret + "::"; +#endif +} + +/** + * @brief Convert shape to string. + * @param shape Shape. + */ +template +inline std::string shape_to_string(const T& shape) +{ + std::string ret = "["; + for (size_t i = 0; i < shape.size(); ++i) { + ret += std::to_string(shape[i]); + if (i < shape.size() - 1) { + ret += ", "; + } + } + ret += "]"; + return ret; +} + +} // namespace detail + /** * Collect kernels. */ @@ -65,9 +100,9 @@ inline array_type::array dummy_circles( const array_type::tensor& r, bool periodic = true) { - GOOSEEYE_ASSERT(row.shape() == col.shape()); - GOOSEEYE_ASSERT(row.shape() == r.shape()); - GOOSEEYE_ASSERT(shape.size() == 2); + GOOSEEYE_ASSERT(row.shape() == col.shape(), std::out_of_range); + GOOSEEYE_ASSERT(row.shape() == r.shape(), std::out_of_range); + GOOSEEYE_ASSERT(shape.size() == 2, std::out_of_range); array_type::array out = xt::zeros(shape); @@ -112,7 +147,7 @@ inline array_type::array dummy_circles( inline array_type::array dummy_circles(const std::vector& shape, bool periodic = true, uint64_t seed = 0) { - GOOSEEYE_ASSERT(shape.size() == 2); + GOOSEEYE_ASSERT(shape.size() == 2, std::out_of_range); prrng::pcg32 rng(seed); // set default: number of circles in both directions and (constant) radius @@ -204,9 +239,10 @@ inline T dilate(const T& f, size_t iterations = 1, bool periodic = true); * @return List of length `max(a) + 1` with per label in `a` the corresponding label in `b`. */ template -array_type::tensor relabel_map(const T& a, const S& b) +[[deprecated]] array_type::tensor relabel_map(const T& a, const S& b) { - GOOSEEYE_ASSERT(xt::has_shape(a, b.shape())); + GOOSEEYE_WARNING_PYTHON("relabel_map is deprecated, use labels_map instead (new API) instead"); + GOOSEEYE_ASSERT(xt::has_shape(a, b.shape()), std::out_of_range); array_type::tensor ret = xt::zeros({static_cast(xt::amax(a)() + 1)}); @@ -217,10 +253,553 @@ array_type::tensor relabel_map(const T& a, const S& b) return ret; } +/** + * @brief Get a map to relabel from `a` to `b`. + * @param a Image with labels. + * @param b Image with labels. + * @return Array with each row the pair (old_label, new_label). + */ +template +inline array_type::tensor labels_map(const T& a, const T& b) +{ + using value_type = typename T::value_type; + std::map map; + + for (size_t i = 0; i < a.size(); ++i) { + map.try_emplace(a.flat(i), b.flat(i)); + } + + size_t i = 0; + array_type::tensor ret = + xt::empty(std::array{map.size(), 2}); + + for (auto const& [key, val] : map) { + ret(i, 0) = key; + ret(i, 1) = val; + ++i; + } + + return ret; +} + +/** + * @brief Rename labels. + * @param labels Image with labels. + * @param rename Array with each row the pair (old_label, new_label). + * @return Image with reordered labels. + */ +template +inline L labels_rename(const L& labels, const A& rename) +{ + GOOSEEYE_ASSERT(rename.dimension() == 2, std::out_of_range); + GOOSEEYE_ASSERT(rename.shape(1) == 2, std::out_of_range); + using value_type = typename A::value_type; + std::map map; + for (size_t i = 0; i < rename.shape(0); ++i) { + map.emplace(rename(i, 0), rename(i, 1)); + } + +#ifdef GOOSEEYE_ENABLE_ASSERT + auto l = xt::unique(labels); + for (size_t i = 0; i < l.size(); ++i) { + GOOSEEYE_ASSERT(map.count(l(i)) > 0, std::out_of_range); + } +#endif + + L ret = xt::empty_like(labels); + for (size_t i = 0; i < labels.size(); ++i) { + ret.flat(i) = map[labels.flat(i)]; + } + + return ret; +} + +/** + * @brief Reorder labels. + * @param labels Image with labels. + * @param order List of new order of labels (`unique(labels)` in desired order). + * @return Image with reordered labels. + */ +template +inline L labels_reorder(const L& labels, const A& order) +{ +#ifdef GOOSEEYE_ENABLE_ASSERT + auto a = xt::unique(labels); + auto b = xt::unique(order); + GOOSEEYE_ASSERT(a.size() == b.size(), std::out_of_range); + GOOSEEYE_ASSERT(xt::all(xt::equal(a, b)), std::out_of_range); +#endif + + auto maxlab = *std::max_element(order.begin(), order.end()); + std::vector renum(maxlab + 1); + + for (size_t i = 0; i < order.size(); ++i) { + renum[order[i]] = i; + } + + L ret = xt::empty_like(labels); + for (size_t i = 0; i < labels.size(); ++i) { + ret.flat(i) = renum[labels.flat(i)]; + } + + return ret; +} + +/** + * @brief Size per label. + * @param labels Image with labels (0..n). + * @return List of size n + 1 with the size per label. + */ +template +array_type::tensor labels_sizes(const T& labels) +{ + using value_type = typename T::value_type; + std::map map; + + for (size_t i = 0; i < labels.size(); ++i) { + if (map.count(labels.flat(i)) == 0) { + map.emplace(labels.flat(i), 1); + } + else { + map[labels.flat(i)]++; + } + } + + size_t i = 0; + array_type::tensor ret = + xt::empty(std::array{map.size(), 2}); + + for (auto const& [key, val] : map) { + ret(i, 0) = key; + ret(i, 1) = val; + ++i; + } + + return ret; +} + +namespace detail { + +/** + * @brief Unravel index. + * @param idx Flat index to unravel. + * @param strides Strides. + * @param indices Output: array indices. + */ +inline void unravel_index( + ptrdiff_t idx, + const std::array& strides, + std::array& indices) +{ + indices[0] = idx / strides[0]; + indices[1] = idx % strides[0]; +} + +/** + * @brief Convert kernel to array of distances and remove zero distance. + * @param kernel Kernel. + * @return Array of distances. + */ +template +inline array_type::tensor kernel_to_dx(T kernel) +{ +#ifdef GOOSEEYE_ENABLE_ASSERT + for (size_t i = 0; i < Dim; ++i) { + GOOSEEYE_ASSERT(kernel.shape(i) % 2 == 1, std::out_of_range); + } +#endif + + std::array mid; + for (size_t i = 0; i < Dim; ++i) { + mid[i] = (kernel.shape(i) - 1) / 2; + } + size_t idx = 0; + for (size_t i = 0; i < Dim; ++i) { + idx += mid[i] * kernel.strides()[i]; + } + GOOSEEYE_ASSERT(kernel.flat(idx) == 1, std::out_of_range); + kernel.flat(idx) = 0; + + if constexpr (Dim == 1) { + return xt::flatten_indices(xt::argwhere(kernel)) - mid[0]; + } + + auto ret = xt::from_indices(xt::argwhere(kernel)); + for (size_t i = 0; i < Dim; ++i) { + xt::view(ret, xt::all(), i) -= mid[i]; + } + return ret; +} + +} // namespace detail + +/** + * @brief (Incrementally) Label clusters (0 as background, 1..n as labels). + * @tparam Dimension The rank (a.k.a. `dimension`) of the image. + * @note The default kernel is `GooseEYE::kernel::nearest()`. + */ +template +class ClusterLabeller { +public: + static constexpr size_t Dim = Dimension; ///< Dimensionality of the system. + static constexpr bool Periodic = Periodicity; ///< Periodicity of the system. + +private: + std::array m_shape; ///< Shape of the system. + array_type::tensor m_dx; ///< Kernel (in distances along each dimension). + array_type::tensor m_label; ///< Per block, the label (`0` for background). + ptrdiff_t m_new_label = 1; ///< The next label number to assign. + size_t m_nmerge = 0; ///< Number of times that clusters have been merged. + std::array m_index; ///< Array index (reused). + std::array m_strides; ///< Strides of the array. + + /** + * @brief Memory used for relabeling. + * @note + * - The maximum label is `maxlab = prod(shape) + 1`. + * - `m_renum` is allocated to `arange(maxlab)`. + */ + std::vector m_renum; + + /** + * @brief Linked list of labels connected to a certain label. + * @warning Each label can only be connected to one other label. + * @note To get the labels connected to label `i`: + * + * labels = [] + * while m_next[i] != -1: + * labels.append(m_next[i]) + * i = m_next[i] + */ + std::vector m_next; + std::vector m_connected; ///< List of labels connected to the current block. + +public: + /** + * @param shape @copydoc ClusterLabeller::m_shape + */ + template + ClusterLabeller(const T& shape) + { + if constexpr (Dim == 1) { + // kernel = {1, 1, 1} + m_dx = {-1, 1}; + } + else if constexpr (Dim == 2) { + // kernel = {{0, 1, 0}, {1, 1, 1}, {0, 1, 0}}; + m_dx = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}}; + } + this->init(shape); + } + + /** + * @param shape @copydoc ClusterLabeller::m_shape + * @param kernel Kernel (e.g. GooseEYE::kernel::nearest()). + */ + template + ClusterLabeller(const T& shape, const K& kernel) + { + m_dx = detail::kernel_to_dx(kernel); + this->init(shape); + } + +private: + template + void init(const T& shape) + { + static_assert(Dim == 1 || Dim == 2, "WIP: 1d and 2d supported."); + m_label = xt::empty(shape); + m_renum.resize(m_label.size() + 1); + m_next.resize(m_label.size() + 1); + for (size_t i = 0; i < Dim; ++i) { + m_shape[i] = static_cast(shape[i]); + m_strides[i] = static_cast(m_label.strides()[i]); + } + GOOSEEYE_ASSERT(m_strides.back() == 1, std::out_of_range); + this->reset(); + m_connected.resize(m_dx.shape(0)); + } + +public: + /** + * @brief Reset labels to zero. + */ + void reset() + { + std::fill(m_label.begin(), m_label.end(), 0); + std::iota(m_renum.begin(), m_renum.end(), 0); + m_new_label = 1; + this->clean_next(); + } + + /** + * @brief Prune: renumber labels to lowest possible label, see also AvalancheSegmenter::nlabels. + * @note This might change all labels. + */ + void prune() + { + ptrdiff_t n = static_cast(m_new_label); + m_new_label = 1; + m_renum[0] = 0; + for (ptrdiff_t i = 1; i < n; ++i) { + if (m_renum[i] == i) { + m_renum[i] = m_new_label; + ++m_new_label; + } + } + this->private_renumber(m_renum); + std::iota(m_renum.begin(), m_renum.begin() + n, 0); + } + +private: + /** + * @brief Clean linked list. + */ + void clean_next() + { + std::fill(m_next.begin(), m_next.end(), -1); + } + + /** + * @brief Apply renumbering without assertions. + * @param renum List of new label for each label in used. + */ + template + void private_renumber(const T& renum) + { + for (size_t i = 0; i < m_label.size(); ++i) { + m_label.flat(i) = renum[m_label.flat(i)]; + } + } + + /** + * @brief Link `b` to `head[a]`. + * @details + * - `head[list(b)] = head[a]` + * - `list(head[a]).append(list(b))` + * @param a Target label. + * @param b Label to merge into `a`. + */ + void merge_detail(ptrdiff_t a, ptrdiff_t b) + { + // -> head[list(b)] = head[a] + ptrdiff_t i = m_renum[b]; + ptrdiff_t target = m_renum[a]; + m_renum[b] = target; + while (true) { + i = m_next[i]; + if (i == -1) { + break; + } + m_renum[i] = target; + } + // -> list(head[a]).append(list(b)) + while (m_next[a] != -1) { + a = m_next[a]; + } + m_next[a] = b; + } + + /** + * @brief Mark list of labels as merged. + * @note Link all labels to the lowest label in the list. + * @warning `m_labels` is not updated. + * @param labels List of labels to merge. + * @param nlabels Number of labels in the list. + */ + ptrdiff_t merge(ptrdiff_t* labels, size_t nlabels) + { + std::sort(labels, labels + nlabels); + nlabels = std::unique(labels, labels + nlabels) - labels; + ptrdiff_t target = labels[0]; + for (size_t i = 1; i < nlabels; ++i) { + this->merge_detail(target, labels[i]); + } + return target; + } + + void apply_merge() + { + if (m_nmerge == 0) { + return; + } + + this->private_renumber(m_renum); + this->clean_next(); + m_nmerge = 0; + } + + void label_impl(size_t idx) + { + static_assert(Dim == 1 || Dim == 2, "WIP: 1d and 2d supported."); + + ptrdiff_t compare; + size_t nconnected = 0; + + for (size_t j = 0; j < m_dx.shape(0); ++j) { + if constexpr (Dim == 1 && Periodic) { + ptrdiff_t nn = m_shape[0]; + ptrdiff_t ii = (nn + idx + m_dx(j)) % nn; // index corrected for periodicity + compare = ii; + } + else if constexpr (Dim == 1 && !Periodic) { + ptrdiff_t nn = m_shape[0]; + ptrdiff_t ii = idx + m_dx(j); + if (ii < 0 || ii >= nn) { + continue; + } + compare = ii; + } + else if constexpr (Dim == 2 && Periodic) { + detail::unravel_index(idx, m_strides, m_index); + ptrdiff_t nn = m_shape[0]; + ptrdiff_t mm = m_shape[1]; + ptrdiff_t ii = (nn + m_index[0] + m_dx(j, 0)) % nn; + ptrdiff_t jj = (mm + m_index[1] + m_dx(j, 1)) % mm; + compare = ii * mm + jj; + } + else if constexpr (Dim == 2 && !Periodic) { + detail::unravel_index(idx, m_strides, m_index); + ptrdiff_t nn = m_shape[0]; + ptrdiff_t mm = m_shape[1]; + ptrdiff_t ii = m_index[0] + m_dx(j, 0); + ptrdiff_t jj = m_index[1] + m_dx(j, 1); + if (ii < 0 || ii >= nn || jj < 0 || jj >= mm) { + continue; + } + compare = ii * mm + jj; + } + + if (m_label.flat(compare) != 0) { + m_connected[nconnected] = m_renum[m_label.flat(compare)]; + nconnected++; + } + } + + if (nconnected == 0) { + m_label.flat(idx) = m_new_label; + m_new_label += 1; + return; + } + + if (nconnected == 1) { + m_label.flat(idx) = m_connected[0]; + return; + } + + // mark all labels in the list for merging + // `m_label` is not yet updated to avoid looping over all blocks too frequently + // the new label can be read by `m_renum[lab]` (as done above) + m_label.flat(idx) = this->merge(&m_connected[0], nconnected); + m_nmerge++; + + // every so often: apply the renumbering to `m_label` + // the linked labels in `m_next` can be released + if (m_nmerge > 100) { + this->apply_merge(); + } + } + +public: + /** + * @brief Add image. Previous labels are not overwritten. + * @param img Image (can be incremental only). + */ + template + void add_image(const T& img) + { + GOOSEEYE_ASSERT(xt::has_shape(img, m_label.shape()), std::out_of_range); + + for (size_t idx = 0; idx < img.size(); ++idx) { + if (img.flat(idx) == 0) { + continue; + } + if (m_label.flat(idx) != 0) { + continue; + } + this->label_impl(idx); + } + this->apply_merge(); + } + + /** + * @brief Add sequence of points. + * @param begin Iterator to first point. + * @param end Iterator to last point. + */ + template + void add_points(const T& begin, const T& end) + { +#ifdef GOOSEEYE_ENABLE_ASSERT + size_t n = m_label.size(); + GOOSEEYE_ASSERT( + !std::any_of(begin, end, [n](size_t i) { return i < 0 || i >= n; }), std::out_of_range); +#endif + + for (auto it = begin; it != end; ++it) { + if (m_label.flat(*it) != 0) { + continue; + } + this->label_impl(*it); + } + this->apply_merge(); + } + + /** + * @brief Add sequence of points. + * @param idx List of points. + */ + template + void add_points(const T& idx) + { + GOOSEEYE_ASSERT(idx.dimension() == 1, std::out_of_range); + return this->add_points(idx.begin(), idx.end()); + } + + /** + * @brief Basic class info. + * @return std::string + */ + std::string repr() const + { + return detail::get_namespace() + "ClusterLabeller" + std::to_string(Dim) + " " + + detail::shape_to_string(m_shape); + } + + /** + * @brief Shape of ClusterLabeller::s and ClusterLabeller::labels. + * @return Shape + */ + const auto& shape() const + { + return m_label.shape(); + } + + /** + * @brief Size of ClusterLabeller::s and ClusterLabeller::labels (`== prod(shape)`). + * @return Size + */ + auto size() const + { + return m_label.size(); + } + + // todo: allow resetting a cluster map ? + + /** + * @brief @copydoc ClusterLabeller::m_label + * @return array of signed integers. + */ + const auto& labels() const + { + return m_label; + } +}; + /** * Compute clusters and obtain certain characteristic about them. */ -class Clusters { +class [[deprecated]] Clusters { public: Clusters() = default; @@ -246,12 +825,15 @@ class Clusters { template Clusters(const T& f, const S& kernel, bool periodic = true) : m_periodic(periodic) { + GOOSEEYE_WARNING_PYTHON("Clusters is deprecated, use ClusterLabeller (new API) instead " + "(please open a PR for missing functions)"); + static_assert(std::is_integral::value, "Integral labels required."); static_assert(std::is_integral::value, "Integral kernel required."); - GOOSEEYE_ASSERT(xt::all(xt::equal(f, 0) || xt::equal(f, 1))); - GOOSEEYE_ASSERT(xt::all(xt::equal(kernel, 0) || xt::equal(kernel, 1))); - GOOSEEYE_ASSERT(f.dimension() == kernel.dimension()); + GOOSEEYE_ASSERT(xt::all(xt::equal(f, 0) || xt::equal(f, 1)), std::out_of_range); + GOOSEEYE_ASSERT(xt::all(xt::equal(kernel, 0) || xt::equal(kernel, 1)), std::out_of_range); + GOOSEEYE_ASSERT(f.dimension() == kernel.dimension(), std::out_of_range); m_shape = detail::shape(f); m_kernel = xt::atleast_3d(kernel); @@ -330,8 +912,9 @@ class Clusters { * Return size per cluster * @return List. */ - array_type::tensor sizes() const + [[deprecated]] array_type::tensor sizes() const { + GOOSEEYE_WARNING_PYTHON("Clusters.sizes() is deprecated, use labels_sizes() (new API)"); array_type::tensor ret = xt::zeros({xt::amax(m_l)() + size_t(1)}); for (size_t h = 0; h < m_l.shape(0); ++h) { @@ -526,14 +1109,50 @@ class Clusters { array_type::tensor m_l_np; // labels before applying periodicity }; +namespace detail { + +template +class ClusterLabellerOverload : public ClusterLabeller { +public: + template + ClusterLabellerOverload(const T& img) : ClusterLabeller(img.shape()) + { + this->add_image(img); + this->prune(); + } + + auto get() const + { + return this->labels(); + } +}; + +} // namespace detail + /** - * Compute clusters. Wraps GooseEYE::Clusters::labels(). + * @brief Compute clusters. * @param f Image. * @param periodic Interpret image as periodic. + * @return 'Image' with labels (1..n) for labels, 0 for background. */ template array_type::array clusters(const T& f, bool periodic = true) { + auto n = f.dimension(); + if (n == 1 && periodic) { + return detail::ClusterLabellerOverload<1, true>(f).get(); + } + if (n == 1 && !periodic) { + return detail::ClusterLabellerOverload<1, false>(f).get(); + } + if (n == 2 && periodic) { + return detail::ClusterLabellerOverload<2, true>(f).get(); + } + if (n == 2 && !periodic) { + return detail::ClusterLabellerOverload<2, false>(f).get(); + } + + GOOSEEYE_WARNING("WIP: updated 3d implementation needs to be completed. Please file a PR."); return Clusters(f, kernel::nearest(f.dimension()), periodic).labels(); } @@ -547,11 +1166,11 @@ array_type::array clusters(const T& f, bool periodic = true) template inline T pos2img(const T& img, const U& positions, const V& labels) { - GOOSEEYE_ASSERT(img.dimension() > 0); - GOOSEEYE_ASSERT(img.dimension() <= 3); - GOOSEEYE_ASSERT(img.dimension() == positions.shape(1)); - GOOSEEYE_ASSERT(positions.shape(0) == labels.size()); - GOOSEEYE_ASSERT(labels.dimension() == 1); + GOOSEEYE_ASSERT(img.dimension() > 0, std::out_of_range); + GOOSEEYE_ASSERT(img.dimension() <= 3, std::out_of_range); + GOOSEEYE_ASSERT(img.dimension() == positions.shape(1), std::out_of_range); + GOOSEEYE_ASSERT(positions.shape(0) == labels.size(), std::out_of_range); + GOOSEEYE_ASSERT(labels.dimension() == 1, std::out_of_range); using value_type = typename T::value_type; T res = img; @@ -590,8 +1209,8 @@ array_type::tensor center_of_mass(const T& labels, bool periodic = tr { static_assert(std::is_integral::value, "Integral labels required."); - GOOSEEYE_ASSERT(labels.dimension() > 0); - GOOSEEYE_ASSERT(xt::all(labels >= 0)); + GOOSEEYE_ASSERT(labels.dimension() > 0, std::out_of_range); + GOOSEEYE_ASSERT(xt::all(labels >= 0), std::out_of_range); double pi = xt::numeric_constants::PI; size_t N = static_cast(xt::amax(labels)(0)) + 1ul; diff --git a/include/GooseEYE/config.h b/include/GooseEYE/config.h index 133cb9b6..2e7e42b5 100644 --- a/include/GooseEYE/config.h +++ b/include/GooseEYE/config.h @@ -4,8 +4,8 @@ * @license This project is released under the GPLv3 License. */ -#ifndef GOOSEEYE_INCLUDE_H -#define GOOSEEYE_INCLUDE_H +#ifndef GOOSEEYE_CONFIG_H +#define GOOSEEYE_CONFIG_H /** * @cond @@ -18,9 +18,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -46,9 +48,9 @@ std::cout << std::string(file) + ":" + std::to_string(line) + " (" + std::string(function) + \ ")" + ": " message ") \n\t"; -#define GOOSEEYE_ASSERT_IMPL(expr, file, line, function) \ +#define GOOSEEYE_ASSERT_IMPL(expr, assertion, file, line, function) \ if (!(expr)) { \ - throw std::runtime_error( \ + throw assertion( \ std::string(file) + ":" + std::to_string(line) + " (" + std::string(function) + ")" + \ ": assertion failed (" #expr ") \n\t"); \ } @@ -76,9 +78,41 @@ * \throw std::runtime_error */ #ifdef GOOSEEYE_ENABLE_ASSERT -#define GOOSEEYE_ASSERT(expr) GOOSEEYE_ASSERT_IMPL(expr, __FILE__, __LINE__, __FUNCTION__) +#define GOOSEEYE_ASSERT(expr, assertion) \ + GOOSEEYE_ASSERT_IMPL(expr, assertion, __FILE__, __LINE__, __FUNCTION__) #else -#define GOOSEEYE_ASSERT(expr) +#define GOOSEEYE_ASSERT(expr, assertion) +#endif + +/** + * Warnings are implemented as: + * + * GOOSEEYE_WARNING(...) + * + * They can be disables by: + * + * #define GOOSEEYE_DISABLE_WARNING + */ +#ifndef GOOSEEYE_DISABLE_WARNING +#define GOOSEEYE_WARNING(message) GOOSEEYE_WARNING_IMPL(message, __FILE__, __LINE__, __FUNCTION__) +#else +#define GOOSEEYE_WARNING(message) +#endif + +/** + * Warnings specific to the Python API are implemented as: + * + * GOOSEEYE_WARNING_PYTHON(...) + * + * They can be enabled by: + * + * #define GOOSEEYE_ENABLE_WARNING_PYTHON + */ +#ifdef GOOSEEYE_ENABLE_WARNING_PYTHON +#define GOOSEEYE_WARNING_PYTHON(message) \ + GOOSEEYE_WARNING_IMPL(message, __FILE__, __LINE__, __FUNCTION__) +#else +#define GOOSEEYE_WARNING_PYTHON(message) #endif /** diff --git a/include/GooseEYE/dilate.hpp b/include/GooseEYE/dilate.hpp index f7f3a4dd..774cc902 100644 --- a/include/GooseEYE/dilate.hpp +++ b/include/GooseEYE/dilate.hpp @@ -96,10 +96,10 @@ inline T dilate(const T& f, const S& kernel, const array_type::tensor& iterations, bool periodic) { using value_type = typename T::value_type; - GOOSEEYE_ASSERT(f.dimension() <= 3); - GOOSEEYE_ASSERT(f.dimension() == kernel.dimension()); - GOOSEEYE_ASSERT(xt::all(xt::equal(kernel, 0) || xt::equal(kernel, 1))); - GOOSEEYE_ASSERT(static_cast(xt::amax(f)()) <= iterations.size() + 1); + GOOSEEYE_ASSERT(f.dimension() <= 3, std::out_of_range); + GOOSEEYE_ASSERT(f.dimension() == kernel.dimension(), std::out_of_range); + GOOSEEYE_ASSERT(xt::all(xt::equal(kernel, 0) || xt::equal(kernel, 1)), std::out_of_range); + GOOSEEYE_ASSERT(static_cast(xt::amax(f)()) <= iterations.size() + 1, std::out_of_range); xt::pad_mode pad_mode = xt::pad_mode::constant; int pad_value = 0; diff --git a/include/GooseEYE/kernel.hpp b/include/GooseEYE/kernel.hpp index 96359e08..7ded8b17 100644 --- a/include/GooseEYE/kernel.hpp +++ b/include/GooseEYE/kernel.hpp @@ -14,7 +14,7 @@ namespace kernel { inline array_type::array nearest(size_t ndim) { - GOOSEEYE_ASSERT(ndim > 0 && ndim <= 3); + GOOSEEYE_ASSERT(ndim > 0 && ndim <= 3, std::out_of_range); std::vector shape(ndim, 3); diff --git a/python/GooseEYE/__init__.py b/python/GooseEYE/__init__.py index 4072ceea..0bae7bc9 100644 --- a/python/GooseEYE/__init__.py +++ b/python/GooseEYE/__init__.py @@ -8,6 +8,24 @@ from ._GooseEYE import * # noqa: F401, F403 +def ClusterLabeller(shape, periodic=True, **kwargs): + """ + Allocate a cluster labeller. + :param shape: The shape of the image. + :param periodic: Whether the image is periodic. + :return: A cluster labeller. + """ + if len(shape) == 1: + if periodic: + return ClusterLabeller1p(shape, **kwargs) + return ClusterLabeller1(shape, **kwargs) + if len(shape) == 2: + if periodic: + return ClusterLabeller2p(shape, **kwargs) + return ClusterLabeller2(shape, **kwargs) + raise NotImplementedError("3d extension needed, please open a PR") + + class Structure(enstat.static): r""" Compute the ensemble average structure factor: diff --git a/python/main.cpp b/python/main.cpp index 006054f4..670da66d 100644 --- a/python/main.cpp +++ b/python/main.cpp @@ -16,6 +16,50 @@ namespace py = pybind11; +template +inline void static_for(Lambda const& f) +{ + if constexpr (First < Last) { + f(std::integral_constant{}); + static_for(f); + } +} + +template +void allocate_ClusterLabeller(py::module& mod) +{ + const size_t Dim = Class::Dim; + std::string name = "ClusterLabeller" + std::to_string(Dim); + if (Class::Periodic) { + name += "p"; + } + py::class_ cls(mod, name.c_str()); + cls.def(py::init&>(), name.c_str(), py::arg("shape")); + cls.def( + py::init&, const xt::template pytensor&>(), + name.c_str(), + py::arg("shape"), + py::arg("kernel")); + + cls.def("__repr__", &Class::repr); + cls.def_property_readonly("shape", &Class::shape, "Shape of system."); + cls.def_property_readonly("size", &Class::shape, "Size of system."); + cls.def_property_readonly("labels", &Class::labels, "Cluster of each block."); + cls.def("prune", &Class::prune, "Prune: renumber to smallest index."); + cls.def("reset", &Class::reset, "Reset labels to zero."); + cls.def( + "add_image", + &Class::template add_image>, + "Add image", + py::arg("img")); + + cls.def( + "add_points", + static_cast&)>(&Class::add_points), + "Add points", + py::arg("idx")); +} + PYBIND11_MODULE(_GooseEYE, m) { xt::import_numpy(); @@ -99,6 +143,11 @@ PYBIND11_MODULE(_GooseEYE, m) py::arg("iterations") = 1, py::arg("periodic") = true); + static_for<1, 3>( + [&](auto i) { allocate_ClusterLabeller>(m); }); + static_for<1, 3>( + [&](auto i) { allocate_ClusterLabeller>(m); }); + py::class_(m, "Clusters") .def( @@ -130,6 +179,22 @@ PYBIND11_MODULE(_GooseEYE, m) py::arg("f"), py::arg("periodic") = true); + m.def("labels_map", &GooseEYE::labels_map>, py::arg("a"), py::arg("b")); + + m.def( + "labels_rename", + &GooseEYE::labels_rename, xt::xtensor>, + py::arg("labels"), + py::arg("rename")); + + m.def( + "labels_reorder", + &GooseEYE::labels_reorder, xt::xtensor>, + py::arg("labels"), + py::arg("order")); + + m.def("labels_sizes", &GooseEYE::labels_sizes>, py::arg("labels")); + m.def( "relabel_map", &GooseEYE::relabel_map, xt::pyarray>, diff --git a/tests/miscellaneous.cpp b/tests/miscellaneous.cpp deleted file mode 100644 index f093645e..00000000 --- a/tests/miscellaneous.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include - -TEST_CASE("GooseFEM::Clusters", "clusters.hpp") -{ - - SECTION("relabel_map") - { - xt::xarray a = xt::zeros({5, 5}); - xt::view(a, xt::range(0, 2), xt::range(0, 2)) = 1; - xt::view(a, xt::range(3, 4), xt::range(3, 4)) = 2; - - xt::xarray b = xt::zeros({5, 5}); - xt::view(b, xt::range(0, 2), xt::range(0, 2)) = 3; - xt::view(b, xt::range(3, 4), xt::range(3, 4)) = 4; - - REQUIRE(xt::all(xt::equal(GooseEYE::relabel_map(a, b), xt::xtensor{0, 3, 4}))); - REQUIRE( - xt::all(xt::equal(GooseEYE::relabel_map(b, a), xt::xtensor{0, 0, 0, 1, 2}))); - } - - SECTION("path") - { - xt::xtensor path = {{0, 0}, {0, 1}, {0, 2}}; - REQUIRE(xt::all(xt::equal(GooseEYE::path({0, 0}, {0, 2}), path))); - REQUIRE(xt::all( - xt::equal(GooseEYE::path({0, 0}, {0, 2}, GooseEYE::path_mode::Bresenham), path))); - REQUIRE( - xt::all(xt::equal(GooseEYE::path({0, 0}, {0, 2}, GooseEYE::path_mode::actual), path))); - REQUIRE( - xt::all(xt::equal(GooseEYE::path({0, 0}, {0, 2}, GooseEYE::path_mode::full), path))); - } -} diff --git a/tests/test_cluster.py b/tests/test_cluster.py deleted file mode 100644 index 09737a0e..00000000 --- a/tests/test_cluster.py +++ /dev/null @@ -1,20 +0,0 @@ -import GooseEYE as eye -import numpy as np - - -def test_relabel_map(): - a = np.array( - [ - [1, 1, 0, 0, 1], - [1, 0, 0, 0, 0], - [0, 0, 3, 3, 0], - [0, 0, 3, 0, 0], - [1, 0, 0, 0, 1], - ] - ) - - b = a.copy() - b = np.where(b == 1, 4, b) - b = np.where(b == 3, 7, b) - - assert list(eye.relabel_map(a, b)) == [0, 4, 0, 7] diff --git a/tests/test_clusters.py b/tests/test_clusters.py new file mode 100644 index 00000000..d35861bc --- /dev/null +++ b/tests/test_clusters.py @@ -0,0 +1,281 @@ +import faulthandler + +import GooseEYE as eye +import numpy as np +import pytest +import scipy.ndimage + +faulthandler.enable() + + +def test_init(): + s = np.zeros([4, 4], dtype=int) + assert np.all(eye.clusters(s) == s) + + +def test_labels_map(): + a = np.array([[1, 1, 0, 0], [0, 0, 3, 3], [2, 2, 0, 0], [0, 0, 4, 4]]) + b = np.array([[-3, -3, 0, 0], [0, 0, 1, 1], [5, 5, 0, 0], [0, 0, 7, 7]]) + lmap = np.array([[0, 0], [1, -3], [2, 5], [3, 1], [4, 7]]) + imap = lmap[:, [1, 0]] + imap = imap[np.argsort(imap[:, 0])] + assert np.all(np.equal(eye.labels_map(a, b), lmap)) + assert np.all(np.equal(eye.labels_map(b, a), imap)) + assert np.all(np.equal(eye.labels_rename(a, lmap), b)) + assert np.all(np.equal(eye.labels_rename(b, imap), a)) + + a = np.array( + [ + [1, 1, 0, 0, 1], + [1, 0, 0, 0, 0], + [0, 0, 3, 3, 0], + [0, 0, 3, 0, 0], + [1, 0, 0, 0, 1], + ] + ) + lmap = [[0, 0], [1, 4], [3, 7]] + + b = a.copy() + for i, j in lmap: + b = np.where(b == i, j, b) + + assert np.all(np.equal(eye.labels_map(a, b), lmap)) + + +def test_clusters_simple(): + tests = [ + [ + np.array([[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]), + np.array([[1, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]), + np.array([[1, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]), + np.array([[1, 1, 0, 0], [1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]), + np.array([[1, 1, 0, 0], [1, 0, 0, 0], [0, 0, 2, 0], [0, 0, 0, 0]]), + np.array([[1, 1, 0, 0], [1, 0, 0, 0], [0, 0, 2, 2], [0, 0, 0, 0]]), + np.array([[1, 1, 0, 0], [1, 0, 2, 0], [0, 0, 2, 2], [0, 0, 0, 0]]), + np.array([[1, 1, 0, 0], [1, 1, 1, 0], [0, 0, 1, 1], [0, 0, 0, 0]]), + np.array([[1, 1, 0, 0], [1, 1, 1, 0], [0, 0, 1, 1], [0, 0, 0, 0]]), + np.array([[1, 1, 0, 0], [1, 1, 1, 0], [0, 0, 1, 1], [0, 0, 0, 1]]), + np.array([[1, 1, 0, 0], [1, 1, 1, 0], [0, 0, 1, 1], [0, 0, 1, 1]]), + ], + [ + np.array([[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]), + np.array([[1, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]), + np.array([[1, 1, 0, 0], [0, 0, 0, 0], [2, 0, 0, 0], [0, 0, 0, 0]]), + np.array([[1, 1, 0, 0], [0, 0, 0, 0], [2, 2, 0, 0], [0, 0, 0, 0]]), + np.array([[1, 1, 0, 0], [0, 0, 3, 0], [2, 2, 0, 0], [0, 0, 0, 0]]), + np.array([[1, 1, 0, 0], [0, 0, 3, 3], [2, 2, 0, 0], [0, 0, 0, 0]]), + np.array([[1, 1, 0, 0], [0, 0, 3, 3], [2, 2, 0, 0], [0, 0, 4, 0]]), + np.array([[1, 1, 0, 0], [0, 0, 3, 3], [2, 2, 0, 0], [0, 0, 4, 4]]), + np.array([[1, 1, 0, 1], [0, 0, 1, 1], [2, 2, 0, 0], [0, 0, 1, 1]]), + np.array([[1, 1, 0, 1], [1, 0, 1, 1], [1, 1, 0, 0], [0, 0, 1, 1]]), + ], + [ + np.array([[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]), + np.array([[1, 0, 2, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]), + np.array([[1, 0, 2, 0], [0, 3, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]), + np.array([[1, 0, 2, 0], [0, 3, 0, 4], [0, 0, 0, 0], [0, 0, 0, 0]]), + np.array([[1, 0, 2, 0], [0, 3, 0, 4], [5, 0, 0, 0], [0, 0, 0, 0]]), + np.array([[1, 0, 2, 0], [0, 3, 0, 4], [5, 0, 6, 0], [0, 0, 0, 0]]), + np.array([[1, 0, 2, 0], [1, 1, 0, 1], [1, 0, 6, 0], [0, 0, 0, 0]]), + np.array([[1, 0, 1, 0], [1, 1, 1, 1], [1, 0, 1, 0], [0, 0, 0, 0]]), + ], + ] + + for test in [i for test in tests for i in test]: + labels = eye.clusters(np.where(test > 0, 1, 0), periodic=True) + assert np.all(np.equal(labels, eye.labels_rename(test, eye.labels_map(test, labels)))) + + segmenter = eye.ClusterLabeller(shape=(4, 4)) + for test in tests: + segmenter.reset() + for i in test: + segmenter.add_image(np.where(i > 0, 1, 0)) + assert np.all(np.equal(segmenter.labels, i)) + + +def test_clusters_simple2(): + img = np.array( + [ + [1, 0, 0, 1, 1], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [1, 0, 0, 1, 1], + [0, 0, 0, 0, 0], + ] + ) + labels = np.array( + [ + [1, 0, 0, 1, 1], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [2, 0, 0, 2, 2], + [0, 0, 0, 0, 0], + ] + ) + assert np.all(np.equal(eye.clusters(img), labels)) + + +def test_clusters_simple3(): + labels = np.array( + [ + [0, 0, 0, 0, 0, 0, 1, 0, 0, 0], + [0, 1, 0, 0, 1, 1, 1, 0, 2, 0], + [0, 1, 1, 1, 0, 1, 1, 0, 2, 2], + [0, 1, 1, 1, 1, 1, 1, 0, 0, 2], + [0, 1, 1, 1, 0, 1, 1, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + ] + ) + assert np.all(np.equal(eye.clusters(np.where(labels > 0, 1, 0)), labels)) + + +def test_clusters_scipy(): + img = eye.dummy_circles((500, 500), periodic=False) + clusters = eye.clusters(img, periodic=False) + scp, num = scipy.ndimage.label(img) + assert np.unique(clusters).size == num + 1 + lmap = eye.labels_map(scp, clusters) + scp = eye.labels_rename(scp, lmap) + assert np.all(np.equal(scp, clusters)) + + +def test_labels_reorder(): + labels = np.array([[1, 0, 2, 0], [0, 0, 0, 0], [3, 0, 4, 0], [0, 0, 0, 0]]) + assert np.all(np.equal(eye.clusters(np.where(labels > 0, 1, 0)), labels)) + + labels = eye.labels_reorder(labels, [0, 4, 1, 2, 3]) + assert np.all( + np.equal(labels, np.array([[2, 0, 3, 0], [0, 0, 0, 0], [4, 0, 1, 0], [0, 0, 0, 0]])) + ) + + with pytest.raises(IndexError): + eye.labels_reorder(labels, [0, 4, 1, 2]) + + +def test_labels_rename(): + labels = np.array([[1, 0, 2, 0], [0, 0, 0, 0], [3, 0, 4, 0], [0, 0, 0, 0]]) + assert np.all(np.equal(eye.clusters(np.where(labels > 0, 1, 0)), labels)) + + rename = [[0, 0], [1, 4], [2, 1], [3, 2], [4, 3]] + labels = eye.labels_rename(labels, rename) + assert np.all( + np.equal(labels, np.array([[4, 0, 1, 0], [0, 0, 0, 0], [2, 0, 3, 0], [0, 0, 0, 0]])) + ) + + with pytest.raises(IndexError): + eye.labels_rename(labels, [[0, 0], [3, 2]]) + + +def test_labels_rename2(): + segmenter = eye.ClusterLabeller(shape=(4, 4)) + segmenter.add_points([0, 2, 8, 10]) + lab = segmenter.labels + assert np.all(np.equal(lab, np.array([[1, 0, 2, 0], [0, 0, 0, 0], [3, 0, 4, 0], [0, 0, 0, 0]]))) + + rename = [[0, 0], [1, 6], [2, 1], [3, 2], [4, 3]] + lab = eye.labels_rename(lab, rename) + assert np.all(np.equal(lab, np.array([[6, 0, 1, 0], [0, 0, 0, 0], [2, 0, 3, 0], [0, 0, 0, 0]]))) + + +def test_labels_sizes(): + labels = np.array([[1, 1, 0, 0], [1, 0, 0, 0], [0, 0, 2, 0], [0, 0, 0, 0]]) + assert np.all( + np.equal( + eye.labels_sizes(labels), + [[i, s] for i, s in zip(*np.unique(labels, return_counts=True))], + ) + ) + + +def test_prune(): + segmenter = eye.ClusterLabeller(shape=(4, 4)) + segmenter.add_points([0, 2, 8, 10, 1]) + lab = segmenter.labels + assert np.all(np.equal(lab, np.array([[1, 1, 1, 0], [0, 0, 0, 0], [3, 0, 4, 0], [0, 0, 0, 0]]))) + segmenter.prune() + lab = segmenter.labels + assert np.all(np.equal(lab, np.array([[1, 1, 1, 0], [0, 0, 0, 0], [2, 0, 3, 0], [0, 0, 0, 0]]))) + + +def test_bug_a(): + shape = (10, 10) + actions = [ + dict(idx=19, label=1), + dict(idx=5, label=2), + dict(idx=10, label=1), + dict(idx=69, label=3), + dict(idx=68, label=3), + dict(idx=24, label=4), + dict(idx=22, label=5), + dict(idx=87, label=6), + dict(idx=47, label=7), + dict(idx=8, label=8), + dict(idx=35, label=9), + dict(idx=7, label=8), + dict(idx=66, label=10), + dict(idx=92, label=11), + dict(idx=56, label=10), + dict(idx=27, label=12), + dict(idx=46, label=10, merge=[7, 10]), + dict(idx=55, label=7), + dict(idx=27, label=12), + dict(idx=37, label=7, merge=[7, 12]), + dict(idx=45, label=7, merge=[7, 9]), + dict(idx=9, label=1, merge=[1, 8]), + dict(idx=46, label=7), + dict(idx=59, label=3), + dict(idx=58, label=3), + dict(idx=48, label=3, merge=[3, 7]), + dict(idx=67, label=3), + dict(idx=36, label=3), + dict(idx=26, label=3), + dict(idx=97, label=1, merge=[1, 6]), + dict(idx=38, label=3), + dict(idx=17, label=1, merge=[1, 3]), + dict(idx=98, label=1), + dict(idx=49, label=1), + dict(idx=12, label=5), + dict(idx=99, label=1), + dict(idx=8, label=1), + dict(idx=6, label=1, merge=[1, 2]), + dict(idx=2, label=5, merge=[5, 11]), + dict(idx=94, label=13), + dict(idx=57, label=1), + dict(idx=3, label=5), + dict(idx=16, label=1), + dict(idx=0, label=1), + dict(idx=18, label=1), + dict(idx=1, label=1, merge=[1, 5]), + dict(idx=25, label=1, merge=[1, 4]), + dict(idx=64, label=14), + dict(idx=91, label=1), + dict(idx=4, label=1, merge=[1, 13]), + dict(idx=13, label=1), + dict(idx=84, label=1), + dict(idx=44, label=1), + dict(idx=65, label=1, merge=[1, 14]), + ] + + idx = [action["idx"] for action in actions] + sizes = [np.zeros(shape, dtype=int) for _ in range(len(actions))] + labels = [np.zeros(shape, dtype=int) for _ in range(len(actions))] + + for i, action in enumerate(actions): + if i > 0: + sizes[i] = sizes[i - 1].copy() + labels[i] = labels[i - 1].copy() + sizes[i].flat[action["idx"]] += 1 + labels[i].flat[action["idx"]] = action["label"] + if "merge" in action: + for label in action["merge"][1:]: + labels[i] = np.where(labels[i] == label, action["merge"][0], labels[i]) + + n = len(idx) + for steps in range(1, n): + segmenter = eye.ClusterLabeller(shape=shape) + start = 0 + for i in range(n // steps + 1): + step = min((i + 1) * steps, n) + segmenter.add_points(idx[start:step]) + start = step + assert np.all(segmenter.labels == labels[step - 1]) diff --git a/tests/test_clusters_example.py b/tests/test_clusters_example.py new file mode 100644 index 00000000..4af8925b --- /dev/null +++ b/tests/test_clusters_example.py @@ -0,0 +1,266 @@ +import GooseEYE as eye +import numpy as np + +img = np.array( + [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1], + [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + ] +) + +labels = np.array( + [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2], + [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5], + [4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5], + [4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5], + [4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5], + [4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5], + [4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5], + [4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5], + [4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5], + ] +) + +labels_periodic = np.array( + [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1], + [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + ] +) + +centers = np.array( + [ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + ] +) + +centers_periodic = np.array( + [ + [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + ] +) + +labels_dilate = np.array( + [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2], + [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2], + [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5], + [4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5], + [4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5], + [4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5], + [4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5], + [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5], + [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5], + [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5], + [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5], + ] +) + +labels_periodic_dilate = np.array( + [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1], + [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1], + ] +) + + +def test_main(): + assert np.all(np.equal(eye.dummy_circles([30, 30], [0, 15], [0, 15], [10, 5]), img)) + + assert np.all(np.equal(eye.clusters(img, periodic=False), labels)) + + test = eye.clusters(img, periodic=True) + assert np.all( + np.equal(labels_periodic, eye.labels_rename(test, eye.labels_map(test, labels_periodic))) + ) + + assert np.all(np.equal(eye.dilate(labels, iterations=1, periodic=False), labels_dilate)) + assert np.all( + np.equal(eye.dilate(labels_periodic, iterations=1, periodic=True), labels_periodic_dilate) + ) + + assert np.all(np.equal(eye.Clusters(img, periodic=False).centers(), centers)) + assert np.all(np.equal(eye.Clusters(img, periodic=True).centers(), centers_periodic)) diff --git a/tests/test_historic.py b/tests/test_historic.py index 9ec7c919..ce46c408 100644 --- a/tests/test_historic.py +++ b/tests/test_historic.py @@ -156,3 +156,6 @@ def test_pixel_path(): [[0, 0], [-1, 0], [-1, 1], [-2, 1], [-3, 1], [-3, 2], [-4, 2], [-5, 2], [-5, 3], [-6, 3]] ) assert np.all(np.equal(eye.path([0, 0], [-6, 3], eye.path_mode.full), path)) + + for mode in [eye.path_mode.Bresenham, eye.path_mode.full, eye.path_mode.actual]: + assert np.all(np.equal(eye.path([0, 0], [0, 2], mode), [[0, 0], [0, 1], [0, 2]]))