From 1448ae8d44e2f735de1be117bdf7efc8eafa4b21 Mon Sep 17 00:00:00 2001 From: Tommy Waltmann Date: Wed, 22 Mar 2023 11:44:08 -0400 Subject: [PATCH 01/33] started working on filter introductory example --- module_intros/locality.Filter.ipynb | 209 ++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 module_intros/locality.Filter.ipynb diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb new file mode 100644 index 0000000..2adc1d5 --- /dev/null +++ b/module_intros/locality.Filter.ipynb @@ -0,0 +1,209 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "80d44c4c", + "metadata": {}, + "source": [ + "# freud.locality.Filter\n", + "\n", + "In this notebook, we introduce the neighborlist filter concept in freud, discuss the filtering methods implemented in freud, and demonstrate how to use them with good efficiency." + ] + }, + { + "cell_type": "markdown", + "id": "f78106b4", + "metadata": {}, + "source": [ + "## What is a NeighborList Filter?\n", + "\n", + "A neighborlist filter is a class which removes some bonds from a pre-defined neighborlist. A neighborlist filter can be thought of as a function for which an unfiltered `NeighborList` is given as the input and a filtered version of the input `NeighborList` is the output. Freud already has some methods in the `NeighborList` class like `filter` and `filter_r` which can achieve this concept, but often the full system definition is needed to decide which bonds to remove. This is often the case when typical neighbor queries which use `r_max` or `num_neighbors` label two particles as neighbors even though they are blocked by another particle in between them. Each of freud's neighborlist filters defines the concept of \"blocking\" or being \"blocked\" differently and removes bonds between particles which are blocked by another particle." + ] + }, + { + "cell_type": "markdown", + "id": "445531c4", + "metadata": {}, + "source": [ + "## The Solid Angle Nearest Neighbor (SANN) Method\n", + "\n", + "With the SANN method, we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors going radially outward and define the solid angle occupied by each neighbor as [show the formula from the paper]. The `freud.locality.FilterSANN` class implements this method, and an example usage is shown below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3164e5e7", + "metadata": {}, + "outputs": [], + "source": [ + "import freud\n", + "\n", + "# make the system to operate on\n", + "N = 1000\n", + "L = 100\n", + "box, points = freud.data.make_random_system(N, L)\n", + "\n", + "# create the unfiltered neighborlist\n", + "nlist = freud.locality.AABBQuery(box, points).compute(points, neighbors=dict(r_max=49, exclude_ii=True)).toNeighborList()\n", + "\n", + "# make the FilterSANN and call compute\n", + "sann = freud.locality.FilterSANN()\n", + "sann.compute((box, points), neighbors=nlist)\n", + "\n", + "# access the filtered neighborlist as a property at the end\n", + "sann.filtered_nlist" + ] + }, + { + "cell_type": "markdown", + "id": "f217ac3a", + "metadata": {}, + "source": [ + "Optionally, instead of having to do the neighbor query explicitly in your python script, freud will do it automatically if query arguents are passed to the `neighbors` argument of `FilterSANN`'s `compute` method. The following script is equivalent to the previous script:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "77e5a753", + "metadata": {}, + "outputs": [], + "source": [ + "import freud\n", + "\n", + "# make the system to operate on\n", + "N = 1000\n", + "L = 100\n", + "box, points = freud.data.make_random_system(N, L)\n", + "\n", + "# make the FilterSANN and call compute\n", + "sann = freud.locality.FilterSANN()\n", + "sann.compute((box, points), neighbors=dict(r_max=49, exclude_ii=True))\n", + "\n", + "# get the filtered neighborlist at the end\n", + "sann.filtered_nlist\n", + "\n", + "# get the unfiltered neighborlist automatically computed by freud\n", + "sann.unfiltered_nlist" + ] + }, + { + "cell_type": "markdown", + "id": "be265984", + "metadata": {}, + "source": [ + "In general, we recommend using `exclude_ii=True` in neighbor queries to generate the unfiltered neighborlist, due to algorithmic issues when the distance between neighbors is $0$. Custom `NeighborList`'s are also supported as inputs to the `neighbors` argument, as shown below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f43a6be8", + "metadata": {}, + "outputs": [], + "source": [ + "import freud\n", + "import numpy as np\n", + "\n", + "# make the system to operate on\n", + "N = 1000\n", + "L = 100\n", + "box, points = freud.data.make_random_system(N, L)\n", + "\n", + "# custom neighborlist\n", + "point_indices = np.random.randint(low=0, high=N, num=N)\n", + "query_point_indices = np.random.randint(low=0, high=N, num=N)\n", + "distances = box.wrap(np.linalg.norm(points[point_indices] - points[query_point_indices], axis=-1))\n", + "nlist = freud.locality.NeighborList.from_arrays(N, N, point_indices, query_point_indices, distances)\n", + "\n", + "# make the FilterSANN and call compute\n", + "sann = freud.locality.FilterSANN()\n", + "sann.compute((box, points), neighbors=nlist)\n", + "\n", + "# get the filtered neighborlist at the end\n", + "sann.filtered_nlist" + ] + }, + { + "cell_type": "markdown", + "id": "64e7fc61", + "metadata": {}, + "source": [ + "If nothing is given to the `neighbors` argument, freud will automatically compute an all pairs neighborlist (excluding ii pairs) as the unfiltered neighborlist, equivalent to what is shown below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e4c01834", + "metadata": {}, + "outputs": [], + "source": [ + "import freud\n", + "\n", + "# make the system to operate on\n", + "N = 1000\n", + "L = 100\n", + "box, points = freud.data.make_random_system(N, L)\n", + "\n", + "# all pairs neighborlist\n", + "nlist = freud.locality.NeighborList.all_pairs(points, exclude_ii=True)\n", + "\n", + "# make the FilterSANN and call compute\n", + "sann = freud.locality.FilterSANN()\n", + "sann.compute((box, points), neighbors=nlist)\n", + "\n", + "# get the filtered neighborlist at the end\n", + "sann.filtered_nlist" + ] + }, + { + "cell_type": "markdown", + "id": "085e3365", + "metadata": {}, + "source": [ + "## The Relative Angular Distance (RAD) Method\n", + "\n", + "With the RAD method, we label a neighbor as blocked if the angle formed between it, the other neighbor, and a blocking particle is less than a given threshold." + ] + }, + { + "cell_type": "markdown", + "id": "53ef28bc", + "metadata": {}, + "source": [ + "## Incomplete Shells and Performance Considerations" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9691fe19", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From ca6fcca9f0aa5402c8f68ba2f2a4b3e57afd2c4f Mon Sep 17 00:00:00 2001 From: Tommy Waltmann Date: Wed, 22 Mar 2023 14:15:35 -0400 Subject: [PATCH 02/33] tweaking whats there so far --- module_intros/locality.Filter.ipynb | 114 +++++++++++++++++----------- 1 file changed, 68 insertions(+), 46 deletions(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index 2adc1d5..2d68db2 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -7,7 +7,7 @@ "source": [ "# freud.locality.Filter\n", "\n", - "In this notebook, we introduce the neighborlist filter concept in freud, discuss the filtering methods implemented in freud, and demonstrate how to use them with good efficiency." + "In this notebook, we introduce the neighborlist filter concept, discuss the filtering methods implemented in freud, and demonstrate how to use them with good efficiency." ] }, { @@ -17,7 +17,7 @@ "source": [ "## What is a NeighborList Filter?\n", "\n", - "A neighborlist filter is a class which removes some bonds from a pre-defined neighborlist. A neighborlist filter can be thought of as a function for which an unfiltered `NeighborList` is given as the input and a filtered version of the input `NeighborList` is the output. Freud already has some methods in the `NeighborList` class like `filter` and `filter_r` which can achieve this concept, but often the full system definition is needed to decide which bonds to remove. This is often the case when typical neighbor queries which use `r_max` or `num_neighbors` label two particles as neighbors even though they are blocked by another particle in between them. Each of freud's neighborlist filters defines the concept of \"blocking\" or being \"blocked\" differently and removes bonds between particles which are blocked by another particle." + "A neighborlist filter is a class which removes some bonds from a pre-defined neighborlist. A neighborlist filter can be thought of as a function for which an unfiltered `NeighborList` is given as the input and a filtered version of the input `NeighborList` is the output. Freud already has some methods in the `NeighborList` class like `filter` and `filter_r` which can achieve this concept, but often the full system definition is needed to decide which bonds to remove. This is often the case when typical neighbor finding algorithms which use `r_max` or `num_neighbors` label two particles as neighbors even though they are blocked by another particle in between them. Each of freud's neighborlist filters defines the concept of \"blocking\" or being \"blocked\" differently and removes bonds between particles which are blocked by another particle." ] }, { @@ -32,20 +32,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "3164e5e7", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "import freud\n", "\n", "# make the system to operate on\n", "N = 1000\n", - "L = 100\n", - "box, points = freud.data.make_random_system(N, L)\n", + "L = 10\n", + "box, points = freud.data.make_random_system(L, N)\n", "\n", "# create the unfiltered neighborlist\n", - "nlist = freud.locality.AABBQuery(box, points).compute(points, neighbors=dict(r_max=49, exclude_ii=True)).toNeighborList()\n", + "nlist = freud.locality.AABBQuery(box, points).query(\n", + " points, dict(r_max=4.9, exclude_ii=True)\n", + ").toNeighborList()\n", "\n", "# make the FilterSANN and call compute\n", "sann = freud.locality.FilterSANN()\n", @@ -60,26 +73,29 @@ "id": "f217ac3a", "metadata": {}, "source": [ - "Optionally, instead of having to do the neighbor query explicitly in your python script, freud will do it automatically if query arguents are passed to the `neighbors` argument of `FilterSANN`'s `compute` method. The following script is equivalent to the previous script:" + "Optionally, instead of having to do the neighbor query explicitly in your python script, freud will do it automatically if query arguents are passed to the `neighbors` argument of `FilterSANN`'s `compute` method. The following call to `compute` is equivalent to the call in the previous script:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "77e5a753", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "import freud\n", - "\n", - "# make the system to operate on\n", - "N = 1000\n", - "L = 100\n", - "box, points = freud.data.make_random_system(N, L)\n", - "\n", - "# make the FilterSANN and call compute\n", - "sann = freud.locality.FilterSANN()\n", - "sann.compute((box, points), neighbors=dict(r_max=49, exclude_ii=True))\n", + "# call compute\n", + "sann.compute((box, points), neighbors=dict(r_max=4.9, exclude_ii=True))\n", "\n", "# get the filtered neighborlist at the end\n", "sann.filtered_nlist\n", @@ -98,27 +114,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "f43a6be8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "import freud\n", "import numpy as np\n", "\n", - "# make the system to operate on\n", - "N = 1000\n", - "L = 100\n", - "box, points = freud.data.make_random_system(N, L)\n", - "\n", "# custom neighborlist\n", - "point_indices = np.random.randint(low=0, high=N, num=N)\n", - "query_point_indices = np.random.randint(low=0, high=N, num=N)\n", - "distances = box.wrap(np.linalg.norm(points[point_indices] - points[query_point_indices], axis=-1))\n", - "nlist = freud.locality.NeighborList.from_arrays(N, N, point_indices, query_point_indices, distances)\n", + "M = 15\n", + "query_point_indices = np.arange(N).repeat(M)\n", + "point_indices = np.random.randint(low=0, high=N, size=M * N)\n", + "distances = np.linalg.norm(box.wrap(points[point_indices, :] - points[query_point_indices, :]), axis=-1)\n", + "nlist = freud.locality.NeighborList.from_arrays(N, N, query_point_indices, point_indices, distances)\n", "\n", "# make the FilterSANN and call compute\n", - "sann = freud.locality.FilterSANN()\n", "sann.compute((box, points), neighbors=nlist)\n", "\n", "# get the filtered neighborlist at the end\n", @@ -135,21 +156,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "e4c01834", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "import freud\n", - "\n", - "# make the system to operate on\n", - "N = 1000\n", - "L = 100\n", - "box, points = freud.data.make_random_system(N, L)\n", - "\n", - "# all pairs neighborlist\n", - "nlist = freud.locality.NeighborList.all_pairs(points, exclude_ii=True)\n", - "\n", "# make the FilterSANN and call compute\n", "sann = freud.locality.FilterSANN()\n", "sann.compute((box, points), neighbors=nlist)\n", @@ -201,7 +223,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.9.16" } }, "nbformat": 4, From 641254594c999c93335e8c92e09ea5765060afac Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Wed, 22 Mar 2023 14:22:43 -0400 Subject: [PATCH 03/33] Add link to SANN paper --- module_intros/locality.Filter.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index 2d68db2..4139e24 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -27,7 +27,7 @@ "source": [ "## The Solid Angle Nearest Neighbor (SANN) Method\n", "\n", - "With the SANN method, we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors going radially outward and define the solid angle occupied by each neighbor as [show the formula from the paper]. The `freud.locality.FilterSANN` class implements this method, and an example usage is shown below:" + "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors going radially outward and define the solid angle occupied by each neighbor as [show the formula from the paper]. The `freud.locality.FilterSANN` class implements this method, and an example usage is shown below:" ] }, { From 1cd8e96b4c48d69c660da03089a7681bbb74c31b Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Wed, 22 Mar 2023 14:34:47 -0400 Subject: [PATCH 04/33] update formulas and description of SANN basic idea --- module_intros/locality.Filter.ipynb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index 4139e24..cf39c55 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -27,7 +27,11 @@ "source": [ "## The Solid Angle Nearest Neighbor (SANN) Method\n", "\n", - "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors going radially outward and define the solid angle occupied by each neighbor as [show the formula from the paper]. The `freud.locality.FilterSANN` class implements this method, and an example usage is shown below:" + "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $$i$$ to consist of the nearest (i.e., closest) $$m$$ particles $${j}$$ in neighborhood defined by radius $$R_i^{(m)}$$ such that the sum of their solid angles associated with $$\theta_{i,j}$$ equals $$4\pi$$ :", + "\n", + "$$ 4\pi = \sum_{j=1}^m 2 \pi (1-\cos{\theta_{i,j}}) = \sum_{j=1}^m 2 \pi (r_{i,j}-R_i^{(m)})$$\n", + "\n", + "The `freud.locality.FilterSANN` class implements this method, and an example usage is shown below:" ] }, { From 6d75ccccea9cba60af5355f4173518bcce0fcf22 Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Wed, 22 Mar 2023 14:42:17 -0400 Subject: [PATCH 05/33] fix notebook --- module_intros/locality.Filter.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index cf39c55..6b34e64 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -27,7 +27,7 @@ "source": [ "## The Solid Angle Nearest Neighbor (SANN) Method\n", "\n", - "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $$i$$ to consist of the nearest (i.e., closest) $$m$$ particles $${j}$$ in neighborhood defined by radius $$R_i^{(m)}$$ such that the sum of their solid angles associated with $$\theta_{i,j}$$ equals $$4\pi$$ :", + "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle i to consist of the nearest (i.e., closest) m particles {j} in neighborhood defined by radius R_i^{(m)} such that the sum of their solid angles associated with \theta_{i,j} equals 4\pi :", "\n", "$$ 4\pi = \sum_{j=1}^m 2 \pi (1-\cos{\theta_{i,j}}) = \sum_{j=1}^m 2 \pi (r_{i,j}-R_i^{(m)})$$\n", "\n", From ae76181b41218bb29876bed6d33630fd0fbc66da Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Wed, 22 Mar 2023 14:45:00 -0400 Subject: [PATCH 06/33] more fixes to nb --- module_intros/locality.Filter.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index 6b34e64..3ad4b9f 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -29,7 +29,7 @@ "\n", "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle i to consist of the nearest (i.e., closest) m particles {j} in neighborhood defined by radius R_i^{(m)} such that the sum of their solid angles associated with \theta_{i,j} equals 4\pi :", "\n", - "$$ 4\pi = \sum_{j=1}^m 2 \pi (1-\cos{\theta_{i,j}}) = \sum_{j=1}^m 2 \pi (r_{i,j}-R_i^{(m)})$$\n", + "$$ 4\\pi = \\sum_{j=1}^m 2 \\pi (1-\\cos{\\theta_{i,j}}) = \\sum_{j=1}^m 2 \\pi (r_{i,j}-R_i^{(m)})$$\n", "\n", "The `freud.locality.FilterSANN` class implements this method, and an example usage is shown below:" ] From 55fefa396b126dcf7e70f2f6b41a2879dc75916d Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Wed, 22 Mar 2023 14:46:36 -0400 Subject: [PATCH 07/33] Hopefully last fix --- module_intros/locality.Filter.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index 3ad4b9f..45b3700 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -27,7 +27,7 @@ "source": [ "## The Solid Angle Nearest Neighbor (SANN) Method\n", "\n", - "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle i to consist of the nearest (i.e., closest) m particles {j} in neighborhood defined by radius R_i^{(m)} such that the sum of their solid angles associated with \theta_{i,j} equals 4\pi :", + "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $$i$$ to consist of the nearest (i.e., closest) $$m$$ particles $${j}$$ in neighborhood defined by radius $$R_i^{(m)}$$ such that the sum of their solid angles associated with $$\\theta_{i,j}$$ equals $$4 \\pi$$ :", "\n", "$$ 4\\pi = \\sum_{j=1}^m 2 \\pi (1-\\cos{\\theta_{i,j}}) = \\sum_{j=1}^m 2 \\pi (r_{i,j}-R_i^{(m)})$$\n", "\n", From 5d49e1376daffefb48642de3799f0d81674cd340 Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Wed, 22 Mar 2023 14:47:39 -0400 Subject: [PATCH 08/33] test more changes --- module_intros/locality.Filter.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index 45b3700..d2ffdd2 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -27,7 +27,7 @@ "source": [ "## The Solid Angle Nearest Neighbor (SANN) Method\n", "\n", - "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $$i$$ to consist of the nearest (i.e., closest) $$m$$ particles $${j}$$ in neighborhood defined by radius $$R_i^{(m)}$$ such that the sum of their solid angles associated with $$\\theta_{i,j}$$ equals $$4 \\pi$$ :", + "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $$i$$ to consist of the nearest (i.e., closest) $$m$$ particles $${j}$$ in neighborhood defined by radius $$R_i^{(m)}$$ such that the sum of their solid angles associated with $$\\theta_{i,j}$$ equals $4 \\pi$ :", "\n", "$$ 4\\pi = \\sum_{j=1}^m 2 \\pi (1-\\cos{\\theta_{i,j}}) = \\sum_{j=1}^m 2 \\pi (r_{i,j}-R_i^{(m)})$$\n", "\n", From 3c7dcad0c0c9895fcb2493b9e7c53b0ec5f9d531 Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Wed, 22 Mar 2023 14:48:20 -0400 Subject: [PATCH 09/33] last batch of fixes --- module_intros/locality.Filter.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index d2ffdd2..3752fda 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -27,7 +27,7 @@ "source": [ "## The Solid Angle Nearest Neighbor (SANN) Method\n", "\n", - "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $$i$$ to consist of the nearest (i.e., closest) $$m$$ particles $${j}$$ in neighborhood defined by radius $$R_i^{(m)}$$ such that the sum of their solid angles associated with $$\\theta_{i,j}$$ equals $4 \\pi$ :", + "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $i$ to consist of the nearest (i.e., closest) $m$ particles ${j}$ in neighborhood defined by radius $R_i^{(m)}$ such that the sum of their solid angles associated with $\\theta_{i,j}$ equals $4 \\pi$ :", "\n", "$$ 4\\pi = \\sum_{j=1}^m 2 \\pi (1-\\cos{\\theta_{i,j}}) = \\sum_{j=1}^m 2 \\pi (r_{i,j}-R_i^{(m)})$$\n", "\n", From 8e22ce55d44c94d258b35e7d0e405507e9b025fc Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Wed, 22 Mar 2023 14:50:29 -0400 Subject: [PATCH 10/33] fix shell radius --- module_intros/locality.Filter.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index 3752fda..d1a1817 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -27,7 +27,7 @@ "source": [ "## The Solid Angle Nearest Neighbor (SANN) Method\n", "\n", - "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $i$ to consist of the nearest (i.e., closest) $m$ particles ${j}$ in neighborhood defined by radius $R_i^{(m)}$ such that the sum of their solid angles associated with $\\theta_{i,j}$ equals $4 \\pi$ :", + "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $i$ to consist of the nearest (i.e., closest) $m$ particles ${j}$ in neighborhood defined by shell radius $R_i^{(m)}$ such that the sum of their solid angles associated with $\\theta_{i,j}$ equals $4 \\pi$ :", "\n", "$$ 4\\pi = \\sum_{j=1}^m 2 \\pi (1-\\cos{\\theta_{i,j}}) = \\sum_{j=1}^m 2 \\pi (r_{i,j}-R_i^{(m)})$$\n", "\n", From 1b41abd7afa6a42a0e2d525425c688ec4bc6ebb0 Mon Sep 17 00:00:00 2001 From: Tommy Waltmann Date: Thu, 23 Mar 2023 12:37:39 -0400 Subject: [PATCH 11/33] finish writing rough draft of filter module intro --- module_intros/locality.Filter.ipynb | 204 +++++++++++++++++++++++++--- 1 file changed, 182 insertions(+), 22 deletions(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index d1a1817..b4ef733 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -27,8 +27,7 @@ "source": [ "## The Solid Angle Nearest Neighbor (SANN) Method\n", "\n", - "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $i$ to consist of the nearest (i.e., closest) $m$ particles ${j}$ in neighborhood defined by shell radius $R_i^{(m)}$ such that the sum of their solid angles associated with $\\theta_{i,j}$ equals $4 \\pi$ :", - "\n", + "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $i$ to consist of the nearest (i.e., closest) $m$ particles ${j}$ in neighborhood defined by shell radius $R_i^{(m)}$ such that the sum of their solid angles associated with $\\theta_{i,j}$ equals $4 \\pi$ :\n", "$$ 4\\pi = \\sum_{j=1}^m 2 \\pi (1-\\cos{\\theta_{i,j}}) = \\sum_{j=1}^m 2 \\pi (r_{i,j}-R_i^{(m)})$$\n", "\n", "The `freud.locality.FilterSANN` class implements this method, and an example usage is shown below:" @@ -43,7 +42,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 1, @@ -77,7 +76,7 @@ "id": "f217ac3a", "metadata": {}, "source": [ - "Optionally, instead of having to do the neighbor query explicitly in your python script, freud will do it automatically if query arguents are passed to the `neighbors` argument of `FilterSANN`'s `compute` method. The following call to `compute` is equivalent to the call in the previous script:" + "Instead of having to do the neighbor query explicitly in your python script, freud will do it automatically if query arguents are passed to the `neighbors` argument of the filter's `compute` method. The following call to `compute` is equivalent to the call in the previous script:" ] }, { @@ -89,7 +88,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 2, @@ -123,14 +122,17 @@ "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" + "ename": "RuntimeError", + "evalue": "Query point indices 664, 853 do not have full neighbor shells.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[3], line 11\u001b[0m\n\u001b[1;32m 8\u001b[0m nlist \u001b[38;5;241m=\u001b[39m freud\u001b[38;5;241m.\u001b[39mlocality\u001b[38;5;241m.\u001b[39mNeighborList\u001b[38;5;241m.\u001b[39mfrom_arrays(N, N, query_point_indices, point_indices, distances)\n\u001b[1;32m 10\u001b[0m \u001b[38;5;66;03m# call compute\u001b[39;00m\n\u001b[0;32m---> 11\u001b[0m \u001b[43msann\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcompute\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbox\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpoints\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mneighbors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnlist\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;66;03m# get the filtered neighborlist at the end\u001b[39;00m\n\u001b[1;32m 14\u001b[0m sann\u001b[38;5;241m.\u001b[39mfiltered_nlist\n", + "File \u001b[0;32mutil.pyx:165\u001b[0m, in \u001b[0;36mfreud.util._Compute.__getattribute__.compute_wrapper\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mlocality.pyx:1396\u001b[0m, in \u001b[0;36mfreud.locality.Filter.compute\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mRuntimeError\u001b[0m: Query point indices 664, 853 do not have full neighbor shells." + ] } ], "source": [ @@ -143,7 +145,7 @@ "distances = np.linalg.norm(box.wrap(points[point_indices, :] - points[query_point_indices, :]), axis=-1)\n", "nlist = freud.locality.NeighborList.from_arrays(N, N, query_point_indices, point_indices, distances)\n", "\n", - "# make the FilterSANN and call compute\n", + "# call compute\n", "sann.compute((box, points), neighbors=nlist)\n", "\n", "# get the filtered neighborlist at the end\n", @@ -167,7 +169,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 4, @@ -176,8 +178,10 @@ } ], "source": [ - "# make the FilterSANN and call compute\n", - "sann = freud.locality.FilterSANN()\n", + "# make all pairs neighborlist with ii pairs excluded\n", + "nlist = freud.locality.NeighborList.all_pairs((box, points))\n", + "\n", + "# call compute\n", "sann.compute((box, points), neighbors=nlist)\n", "\n", "# get the filtered neighborlist at the end\n", @@ -191,7 +195,41 @@ "source": [ "## The Relative Angular Distance (RAD) Method\n", "\n", - "With the RAD method, we label a neighbor as blocked if the angle formed between it, the other neighbor, and a blocking particle is less than a given threshold." + "With the [Relative Angular Distance (RAD) method](https://aip.scitation.org/doi/10.1063/1.4961439), we label a neighbor as blocked if the angle formed between it, the other neighbor, and a blocking particle is less than a given threshold. Strictly speaking, we being considering neighbors of particle $i$ starting with the closest neighbor $j$ going radially outward. We label $j$ blocked by a nearer neighbor particle $k$ if\n", + "\n", + "$$ \\frac{1}{r_{ij}^2} < \\frac{1}{r_{ik}^2} \\cos(\\theta_{jik})$$\n", + "\n", + "where $r_{\\alpha \\beta}$ is the distance between particles $\\alpha$ and $\\beta$ and $\\theta_{jik}$ is the angle centered at particle $i$ extending out to particles $j$ and $k$." + ] + }, + { + "cell_type": "markdown", + "id": "e8b3246c", + "metadata": {}, + "source": [ + "There are two variants of the RAD method: RAD$_{open}$ and RAD$_{closed}$. In RAD$_{closed}$, we consider all neighbors further away than the first blocked neighbor $j$ to also be blocked. In other words, the RAD$_{closed}$ algorithm terminates after we find the first blocked neighbor. In RAD$_{open}$, we consider all neighbors regardless of whether or not closer neighbors are blocked. The flag determining which RAD algorithm we use is controlled by the `terminate_after_blocked` argument to the `FilterRAD` constructor, as shown below:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "68401679", + "metadata": {}, + "outputs": [], + "source": [ + "# default behavior is RAD closed\n", + "rad_closed = freud.locality.FilterRAD()\n", + "\n", + "# RAD open\n", + "rad_open = freud.locality.FilterRAD(terminate_after_blocked=False)" + ] + }, + { + "cell_type": "markdown", + "id": "f1e1cc26", + "metadata": {}, + "source": [ + "All patterns in the `compute` method established in the previous section for the `FilterSANN` class also apply to the `FilterRAD` class. " ] }, { @@ -202,13 +240,135 @@ "## Incomplete Shells and Performance Considerations" ] }, + { + "cell_type": "markdown", + "id": "26c30fa6", + "metadata": {}, + "source": [ + "There are two more issues to discuss in this tutorial related to the input unfiltered neighborlist.\n", + "\n", + "In cases where the input neighborlist is sparse (i.e. relatively few neighbors), there may not be enough neighbors such that each particle has a complete neighbor shell in the unfiltered neighborlist, making it impossible for `FilterSANN` (`FilterRAD`) to return a full SANN (RAD) neighborlist. In these cases, `FilterSANN` (`FilterRAD`) will by default throw an error message detailing which particles do not have full neighbor shells. An example is shown in the code block below:" + ] + }, { "cell_type": "code", - "execution_count": null, - "id": "9691fe19", + "execution_count": 6, + "id": "136b5bbc", "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "ename": "RuntimeError", + "evalue": "Query point indices 0, 1, 2, 3, 4 do not have full neighbor shells.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[6], line 8\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[38;5;66;03m# try to compute SANN neighborlist\u001b[39;00m\n\u001b[1;32m 7\u001b[0m sann \u001b[38;5;241m=\u001b[39m freud\u001b[38;5;241m.\u001b[39mlocality\u001b[38;5;241m.\u001b[39mFilterSANN()\n\u001b[0;32m----> 8\u001b[0m \u001b[43msann\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcompute\u001b[49m\u001b[43m(\u001b[49m\u001b[43msystem\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32mutil.pyx:165\u001b[0m, in \u001b[0;36mfreud.util._Compute.__getattribute__.compute_wrapper\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mlocality.pyx:1396\u001b[0m, in \u001b[0;36mfreud.locality.Filter.compute\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mRuntimeError\u001b[0m: Query point indices 0, 1, 2, 3, 4 do not have full neighbor shells." + ] + } + ], + "source": [ + "# sparse system\n", + "N = 5\n", + "L = 100\n", + "system = freud.data.make_random_system(L, N)\n", + "\n", + "# try to compute SANN neighborlist\n", + "sann = freud.locality.FilterSANN()\n", + "sann.compute(system)" + ] + }, + { + "cell_type": "markdown", + "id": "c9eed5eb", + "metadata": {}, + "source": [ + "This error can be downgraded to a warning through an optional argument `allow_incomplete_shell` to the filter class's constructor, as shown below" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "24fc48ae", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING: Query point indices 0, 1, 2, 3, 4 do not have full neighbor shells.\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sann = freud.locality.FilterSANN(allow_incomplete_shell=True)\n", + "sann.compute(system)" + ] + }, + { + "cell_type": "markdown", + "id": "2ca97268", + "metadata": {}, + "source": [ + "In cases where the input neighborlist is dense (i.e. $\\approx N$ neighbors per particle), the calculation by done `FilterSANN` and `FilterRAD` can take a long time to complete and often most of the input neighbors will be blocked. To use these classes more efficiently, physical intuition about the system can be used to limit the number of neighbors in the unfiltered neighborlist. For example, plotting a $g(r)$ for the system and choosing an `r_max` slightly larger than fist peak distance can be used as a good starting point. Another option which does not rely on any physical intuition is to start with a small number of neighbors, and slowly increase the number until the filter class does not issue a `RuntimeError`. An example demonstrating this method is shown below:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "7fa6ac52", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of neighbors: 4\n", + "number of neighbors: 5\n", + "number of neighbors: 6\n", + "number of neighbors: 7\n", + "number of neighbors: 8\n", + "number of neighbors: 9\n", + "number of neighbors: 10\n", + "number of neighbors: 11\n", + "number of neighbors: 12\n", + "number of neighbors: 13\n" + ] + } + ], + "source": [ + "# dense system\n", + "N = 1000000\n", + "L = 10\n", + "system = freud.data.make_random_system(L, N)\n", + "\n", + "# start with a small number of neighbors\n", + "num_neighbors = 4\n", + "all_shells_full = False\n", + "rad = freud.locality.FilterRAD()\n", + "\n", + "# iterate and increase num_neighbors each time\n", + "while not all_shells_full:\n", + " print(\"number of neighbors:\", num_neighbors)\n", + " try:\n", + " rad.compute(system, dict(num_neighbors=num_neighbors, exclude_ii=True))\n", + " all_shells_full = True\n", + " except RuntimeError:\n", + " num_neighbors += 1" + ] } ], "metadata": { From 186e220e167b56ecc0c071649e996b56b5dc94fd Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 23 Mar 2023 16:43:58 +0000 Subject: [PATCH 12/33] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- module_intros/locality.Filter.ipynb | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index b4ef733..1d067c8 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -59,9 +59,11 @@ "box, points = freud.data.make_random_system(L, N)\n", "\n", "# create the unfiltered neighborlist\n", - "nlist = freud.locality.AABBQuery(box, points).query(\n", - " points, dict(r_max=4.9, exclude_ii=True)\n", - ").toNeighborList()\n", + "nlist = (\n", + " freud.locality.AABBQuery(box, points)\n", + " .query(points, dict(r_max=4.9, exclude_ii=True))\n", + " .toNeighborList()\n", + ")\n", "\n", "# make the FilterSANN and call compute\n", "sann = freud.locality.FilterSANN()\n", @@ -142,8 +144,12 @@ "M = 15\n", "query_point_indices = np.arange(N).repeat(M)\n", "point_indices = np.random.randint(low=0, high=N, size=M * N)\n", - "distances = np.linalg.norm(box.wrap(points[point_indices, :] - points[query_point_indices, :]), axis=-1)\n", - "nlist = freud.locality.NeighborList.from_arrays(N, N, query_point_indices, point_indices, distances)\n", + "distances = np.linalg.norm(\n", + " box.wrap(points[point_indices, :] - points[query_point_indices, :]), axis=-1\n", + ")\n", + "nlist = freud.locality.NeighborList.from_arrays(\n", + " N, N, query_point_indices, point_indices, distances\n", + ")\n", "\n", "# call compute\n", "sann.compute((box, points), neighbors=nlist)\n", From a00b8adf1a4357c205d774c32d6aa6425c86b2fb Mon Sep 17 00:00:00 2001 From: Tommy Waltmann Date: Thu, 23 Mar 2023 12:58:02 -0400 Subject: [PATCH 13/33] fix failing cell --- module_intros/locality.Filter.ipynb | 31 ++++++++++++++--------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index b4ef733..4a424a3 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -42,7 +42,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 1, @@ -88,7 +88,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 2, @@ -122,17 +122,14 @@ "metadata": {}, "outputs": [ { - "ename": "RuntimeError", - "evalue": "Query point indices 664, 853 do not have full neighbor shells.", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[3], line 11\u001b[0m\n\u001b[1;32m 8\u001b[0m nlist \u001b[38;5;241m=\u001b[39m freud\u001b[38;5;241m.\u001b[39mlocality\u001b[38;5;241m.\u001b[39mNeighborList\u001b[38;5;241m.\u001b[39mfrom_arrays(N, N, query_point_indices, point_indices, distances)\n\u001b[1;32m 10\u001b[0m \u001b[38;5;66;03m# call compute\u001b[39;00m\n\u001b[0;32m---> 11\u001b[0m \u001b[43msann\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcompute\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbox\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpoints\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mneighbors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnlist\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;66;03m# get the filtered neighborlist at the end\u001b[39;00m\n\u001b[1;32m 14\u001b[0m sann\u001b[38;5;241m.\u001b[39mfiltered_nlist\n", - "File \u001b[0;32mutil.pyx:165\u001b[0m, in \u001b[0;36mfreud.util._Compute.__getattribute__.compute_wrapper\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32mlocality.pyx:1396\u001b[0m, in \u001b[0;36mfreud.locality.Filter.compute\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mRuntimeError\u001b[0m: Query point indices 664, 853 do not have full neighbor shells." - ] + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -169,7 +166,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 4, @@ -305,7 +302,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 7, @@ -345,7 +342,9 @@ "number of neighbors: 10\n", "number of neighbors: 11\n", "number of neighbors: 12\n", - "number of neighbors: 13\n" + "number of neighbors: 13\n", + "number of neighbors: 14\n", + "number of neighbors: 15\n" ] } ], From 6a45ce52c941494982873e32a4b07941921ea8f2 Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Fri, 31 Mar 2023 15:59:31 -0400 Subject: [PATCH 14/33] Fix SANN equation --- module_intros/locality.Filter.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index 354e540..262d4d4 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -28,7 +28,7 @@ "## The Solid Angle Nearest Neighbor (SANN) Method\n", "\n", "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $i$ to consist of the nearest (i.e., closest) $m$ particles ${j}$ in neighborhood defined by shell radius $R_i^{(m)}$ such that the sum of their solid angles associated with $\\theta_{i,j}$ equals $4 \\pi$ :\n", - "$$ 4\\pi = \\sum_{j=1}^m 2 \\pi (1-\\cos{\\theta_{i,j}}) = \\sum_{j=1}^m 2 \\pi (r_{i,j}-R_i^{(m)})$$\n", + "$$ 4\\pi = \\sum_{j=1}^m 2 \\pi (1-\\cos{\\theta_{i,j}}) = \\sum_{j=1}^m 2 \\pi (1- r_{i,j}/R_i^{(m)})$$\n", "\n", "The `freud.locality.FilterSANN` class implements this method, and an example usage is shown below:" ] From b94783aa93a30341a3ab56c7da1db00343578a64 Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Fri, 31 Mar 2023 17:57:46 -0400 Subject: [PATCH 15/33] add RAD and SANN figures in pdf --- data/RAD.pdf | Bin 0 -> 8062 bytes data/SANN.pdf | Bin 0 -> 14487 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/RAD.pdf create mode 100644 data/SANN.pdf diff --git a/data/RAD.pdf b/data/RAD.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f08f972ed9bd46b6336eac3313ecf32427453ceb GIT binary patch literal 8062 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 Ky^N|X+W!FL0$_ar literal 0 HcmV?d00001 diff --git a/data/SANN.pdf b/data/SANN.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4924e7c52252fe0ba05b6701eacc89f4747d2224 GIT binary patch literal 14487 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 literal 0 HcmV?d00001 From 5ba53578a4a60adea289fac7cc9f7b49d1045606 Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Fri, 31 Mar 2023 18:04:14 -0400 Subject: [PATCH 16/33] add SANN figure --- module_intros/locality.Filter.ipynb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index 262d4d4..c8ce67a 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -30,6 +30,8 @@ "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $i$ to consist of the nearest (i.e., closest) $m$ particles ${j}$ in neighborhood defined by shell radius $R_i^{(m)}$ such that the sum of their solid angles associated with $\\theta_{i,j}$ equals $4 \\pi$ :\n", "$$ 4\\pi = \\sum_{j=1}^m 2 \\pi (1-\\cos{\\theta_{i,j}}) = \\sum_{j=1}^m 2 \\pi (1- r_{i,j}/R_i^{(m)})$$\n", "\n", + "![SANN Figure setup](data/SANN.pdf)" + "\n", "The `freud.locality.FilterSANN` class implements this method, and an example usage is shown below:" ] }, From 0b852f337e20161479151202887285038f976e81 Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Fri, 31 Mar 2023 18:04:34 -0400 Subject: [PATCH 17/33] fix --- module_intros/locality.Filter.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index c8ce67a..93952e0 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -30,7 +30,7 @@ "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $i$ to consist of the nearest (i.e., closest) $m$ particles ${j}$ in neighborhood defined by shell radius $R_i^{(m)}$ such that the sum of their solid angles associated with $\\theta_{i,j}$ equals $4 \\pi$ :\n", "$$ 4\\pi = \\sum_{j=1}^m 2 \\pi (1-\\cos{\\theta_{i,j}}) = \\sum_{j=1}^m 2 \\pi (1- r_{i,j}/R_i^{(m)})$$\n", "\n", - "![SANN Figure setup](data/SANN.pdf)" + "![SANN Figure setup](data/SANN.pdf)", "\n", "The `freud.locality.FilterSANN` class implements this method, and an example usage is shown below:" ] From d9dc5bd8bc40661cbf077f949e74d4b776152405 Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Fri, 31 Mar 2023 18:05:13 -0400 Subject: [PATCH 18/33] change path? --- module_intros/locality.Filter.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index 93952e0..3743768 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -30,7 +30,7 @@ "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $i$ to consist of the nearest (i.e., closest) $m$ particles ${j}$ in neighborhood defined by shell radius $R_i^{(m)}$ such that the sum of their solid angles associated with $\\theta_{i,j}$ equals $4 \\pi$ :\n", "$$ 4\\pi = \\sum_{j=1}^m 2 \\pi (1-\\cos{\\theta_{i,j}}) = \\sum_{j=1}^m 2 \\pi (1- r_{i,j}/R_i^{(m)})$$\n", "\n", - "![SANN Figure setup](data/SANN.pdf)", + "![SANN Figure setup](../data/SANN.pdf)", "\n", "The `freud.locality.FilterSANN` class implements this method, and an example usage is shown below:" ] From d82a6d73f65fe4fa8769e294e6867e6baf2b7e20 Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Fri, 31 Mar 2023 18:08:07 -0400 Subject: [PATCH 19/33] add RAD figure --- module_intros/locality.Filter.ipynb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index 3743768..f5ab74e 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -205,6 +205,8 @@ "$$ \\frac{1}{r_{ij}^2} < \\frac{1}{r_{ik}^2} \\cos(\\theta_{jik})$$\n", "\n", "where $r_{\\alpha \\beta}$ is the distance between particles $\\alpha$ and $\\beta$ and $\\theta_{jik}$ is the angle centered at particle $i$ extending out to particles $j$ and $k$." + "![RAD Figure setup](../data/RAD.pdf)", + "\n", ] }, { From dfca70c1c025bfc74073d6d4a8c79cffae627ddf Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Fri, 31 Mar 2023 18:08:46 -0400 Subject: [PATCH 20/33] fix --- module_intros/locality.Filter.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index f5ab74e..7e47a26 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -204,7 +204,7 @@ "\n", "$$ \\frac{1}{r_{ij}^2} < \\frac{1}{r_{ik}^2} \\cos(\\theta_{jik})$$\n", "\n", - "where $r_{\\alpha \\beta}$ is the distance between particles $\\alpha$ and $\\beta$ and $\\theta_{jik}$ is the angle centered at particle $i$ extending out to particles $j$ and $k$." + "where $r_{\\alpha \\beta}$ is the distance between particles $\\alpha$ and $\\beta$ and $\\theta_{jik}$ is the angle centered at particle $i$ extending out to particles $j$ and $k$.", "![RAD Figure setup](../data/RAD.pdf)", "\n", ] From 3672f354343bcc05792e2444e648524784543ada Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Fri, 31 Mar 2023 18:09:39 -0400 Subject: [PATCH 21/33] fix --- module_intros/locality.Filter.ipynb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index 7e47a26..a4ca389 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -205,8 +205,7 @@ "$$ \\frac{1}{r_{ij}^2} < \\frac{1}{r_{ik}^2} \\cos(\\theta_{jik})$$\n", "\n", "where $r_{\\alpha \\beta}$ is the distance between particles $\\alpha$ and $\\beta$ and $\\theta_{jik}$ is the angle centered at particle $i$ extending out to particles $j$ and $k$.", - "![RAD Figure setup](../data/RAD.pdf)", - "\n", + "![RAD Figure setup](../data/RAD.pdf)" ] }, { From d43d1b066e3c3620241363af719548b3e8933969 Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Fri, 31 Mar 2023 18:13:33 -0400 Subject: [PATCH 22/33] add pngs instead? --- data/RAD.png | Bin 0 -> 21518 bytes data/SANN.png | Bin 0 -> 41585 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/RAD.png create mode 100644 data/SANN.png diff --git a/data/RAD.png b/data/RAD.png new file mode 100644 index 0000000000000000000000000000000000000000..053a2dc211f3d67009eb97e9fe0a281daae1cfe0 GIT binary patch literal 21518 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≠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 Xz-Cs8ZfUkP4gBD%Tvz5U4><7uLRRsS literal 0 HcmV?d00001 From 1919da2d8d9b60143af85e70278c98da7521ff0b Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Fri, 31 Mar 2023 18:14:08 -0400 Subject: [PATCH 23/33] try png --- module_intros/locality.Filter.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index a4ca389..a9b84c4 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -30,7 +30,7 @@ "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $i$ to consist of the nearest (i.e., closest) $m$ particles ${j}$ in neighborhood defined by shell radius $R_i^{(m)}$ such that the sum of their solid angles associated with $\\theta_{i,j}$ equals $4 \\pi$ :\n", "$$ 4\\pi = \\sum_{j=1}^m 2 \\pi (1-\\cos{\\theta_{i,j}}) = \\sum_{j=1}^m 2 \\pi (1- r_{i,j}/R_i^{(m)})$$\n", "\n", - "![SANN Figure setup](../data/SANN.pdf)", + "![SANN Figure setup](../data/SANN.png)", "\n", "The `freud.locality.FilterSANN` class implements this method, and an example usage is shown below:" ] @@ -205,7 +205,7 @@ "$$ \\frac{1}{r_{ij}^2} < \\frac{1}{r_{ik}^2} \\cos(\\theta_{jik})$$\n", "\n", "where $r_{\\alpha \\beta}$ is the distance between particles $\\alpha$ and $\\beta$ and $\\theta_{jik}$ is the angle centered at particle $i$ extending out to particles $j$ and $k$.", - "![RAD Figure setup](../data/RAD.pdf)" + "![RAD Figure setup](../data/RAD.png)" ] }, { From 6dbc6eea25d6b090c1a623ca06dabbbd03bdba9c Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Fri, 31 Mar 2023 18:15:43 -0400 Subject: [PATCH 24/33] delete RAD.pdf --- data/RAD.pdf | Bin 8062 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 data/RAD.pdf diff --git a/data/RAD.pdf b/data/RAD.pdf deleted file mode 100644 index f08f972ed9bd46b6336eac3313ecf32427453ceb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8062 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 Ky^N|X+W!FL0$_ar From 5cb2b2c43b59e78d0b6ee3f8f16577abafa5cc7d Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Fri, 31 Mar 2023 18:16:04 -0400 Subject: [PATCH 25/33] delete SANN.pdf --- data/SANN.pdf | Bin 14487 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 data/SANN.pdf diff --git a/data/SANN.pdf b/data/SANN.pdf deleted file mode 100644 index 4924e7c52252fe0ba05b6701eacc89f4747d2224..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14487 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 From dcff2a18c74c22b5857b72ea5844d4e12222f059 Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Mon, 3 Apr 2023 14:09:39 -0400 Subject: [PATCH 26/33] Fixed the figure slightly --- data/SANN.png | Bin 41585 -> 41581 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/SANN.png b/data/SANN.png index 90d70e326edb95abf19ad925f616e0004cf0c07d..4eac2b2718b938c2e2ede6db16cd969a788c9de5 100644 GIT binary patch literal 41581 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 LJ=T=23jFT>dm%l- literal 41585 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≠5iPT_{vae;R~*t#MyU}cu)!kDcrVA6#tHp9m-4H#8((fO#&r0M zM@zjRehY1Yc-<|Pa>5jJ6`W1k6w}hEwgOJE!RD$`({%Yr6sZ5%E)h@mU`A=|snCs;i8ZZB~L|iPbYLV*qL3>(b68(Rp9$ zAA|l7ri3?sw}^Y`;{XF3ObwTA?Rm%BeZQ8tfoNST(a^GvPqgX#UPcWpxIO}{+CE7r zsk!iNP6Q}jk6`1t{{$a;CkE0WKUlt75vPeCNHhOnz}cKKUHo)HN?Rq%AEV@>^{_So z8g#HEZ@`~_&3#$M9Kq$;zInz`)gmzXSk)8BlU_+1rT(+J-_simqr!ip`rHh^)lPh@ znOzC;Q6P|clyUsraWUBlrQbJ3S74tz5#9hm2js2&LCG4k~xL$cmujS5PgKiIY= znq?_|5jvBaUB%gU$}>xVL*MwznXi_7+Y{cSONo1Rc%@$_jazWn{acsVbB!_jlMH@z zKmrJNrk>zSA_$*6;*`-H{x^SvVQAyw?ao*?ZDpdYl5RZ@88ol9H_gZqxM48eiF610|5eUcCGnIb~W0zCyhf_i(wHP?9NF zXHu>-b;fEZNecLD&S!b&k~aRxYrWs@yFMo_q+o4j$In+wM|o;EDJ1A(?$;1J3tuh7 zM#LTWfytbCy1^q`v^rq>LFk~r2v&T0Z1(4QBUVrF415cPbS|_0Q-Rfaj zK`h`0zi0>7cOPw&9O0Z?<7aN)<|1lX2w}x(OKaPINsE)7EhkB?Mr`T2ZXZ~)bdTku zR|or4{Bu3IA>+`vcfPEXv2LqsyGkPjab*D3O%t;%e>nv@%N z7S^^0p&hY)Z|M@qU_+96nxmYx=T3(XzKY2>Z<-AnVH%EtE}x#HSw-D=*gLH8lKs4x z(%IOS-W)NF3e?!Jhh`QF z*8N1&iVMb%PQlQx8V@^$`3par5N*Ugwe6b3*QzyyQrbRf{zD~5Zq4XtDPmrQedy?5 z2BYZ8?(sFVW{1URh=+(W-iJ%KwB$s~QWsjlcIe7`WRx$G6vwE6lpHmZcEaR|bq-g& z80WgC)c^Vpf0=&c!-mfbkXEOKn6WOOV9&~##*CJxCzO?>kITrG)qy;o$|OhOCrsM3 zBx>B5Wt_k-CpI<|Jyppl3VBs#UGd@6%I@P>x51a{f*Xr;k-oNC2xIP;ya@|CD|6c^DFBd z`li<>r@!rTjrWieYnM_#D_ZgU;MC!*z3{ld6-r6 z3cvw;%K5bejVrs`sDy>1b(WHAn-v)1({@|c>t^*EpIyD39$$xOIEj*!{w#wlpRY?R zfW;r=_v-Jh4=x+Z$vszo{oD+C{xS~}bc#oLf*}LE#DI0RSCiI`%$A6o)2X9L! zhvkF*OioEXaj>5{>Aa;9a8#T_qDQNK5PoF}w=P#Wst5_OOQX*nlaYHSIn{!tx>{*# zIKA|$t-KHK3SU+}^Y9;;78jHnI3jnvIzGQ8D$uT~>P$q0Myn`E$iDky@mu z%1_S0Kf^!sxpS(2Zm0U9yE&o!ZHk_@*=y>}NoR|F`I?a=E>mwP+IDI*yZr zO#v=C=<{Xa(wn0SQ&_TJ$f+k*4-gtoBOeX8C*i-+?v6DJ@*@5pRbL(mpvxjG#FwHyN8+UskvhJ-7O&Epzxax?5>$10m+~GJ-Z;Hvm@qHM~f zDj;d0+WskRVo1!1;pceygkAA`m4MsEeS7V&y>$iAhwrj`eq39>`oiaBVt|>T`NTys z$FDL82&yt6llFB1-s6Q@AXL(MMQ)w!`-ug!@a!k90khZ@$)W7TV&AYz@^~Uso!JgK zJ9qO@OucK(V!Tg^SA|2fykHlh>koh_0Y2+KVafV$v!;tQ8Gevm2{(%y!`W@aM zR;Zs`!h6^NGepR)nftewnIiaKkWGb^L_U5)QvldL4=H_JzqsBLeY<~kyxul@jND8# zs+-|!vwKq-Sa?61+?-jN&G+!N2?*(HT| zW{7u%n-Dq=5lO$Tq^yA>p#92n66OtmQF_`68=O(QrlG;Sr@CkIpT`qEUcfNG^0?il z2C#c4>%0$(-_oOIb))hxo6c<|C84vidb1zm<`3Jn++NE?2{qe)isa>s2TOv&=Ca$I zCEZ`6#D-t(DZ*@XeN*acCzaEed0IyUPAO|VSuSq0$bdQV@7omcylOpevRXPYcc;+0 zSuAzMIlOqe$UzVXF+50_N^ezzZOX{r7$h7%ew90ET+l{Ta95Qm9etsnzTEv&MmhTK z#vMPI!$>uL(K+n&`Oc{0?#MT>8A2yYykT{NauvMHGnF}04`;)MRFQ!RcBshxV$!o2 zhBTWAe@e10+@de_Z3g*f#vOLx>S_NzS^g4}@e#h|h56>OPKt}3)>FgQ5l^A_j9K@_zn)2)N;@_V9q-u*k{|{s zYg~_+)r+w7L*MgeeZ=27x*>saGd|KWIi9BdsD_Lo9R7zJP`TY9r$#l;XK?6&ezQ;g zeUcutJ!)f3Jzm7{ep$3uk*k zz{l+k6QJY0+3Pj#sZ8`yrs!|zuAOK7bd57;S{@9uhY9|abSAQpxx^2q!5ibAw7wQf zmQE0Gyw-LjjdI~+pqRGb&rbswG=V^o*^~%$Rc1F3_J1r)wj26rdGPdScOV&o>Kh=dI zEst3X*fiYZl|tFNgL!~-r||tkG&{dzQFTic=g|71Vc1aY6X+lEwfax}J%@59Aq3yV zjTI9ZK3guy_uxohX(V?!SZSD_Z&dlbN$^COS*0J}sx<^})wG54MVzw+1k7qXBr2 zo*!BLyAO!^T#e;n0844QObEnejs~oLKO7CPBU-sXtV(V?0S_lripoBxDd#-n{a&u3Z=&o*Wsyh4 zV)jNEoxo}2nblcy;>G^^FU~Z|LpzqDZbxX_FLkN(VBZxQqL}0qkP!uVIoKXtnZgpH zde*Z2ko$fTT3aR2(Y5a#x#Z2P8tP>Si%c}%0AmJpR&?G-M8|WxgI6R(XY~08crH3BBDRe2-fyX`Pd$ySK^nP62^+pD#pi zcyUoH-R;$P2Vj?bNDI4fW`)`gUgy~j$^EkLMqwqPD;G6WE3*g^%5w=?Jb8#0MW-If z!#TKZGT|J`#RKm?k8uu0VCy5%_EMdvn*e~?mDB` zH2zIYK57zZdWE(-cPrW*Hd4;l_u-2W3~sz3CiSXK9PeTo&Uqkt%wCY^ratj-AR%Wo zz$qe5%6|}~=K23p^S)U62Rd)NuFfAi5JQwHjN7X2MhJhYJc&~=uj!BpxAiWK>HY5Q zjb_^X{qd7vYuSmQ;Z=KP{I?cIKgyAhjdfxn-*#A3fwo&HIYt?cBQ&MC7$;e4L+Ka2 z{+c>+E*@ZB$LECwN;#V;NAxBi@gi1>3me|QQ|om$Z0V1`{(GR97fpF-OJUb(s+(Wy z8~j_JJv+S4Eo(4?)Y@9W~2JjL$)n~*GBdZI$ zuf-(K>Q*E=y4V-nQQpg>qA{HA4Z`HOir;b*)&E?oQUP8Hv*I};DjR6VLl6l7JPPj`VW0YIl*T!q9XRd4FyZ3p9>v^m! z%GlR=j3f91?^imaD~q!?#El!Ha(~UHS1ejDIew`9vsg)=zkIJ=OujjBf#R@*tz=I4 zdHbf;nTAvZOIq0*3Ahl#myamWlJ+X=Jzt+!A2CD{`UnJyXZN8x?L+QSnqCC+CC5+> zxyD)4Dyew>@No$nUa(cP!g(?`r99qcBu7*lw|y z1~Xqnq(%lb?sP%3Qpsd$U;A<(y?bXBCDeCO0clg%!MT|fDJU%%%>0!SuhF?kSovm? z`Q}sRp90(HfOUGzg_g9eMj-*)uTKM39g0mq=M(niKVqku*e*5mNZN`!k6Cx*m2h_| zn2#Ug{AqHcac&J_fBe$jeHrt4umSwrEx2%FOBfwxQ0^sNEq7~z<@j83vbA1V$47sX zd-kI)IbHg-LAle)PN~pCnorKln{Uz(qvA3yf1p0-oW0t!z)s5EyQL436*HO9w-H() zUOI!J#EFt84Bg2AqcVuHdm>f3@SIPxJ3qllZm1KkLg*Akoy8F26FSqd@G4gQCC8Vi zL^hl*6JpxYW1~y<@84y`)S*}SI*NF^SC^lFy>$P}R5xpIAxfazQcd#P&l()VQ|HUN z@Q#olLL7eCOI96uN;pCLm#aN*91UO!KSwW**>c2ZM9&}p&%=w|hOM{zct4fjnGvPO zFJR$mF8Ysc#G&*|%F{C!rgj69{3R0{WJx0>B6HY0RiqJiqou0scrB#b(k?NWLqpq8}rq8EB*Gj7DO$X#<{zwfXi23@|KDW|QsGCptX@h6g4B%IlPrsHLQ7-I`tcj+z~PvHG#ot7@E zPtS}8u1F$5?R}%(qdST!XJ$Vt*KAe-Jg*`WLLpwVF?L-LMAPuOEcJIsj;EOsVsw(L zQGS$;2}0S}m1(H^dKJ3qF4^00Qyb#PEy+77H!-_@X?*Azt9jXaL#_rjMgJk+6tr;e z$kpHuE)TjaA&V5z@ZoON&A54SD9rNHY` zA}KR!`fZgRLrAdk7R0N`s2n}-CaU4K%07K-|SjNI&sPaZ4ArL^Zjc)p76GdP2%H^rg( zL6GQ`S2o5AuKZ}4?4Uxt5{67eFUMrDx&5@;ah{y%F*8*WS+j2uIh+wXrytf=mR5+Le3g45Bdh!Nq!c9h!0V~00`i85+>;UmC8@h1)AJJ^ zZ6p_2;e*>++&%6i|3V};Pe`=Ich_>gEy`}yTjb-3z&n-aMuQSJY}2%jW7-_UEi0_C z83T1zCds%EU~{>{$ZiY>T? zJAtR^_e1A8^Bw-y%ZO6#q>Z0ZnsZ`PN*Pf8aSQ3CCy0p*s61o9Nf{3Gnc*obh{tjs zE-3|iMR?!2j^)H?0RQk8)!QbHCbOM<`;l7Tx^J3&CD%BGne?19w$MHH^0W?K)`MSJ zM@DX3g+w?#&nmU;vJtsBPH}Fsx^WPlXB9>+R)P_62#C9PB0j%5tqfnQwKtd7 zO1!UT{}g$(HvH)FC#$t`_Z(oGu>VcMCBG+^oxrBJBy!y;#WAF?KEEBenu}>9#X8Wo zzp|-#pklOl|G-(~^g*<6(>>8>MXnyhq*%Vn53y{{I-IB(dRwv8kshWi^!wfk>CUH^eH=NK+qMJLq_hO{fc#GJ0QO zd3r3}1IF|j)=lMPJRk;Tx@AidxsDG(>R6ACsY+kuB{0xjm{mW{h(tLpxD(#27 zF?hZr>gm#Z8PmZ0I}4L0n6oWuXTVRgpJ@uC<2g;5eszEv3WFo-eXatk1`!4@&%iIT zv+rGPj=?Q3bijt1dbPK6nhzz36usC(9YV@?Qr?mi=vPOlaGJbMd3ph=4NjcoyN9Gk zB##(CT+g|>3w%jO17expuq{2&Xs#b&F>fZ?)6D5eRBigQNBz}u#XTgmKHO-7 zuHp=JkM3=X<$Q9Rc=c%!nKEg!%JU+{e2ZMJ6F2rXx6uX48KOts?1N~Y>@F#S7*{rd z@!H~D`I@USjhXpJ1o;8ow48W!&X9! zT!`6*F2qi)18sO&zoKzcPHEhxg(b^bR*Vmls|ZBT*Z~{}LhbM{)ws0A1^Uv=llOdQ z*IUBMJGqxoQ-Rj8OvfY;Km1#Ou{i$hYE16}Y*6lbBKY6#h&?b(T-jHP%VwWVz?;TH z8J=fRBz(i@lC8QM2%dYCTvi#FtI7dKm0uj)LP!Ht(SlqenQl2dY9W| zE1kj+cxk;28V!E^RFg$ZiCwOKwlRIggQgiCxJ-(*1D4vSW^zw?ywFkj|)pb-4 z%3aroc&`ly-6&h%tr**#&a(*2e`zBn)OvgZn_-i({Dn^iAu6`3Cf}}k*^yh~D@l#s zj_PemPr=aEtA?#^R~o*PEDP}>32FxQMvvAbioO_C6k!AOh*Owpj49;dc{}=QG=)LY zU;4$p<8M}hWd0i$>73rn=|1`ni|D-s=a85>H|+X@G-l8M@gccra3pP9Rab=5ij`xr zdGr=RzqiQ%py3(Av+ZANzUY2~y;peOO&QI6g>C;adQ5Mk+?E;t^^kdAYR#r8&F#J1 z^LPBcluAD5fTKzc`ujBYmvv>8oXND_gL1mici<)~pWnEZ&uZ8J=520b$W=0TFs&ft zU!PBO{$fI{`9bKJlc8j$(G7F=EnNE$MsPnI$PHAu&BmqZzDBnS+&=ny!3wWc}cVZ$yK0)8f)SlYr1v68C^E9h$Wi%MJzNoRgDHV8|3uVCU z4fCg~YmeL)Q&uKcW8j)SJ9Nb8hm*FqGsdMeps(Sq+xNg}3U>Q!@UhTTEk>m66y781 zRTv9Uxyoi)t9l2%Ocy%9;cFiKicC0WSm4?FqY`rW{)Tl#Z?wI^bc$iCatFl|qC8=| zd+p?32-teNt|XuH(WYhcwDQumXC%$V14MjbM&&FJgI^Oti3gGHS4~oa;EdaMBYL|A zJl#}~-NvwZ#AE()yW67ysc3MlZm7r5@6$8`kfh?`BCD+S#KO)b-1j4{&7b!z;h4>* z@ApBG2`8#)VhCj{H@oY(sG}s6dsJG?@`e|OzJX!H5G*6e(vNICx_ufq*yay)5Ihn! zPmIQ`O9}Rh?T5x~Qbld2@o$azig`@dOgx;Rpoqu0IcK0sH*G?QWyXyV;xzz^W7@qNC}j#A7$LfMrD{4Ptp>&an^>Lh4Dd8A8KejU}*ny{^m8> zjqju`Mp(#d_J-F>n_HozqcbL%y-ydte7Mjcx<-kl*&5_nh~u-;Vfo*k654hyHLHiH z4EwI=Tnb2IZFH$Kp4BB@kLXp|x?}k6Y|SRGLETIK*pykFksyw39T(-Pc2iUuk(4=c zKqn-bc?>5D%+r`UNd4cv0Ed?lpFc6riQNrXmR(evKg7;U^9ilKea<~glE@f{*1G=7 z!1BZDMUN`ARf}C<7h_L27kGMV9_A92%hT%&pkxD z87RG!{pms{2wYjJpY#6yy~4b*ElDVo2u-5^Ty!GGKR$Ekw|-J!_Pm$NPRE%a2O}*z z`l4t{(oqa?re*!yT}ztaQ1Xf=uhp%L#Xl2msnfP2w?Mp`3+ZbBX(Z+fC zm(8+>;`;23xI`N=bf2r0>31ygJI)~e64Syr(rW-srs^)(tIpTMhZsZ1{t1UPF<+&o zuOZ?~@yP@hF#M7tvN9n<8UE+St@iZi7x{`2L4WFnyu>2nIB{vqMYNLBgHy?xS=@Xh z$jUDFwx+DpM3OiC*7-sOmtU_>UKt`BKO0P|?%SIMO0(nd^qkPUyOOZTYd>Oq3Mq3r zj|E_lB7Med&(hs+M!$A1M;yaIdQKXs*^Dl?8P{DD6~GXVMYdmvPKn{4gphN7Yo(yI zOK#(O96g*2F?)QOrCX%VL|)}N0@fnvATrWoa27StvN!zIKE|g+%65p9gLXUpM)(s~ z&L53aSES$^m$TULWT2@@3A(EB=wq7wwKIO%ds2okP~7%}EQ`NnRQ9XB;cl5jaC`yx7L(INZR zJ-Thi(OhloRd{wZNLBlq0h=O(>}k^T=lkw=EvfIc!LnZm&VacFdhL3;UHj2i%!i^W zauS#O@bx+j#dx;gUv6;i_QA_)-q!@PE}jeOxYD2Arz*4u5p5}##82DBM7I`qQcNI= z56Xo1{4-P3G5&<^$=flK0cqw6(qCJChh8HwV;pX1djsTW%1LltUR|h8gn#&B0@@AS z;yura&PxqN_#Uv`W`_f|P&BOsMad`fFa}VnFvA$bPQmBT8tK_se`nd5Ua>j4g}}q| z1pCZfEkkuSO-Mb>pFfJV6yn`X7|%K4a z)9(72YvR>e&I$?AZ|I!TyJ2$0 zpLVW`^0S474<*>Q*M+%zDZotqvgM2Xypeh_rCatJ)r$5no^1$rQaV9orGBu59i-uk_g;AYStmjN{%cPzKYz~zZaUk0`6@U4WW@2=X31@J z;vZ1dQxL#iNO#RVIDcn++AMI9ry*69`857C=_np8Vm|RX+$No0tV0ktMPR>2X7c1c zo7RV#ys@wL`bKeb=>t2x05&rFGVYl0p#Gxd%G02=ktbj?x+vZzJcj(a+4Iry$8@gW zNp?n!Ue*o8vppcr4AegbULT7>2cLSwxo?Se485lwa^7Ss{Mm???Z7x>TDom zH5A7Ng+jYyvdo28*Qf0>e;X(FuC}C}3kPa_#j{(&1m}9Dv%;ezce$(ewC>1CSPKh+ zS9k9$>BxT4)bWzRP*4aNP^kD3xs|c3%Sv=l%Lh&97WPO-6Q8OtxZK3$F{g!(d)9sZ z&b{U&R97#mp;^=(G}m2mh7=oka!!EWjh6Jp*{X>LQSa9!()M}Ca_ z-*;lM_wj386ze-ea5(u`G%|Sc^ghG(J#5j{4#E8s%}>x<>!dgt-{{Fp#c%DO$hy>> zT<)kpXioA%FJ5n*og`tDI7T8-uxL^I!ROSpV3vd z-QSON??SW3pcp_<=>cx{5eT|V{@%0dA+#lTzT5dHJ*mf$eM}zeup3f8VDkOLvlGr= zNDkio5HV#ZP8=_e=|1-`#!=>Xd>p+uO!|WHwM#h#_9uxr#Q$i-q2-`LyqdDej zVGMUt;Hu@*KP|q5mk2L z9IvVI=A9hL^#jWn=p|E4Bh{xneS>d0D1s4j*LKU}U2c(%jP3W`H4!%N8C|^UI8c|z zP&+SWcs1otG+z2)A1U9g%-XeotKx{ickVZ+Z9IMQU!rx9Axa|elioqNBRTzQ)=1KA zkEG#-Vp7l5Or3|@i#Wm7;0DaV0$~4L=2>8xVOI;5Utej{MNR$(PO0op*3p%|7iykg zm~$dCipJc(Fywh{4LC1u*%)kp@IWeoKEXxRZ_p2&&s ziN)*Qo6=&rZ6ba*Z#NkvEa}aA> zqZe#+^Rk##APD*2EF3ddWw`_i(93_g?<|ToW1h2Of}u_fm%R1O|8}?gdNGSkQ^Tiv z^Nia=ImQcS1{GSs9dmfPy)rWrMbEcZF+~?aTLf1V`cT%+b=((zAGB)bG^>P|;#USO z%*ehU1JL;?)~SUz=v0~2g4v~$^ANi5PA|E8OQbaBx(XNwv0hGQ61wjVEmTmsdzaT0 zRQs)b<)cm{ZM2T?4>wLEyZC}N4{&uJ+$q&X8MYd%m2)bm#p}X-3-Q+OY3VMtJ05mX zVA>p`Zf`_9|K1Dlp9D2G`bJQ5i|jaEAbsPvl zk9pd&Ta}RC3a_mE9`LwT;vwSC-yHdwkdLPP^$?MkC-n?rgHE96rY|EU=3|1YR~{R$ z+T4M0+#HgVjfi8tauqIAZtCG=>cew3KV<8^;Rtrm`-{U!9YJ%wZ&fy-<_6hiqNVRw zXC9zjUFf{ImfGJL2uy?GTV+SBWGEF2mca<7YDy!w3dem1ZDcN69Gl*y4Q z%oh(zYeCXIDzlME{n2JIH>&dCcVcutdU5e<7>zJEf*RMFKw-j!n8!9IS$?k<_FGI# z%t~{Wq1Ckapk5bcEE0NhZvA<)Y+wPt2;+AHkR$qU)}b=7D^vjd(dbysk2il`E2;Jm z<^7{E;x4o|WCvtly^YKJZ)aYLGtXeLYCw+{eq|bXDOKyAFOBA7L_=&k)Wxx%0Jhj3 z=;tJk7c0N+;S{>Z>;9*zEI9oBM=|%!<}H6Kav5PMa_)6U(}&-`)C|$-&?*2eK353& zWUsyaM1jS=X7wRD5xXI7UZPdEv_*0~2o5f<9hi(urvJ=ze>fa4sxD$Tqnj;)8yjhdJe$an^9Tja7 zgat%}=c?@TA!JK#hfHhRuEPe-hZ&&S`*}^b@{s|i(tum+VHnxy7A~)2!AvP_l#YlN z+9S}~x32cYt=zIsXcSdvQOKCqTtoC8#*5EggR28}KfyT8r170GDyns)n(zii0|JQW z-94NMXzkfad?(u)K93C>VE5kk$ze9yt*k`@v+guce*J>Srdc6$vEV~+ze02> zm-Kqr4R7yCr`#fk6I`t$#=(Y{tD0pE6p-IWH;OTCCWck=G+GNw>e95yDg;gTE1LOY zX;W9)ubsN_jaP4)Z&u39TAD!-X_D^J@t_y2eFpg~ND`W#QpoqUy4tr&t-J`t4JF+S zSLp2N_O*$*fJ**VM>)E(Fc1Jd#dsyy9y5`ZXmF$HH&aC1%jVkOpC9}z=X!^AWvvGw zFJoqfK(WHKpF^Rf0e9<&m-vO)p-M^UOnM(`8EQj3LF6VK!6M?SR)2mqF^nj?P#E+p zz|oECen6uQkCCXxv-(>b-U$}6=3)v*|84vRnWA{oM(A*qauJiWgSDuYOj01-_VKgxeTHao_mXy?|2 z^hVaOZ>AZ*_Rzw@TgDa>$jdIqx2Prmu8^=QxmX$NX=1jcL4}h>5@<+yfjj_P{xVIN z0m#EymTjKqe%c`EgcjXK4r!_J@%tY$P{$@e$v>TKqhs2hJQ7pxFljo0N5%Qc@}s%W z*=G?7NJ*&Mu4`d%kkYjxZ>LA2ggB8JwjwnPHpXCWz8FN0n+ z{WxTyhH7Y4HL6h3pEFN0xG$0fkrC;H{DnGzK zoY!-&i!S<>N3QYew{xgqpv(Le%l$A1_s<1MDaPI}a#43%_FPD@me{B$zz7s}iM z)5Ez6fM{R7Jw3&G#1>LFtvg`Yq9cmt0zTjUYq|?ptHkY(9ux)TVpZb$ z|I3W*d0f5eDgoZZhBU6q^)vcRHn9t3o?E01vIYZpaQW1$HHS?<5wl`$G7cPjVrx(a zG+VSzgaR0Ub)n?7!!toTIC(Lwuf~Yqb2E#O9JOg9dGVDsNho&*19+WarKZGeB z0`t%0vU91^3da+v(+x8MxCNS09mb9F$>X$6PB%y=(yRdu3Xl+M(38m2a zLq(wXIvKYVJ^yYnC<*!{Jk{AeDZ`B#gGXe7n`F3JzkV*x)~^N$-37v8OsTBoJy8qP0hGl=a!AZu>{#bqv4MiA67&v;CBimFF}@;_A?g94#dYm!N~W zQ&O#GI^Mj})pw+7lG&JTb2N~+9oUA@h%z^@JR5oXsz;k2p4@q;3lHd`bCMF}M$Irj z0T#K|G6w%==)n0i-eL8~nTFs;Te|KRxCPC6t4s7J zdwYw$HeQ0YyNii%=n+!6L}x+J6BIt>;NC>|DsuT;7_z4Woo?kRVEP_ zu#rIWR!*d&HV}R3d#Xe$HQQlzYeCI|Ruzjg5Oum5$*mv}a4g|JSbKBm2?oo**hrRNj74+p0J#A8aXQY%jDKyU?M|nPSLC`39^>~2=8^aF-~22-uX$(vzx0o zz-pVDr7CJ+v~`J_aUB$-Vj3S$(#93)dhbTa*K=l{WIj2U#_m|2&efjIDi;RJ21l_r zD#j1ZLsdkfG`T1)(V2gF@D5S_x@VL+0C@py1L=+41iN`Lm^Dt0&LYiWNI??HD`S2O zsqKK)IH0P^TF>eQjpt#PbnzZpn^M;a(bzRx43MGy8wp2h<2JnZ~ zcWY;Fju_kN9v_(Up?$WETPw!+4^f-0++Ibp7W%apWS0KM5{(g^8BF24+p@$f5ph8$ zn=VSiR0VMA^Yb4FP3aDn8ZZ>Yr&oa}^cE-bnUn%jjkeeK_qHy`jjPmeT<4e1yenRyXwiC6fpcNZxY^6Me@H1-ZKlls!k{Pe30zYcR3g; z3L9k_bfMY&{a0rE1fno-z`kzCfD~&sePjbVam3oe*3F*gTfd;4+?8U+!dH&Bxr=p&ISfSb3fdV(f~*^lFG%5 z0U*LTXsIl{S2y$+{3#wZ(54H5e7f%xB&~)<@D7XzS-?5VS&;X$LlrBo$lI z#--X@khoe6pimHdXpmy%Lo7NvRi96Z49>}YZ2{2x3j;`CT%TVGMv|nZ1_q}tCL2sL zu)@+yWD*o_pLU+iK+8+jbJieslHRqK+EnO>I_X1z3@`LDd{5j2?Te2K2A-zdMm>F& zsJ;@xqP9i%F~iu5-r_-f@q(5jR40}*2Ze5vs z0pv3As1Nl#FWVNDT`HmyQ*7FCn8Pjd5Y-{`h!k#2sJ zeIFYxbFhjEBa)U8c(33ft^~hzYD71)6?jDx4;y2N0=yqaYw0^Z#+PG6@+pwEahYS{ z<{;w(5YBUklF{+K$;JLOO;7ACtO15?GH0#P_2X7iH&X#8D(*Y!w5+MKu|*M8W8ik@GgY=Dj$F!i0M%SB!+z{ zPY2g+S_v1LF^h>dbSyXTHY;ok+5YpD~cR_(%;j zqS9PJf|J0h^$y3JsSPJHIB3jdQ)Q*Yh4NoAs@c>lx8WF!^STCq2I2`2Lt#>|@Sayg}H_wr}Sez@ohW#)TmnFvrrb1SLD0?LQ}5MF^d(%ftP9 zfVB4*s0m9dMNoQ}nKx=#U{?tyOo;zN+EKIez9Hf7GnpQ5yr&Vlq4sUh9Ju0a4 zvIa7*sW3un1Fv;7O4~zI!UmPSpj=kbyC;hgCdK-{?@_t~+Cks*ltuEmu(HH=MsM)z z>qBXlUZNvt%g#F#z;3c2af2`0%Vl1&r+?_;RAQ$hUaHKMMgsrL=D(mV~BC(gC#IQ9l(58=(_n zRpX^wOtH6ErK<4c(?0l%*i-WyC^s*dhC#hS#U&9sS1wc>D2Be1sS2R#pr3_@MjT12 z>}NT?EX5|xm;)Oi`9ANaoBpq7=Ow8JSX|dbBSM>=KMlFz4?AqExManUoQ>6`52-~j zoG5&}+w*9CMU!O!vzxP;M@lGNKBC`-lRTfcTWE$jr#>70Q{8U9`4dyj4HQz{Ko>R9as2iztCTa7D)+sFeoKXS( zfcmoW1xdkhfXT~l7FES0Pq1nuH`KMPUqy2Am}UnPG@k$Bt|rm#KH9CNm)wMm}3PODe9 zdah3p1G{*2y^%_;k72wsXh2g7Tc?9TTxK`e~NA zW5!s)mOMug`f+4i`Ej6_glwd3aBR{#v5NC0C;nQ8d7H63700-S=el z(I8e;x{Hm^x9kM!^qd;vuf@V zx{P0rKMqcwi)XJU9lR)P(8PKU`6wav66pIzFUCjsju-x=%4x_rgzR0%2~?REGraWu z9ucBkJaNP)hNr6YTn(BnoQ%FRrOZrS5VXSjQh*5aybvmau}7<7CYR&vL9-<-4|~KR zV0g&iF#*OO$kWgY59X-NCU{Z>7IOuQWfN{Ta;9hK_~c zm&Z)|_G^tI1^6oZ>5JvxzGBw<_r79^+iE=(siW#&3I^-gqU&W<%cqMChJ9wLzhM|( zxM{2;3yIH>DUOYPhcHZ~3dh*gq<@bozOH|d5i_PM5N~V-LxIb^zvkaK)&sx!w}-|o zUd%xGS(~-Dp&jd|A%Qg1W5kIOiJ$6sIi}MRYI-?dLDez@KrOs!w&+Q~Bv8O3vC1JQ zhkfJXn+ou;^wVOO&wdQ~%ZZbl4_Dj%-ux+>%b2?K3Kr7Q8?=a}l9}F9prh5aZft57 zv$18G{+O#3u3BTb|CGbxXSyi#9P4}llmLWX%}YACBb5*eJC(Z z;G!Ehj+TmSYN91Jk!~Uw*Tu-a%}S67gq+7&bti zcn{%wfi~#GUIh8i&sqfIKjScQ1XERqa~NEb0=lmb(VWewIRphW%hUH|B-NFjnD@c= z4?5O^+$|&GWL#|!{}vhP1Zbry+w#gz^0tZw($rJ)7?XUP^58AD&Hl!XLOd6d%e^{e zMjTT&f7p26#zgsljI0g@Uo)pcZ&!@ZhN&u*=|v_767`8GlV6RB@h|9w^-M36oVv;Z z+{-Rkb3WQlq)E!x3%W3`uMc61=sk;j2(i~XOLC>#mkQ}BY~ZLvo%_W)hq?D$u`ZEz zQ4RU}^!|Yr=aSj#PfT&2OIX582c;4$6HZl4NW`-%!r)uSrBOd}F_&R`3s-Una)2L9 zfCTi??^|{Rb8fRJgDk+?L?V%6!;NN(HDZ*B?H)O-oLi#spNUW)#R_aQ6ED4oy(?f7 z^oCUz;Zw&`(;(H&-Soh&cAp#mwZ0|19WH_R^zcvsF)ba>fO$(gS^=xS`0t=!if|*6 zjOdZ^JBTp~J?IZ#|6>f;4@v8ZxI}5F>suxtZXOnHk-f(~Hs^E-aKiRl>L-K#F=+VX*uf ztQ`~)fPqyZX)O}8SvKhAOQL?z5Sf+dWKBIJvY6+T&jsPM=CN{uQ}T*79N%@cOQ8~$ z#&Y}%GX%>tyWAb!e~C*i6%XR6>63>k|+k1}$1=P_OApYDoD4{Eq0G zXRO(U4GbklzrLLXjG{d_8TrLVqMI6=Wm|=iJ4vzUnt4MkJLclabasV!vvO`bI@!Lx zZV())5N~5PJ#GmkZ65b_Q!=I~T3c6-j)oe{?wH&*d>(t=mpcowb%BHJKgFEQpF=GUfi|`wwq!d#cyo2EwR%?$Il?<7oG0v z-Qh0Utkj%SozpaK6}ZAUKmW*;R=B42c-qaTi{syeHa3It=!CDO+g#fjC=TZtORxTZ zSah4jpPL8=BF)yG7r1xa+Q#KalM>-lae&Fh&AM6^n_UMYZ^9O8iG4!lKY58ig$th&&yK=~TXs|A{IQ8w&BJ++jKta^CSe-ajYN?uhuzl~A0JzQF{~kx ztots+vw=S-n3dYKnc7-LZ$ImOc8JNu(5qSl;%Al7uLG(N&Nj2(R~`P|<0qi1I@e#L zDf|nfz%FyhcN9_ddnTDuXD&T@!3m*aRjX)(w4+phG%BNAFmCn#gB^w6IsM?x z={S*nU7JHf?SX6Dly5r@YKAbhwK;6A-J=KVRxmqa+jh(Oy9xHmRdvo^dYGV+FK{fe z)wtqxLd(I%a@V%Nw)6%H;=61!^f5GEG?Nwo&|T zlRXKC-Un3ys3w`=hRx3P-zss2B0ky&s-tnAVqVt9zHU00l&5NxeO>MAI=@G-zWq|w zzqIb`+l~lIv~QjIGM@vE$GNQ^5b{NJx(8`hdzD3ie!3OkVADR+Jwrzw z_(aYBugd2CtI8auFp9;6=Xi@yGsH#21MYoIqR2L>C2Nb`jZw?iMx$|Zqc+iHLWu3&ajiHk3cKkt=*u@@Dru(L z_FFC0kwi(m207!lL~?6>)mF1|X*7w#v|U7QC35NVd!A=Rm#;rPo^#Ig{=7f$_xp2R zuNfK+&V?PJQREx<#uwAtw%SU5CEw*l2EBI>fG+{t*tVu6qjB2KZA2GEwf3aBGB10` z681Zi!Ugv%>p!Xwdi@Yp)Vg2U-k-2)vUdG#U`l%%-=ATbC-#cb=CK}l5g*%@UVXVF zU_|$|gAWnv*Ja`K+FhK+uaU)EX0IU~GM1)=!l&cm-O82p zU0x#<%y&VyIWofM*w(!!$(_YnAH3!9UH(QhdeijyY2r}2=9VYIw@`?rd$A!}?_6;r z?`?uTf3w(vkVTz#xmV!%dt>Fw@bWf1z`|kJXk}H>AKbc7wU`Nm$2f_W4yuow!tJ)4 z=()S`#CsR{5HN^6$I^l_>Oq7tj>16JG*@u$_$@}wM@f8VOrIm+-)bC;7``TYDM zoexucR}vK^(WhH#S(Xp;q#<@gTGfY7ID~v0eovL=AHC|Oa|aMbC_43&9bnXZT#zn{ zSygB>l$gTzOT~=nA7)k$b;!0C=W)yadud9kOYvUNKzodcep8}Ie{gq8v&xJBy)d>U z!CcOrPW0~=by)p)W$8odx<7%kwSVs+!{vq-%A`HU;w)^WY4fDg)uP^uv7GN-K|f_Z6~#Lh=6vn89w_2LZIL9_fq z%Jr>#g7D>I3=n7LdSsD0$RaU+=YrhSzp-X@xQBTJv*mk(BZUf{XAca;P~@&6_;8#< zRFEN$W-ZfjW8|4OreNF{0eqf?U^IX5CX(Z3c928 zR;f8523eR0+-B1}$o0b>M1@B5ga?`%gRWnu72?n1Ls)0bvb_AFPhnhTEQuahSI)Zf z^b@Qb5+PSu3y6r*&!;?%k?+*6Wb)XOyO_Qj+sP-~6%doP0M8Iy7vFc~O&*LUDjv8I zBzo>^W1#vJtMKe4AtbXx*Hj}6R${GF!3=9j9Qyo~C_WTBo z{mRw}f&OGaIIW8%#3%L$c3jDg0h)Q6Accr1O{Ihqgy{m0Z!r~0oZuh^XCiCAo*G9kcvAVDlUIB+hi$WGr{0NIitHm49r8^vsoL1x$UB zJK#$*%%l3=dzdhdV1?Q#LT1-X3!`+-tNOVW*y6)k&MZI3#`dFMGPMygHU2h058IT0 znCkyB`qB)Zu_QO<`}o7hp^lWYiGFr3@QAQ1W-I*;JISqpyDpbAr+jcWkZfOaj$FN3 zbkfP3wup!*2W*Jp0j0un{!7_7g=_3|_$(nY;?oyA2YdjFSiShCfMC;d_2^2{!-@V4pcf;S@<+>2ES^3N}O6J9n&+-}KLflgO?}XLAK=^#ZWoHvTil=%a0%O zpNtACYavtsX&pW)tjEM{qK?0ScD1C&gO=gk8`FSUCF2^fNd?k{d(os(%YY6bYEicL zA}spd6W%;Q=RLWeFy)@#lKKU%2N5lejlbq=78C(2R!G^bUL@?)}sk(?-6`((#u`%Sj6+?}`Ek4BX)Z834)Bui@TA*g9T;4Ra z-L`i%x#_(}1~3cIdpDQ=FHq+yK<)en)aGdj)IUA{7pOi;2-F{)#z55}B7%m@+M5sr zI%#8EJ?6{TBNZCJ@^RsUD%aCb(mF~+=CAirEUY3Tw0O#2+JE-RXMe2$fG;MW`pMP9{7v6Y1*yvP zG#I&iVW`@mO?6D{ou6-1^5`)57eJ;%IJL$E$M!W=hUuU~F@4K%|$R2+C{<7w4q( z(yP6@fKjC{Lpx&mk<>niFCg{$8M2gfW89~zL83xFML9sJ#aHCA!o}d3(_16uu~-?n z$w4^AW3j++)a>Y;D&|Fxeff=8A8yHXzMuRW0w+~>+-VV}T#}~~qj@Ha(y7|UT@3Ry z#=Swvrptc{KrW?a;I@+^x!H0w9?Ft%ePSTXdSXb|Aw7X9)p75&w+|Ol=jK{sUS0OE zt-6`Zy2~^REXk$d_sjpVPoYf<$UxgLb>PXiYe3(Nz>Q20t3aUn)c5A{XA18xko*I6 zk?UMkTi~Dq(ou>^q^GPM3;_P5OOXjfb(n9K}LNjD8wWC!5%mV z;mJRI#!>ocM9rS7K=hE)SBSP(pvD(E5X3hAuVAVNjc==Hd@%X1MBI_4I)0_40*D&M zTt{e%--|)+XO*e&W-218)pB%Jt~U-o1E>_W>ss4(5c?yBvL(n)a4!#{_O4x(eS=1; zO8GfOMzws0_Ou@*J89>krPb6q7r6m^!Vo^fU@$*{(F|~OuizI&nksnw6jlLmz$C76 zTz(yr)MF&tf#^p$0VEt^hEfKkH5a@PZ^otYZ5r%*ydfJ5SUbcMdtLP_r(4tP&IX42 z7cm)7GqFvH2vZbN&$$$U+&{bxGFzy>foR(vcT7Q3K_h4x7e@T8Q!w3=mwqN6X&NYX zzdY1R-%54dcj?oQr{JbC6~S@of*FhKy%Fk zLvxCceef;?*3?+zH#UzozV8;rrVi3>f&snz#UTJ;KwpppkzfUzV!BCO zHR?|y6s5@f9^?$MJ5-D5Afr~axDi%pFeCT4kE7}}nx#DBP-XksTD0$ zMOG-*%DzT57e!R^@MjiakZ`nO@D}+ju%}Sd#`38VsPVbk9-Fmz zlXy9Ochkg;Sea*;Dk5)eI%Tsad}AO={1as6tTY-;=^DOrna7>t+JaElndpOxUjH-k z3#0OU5rwip9-l_l(6kw7rizsFNMqdIZvK!BQbOrU{Iz=6w88Bl{M)T3GEdi*Qauq+ zy@V1E!lK?le+j_$oC4dOeX$?3(6N($9G8LfTlVi5$`-ULbbzATwktv^Oq@;yANEu> zKocXCu|_33q^rLt1znBN9YU2A=2FR-NkJbyO`|P(9m%EmeGs@%EyxyQNLD!dqu{T7 z8;J(S+(4}1&jIg)Mn$#UzY^wm^3rc#GW8+eJ?&I5>~bJzAWJQSuaMS5lR8~h2nChQ z1#d;}8t65mp&uw}9J~GB7v_AX8$iEO+WG+53<*6wjs_DD< zOH9kr-};hkwr4aMb=^#X)`vG_QGTlSTG3bZqacu24j(&C|CMix2q4rYpIXqazWS(i Xz-Cs8ZfUkP4gBD%Tvz5U4><7uLRRsS From 30fec227b662014085345e355aeaa1a5d1f73aee Mon Sep 17 00:00:00 2001 From: Tommy Waltmann Date: Mon, 3 Apr 2023 14:37:04 -0400 Subject: [PATCH 27/33] make image sizes smaller --- module_intros/locality.Filter.ipynb | 31 +++++++++++++++-------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index a9b84c4..d78ea42 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -30,8 +30,8 @@ "With the [Solid Angle Nearest Neighbor (SANN) method](https://doi.org/10.1063/1.4729313), we look for enough nearby neighbors to fully occupy the $4 \\pi$ solid angle distribution surrounding a particle and label all neighbors further away as blocked. Strictly speaking, we consider neighbors of a particle $i$ to consist of the nearest (i.e., closest) $m$ particles ${j}$ in neighborhood defined by shell radius $R_i^{(m)}$ such that the sum of their solid angles associated with $\\theta_{i,j}$ equals $4 \\pi$ :\n", "$$ 4\\pi = \\sum_{j=1}^m 2 \\pi (1-\\cos{\\theta_{i,j}}) = \\sum_{j=1}^m 2 \\pi (1- r_{i,j}/R_i^{(m)})$$\n", "\n", - "![SANN Figure setup](../data/SANN.png)", - "\n", + "\n", + "\"Alt\n", "The `freud.locality.FilterSANN` class implements this method, and an example usage is shown below:" ] }, @@ -44,7 +44,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 1, @@ -92,7 +92,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 2, @@ -128,7 +128,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 3, @@ -174,7 +174,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 4, @@ -204,8 +204,10 @@ "\n", "$$ \\frac{1}{r_{ij}^2} < \\frac{1}{r_{ik}^2} \\cos(\\theta_{jik})$$\n", "\n", - "where $r_{\\alpha \\beta}$ is the distance between particles $\\alpha$ and $\\beta$ and $\\theta_{jik}$ is the angle centered at particle $i$ extending out to particles $j$ and $k$.", - "![RAD Figure setup](../data/RAD.png)" + "where $r_{\\alpha \\beta}$ is the distance between particles $\\alpha$ and $\\beta$ and $\\theta_{jik}$ is the angle centered at particle $i$ extending out to particles $j$ and $k$.\n", + "\n", + "\n", + "\"Alt" ] }, { @@ -269,9 +271,9 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[6], line 8\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[38;5;66;03m# try to compute SANN neighborlist\u001b[39;00m\n\u001b[1;32m 7\u001b[0m sann \u001b[38;5;241m=\u001b[39m freud\u001b[38;5;241m.\u001b[39mlocality\u001b[38;5;241m.\u001b[39mFilterSANN()\n\u001b[0;32m----> 8\u001b[0m \u001b[43msann\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcompute\u001b[49m\u001b[43m(\u001b[49m\u001b[43msystem\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32mutil.pyx:165\u001b[0m, in \u001b[0;36mfreud.util._Compute.__getattribute__.compute_wrapper\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32mlocality.pyx:1396\u001b[0m, in \u001b[0;36mfreud.locality.Filter.compute\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32m/tmp/ipykernel_1846/1282692032.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;31m# try to compute SANN neighborlist\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0msann\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfreud\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlocality\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mFilterSANN\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0msann\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msystem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32mutil.pyx\u001b[0m in \u001b[0;36mfreud.util._Compute.__getattribute__.compute_wrapper\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mlocality.pyx\u001b[0m in \u001b[0;36mfreud.locality.Filter.compute\u001b[0;34m()\u001b[0m\n", "\u001b[0;31mRuntimeError\u001b[0m: Query point indices 0, 1, 2, 3, 4 do not have full neighbor shells." ] } @@ -311,7 +313,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 7, @@ -352,8 +354,7 @@ "number of neighbors: 11\n", "number of neighbors: 12\n", "number of neighbors: 13\n", - "number of neighbors: 14\n", - "number of neighbors: 15\n" + "number of neighbors: 14\n" ] } ], @@ -395,7 +396,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.16" + "version": "3.7.12" } }, "nbformat": 4, From 89fe3b4f61e7b694f9cb85b401a89bab0284f744 Mon Sep 17 00:00:00 2001 From: Tommy Waltmann Date: Fri, 14 Apr 2023 11:01:09 -0400 Subject: [PATCH 28/33] re word some sections of the notebook --- module_intros/locality.Filter.ipynb | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index d78ea42..d86f534 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -17,7 +17,17 @@ "source": [ "## What is a NeighborList Filter?\n", "\n", - "A neighborlist filter is a class which removes some bonds from a pre-defined neighborlist. A neighborlist filter can be thought of as a function for which an unfiltered `NeighborList` is given as the input and a filtered version of the input `NeighborList` is the output. Freud already has some methods in the `NeighborList` class like `filter` and `filter_r` which can achieve this concept, but often the full system definition is needed to decide which bonds to remove. This is often the case when typical neighbor finding algorithms which use `r_max` or `num_neighbors` label two particles as neighbors even though they are blocked by another particle in between them. Each of freud's neighborlist filters defines the concept of \"blocking\" or being \"blocked\" differently and removes bonds between particles which are blocked by another particle." + "A neighborlist filter is a class which removes some bonds from a pre-defined neighborlist. A neighborlist filter can be thought of as a function for which an unfiltered `NeighborList` is given as the input and a filtered version of the input `NeighborList` is the output. Freud already has some methods in the `NeighborList` class like `filter` and `filter_r` which can achieve this concept, but often the full system definition is needed to decide which bonds to remove. This is often the case when typical neighbor finding algorithms which use `r_max` or `num_neighbors` label two particles as neighbors even though they are blocked by another particle in between them. Each of _freud_'s neighborlist filters defines the concept of \"blocking\" or being \"blocked\" differently and removes bonds between particles which are blocked by another particle." + ] + }, + { + "cell_type": "markdown", + "id": "5eb827ee", + "metadata": {}, + "source": [ + "The _freud_ library's neighborlist filter algorithms are the same as some well-known parameter-free neighbor finding methods like the Solid Angle Nearest Neighbor (SANN) method and the Relative Angular Distance (RAD) method. Each of these neighbor finding methods was created to find a set of neighbors in which no neighbor is blocked by any other neighbor. In that sense, _freud_'s neighborlist filters can be used to *find* neighbors as well as to *filter* neighbors. The difference between finding and filtering depends solely on the meaning attributed to the unfiltered neighborlist.\n", + "\n", + "The following sections give descriptions of the algorithms used by each neighborlist filter in _freud_ along with code examples which illustrate proper usage." ] }, { @@ -116,7 +126,7 @@ "id": "be265984", "metadata": {}, "source": [ - "In general, we recommend using `exclude_ii=True` in neighbor queries to generate the unfiltered neighborlist, due to algorithmic issues when the distance between neighbors is $0$. Custom `NeighborList`'s are also supported as inputs to the `neighbors` argument, as shown below:" + "Custom `NeighborList`'s are also supported as inputs to the `neighbors` argument, as shown below:" ] }, { @@ -200,7 +210,7 @@ "source": [ "## The Relative Angular Distance (RAD) Method\n", "\n", - "With the [Relative Angular Distance (RAD) method](https://aip.scitation.org/doi/10.1063/1.4961439), we label a neighbor as blocked if the angle formed between it, the other neighbor, and a blocking particle is less than a given threshold. Strictly speaking, we being considering neighbors of particle $i$ starting with the closest neighbor $j$ going radially outward. We label $j$ blocked by a nearer neighbor particle $k$ if\n", + "With the [Relative Angular Distance (RAD) method](https://aip.scitation.org/doi/10.1063/1.4961439), we label a neighbor as blocked if the angle formed between it, the other neighbor, and a blocking particle is less than a given threshold. Strictly speaking, we begin by considering neighbors of particle $i$ starting with the closest neighbor and going radially outward. We label a potential neighbor $j$ blocked by a nearer neighbor particle $k$ if\n", "\n", "$$ \\frac{1}{r_{ij}^2} < \\frac{1}{r_{ik}^2} \\cos(\\theta_{jik})$$\n", "\n", @@ -331,7 +341,7 @@ "id": "2ca97268", "metadata": {}, "source": [ - "In cases where the input neighborlist is dense (i.e. $\\approx N$ neighbors per particle), the calculation by done `FilterSANN` and `FilterRAD` can take a long time to complete and often most of the input neighbors will be blocked. To use these classes more efficiently, physical intuition about the system can be used to limit the number of neighbors in the unfiltered neighborlist. For example, plotting a $g(r)$ for the system and choosing an `r_max` slightly larger than fist peak distance can be used as a good starting point. Another option which does not rely on any physical intuition is to start with a small number of neighbors, and slowly increase the number until the filter class does not issue a `RuntimeError`. An example demonstrating this method is shown below:" + "In cases where the input neighborlist is dense (i.e. $\\approx N$ neighbors per particle), the filtering by done `FilterSANN` and `FilterRAD` can take a long time to complete and often most of the input neighbors will be blocked. To use these classes more efficiently, physical intuition about the system can be used to limit the number of neighbors in the unfiltered neighborlist. For example, plotting a $g(r)$ for the system and choosing an `r_max` slightly larger than fist peak distance can be used as a good starting point. Another option which does not rely on any physical intuition is to start with a small number of neighbors, and slowly increase the number until the filter class does not issue a `RuntimeError`. An example demonstrating this method is shown below:" ] }, { From 37270167ed732e03b688065d221ce8c1be9a4092 Mon Sep 17 00:00:00 2001 From: Tommy Waltmann Date: Tue, 18 Apr 2023 16:15:58 -0400 Subject: [PATCH 29/33] re-word section about incomplete neighbor shells --- module_intros/locality.Filter.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index d86f534..bd70127 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -265,7 +265,7 @@ "source": [ "There are two more issues to discuss in this tutorial related to the input unfiltered neighborlist.\n", "\n", - "In cases where the input neighborlist is sparse (i.e. relatively few neighbors), there may not be enough neighbors such that each particle has a complete neighbor shell in the unfiltered neighborlist, making it impossible for `FilterSANN` (`FilterRAD`) to return a full SANN (RAD) neighborlist. In these cases, `FilterSANN` (`FilterRAD`) will by default throw an error message detailing which particles do not have full neighbor shells. An example is shown in the code block below:" + "In cases where the input neighborlist is sparse (i.e. relatively few neighbors), there may not be enough neighbors in the unfiltered neighborlist such that each particle has the proper number of neighbors in the filtered neighborlist according to the SANN (RAD) algorithm. In these cases it is impossible for `FilterSANN` (`FilterRAD`) to return a full SANN (RAD) neighborlist and we say those particles have \"incomplete shells\". The `FilterSANN` (`FilterRAD`) class will by default throw an error message detailing which particles do not have full neighbor shells. An example is shown in the code block below:" ] }, { @@ -304,7 +304,7 @@ "id": "c9eed5eb", "metadata": {}, "source": [ - "This error can be downgraded to a warning through an optional argument `allow_incomplete_shell` to the filter class's constructor, as shown below" + "This error can be downgraded to a warning through an optional argument `allow_incomplete_shell` to the filter class's constructor, as shown in the cell below. When downgraded, particles with incomplete shells will have the same number of neighbors in the filtered neighborlist as they had in the unfiltered neighborlist." ] }, { From ae814c063ec69bb7815d1be891800c9edd6e318d Mon Sep 17 00:00:00 2001 From: Tommy Waltmann Date: Fri, 21 Apr 2023 16:44:26 -0400 Subject: [PATCH 30/33] empty commit so CI builds with new freud master branch commit From e87422d10c98def76b53e46eac2ea850baf7cc2f Mon Sep 17 00:00:00 2001 From: Tommy Waltmann Date: Tue, 25 Apr 2023 14:25:56 -0400 Subject: [PATCH 31/33] catch error and print message --- module_intros/locality.Filter.ipynb | 31 +++++++++++++---------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index bd70127..1af8a67 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -54,7 +54,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 1, @@ -102,7 +102,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 2, @@ -138,7 +138,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 3, @@ -184,7 +184,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 4, @@ -275,16 +275,10 @@ "metadata": {}, "outputs": [ { - "ename": "RuntimeError", - "evalue": "Query point indices 0, 1, 2, 3, 4 do not have full neighbor shells.", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/tmp/ipykernel_1846/1282692032.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;31m# try to compute SANN neighborlist\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0msann\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfreud\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlocality\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mFilterSANN\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0msann\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msystem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32mutil.pyx\u001b[0m in \u001b[0;36mfreud.util._Compute.__getattribute__.compute_wrapper\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mlocality.pyx\u001b[0m in \u001b[0;36mfreud.locality.Filter.compute\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mRuntimeError\u001b[0m: Query point indices 0, 1, 2, 3, 4 do not have full neighbor shells." + "name": "stdout", + "output_type": "stream", + "text": [ + "Query point indices 0, 1, 2, 3, 4 do not have full neighbor shells.\n" ] } ], @@ -296,7 +290,10 @@ "\n", "# try to compute SANN neighborlist\n", "sann = freud.locality.FilterSANN()\n", - "sann.compute(system)" + "try:\n", + " sann.compute(system)\n", + "except RuntimeError as e:\n", + " print(e)" ] }, { @@ -323,7 +320,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 7, @@ -406,7 +403,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.10" } }, "nbformat": 4, From 0c07d584dc9de542029507318400046974fa3f2d Mon Sep 17 00:00:00 2001 From: Tommy Waltmann Date: Thu, 27 Apr 2023 14:00:17 -0400 Subject: [PATCH 32/33] reword the explanation of RAD closed --- module_intros/locality.Filter.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index 1af8a67..5228785 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -225,7 +225,7 @@ "id": "e8b3246c", "metadata": {}, "source": [ - "There are two variants of the RAD method: RAD$_{open}$ and RAD$_{closed}$. In RAD$_{closed}$, we consider all neighbors further away than the first blocked neighbor $j$ to also be blocked. In other words, the RAD$_{closed}$ algorithm terminates after we find the first blocked neighbor. In RAD$_{open}$, we consider all neighbors regardless of whether or not closer neighbors are blocked. The flag determining which RAD algorithm we use is controlled by the `terminate_after_blocked` argument to the `FilterRAD` constructor, as shown below:" + "There are two variants of the RAD method: RAD$_{open}$ and RAD$_{closed}$. In RAD$_{closed}$, we consider all neighbors further away than the first blocked neighbor $j$ to also be blocked. In other words, the RAD$_{closed}$ algorithm terminates the search for neighbors of particle $i$ and begins the search for neighbors of particle $i+1$ after it finds the first blocked neighbor of particle $i$. In RAD$_{open}$, we consider all neighbors regardless of whether or not closer neighbors are blocked. The flag determining which RAD algorithm we use is controlled by the `terminate_after_blocked` argument to the `FilterRAD` constructor, as shown below:" ] }, { From 41811b425fc08090ae0a447b5876021ff14ec99f Mon Sep 17 00:00:00 2001 From: Domagoj Fijan <50439291+DomFijan@users.noreply.github.com> Date: Thu, 27 Apr 2023 14:41:12 -0400 Subject: [PATCH 33/33] small wording fix --- module_intros/locality.Filter.ipynb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module_intros/locality.Filter.ipynb b/module_intros/locality.Filter.ipynb index 5228785..e9095ea 100644 --- a/module_intros/locality.Filter.ipynb +++ b/module_intros/locality.Filter.ipynb @@ -334,11 +334,12 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "2ca97268", "metadata": {}, "source": [ - "In cases where the input neighborlist is dense (i.e. $\\approx N$ neighbors per particle), the filtering by done `FilterSANN` and `FilterRAD` can take a long time to complete and often most of the input neighbors will be blocked. To use these classes more efficiently, physical intuition about the system can be used to limit the number of neighbors in the unfiltered neighborlist. For example, plotting a $g(r)$ for the system and choosing an `r_max` slightly larger than fist peak distance can be used as a good starting point. Another option which does not rely on any physical intuition is to start with a small number of neighbors, and slowly increase the number until the filter class does not issue a `RuntimeError`. An example demonstrating this method is shown below:" + "In cases where the input neighborlist is dense (i.e. $\\approx N$ neighbors per particle), the filtering done by `FilterSANN` and `FilterRAD` can take a long time to complete and often most of the input neighbors will be blocked. To use these classes more efficiently, physical intuition about the system can be used to limit the number of neighbors in the unfiltered neighborlist. For example, plotting a $g(r)$ for the system and choosing an `r_max` slightly larger than fist peak distance can be used as a good starting point. Another option which does not rely on any physical intuition is to start with a small number of neighbors, and slowly increase the number until the filter class does not issue a `RuntimeError`. An example demonstrating this method is shown below:" ] }, {