From 42d2a652bbfd83c94e3d8921016aa3ecdd4e8a9d Mon Sep 17 00:00:00 2001 From: Brandon Cohen Date: Wed, 30 Aug 2023 09:37:22 -0400 Subject: [PATCH 1/3] mapbox upload and awkde --- Pipfile | 1 + Pipfile.lock | 374 +- README.md | 31 +- src/awkde/LICENSE | 21 + src/awkde/README.md | 65 + src/awkde/awkde.egg-info/PKG-INFO | 8 + src/awkde/awkde.egg-info/SOURCES.txt | 13 + src/awkde/awkde.egg-info/dependency_links.txt | 1 + src/awkde/awkde.egg-info/requires.txt | 5 + src/awkde/awkde.egg-info/top_level.txt | 1 + src/awkde/awkde/__init__.py | 10 + src/awkde/awkde/awkde.py | 461 ++ src/awkde/awkde/backend.cpython-311-darwin.so | Bin 0 -> 180618 bytes src/awkde/awkde/tools.py | 147 + src/awkde/cpp/backend.cpp | 115 + src/awkde/example/example.png | Bin 0 -> 72255 bytes src/awkde/example/example.py | 127 + src/awkde/example/example_KDE.json | 5023 +++++++++++++++++ src/awkde/pyproject.toml | 3 + src/awkde/setup.py | 36 + src/awkde/tex/kernel_dens.png | Bin 0 -> 23705 bytes src/awkde/tex/lambda.png | Bin 0 -> 16951 bytes src/awkde/tex/log_g.png | Bin 0 -> 17996 bytes src/classes/featurelayer.py | 49 +- src/config/config.py | 5 +- src/data_utils/gun_crimes.py | 1 + src/data_utils/rco_geoms.py | 9 +- src/script.py | 5 + 28 files changed, 6383 insertions(+), 128 deletions(-) create mode 100644 src/awkde/LICENSE create mode 100644 src/awkde/README.md create mode 100644 src/awkde/awkde.egg-info/PKG-INFO create mode 100644 src/awkde/awkde.egg-info/SOURCES.txt create mode 100644 src/awkde/awkde.egg-info/dependency_links.txt create mode 100644 src/awkde/awkde.egg-info/requires.txt create mode 100644 src/awkde/awkde.egg-info/top_level.txt create mode 100644 src/awkde/awkde/__init__.py create mode 100644 src/awkde/awkde/awkde.py create mode 100755 src/awkde/awkde/backend.cpython-311-darwin.so create mode 100644 src/awkde/awkde/tools.py create mode 100644 src/awkde/cpp/backend.cpp create mode 100644 src/awkde/example/example.png create mode 100644 src/awkde/example/example.py create mode 100644 src/awkde/example/example_KDE.json create mode 100644 src/awkde/pyproject.toml create mode 100644 src/awkde/setup.py create mode 100644 src/awkde/tex/kernel_dens.png create mode 100644 src/awkde/tex/lambda.png create mode 100644 src/awkde/tex/log_g.png diff --git a/Pipfile b/Pipfile index ba475f75..548d00a7 100644 --- a/Pipfile +++ b/Pipfile @@ -19,6 +19,7 @@ esridump = "*" sqlalchemy = "*" psycopg2-binary = "*" geoalchemy2 = "*" +mapbox = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index a25c38c4..bf79935c 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "304d3732a0e4467e0533740d3ca4dcd9be9a293b58ad52e9f48d6559f0013bfe" + "sha256": "36c824d5284bbf554ee303d347700694bdb6f31786581709bcdc7e340ce013af" }, "pipfile-spec": 6, "requires": { @@ -166,6 +166,30 @@ "markers": "python_version >= '3.7'", "version": "==6.0.0" }, + "boto3": { + "hashes": [ + "sha256:4aec1b54ba6cd352abba2cdd7cdc76e631a4d3ce79c55c0719f85f9c9842e4a2", + "sha256:709cf438ad3ea48d426e4659538fe1148fc2719469b52179d07a11c5d26abac6" + ], + "markers": "python_version >= '3.7'", + "version": "==1.28.37" + }, + "botocore": { + "hashes": [ + "sha256:5c92c8bc3c6b49950c95501b30f0ac551fd4952359b53a6fba243094028157de", + "sha256:72e10759be3dff39c5eeb29f85c11a227c369c946d044f2caf62c352d6a6fc06" + ], + "markers": "python_version >= '3.7'", + "version": "==1.31.37" + }, + "cachecontrol": { + "hashes": [ + "sha256:95dedbec849f46dda3137866dc28b9d133fc9af55f5b805ab1291833e4457aa4", + "sha256:f012366b79d2243a6118309ce73151bf52a38d4a5dac8ea57f09bd29087e506b" + ], + "markers": "python_version >= '3.7'", + "version": "==0.13.1" + }, "certifi": { "hashes": [ "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", @@ -598,6 +622,14 @@ "markers": "python_version >= '3.7'", "version": "==8.1.0" }, + "iso3166": { + "hashes": [ + "sha256:263660b36f8471c42acd1ff673d28a3715edbce7d24b1550d0cf010f6816c47f", + "sha256:fcd551b8dda66b44e9f9e6d6bbbee3a1145a22447c0a556e5d0fb1ad1e491719" + ], + "markers": "python_version >= '3.6'", + "version": "==2.1.1" + }, "isoduration": { "hashes": [ "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", @@ -621,6 +653,14 @@ "markers": "python_version >= '3.7'", "version": "==3.1.2" }, + "jmespath": { + "hashes": [ + "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", + "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe" + ], + "markers": "python_version >= '3.7'", + "version": "==1.0.1" + }, "joblib": { "hashes": [ "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1", @@ -670,11 +710,11 @@ }, "jupyter-client": { "hashes": [ - "sha256:3af69921fe99617be1670399a0b857ad67275eefcfa291e2c81a160b7b650f5f", - "sha256:7441af0c0672edc5d28035e92ba5e32fadcfa8a4e608a434c228836a89df6158" + "sha256:5eb9f55eb0650e81de6b7e34308d8b92d04fe4ec41cd8193a913979e33d8e1a5", + "sha256:60294b2d5b869356c893f57b1a877ea6510d60d45cf4b38057f1672d85699ac9" ], "markers": "python_version >= '3.8'", - "version": "==8.3.0" + "version": "==8.3.1" }, "jupyter-console": { "hashes": [ @@ -866,6 +906,14 @@ "markers": "python_version >= '3.7'", "version": "==1.4.5" }, + "mapbox": { + "hashes": [ + "sha256:13c0774d8e4a4de07c224db00f04f6da21a40c1df7febda1791444d95c3d3c2b", + "sha256:e61be76f1594c0851ec2b7c1d713d4ae8a9c07bada5fa3648ffd718b908b470b" + ], + "index": "pypi", + "version": "==0.18.1" + }, "mapclassify": { "hashes": [ "sha256:3368ecd3ee197f1673979a2e19071a7dd7d88675cfa339c4fbb2432c118d9d47", @@ -993,6 +1041,74 @@ "markers": "python_version >= '3.7'", "version": "==3.0.1" }, + "msgpack": { + "hashes": [ + "sha256:06f5174b5f8ed0ed919da0e62cbd4ffde676a374aba4020034da05fab67b9164", + "sha256:0c05a4a96585525916b109bb85f8cb6511db1c6f5b9d9cbcbc940dc6b4be944b", + "sha256:137850656634abddfb88236008339fdaba3178f4751b28f270d2ebe77a563b6c", + "sha256:17358523b85973e5f242ad74aa4712b7ee560715562554aa2134d96e7aa4cbbf", + "sha256:18334484eafc2b1aa47a6d42427da7fa8f2ab3d60b674120bce7a895a0a85bdd", + "sha256:1835c84d65f46900920b3708f5ba829fb19b1096c1800ad60bae8418652a951d", + "sha256:1967f6129fc50a43bfe0951c35acbb729be89a55d849fab7686004da85103f1c", + "sha256:1ab2f3331cb1b54165976a9d976cb251a83183631c88076613c6c780f0d6e45a", + "sha256:1c0f7c47f0087ffda62961d425e4407961a7ffd2aa004c81b9c07d9269512f6e", + "sha256:20a97bf595a232c3ee6d57ddaadd5453d174a52594bf9c21d10407e2a2d9b3bd", + "sha256:20c784e66b613c7f16f632e7b5e8a1651aa5702463d61394671ba07b2fc9e025", + "sha256:266fa4202c0eb94d26822d9bfd7af25d1e2c088927fe8de9033d929dd5ba24c5", + "sha256:28592e20bbb1620848256ebc105fc420436af59515793ed27d5c77a217477705", + "sha256:288e32b47e67f7b171f86b030e527e302c91bd3f40fd9033483f2cacc37f327a", + "sha256:3055b0455e45810820db1f29d900bf39466df96ddca11dfa6d074fa47054376d", + "sha256:332360ff25469c346a1c5e47cbe2a725517919892eda5cfaffe6046656f0b7bb", + "sha256:362d9655cd369b08fda06b6657a303eb7172d5279997abe094512e919cf74b11", + "sha256:366c9a7b9057e1547f4ad51d8facad8b406bab69c7d72c0eb6f529cf76d4b85f", + "sha256:36961b0568c36027c76e2ae3ca1132e35123dcec0706c4b7992683cc26c1320c", + "sha256:379026812e49258016dd84ad79ac8446922234d498058ae1d415f04b522d5b2d", + "sha256:382b2c77589331f2cb80b67cc058c00f225e19827dbc818d700f61513ab47bea", + "sha256:476a8fe8fae289fdf273d6d2a6cb6e35b5a58541693e8f9f019bfe990a51e4ba", + "sha256:48296af57cdb1d885843afd73c4656be5c76c0c6328db3440c9601a98f303d87", + "sha256:4867aa2df9e2a5fa5f76d7d5565d25ec76e84c106b55509e78c1ede0f152659a", + "sha256:4c075728a1095efd0634a7dccb06204919a2f67d1893b6aa8e00497258bf926c", + "sha256:4f837b93669ce4336e24d08286c38761132bc7ab29782727f8557e1eb21b2080", + "sha256:4f8d8b3bf1ff2672567d6b5c725a1b347fe838b912772aa8ae2bf70338d5a198", + "sha256:525228efd79bb831cf6830a732e2e80bc1b05436b086d4264814b4b2955b2fa9", + "sha256:5494ea30d517a3576749cad32fa27f7585c65f5f38309c88c6d137877fa28a5a", + "sha256:55b56a24893105dc52c1253649b60f475f36b3aa0fc66115bffafb624d7cb30b", + "sha256:56a62ec00b636583e5cb6ad313bbed36bb7ead5fa3a3e38938503142c72cba4f", + "sha256:57e1f3528bd95cc44684beda696f74d3aaa8a5e58c816214b9046512240ef437", + "sha256:586d0d636f9a628ddc6a17bfd45aa5b5efaf1606d2b60fa5d87b8986326e933f", + "sha256:5cb47c21a8a65b165ce29f2bec852790cbc04936f502966768e4aae9fa763cb7", + "sha256:6c4c68d87497f66f96d50142a2b73b97972130d93677ce930718f68828b382e2", + "sha256:821c7e677cc6acf0fd3f7ac664c98803827ae6de594a9f99563e48c5a2f27eb0", + "sha256:916723458c25dfb77ff07f4c66aed34e47503b2eb3188b3adbec8d8aa6e00f48", + "sha256:9e6ca5d5699bcd89ae605c150aee83b5321f2115695e741b99618f4856c50898", + "sha256:9f5ae84c5c8a857ec44dc180a8b0cc08238e021f57abdf51a8182e915e6299f0", + "sha256:a2b031c2e9b9af485d5e3c4520f4220d74f4d222a5b8dc8c1a3ab9448ca79c57", + "sha256:a61215eac016f391129a013c9e46f3ab308db5f5ec9f25811e811f96962599a8", + "sha256:a740fa0e4087a734455f0fc3abf5e746004c9da72fbd541e9b113013c8dc3282", + "sha256:a9985b214f33311df47e274eb788a5893a761d025e2b92c723ba4c63936b69b1", + "sha256:ab31e908d8424d55601ad7075e471b7d0140d4d3dd3272daf39c5c19d936bd82", + "sha256:ac9dd47af78cae935901a9a500104e2dea2e253207c924cc95de149606dc43cc", + "sha256:addab7e2e1fcc04bd08e4eb631c2a90960c340e40dfc4a5e24d2ff0d5a3b3edb", + "sha256:b1d46dfe3832660f53b13b925d4e0fa1432b00f5f7210eb3ad3bb9a13c6204a6", + "sha256:b2de4c1c0538dcb7010902a2b97f4e00fc4ddf2c8cda9749af0e594d3b7fa3d7", + "sha256:b5ef2f015b95f912c2fcab19c36814963b5463f1fb9049846994b007962743e9", + "sha256:b72d0698f86e8d9ddf9442bdedec15b71df3598199ba33322d9711a19f08145c", + "sha256:bae7de2026cbfe3782c8b78b0db9cbfc5455e079f1937cb0ab8d133496ac55e1", + "sha256:bf22a83f973b50f9d38e55c6aade04c41ddda19b00c4ebc558930d78eecc64ed", + "sha256:c075544284eadc5cddc70f4757331d99dcbc16b2bbd4849d15f8aae4cf36d31c", + "sha256:c396e2cc213d12ce017b686e0f53497f94f8ba2b24799c25d913d46c08ec422c", + "sha256:cb5aaa8c17760909ec6cb15e744c3ebc2ca8918e727216e79607b7bbce9c8f77", + "sha256:cdc793c50be3f01106245a61b739328f7dccc2c648b501e237f0699fe1395b81", + "sha256:d25dd59bbbbb996eacf7be6b4ad082ed7eacc4e8f3d2df1ba43822da9bfa122a", + "sha256:e42b9594cc3bf4d838d67d6ed62b9e59e201862a25e9a157019e171fbe672dd3", + "sha256:e57916ef1bd0fee4f21c4600e9d1da352d8816b52a599c46460e93a6e9f17086", + "sha256:ed40e926fa2f297e8a653c954b732f125ef97bdd4c889f243182299de27e2aa9", + "sha256:ef8108f8dedf204bb7b42994abf93882da1159728a2d4c5e82012edd92c9da9f", + "sha256:f933bbda5a3ee63b8834179096923b094b76f0c7a73c1cfe8f07ad608c58844b", + "sha256:fe5c63197c55bce6385d9aee16c4d0641684628f63ace85f73571e65ad1c1e8d" + ], + "version": "==1.0.5" + }, "mypy-extensions": { "hashes": [ "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", @@ -1011,11 +1127,11 @@ }, "nbconvert": { "hashes": [ - "sha256:1113d039fa3fc3a846ffa5a3b0a019e85aaa94c566a09fa0c400fb7638e46087", - "sha256:ace26f4386d08eb5c55833596a942048c5502a95e05590cb523826a749a40a37" + "sha256:aec605e051fa682ccc7934ccc338ba1e8b626cfadbab0db592106b630f63f0f2", + "sha256:f5bc15a1247e14dd41ceef0c0a3bc70020e016576eb0578da62f1c5b4f950479" ], "markers": "python_version >= '3.8'", - "version": "==7.7.4" + "version": "==7.8.0" }, "nbformat": { "hashes": [ @@ -1244,6 +1360,14 @@ "markers": "python_version >= '3.7'", "version": "==3.10.0" }, + "polyline": { + "hashes": [ + "sha256:1492b8fcadc2143f8aedc673d3c6d95df45131f1c62eb8d51c8183b24e771486", + "sha256:45c9c0e8c0814a17df78390e3196cd47f6bc69697cd8a83f00d527c72f4d2a88" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.0" + }, "prometheus-client": { "hashes": [ "sha256:21e674f39831ae3f8acde238afd9a27a37d0d2fb5a28ea094f0ce25d2cbf2091", @@ -1439,7 +1563,9 @@ }, "pyyaml": { "hashes": [ + "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", + "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", @@ -1447,7 +1573,10 @@ "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", + "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", + "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", + "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", @@ -1455,9 +1584,12 @@ "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", + "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", + "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", + "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", @@ -1472,7 +1604,9 @@ "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", + "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", + "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", @@ -1592,11 +1726,11 @@ }, "qtpy": { "hashes": [ - "sha256:5193d20e0b16e4d9d3bc2c642d04d9f4e2c892590bd1b9c92bfe38a95d5a2e12", - "sha256:a8c74982d6d172ce124d80cafd39653df78989683f760f2281ba91a6e7b9de8b" + "sha256:4d4f045a41e09ac9fa57fcb47ef05781aa5af294a0a646acc1b729d14225e741", + "sha256:db2d508167aa6106781565c8da5c6f1487debacba33519cedc35fa8997d424d4" ], "markers": "python_version >= '3.7'", - "version": "==2.3.1" + "version": "==2.4.0" }, "rasterio": { "hashes": [ @@ -1655,106 +1789,114 @@ }, "rpds-py": { "hashes": [ - "sha256:0173c0444bec0a3d7d848eaeca2d8bd32a1b43f3d3fde6617aac3731fa4be05f", - "sha256:01899794b654e616c8625b194ddd1e5b51ef5b60ed61baa7a2d9c2ad7b2a4238", - "sha256:02938432352359805b6da099c9c95c8a0547fe4b274ce8f1a91677401bb9a45f", - "sha256:03421628f0dc10a4119d714a17f646e2837126a25ac7a256bdf7c3943400f67f", - "sha256:03975db5f103997904c37e804e5f340c8fdabbb5883f26ee50a255d664eed58c", - "sha256:0766babfcf941db8607bdaf82569ec38107dbb03c7f0b72604a0b346b6eb3298", - "sha256:07e2c54bef6838fa44c48dfbc8234e8e2466d851124b551fc4e07a1cfeb37260", - "sha256:0836d71ca19071090d524739420a61580f3f894618d10b666cf3d9a1688355b1", - "sha256:095b460e117685867d45548fbd8598a8d9999227e9061ee7f012d9d264e6048d", - "sha256:0e7521f5af0233e89939ad626b15278c71b69dc1dfccaa7b97bd4cdf96536bb7", - "sha256:0f2996fbac8e0b77fd67102becb9229986396e051f33dbceada3debaacc7033f", - "sha256:1054a08e818f8e18910f1bee731583fe8f899b0a0a5044c6e680ceea34f93876", - "sha256:13b602dc3e8dff3063734f02dcf05111e887f301fdda74151a93dbbc249930fe", - "sha256:141acb9d4ccc04e704e5992d35472f78c35af047fa0cfae2923835d153f091be", - "sha256:14c408e9d1a80dcb45c05a5149e5961aadb912fff42ca1dd9b68c0044904eb32", - "sha256:159fba751a1e6b1c69244e23ba6c28f879a8758a3e992ed056d86d74a194a0f3", - "sha256:190ca6f55042ea4649ed19c9093a9be9d63cd8a97880106747d7147f88a49d18", - "sha256:196cb208825a8b9c8fc360dc0f87993b8b260038615230242bf18ec84447c08d", - "sha256:1fcdee18fea97238ed17ab6478c66b2095e4ae7177e35fb71fbe561a27adf620", - "sha256:207f57c402d1f8712618f737356e4b6f35253b6d20a324d9a47cb9f38ee43a6b", - "sha256:24a81c177379300220e907e9b864107614b144f6c2a15ed5c3450e19cf536fae", - "sha256:29cd8bfb2d716366a035913ced99188a79b623a3512292963d84d3e06e63b496", - "sha256:2d8b3b3a2ce0eaa00c5bbbb60b6713e94e7e0becab7b3db6c5c77f979e8ed1f1", - "sha256:35da5cc5cb37c04c4ee03128ad59b8c3941a1e5cd398d78c37f716f32a9b7f67", - "sha256:44659b1f326214950a8204a248ca6199535e73a694be8d3e0e869f820767f12f", - "sha256:47c5f58a8e0c2c920cc7783113df2fc4ff12bf3a411d985012f145e9242a2764", - "sha256:4bd4dc3602370679c2dfb818d9c97b1137d4dd412230cfecd3c66a1bf388a196", - "sha256:4ea6b73c22d8182dff91155af018b11aac9ff7eca085750455c5990cb1cfae6e", - "sha256:50025635ba8b629a86d9d5474e650da304cb46bbb4d18690532dd79341467846", - "sha256:517cbf6e67ae3623c5127206489d69eb2bdb27239a3c3cc559350ef52a3bbf0b", - "sha256:5855c85eb8b8a968a74dc7fb014c9166a05e7e7a8377fb91d78512900aadd13d", - "sha256:5a46859d7f947061b4010e554ccd1791467d1b1759f2dc2ec9055fa239f1bc26", - "sha256:65a0583c43d9f22cb2130c7b110e695fff834fd5e832a776a107197e59a1898e", - "sha256:674c704605092e3ebbbd13687b09c9f78c362a4bc710343efe37a91457123044", - "sha256:682726178138ea45a0766907957b60f3a1bf3acdf212436be9733f28b6c5af3c", - "sha256:686ba516e02db6d6f8c279d1641f7067ebb5dc58b1d0536c4aaebb7bf01cdc5d", - "sha256:6a5d3fbd02efd9cf6a8ffc2f17b53a33542f6b154e88dd7b42ef4a4c0700fdad", - "sha256:6aa8326a4a608e1c28da191edd7c924dff445251b94653988efb059b16577a4d", - "sha256:700375326ed641f3d9d32060a91513ad668bcb7e2cffb18415c399acb25de2ab", - "sha256:71f2f7715935a61fa3e4ae91d91b67e571aeb5cb5d10331ab681256bda2ad920", - "sha256:745f5a43fdd7d6d25a53ab1a99979e7f8ea419dfefebcab0a5a1e9095490ee5e", - "sha256:79f594919d2c1a0cc17d1988a6adaf9a2f000d2e1048f71f298b056b1018e872", - "sha256:7d68dc8acded354c972116f59b5eb2e5864432948e098c19fe6994926d8e15c3", - "sha256:7f67da97f5b9eac838b6980fc6da268622e91f8960e083a34533ca710bec8611", - "sha256:83b32f0940adec65099f3b1c215ef7f1d025d13ff947975a055989cb7fd019a4", - "sha256:876bf9ed62323bc7dcfc261dbc5572c996ef26fe6406b0ff985cbcf460fc8a4c", - "sha256:890ba852c16ace6ed9f90e8670f2c1c178d96510a21b06d2fa12d8783a905193", - "sha256:8b08605d248b974eb02f40bdcd1a35d3924c83a2a5e8f5d0fa5af852c4d960af", - "sha256:8b2eb034c94b0b96d5eddb290b7b5198460e2d5d0c421751713953a9c4e47d10", - "sha256:8b9ec12ad5f0a4625db34db7e0005be2632c1013b253a4a60e8302ad4d462afd", - "sha256:8c8d7594e38cf98d8a7df25b440f684b510cf4627fe038c297a87496d10a174f", - "sha256:8d3335c03100a073883857e91db9f2e0ef8a1cf42dc0369cbb9151c149dbbc1b", - "sha256:8d70e8f14900f2657c249ea4def963bed86a29b81f81f5b76b5a9215680de945", - "sha256:9039a11bca3c41be5a58282ed81ae422fa680409022b996032a43badef2a3752", - "sha256:91378d9f4151adc223d584489591dbb79f78814c0734a7c3bfa9c9e09978121c", - "sha256:9251eb8aa82e6cf88510530b29eef4fac825a2b709baf5b94a6094894f252387", - "sha256:933a7d5cd4b84f959aedeb84f2030f0a01d63ae6cf256629af3081cf3e3426e8", - "sha256:978fa96dbb005d599ec4fd9ed301b1cc45f1a8f7982d4793faf20b404b56677d", - "sha256:987b06d1cdb28f88a42e4fb8a87f094e43f3c435ed8e486533aea0bf2e53d931", - "sha256:99b1c16f732b3a9971406fbfe18468592c5a3529585a45a35adbc1389a529a03", - "sha256:99e7c4bb27ff1aab90dcc3e9d37ee5af0231ed98d99cb6f5250de28889a3d502", - "sha256:9c439fd54b2b9053717cca3de9583be6584b384d88d045f97d409f0ca867d80f", - "sha256:9ea4d00850ef1e917815e59b078ecb338f6a8efda23369677c54a5825dbebb55", - "sha256:9f30d205755566a25f2ae0382944fcae2f350500ae4df4e795efa9e850821d82", - "sha256:a06418fe1155e72e16dddc68bb3780ae44cebb2912fbd8bb6ff9161de56e1798", - "sha256:a0805911caedfe2736935250be5008b261f10a729a303f676d3d5fea6900c96a", - "sha256:a1f044792e1adcea82468a72310c66a7f08728d72a244730d14880cd1dabe36b", - "sha256:a216b26e5af0a8e265d4efd65d3bcec5fba6b26909014effe20cd302fd1138fa", - "sha256:a987578ac5214f18b99d1f2a3851cba5b09f4a689818a106c23dbad0dfeb760f", - "sha256:aad51239bee6bff6823bbbdc8ad85136c6125542bbc609e035ab98ca1e32a192", - "sha256:ab2299e3f92aa5417d5e16bb45bb4586171c1327568f638e8453c9f8d9e0f020", - "sha256:ab6919a09c055c9b092798ce18c6c4adf49d24d4d9e43a92b257e3f2548231e7", - "sha256:b0c43f8ae8f6be1d605b0465671124aa8d6a0e40f1fb81dcea28b7e3d87ca1e1", - "sha256:b1440c291db3f98a914e1afd9d6541e8fc60b4c3aab1a9008d03da4651e67386", - "sha256:b52e7c5ae35b00566d244ffefba0f46bb6bec749a50412acf42b1c3f402e2c90", - "sha256:bf4151acb541b6e895354f6ff9ac06995ad9e4175cbc6d30aaed08856558201f", - "sha256:c27ee01a6c3223025f4badd533bea5e87c988cb0ba2811b690395dfe16088cfe", - "sha256:c545d9d14d47be716495076b659db179206e3fd997769bc01e2d550eeb685596", - "sha256:c5934e2833afeaf36bd1eadb57256239785f5af0220ed8d21c2896ec4d3a765f", - "sha256:c7671d45530fcb6d5e22fd40c97e1e1e01965fc298cbda523bb640f3d923b387", - "sha256:c861a7e4aef15ff91233751619ce3a3d2b9e5877e0fcd76f9ea4f6847183aa16", - "sha256:d25b1c1096ef0447355f7293fbe9ad740f7c47ae032c2884113f8e87660d8f6e", - "sha256:d55777a80f78dd09410bd84ff8c95ee05519f41113b2df90a69622f5540c4f8b", - "sha256:d576c3ef8c7b2d560e301eb33891d1944d965a4d7a2eacb6332eee8a71827db6", - "sha256:dd9da77c6ec1f258387957b754f0df60766ac23ed698b61941ba9acccd3284d1", - "sha256:de0b6eceb46141984671802d412568d22c6bacc9b230174f9e55fc72ef4f57de", - "sha256:e07e5dbf8a83c66783a9fe2d4566968ea8c161199680e8ad38d53e075df5f0d0", - "sha256:e564d2238512c5ef5e9d79338ab77f1cbbda6c2d541ad41b2af445fb200385e3", - "sha256:ed89861ee8c8c47d6beb742a602f912b1bb64f598b1e2f3d758948721d44d468", - "sha256:ef1f08f2a924837e112cba2953e15aacfccbbfcd773b4b9b4723f8f2ddded08e", - "sha256:f411330a6376fb50e5b7a3e66894e4a39e60ca2e17dce258d53768fea06a37bd", - "sha256:f68996a3b3dc9335037f82754f9cdbe3a95db42bde571d8c3be26cc6245f2324", - "sha256:f7fdf55283ad38c33e35e2855565361f4bf0abd02470b8ab28d499c663bc5d7c", - "sha256:f963c6b1218b96db85fc37a9f0851eaf8b9040aa46dec112611697a7023da535", - "sha256:fa2818759aba55df50592ecbc95ebcdc99917fa7b55cc6796235b04193eb3c55", - "sha256:fae5cb554b604b3f9e2c608241b5d8d303e410d7dfb6d397c335f983495ce7f6", - "sha256:fb39aca7a64ad0c9490adfa719dbeeb87d13be137ca189d2564e596f8ba32c07" + "sha256:00215f6a9058fbf84f9d47536902558eb61f180a6b2a0fa35338d06ceb9a2e5a", + "sha256:0028eb0967942d0d2891eae700ae1a27b7fd18604cfcb16a1ef486a790fee99e", + "sha256:0155c33af0676fc38e1107679be882077680ad1abb6303956b97259c3177e85e", + "sha256:063411228b852fb2ed7485cf91f8e7d30893e69b0acb207ec349db04cccc8225", + "sha256:0700c2133ba203c4068aaecd6a59bda22e06a5e46255c9da23cbf68c6942215d", + "sha256:08e08ccf5b10badb7d0a5c84829b914c6e1e1f3a716fdb2bf294e2bd01562775", + "sha256:0d292cabd7c8335bdd3237ded442480a249dbcdb4ddfac5218799364a01a0f5c", + "sha256:15932ec5f224b0e35764dc156514533a4fca52dcfda0dfbe462a1a22b37efd59", + "sha256:18f87baa20e02e9277ad8960cd89b63c79c05caf106f4c959a9595c43f2a34a5", + "sha256:1a6420a36975e0073acaeee44ead260c1f6ea56812cfc6c31ec00c1c48197173", + "sha256:1b401e8b9aece651512e62c431181e6e83048a651698a727ea0eb0699e9f9b74", + "sha256:1d7b7b71bcb82d8713c7c2e9c5f061415598af5938666beded20d81fa23e7640", + "sha256:23750a9b8a329844ba1fe267ca456bb3184984da2880ed17ae641c5af8de3fef", + "sha256:23a059143c1393015c68936370cce11690f7294731904bdae47cc3e16d0b2474", + "sha256:26d9fd624649a10e4610fab2bc820e215a184d193e47d0be7fe53c1c8f67f370", + "sha256:291c9ce3929a75b45ce8ddde2aa7694fc8449f2bc8f5bd93adf021efaae2d10b", + "sha256:298e8b5d8087e0330aac211c85428c8761230ef46a1f2c516d6a2f67fb8803c5", + "sha256:2c7c4266c1b61eb429e8aeb7d8ed6a3bfe6c890a1788b18dbec090c35c6b93fa", + "sha256:2d68a8e8a3a816629283faf82358d8c93fe5bd974dd2704152394a3de4cec22a", + "sha256:344b89384c250ba6a4ce1786e04d01500e4dac0f4137ceebcaad12973c0ac0b3", + "sha256:3455ecc46ea443b5f7d9c2f946ce4017745e017b0d0f8b99c92564eff97e97f5", + "sha256:3d544a614055b131111bed6edfa1cb0fb082a7265761bcb03321f2dd7b5c6c48", + "sha256:3e5c26905aa651cc8c0ddc45e0e5dea2a1296f70bdc96af17aee9d0493280a17", + "sha256:3f5cc8c7bc99d2bbcd704cef165ca7d155cd6464c86cbda8339026a42d219397", + "sha256:4992266817169997854f81df7f6db7bdcda1609972d8ffd6919252f09ec3c0f6", + "sha256:4d55528ef13af4b4e074d067977b1f61408602f53ae4537dccf42ba665c2c7bd", + "sha256:576da63eae7809f375932bfcbca2cf20620a1915bf2fedce4b9cc8491eceefe3", + "sha256:58fc4d66ee349a23dbf08c7e964120dc9027059566e29cf0ce6205d590ed7eca", + "sha256:5b9bf77008f2c55dabbd099fd3ac87009471d223a1c7ebea36873d39511b780a", + "sha256:5e7996aed3f65667c6dcc8302a69368435a87c2364079a066750a2eac75ea01e", + "sha256:5f7487be65b9c2c510819e744e375bd41b929a97e5915c4852a82fbb085df62c", + "sha256:6388e4e95a26717b94a05ced084e19da4d92aca883f392dffcf8e48c8e221a24", + "sha256:65af12f70355de29e1092f319f85a3467f4005e959ab65129cb697169ce94b86", + "sha256:668d2b45d62c68c7a370ac3dce108ffda482b0a0f50abd8b4c604a813a59e08f", + "sha256:71333c22f7cf5f0480b59a0aef21f652cf9bbaa9679ad261b405b65a57511d1e", + "sha256:7150b83b3e3ddaac81a8bb6a9b5f93117674a0e7a2b5a5b32ab31fdfea6df27f", + "sha256:748e472345c3a82cfb462d0dff998a7bf43e621eed73374cb19f307e97e08a83", + "sha256:75dbfd41a61bc1fb0536bf7b1abf272dc115c53d4d77db770cd65d46d4520882", + "sha256:7618a082c55cf038eede4a918c1001cc8a4411dfe508dc762659bcd48d8f4c6e", + "sha256:780fcb855be29153901c67fc9c5633d48aebef21b90aa72812fa181d731c6b00", + "sha256:78d10c431073dc6ebceed35ab22948a016cc2b5120963c13a41e38bdde4a7212", + "sha256:7a3a3d3e4f1e3cd2a67b93a0b6ed0f2499e33f47cc568e3a0023e405abdc0ff1", + "sha256:7b6975d3763d0952c111700c0634968419268e6bbc0b55fe71138987fa66f309", + "sha256:80772e3bda6787510d9620bc0c7572be404a922f8ccdfd436bf6c3778119464c", + "sha256:80992eb20755701753e30a6952a96aa58f353d12a65ad3c9d48a8da5ec4690cf", + "sha256:841128a22e6ac04070a0f84776d07e9c38c4dcce8e28792a95e45fc621605517", + "sha256:861d25ae0985a1dd5297fee35f476b60c6029e2e6e19847d5b4d0a43a390b696", + "sha256:872f3dcaa8bf2245944861d7311179d2c0c9b2aaa7d3b464d99a7c2e401f01fa", + "sha256:87c93b25d538c433fb053da6228c6290117ba53ff6a537c133b0f2087948a582", + "sha256:8856aa76839dc234d3469f1e270918ce6bec1d6a601eba928f45d68a15f04fc3", + "sha256:885e023e73ce09b11b89ab91fc60f35d80878d2c19d6213a32b42ff36543c291", + "sha256:899b5e7e2d5a8bc92aa533c2d4e55e5ebba095c485568a5e4bedbc163421259a", + "sha256:8ce8caa29ebbdcde67e5fd652c811d34bc01f249dbc0d61e5cc4db05ae79a83b", + "sha256:8e1c68303ccf7fceb50fbab79064a2636119fd9aca121f28453709283dbca727", + "sha256:8e7e2b3577e97fa43c2c2b12a16139b2cedbd0770235d5179c0412b4794efd9b", + "sha256:92f05fc7d832e970047662b3440b190d24ea04f8d3c760e33e7163b67308c878", + "sha256:97f5811df21703446b42303475b8b855ee07d6ab6cdf8565eff115540624f25d", + "sha256:9affee8cb1ec453382c27eb9043378ab32f49cd4bc24a24275f5c39bf186c279", + "sha256:a2da4a8c6d465fde36cea7d54bf47b5cf089073452f0e47c8632ecb9dec23c07", + "sha256:a6903cdca64f1e301af9be424798328c1fe3b4b14aede35f04510989fc72f012", + "sha256:a8ab1adf04ae2d6d65835995218fd3f3eb644fe20655ca8ee233e2c7270ff53b", + "sha256:a8edd467551c1102dc0f5754ab55cd0703431cd3044edf8c8e7d9208d63fa453", + "sha256:ac00c41dd315d147b129976204839ca9de699d83519ff1272afbe4fb9d362d12", + "sha256:ad277f74b1c164f7248afa968700e410651eb858d7c160d109fb451dc45a2f09", + "sha256:ae46a50d235f1631d9ec4670503f7b30405103034830bc13df29fd947207f795", + "sha256:afe6b5a04b2ab1aa89bad32ca47bf71358e7302a06fdfdad857389dca8fb5f04", + "sha256:b1cb078f54af0abd835ca76f93a3152565b73be0f056264da45117d0adf5e99c", + "sha256:b25136212a3d064a8f0b9ebbb6c57094c5229e0de76d15c79b76feff26aeb7b8", + "sha256:b3226b246facae14909b465061ddcfa2dfeadb6a64f407f24300d42d69bcb1a1", + "sha256:b98e75b21fc2ba5285aef8efaf34131d16af1c38df36bdca2f50634bea2d3060", + "sha256:bbd7b24d108509a1b9b6679fcc1166a7dd031dbef1f3c2c73788f42e3ebb3beb", + "sha256:bed57543c99249ab3a4586ddc8786529fbc33309e5e8a1351802a06ca2baf4c2", + "sha256:c0583f69522732bdd79dca4cd3873e63a29acf4a299769c7541f2ca1e4dd4bc6", + "sha256:c1e0e9916301e3b3d970814b1439ca59487f0616d30f36a44cead66ee1748c31", + "sha256:c651847545422c8131660704c58606d841e228ed576c8f1666d98b3d318f89da", + "sha256:c7853f27195598e550fe089f78f0732c66ee1d1f0eaae8ad081589a5a2f5d4af", + "sha256:cbae50d352e4717ffc22c566afc2d0da744380e87ed44a144508e3fb9114a3f4", + "sha256:cdbed8f21204398f47de39b0a9b180d7e571f02dfb18bf5f1b618e238454b685", + "sha256:d08395595c42bcd82c3608762ce734504c6d025eef1c06f42326a6023a584186", + "sha256:d4639111e73997567343df6551da9dd90d66aece1b9fc26c786d328439488103", + "sha256:d63787f289944cc4bde518ad2b5e70a4f0d6e2ce76324635359c74c113fd188f", + "sha256:d6d5f061f6a2aa55790b9e64a23dfd87b6664ab56e24cd06c78eb43986cb260b", + "sha256:d7865df1fb564092bcf46dac61b5def25342faf6352e4bc0e61a286e3fa26a3d", + "sha256:db6585b600b2e76e98131e0ac0e5195759082b51687ad0c94505970c90718f4a", + "sha256:e36d7369363d2707d5f68950a64c4e025991eb0177db01ccb6aa6facae48b69f", + "sha256:e7947d9a6264c727a556541b1630296bbd5d0a05068d21c38dde8e7a1c703ef0", + "sha256:eb2d59bc196e6d3b1827c7db06c1a898bfa0787c0574af398e65ccf2e97c0fbe", + "sha256:ee9c2f6ca9774c2c24bbf7b23086264e6b5fa178201450535ec0859739e6f78d", + "sha256:f4760e1b02173f4155203054f77a5dc0b4078de7645c922b208d28e7eb99f3e2", + "sha256:f70bec8a14a692be6dbe7ce8aab303e88df891cbd4a39af091f90b6702e28055", + "sha256:f869e34d2326e417baee430ae998e91412cc8e7fdd83d979277a90a0e79a5b47", + "sha256:f8b9a7cd381970e64849070aca7c32d53ab7d96c66db6c2ef7aa23c6e803f514", + "sha256:f99d74ddf9d3b6126b509e81865f89bd1283e3fc1b568b68cd7bd9dfa15583d7", + "sha256:f9e7e493ded7042712a374471203dd43ae3fff5b81e3de1a0513fa241af9fd41", + "sha256:fc72ae476732cdb7b2c1acb5af23b478b8a0d4b6fcf19b90dd150291e0d5b26b", + "sha256:fccbf0cd3411719e4c9426755df90bf3449d9fc5a89f077f4a7f1abd4f70c910", + "sha256:ffcf18ad3edf1c170e27e88b10282a2c449aa0358659592462448d71b2000cfc" ], "markers": "python_version >= '3.8'", - "version": "==0.9.2" + "version": "==0.10.0" + }, + "s3transfer": { + "hashes": [ + "sha256:b014be3a8a2aab98cfe1abc7229cc5a9a0cf05eb9c1f2b86b230fd8df3f78084", + "sha256:cab66d3380cca3e70939ef2255d01cd8aece6a4907a9528740f668c4b0611861" + ], + "markers": "python_version >= '3.7'", + "version": "==0.6.2" }, "scikit-learn": { "hashes": [ @@ -2031,13 +2173,21 @@ ], "version": "==1.3.0" }, + "uritemplate": { + "hashes": [ + "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0", + "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e" + ], + "markers": "python_version >= '3.6'", + "version": "==4.1.1" + }, "urllib3": { "hashes": [ - "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11", - "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4" + "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f", + "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14" ], - "markers": "python_version >= '3.7'", - "version": "==2.0.4" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==1.26.16" }, "wcwidth": { "hashes": [ diff --git a/README.md b/README.md index 09b5ca66..c041bb33 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ # Clean & Green Philly + Philadelphia has a gun violence problem. This dashboard aims to help solve it by empowering community groups to carry out cleaning and greening interventions in the vacant properties where they can have the biggest impact. # Motivation + Philadelphia has a gun violence problem. Homicides have been on the rise since 2013. The past three years—2020, 2021, and 2022—have been the deadliest on record, with a high of 562 homicides in 2021. Community members need solutions, but many city-run initiatives are frustratingly slow or inadequate. Nearly 80% of the city’s anti-violence spending focuses on long-term violence reduction without any clear, immediate impact. Research shows that greening and cleaning vacant and abandoned parcels is one of the most impactful, cost-effective interventions available to reduce gun violence in a neighborhood. Drs. Eugenia South and Charles Branas have led several studies that [demonstrate that greening vacant lots in Philadelphia reduced gun violence by as much as 29% in the surrounding area](https://www.pnas.org/doi/10.1073/pnas.1718503115). Similarly, cleaning and lightly repairing vacant houses led a 13% drop in gun assaults compared to nearby blocks. These “greening and cleaning” interventions not only reduce gun violence but also provide other benefits, such as reducing the urban heat island effect, lowering residents’ stress levels, and contributing to lower levels of depression among residents. @@ -9,6 +11,7 @@ Research shows that greening and cleaning vacant and abandoned parcels is one of There are roughly 40,000 vaccant properties in Philadelphia. Identifying the highest-priority vacant properties will allow community groups to invest their limited resources where they will have the biggest impact. Combining various public data, this dashboard helps users identify the properties that are ideal for them to intervene in. It also offers additional information about each property to facilitate interventions and indicates the best possible route to cleaning up the property. # Current Draft + You can view the [most recent prototype of the website and dashboard](https://nlebovits.github.io/dashboard_demo_website/more_info.html), which was created in Quarto. Currently we are in the process of user testing a newer prototype, which looks like this: @@ -18,7 +21,9 @@ Currently we are in the process of user testing a newer prototype, which looks l ![User prototype map](https://github.com/CodeForPhilly/vacant-lots-proj/assets/111617674/8cbf0b06-b299-49cd-8f9f-bbb714e55b44) # Current Tasks + At the moment, we are working on: + - User testing with the prototype - Finishing the Python script that creates the underlying dataset @@ -27,16 +32,17 @@ Current tasks for the Python script are visible under the Issues section. In September, we hope to begin turning our attention to building the dashboard and website, which will be built in React JS. # Looking For + - Front end engineer w/mapping experience - Python data engineer # Languages/Frameworks + - React - Nextjs - Tailwind - Python (data engineering) - # Setup Instructions 1. Install [pyenv](https://github.com/pyenv/pyenv) (or [pyenv-win](https://github.com/pyenv-win/pyenv-win) for Windows) for Python version management @@ -56,9 +62,15 @@ In September, we hope to begin turning our attention to building the dashboard a `CREATE EXTENSION postgis;` 5. Set your database connection string to an environment variable `VACANT_LOTS_DB` +In `/config/config`, set `FORCE_RELOAD` = `False` to read "cached" data in postgres instead of downloading new data. + # awkde -We are using the [awkde package](https://github.com/mennthor/awkde) to create the Adaptive Width KDE. It is not available through pip. Install directly in the `src` folder using their instructions. +We are using the [awkde package](https://github.com/mennthor/awkde) to create the Adaptive Width KDE. It is not available through pip. To install, navigate to `src/awkde` and run + +``` +pip install -e ./awkde +``` # Usage Instructions @@ -66,14 +78,19 @@ We are using the [awkde package](https://github.com/mennthor/awkde) to create th 2. Move the to src folder `cd src` 3. Run the main script `python script.py` +# Mapbox + +To upload to Mapbox through the API you'll need a key with `upload` write access, saved to the environment variable `CFP_MAPBOX_TOKEN_UPLOADER` + # Contribution Instructions 1. Create a fork of this repository and work from branches within your fork. When those changes are ready for review, create a pull request from fork:branch to upstream:main -2. Before committing changes, format your code to maintain a consistent codebase: - ``` - pipenv shell - black . - ``` +2. Before committing changes, format your code to maintain a consistent codebase: + ``` + pipenv shell + black . + ``` # License + MIT © Code for Philly diff --git a/src/awkde/LICENSE b/src/awkde/LICENSE new file mode 100644 index 00000000..cedffc1a --- /dev/null +++ b/src/awkde/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Thorben Menne + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/awkde/README.md b/src/awkde/README.md new file mode 100644 index 00000000..1f517a03 --- /dev/null +++ b/src/awkde/README.md @@ -0,0 +1,65 @@ +# Adaptive Width KDE with Gaussian Kernels + +## Installation + +This uses the awesome [pybind11](https://github.com/pybind/pybind11) package which makes creating C++ bindings super convenient. +Only the evaluation is written in a small C++ snippet to speed it up, the rest is a pure python implementation. + +The setup is taken from the example at https://github.com/pybind/python_example +Just clone the repository and invoke `pip`: + +```bash +git clone https://github.com/mennthor/awkde +pip install [--user] [-e] ./awkde +``` +Note: `--user` and `-e` are optional. Use `--user` to install in your user site-package directory (recommended) and `-e` if you want to only link the files to the site-package directories, so that when you make any changes in your local copy, you don't have to reinstall all the time. + +Try to run the `example/examply.py`: + +``` +cd awkde/example +python example.py +``` + +You should get this plot in the examples folder (you need matplotlib for the plot): + +![example plot](example/example.png) + + +## Algorithm + +The unweighted kernel density estimator is defined as + +![kernel density formula](tex/kernel_dens.png) + +where the product `h * lambda` takes the role of a local `sigma`. + +The kernel bandwith is choosen locally to account for variations in the +density of the data. +Areas with large density gets smaller kernels and vice versa. +This smoothes the tails and gets high resolution in high statistics regions. +The local bandwidth paramter is defined as + +![kernel density formula](tex/lambda.png) + +where + +![kernel density formula](tex/log_g.png) + +is some normalization and `^f(X_i)` the KDE estimate at the data point `X_i`. +The local bandwidth is multiplied to the global bandwidth for each kernel. + +Furthermore different scales in data is accounted for by scaling it via its +covariance matrix to an equal spread. +First a global kernel bandwidth is applied to the transformed data and then +based on that density a local bandwidth parameter is applied. + +All credit for the method goes to [1] and to S. Schoenen and L. Raedel for +huge parts of the implementation. +For information on Silverman or Scott rule, see [2] or [3]. + + +## References +- [1] B. Wang and X. Wang, "Bandwidth Selection for Weighted Kernel Density Estimation", Sep. 2007, DOI: 10.1214/154957804100000000. +- [2] D.W. Scott, "Multivariate Density Estimation: Theory, Practice, and Visualization", John Wiley & Sons, New York, Chicester, 1992. +- [3] B.W. Silverman, "Density Estimation for Statistics and Data Analysis", Vol. 26, Monographs on Statistics and Applied Probability, Chapman and Hall, London, 1986. diff --git a/src/awkde/awkde.egg-info/PKG-INFO b/src/awkde/awkde.egg-info/PKG-INFO new file mode 100644 index 00000000..f037dfad --- /dev/null +++ b/src/awkde/awkde.egg-info/PKG-INFO @@ -0,0 +1,8 @@ +Metadata-Version: 2.1 +Name: awkde +Version: 0.1 +Summary: Adaptive width gaussian KDE +Home-page: https://github.com/mennthor/awkde +Author: Thorben Menne +Author-email: thorben.menne@tu-dortmund.de +License-File: LICENSE diff --git a/src/awkde/awkde.egg-info/SOURCES.txt b/src/awkde/awkde.egg-info/SOURCES.txt new file mode 100644 index 00000000..e3893b75 --- /dev/null +++ b/src/awkde/awkde.egg-info/SOURCES.txt @@ -0,0 +1,13 @@ +LICENSE +README.md +pyproject.toml +setup.py +awkde/__init__.py +awkde/awkde.py +awkde/tools.py +awkde.egg-info/PKG-INFO +awkde.egg-info/SOURCES.txt +awkde.egg-info/dependency_links.txt +awkde.egg-info/requires.txt +awkde.egg-info/top_level.txt +cpp/backend.cpp \ No newline at end of file diff --git a/src/awkde/awkde.egg-info/dependency_links.txt b/src/awkde/awkde.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/awkde/awkde.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/src/awkde/awkde.egg-info/requires.txt b/src/awkde/awkde.egg-info/requires.txt new file mode 100644 index 00000000..3ac2e261 --- /dev/null +++ b/src/awkde/awkde.egg-info/requires.txt @@ -0,0 +1,5 @@ +numpy +scipy +scikit-learn +pybind11 +future diff --git a/src/awkde/awkde.egg-info/top_level.txt b/src/awkde/awkde.egg-info/top_level.txt new file mode 100644 index 00000000..436fa0a6 --- /dev/null +++ b/src/awkde/awkde.egg-info/top_level.txt @@ -0,0 +1 @@ +awkde diff --git a/src/awkde/awkde/__init__.py b/src/awkde/awkde/__init__.py new file mode 100644 index 00000000..dca7c77c --- /dev/null +++ b/src/awkde/awkde/__init__.py @@ -0,0 +1,10 @@ +# coding: utf-8 + +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future import standard_library + +standard_library.install_aliases() + +from .awkde import GaussianKDE diff --git a/src/awkde/awkde/awkde.py b/src/awkde/awkde/awkde.py new file mode 100644 index 00000000..e979acf0 --- /dev/null +++ b/src/awkde/awkde/awkde.py @@ -0,0 +1,461 @@ +# coding: utf-8 + +from __future__ import division, print_function, absolute_import, unicode_literals +from builtins import int, open +from future import standard_library + +standard_library.install_aliases() + +import os +import sys +import json +import numpy as np +from sklearn.base import BaseEstimator +from sklearn.utils import check_random_state + +from awkde.tools import standardize_nd_sample, shift_and_scale_nd_sample +import awkde.backend as backend + + +class GaussianKDE(BaseEstimator): + """ + GaussianKDE + + Kernel denstiy estimate using gaussian kernels and a local kernel bandwidth. + Implements the ``sklearn.BaseEstimator`` class and can be used in a cross- + validation gridsearch (``sklearn.model_selection``). + + Parameters + ---------- + glob_bw : float or str, optional + The global bandwidth of the kernel, must be a float ``> 0`` or one of + ``['silverman'|'scott']``. If ``alpha`` is not ``None``, this is the + bandwidth used for the first estimate KDE from which the local bandwidth + is calculated. ``If ['silverman'|'scott']`` a rule of thumb is used to + estimate the global bandwidth. (default: 'silverman') + alpha : float or None, optional + If ``None``, only the global bandwidth ``glob_bw`` is used. If + ``0 <= alpha <= 1``, an adaptive local kernel bandwith is used as + described in [1]_. (default: 0.5) + diag_cov : bool, optional + If ``True``, scale fit sample by variance only, which means using a + diagonal covariance matrix. (default: False) + + Notes + ----- + The unweighted kernel density estimator is defined as + + .. math: + + \hat{f}(x) = \sum_i \frac{1}{h\lambda_i}\cdot + K\left(\frac{x - X_i}{h\lambda_i}\right) + + + where the product :math:`h\lambda_i` takes the role of a local + variance :math`\sigma_i^2`. + + The kernel bandwith is choosen locally to account for variations in the + density of the data. + Areas with large density gets smaller kernels and vice versa. + This smoothes the tails and gets high resolution in high statistics regions. + The local bandwidth parameter is defined as + + .. math: \lambda_i = (\hat{f}(X_i) / g)^{-\alpha} + + where :math:`\log g = n^{-1}\sum_i \log\hat{f}(X_i)` is some normalization + and :math:`\hat{f}(X_i)` the KDE estimate at the data point :math:`X_i`. + The local bandwidth is multiplied to the global bandwidth for each kernel. + + Furthermore different scales in data is accounted for by scaling it via its + covariance matrix to an equal spread. + First a global kernel bandwidth is applied to the transformed data and then + based on that density a local bandwidth parameter is applied. + + All credit for the method goes to [1]_ and to S. Schoenen and L. Raedel for + huge parts of the implementation :+1:. + For information on Silverman or Scott rule, see [2]_ or [3]_. + + References + ---------- + .. [1] B. Wang and X. Wang, "Bandwidth Selection for Weighted Kernel Density + Estimation", Sep. 2007, DOI: 10.1214/154957804100000000. + .. [2] D.W. Scott, "Multivariate Density Estimation: Theory, Practice, and + Visualization", John Wiley & Sons, New York, Chicester, 1992. + .. [3] B.W. Silverman, "Density Estimation for Statistics and Data + Analysis", Vol. 26, Monographs on Statistics and Applied Probability, + Chapman and Hall, London, 1986. + """ + + def __init__(self, glob_bw="silverman", alpha=0.5, diag_cov=False): + if type(glob_bw) is str: + if glob_bw not in ["silverman", "scott"]: + raise ValueError("glob_bw can be one of ['silverman'|'scott'].") + pass + elif glob_bw <= 0: + raise ValueError("Global bandwidth must be > 0.") + + # List class attributes. Setup indicating that no fit was done yet + self._n_kernels = None + self._n_features = None + self._std_X = None + self._mean = None + self._cov = None + self._kde_values = None + self._inv_loc_bw = None + self._adaptive = None + + self.alpha = alpha + self._glob_bw = glob_bw + self._diag_cov = diag_cov + + return + + # Properties + @property + def alpha(self): + return self._alpha + + @alpha.setter + def alpha(self, alpha): + """ + The adaptive width can easily be changed after the model has been fit, + because the computation only needs the cached ``_kde_values``. + """ + if alpha is None: + self._adaptive = False + else: + if alpha < 0 or alpha > 1: + raise ValueError("alpha must be in [0, 1]") + self._adaptive = True + + self._alpha = alpha + + if self._std_X is not None and self._adaptive: + # Recalculate local bandwidth if we already have a fitted model + self._calc_local_bandwidth() + + @property + def glob_bw(self): + return self._glob_bw + + @property + def diag_cov(self): + return self._diag_cov + + # Public Methods + def __call__(self, X): + # Does the same as `predict`, only copy docstring here + self.__call__.__func__.__doc__ = self.predict.__doc__ + return self.predict(X) + + def fit(self, X, bounds=None, weights=None): + """ + Prepare KDE to describe the data. + + Data is transformed via global covariance matrix to equalize scales in + different features. + Then a symmetric kernel with cov = diag(1) is used to describe the pdf + at each point. + + Parameters + ----------- + X : array-like, shape (n_samples, n_features) + Data points defining each kernel position. Each row is a point, each + column is a feature. + bounds : array-like, shape (n_features, 2) + Boundary condition for each dimension. The method of mirrored points + is used to improve prediction close to bounds. If no bound shall be + given in a specific direction use ``None``, eg. + ``[[0, None], ...]``. If ``bounds`` is ``None`` no bounds are used + in any direction. (default: ``None``) + weights : array-like, shape (n_samples), optional + Per event weights to consider for ``X``. If ``None`` all weights are + set to one. (default: ``None``) + + Returns + ------- + mean : array-like, shape (n_features) + The (weighted) mean of the given data. + cov : array-like, shape (n_features, n_features) + The (weighted) covariance matrix of the given data. + + Raises + ------ + ``NotImplementedError`` if ``bounds`` or ``weights`` are not ``None``. + """ + if bounds is not None: + # TODO: Use mirroring of points near boundary regions and then + # constrain KDE to values inside Region but taking all kernels + # into account. (only neccessary on hard cuts) + raise NotImplementedError("TODO: Boundary conditions.") + if weights is not None: + # TODO: Implement weighted statitistics + raise NotImplementedError("TODO: Implement weighted statistics.") + + if len(X.shape) != 2: + raise ValueError("`X` must have shape (n_samples, n_features).") + + # Transform sample to zero mean and unity covariance matrix + self._n_kernels, self._n_features = X.shape + self._std_X, self._mean, self._cov = standardize_nd_sample( + X, cholesky=True, ret_stats=True, diag=self._diag_cov + ) + + # Get global bandwidth number + self._glob_bw = self._get_glob_bw(self._glob_bw) + + # Build local bandwidth parameter if alpha is set + if self._adaptive: + self._kde_values = self._evaluate(self._std_X, adaptive=False) + self._calc_local_bandwidth() + + return self._mean, self._cov + + def predict(self, X): + """ + Evaluate KDE at given points X. + + Parameters + ----------- + X : array-like, shape (n_samples, n_features) + Data points we want to evaluate the KDE at. Each row is a point, + each column is a feature. + + Returns + ------- + prob : array-like, shape (len(X)) + The probability from the KDE pdf for each point in X. + """ + if self._std_X is None: + raise ValueError("KDE has not been fitted to data yet.") + + X = np.atleast_2d(X) + _, n_feat = X.shape + if n_feat != self._n_features: + raise ValueError("Dimensions of given points and KDE don't match.") + + # Standardize given points to be in the same space as the KDE + X = standardize_nd_sample( + X, + mean=self._mean, + cov=self._cov, + cholesky=True, + ret_stats=False, + diag=self._diag_cov, + ) + + # No need to backtransform, because we only return y-values + return self._evaluate(X, adaptive=self._adaptive) + + def sample(self, n_samples, random_state=None): + """ + Get random samples from the KDE model. + + Parameters + ---------- + n_samples : int, optional + Number of samples to generate. (default: 1) + random_state : RandomState, optional + Turn seed into a `np.random.RandomState` instance. Method from + `sklearn.utils`. Can be None, int or RndState. (default: None) + + Returns + ------- + X : array_like, shape (n_samples, n_features) + Generated samples from the fitted model. + """ + if self._std_X is None: + raise ValueError("KDE has not been fitted to data yet.") + + rndgen = check_random_state(random_state) + + # Select randomly all kernels to sample from + idx = rndgen.randint(0, self._n_kernels, size=n_samples) + + # Because we scaled to standard normal dist, we can draw uncorrelated + # and the cov is only the inverse bandwidth of each kernel. + means = self._std_X[idx] + invbw = np.ones(n_samples) / self._glob_bw + if self._adaptive: + invbw *= self._inv_loc_bw[idx] + invbw = invbw.reshape(n_samples, 1) + + # Retransform to original space + sample = np.atleast_2d(rndgen.normal(means, 1.0 / invbw)) + return shift_and_scale_nd_sample(sample, self._mean, self._cov) + + def score(self, X): + """ + Compute the total ln-probability of points X under the KDE model. + + Parameters + ---------- + X : array-like, shape (n_samples, n_features) + Data points included in the score calculation. Each row is a point, + each column is a feature. + + Returns + ------- + lnprob : float + Total ln-likelihood of the data ``X`` given the KDE model. + """ + if self._std_X is None: + raise ValueError("KDE has not been fitted to data yet.") + + X = np.atleast_2d(X) + _, n_feat = X.shape + if n_feat != self._n_features: + raise ValueError("Dimensions of given points and KDE don't match.") + + probs = self.predict(np.atleast_2d(X)) + if np.any(probs <= 0): + return -np.inf + else: + return np.sum(np.log(probs)) + + def to_json(self, fpath): + """ + Write out the relevant parameters for the KDE model as a JSON file, + which can be used to reconstruct the whole model with ``from_json``. + + Parameters + ---------- + fpath : string + File path where to save the JSON dump. + """ + if self._std_X is None: + raise ValueError("KDE has not been fitted to data yet.") + + out = self.get_params() # From implementing sklearnBaseEstimator + out["kde_X_std"] = [list(Xi) for Xi in self._std_X] + out["kde_X_mean"] = list(self._mean) + out["kde_X_cov"] = [list(Xi) for Xi in self._cov] + + if self._kde_values is not None: + out["kde_Y"] = list(self._kde_values) + else: + out["kde_Y"] = None + + # json seems to behave differently in py2 vs py3 ... + if sys.version_info[0] < 3: + mode = "wb" + else: + mode = "w" + with open(os.path.abspath(fpath), mode) as f: + json.dump(obj=out, fp=f, indent=2) + + return + + @classmethod + def from_json(cls, fpath, verb=False): + """ + Build a awKDE object from a JSON dict with the needed parts. + + Parameters + ---------- + fpath : string + Path to the JSON file. Must have keys: + + - 'alpha', 'diag_cov', 'glob_bw': See GaussianKDE docstring. + - 'kde_Y': KDE function values at points 'kde_X_std' used for the + adaptive kernel computation. + - 'kde_X_std': Standardized sample in shape + ``(nsamples, nfeatures)``. + - 'kde_X_mean': Mean vector of the standardized sample. + - 'kde_X_cov': Covariance matrix of the stadardized sample. + verb : bool, optional + If ``True`` print model summary. (default: ``False``) + + Returns + ------- + kde : KDE.GaussianKDE + KDE object in fitted state, ready to evaluate or sample from. + """ + with open(os.path.abspath(fpath), "rb") as f: + d = json.load(f) + + kde = cls(glob_bw=d["glob_bw"], alpha=d["alpha"], diag_cov=d["diag_cov"]) + + # Reconstruct all internals without using fit again + kde._std_X = np.atleast_2d(d["kde_X_std"]) + kde._n_kernels, kde._n_features = kde._std_X.shape + kde._mean = np.atleast_1d(d["kde_X_mean"]) + kde._cov = np.atleast_2d(d["kde_X_cov"]) + + if len(kde._mean) != kde._n_features: + raise ValueError( + "'kde_X_mean' has not the same dimension " + "as the X values." + ) + if kde._cov.shape != (kde._n_features, kde._n_features): + raise ValueError("'kde_X_cov' has not shape " + "(n_features, n_features).") + + if d["kde_Y"] is not None: + if d["alpha"] is None: + raise ValueError("Saved 'alpha' is None, but 'kde_Y' is not.") + # Set kde values and alpha to restore inverse bandwidth internally + kde._kde_values = np.atleast_1d(d["kde_Y"]) + kde.alpha = d["alpha"] + + if len(kde._kde_values) != kde._n_kernels: + raise ValueError("'kde_Y' has not the same length as 'kde_X_std'.") + + if verb: + print("Loaded KDE model from {}".format(fpath)) + print("- glob_bw : {:.3f}".format(kde._glob_bw)) + print("- alpha : {:.3f}".format(kde._alpha)) + print("- adaptive : {}".format(kde._adaptive)) + print("- Nr. of kernels : {:d}".format(kde._n_kernels)) + print("- Nr. of data dim : {:d}".format(kde._n_features)) + + return kde + + # Private Methods + def _evaluate(self, X, adaptive): + """ + Evaluate KDE at given points, returning the log-probability. + + Parameters + ----------- + X : array-like, shape (n_samples, n_features) + Data points we want to evaluate the KDE at. Each row is a point, + each column is a feature. + adaptive : bool, optional + Wether to evaluate with fixed or with adaptive kernel. + (default: True) + + Returns + ------- + prob : array-like, shape (len(X)) + The probability from the KDE PDF for each point in X. + """ + n = self._n_kernels + d = self._n_features + + # Get fixed or adaptive bandwidth + invbw = np.ones(n) / self._glob_bw + if adaptive: + invbw *= self._inv_loc_bw + + # Total norm, including gaussian kernel norm with data covariance + norm = invbw**d / np.sqrt(np.linalg.det(2 * np.pi * self._cov)) / n + + return backend.kernel_sum(self._std_X, X, invbw, norm) + + def _get_glob_bw(self, glob_bw): + """Simple wrapper to handle string args given for global bw.""" + dim = self._n_features + nsam = self._n_kernels + if glob_bw == "silverman": + return np.power(nsam * (dim + 2.0) / 4.0, -1.0 / (dim + 4)) + elif glob_bw == "scott": + return np.power(nsam, -1.0 / (dim + 4)) + else: + return self._glob_bw + + def _calc_local_bandwidth(self): + """Build the local bandwidth from cached ``_kde_values``.""" + # Get local bandwidth from local "density" g + g = np.exp(np.sum(np.log(self._kde_values)) / self._n_kernels) + # Needed inverted so use power of (+alpha), shape (n_samples) + self._inv_loc_bw = (self._kde_values / g) ** (self._alpha) + return diff --git a/src/awkde/awkde/backend.cpython-311-darwin.so b/src/awkde/awkde/backend.cpython-311-darwin.so new file mode 100755 index 0000000000000000000000000000000000000000..0e8079aa69ddbbc001739b487ac53342e8bd9ae8 GIT binary patch literal 180618 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 HTdw{;#gSah literal 0 HcmV?d00001 diff --git a/src/awkde/awkde/tools.py b/src/awkde/awkde/tools.py new file mode 100644 index 00000000..153adf3e --- /dev/null +++ b/src/awkde/awkde/tools.py @@ -0,0 +1,147 @@ +# coding: utf8 + +""" +Part of awkde package +--------------------- + +Helper tools for standardizing a data sample. +""" + +from __future__ import print_function, division, absolute_import +from future import standard_library + +standard_library.install_aliases() + +import numpy as _np + + +def standardize_nd_sample( + sam, mean=None, cov=None, cholesky=True, ret_stats=False, diag=False +): + """ + Standardizes a n-dimensional sample using the Mahalanobis distance. + + .. math:: x' = \Sigma^{-1/2} (x - y) + + The resulting sample :math:`x'` has a zero mean vector and an identity + covariance. + + Parameters + ---------- + sam : array-like, shape (n_samples, n_features) + Data points in the sample, each column is a feature, each row a point. + mean : array-like, shape (n_features), optional + If explicitely given, use this mean vector for the transformation. If + None, the estimated mean from data is used. (default: None) + cov : array-like, shape (n_features, n_features), optional + If explicitely given, use this covariance matrix for the transformation. + If None, the estimated cov from data is used. (default: None) + cholesky : bool, optional + If true, use fast Cholesky decomposition to calculate the sqrt of the + inverse covariance matrix. Else use eigenvalue decomposition (Can be + numerically unstable, not recommended). (default: True) + ret_stats : bool, optional + If True, the mean vector and covariance matrix of the input sample are + returned, too. (default: False) + diag : bool + If True, only scale by variance, diagonal cov matrix. (default: False) + + Returns + ------- + stand_sam : array-like, shape (n_samples, n_features) + Standardized sample, with mean = [0., ..., 0.] and cov = identity. + + Optional Returns + ---------------- + mean : array-like, shape(n_features) + Mean vector of the input data, only if ret_stats is True. + cov : array-like, shape(n_features, n_features) + Covariance matrix of the input data, only if ret_stats is True. + + Example + ------- + >>> mean = [10, -0.01, 1] + >>> cov = [[14, -.2, 0], [-.2, .1, -0.1], [0, -0.1, 1]] + >>> sam = np.random.multivariate_normal(mean, cov, size=1000) + >>> std_sam = standardize_nd_sample(sam) + >>> print(np.mean(std_sam, axis=0)) + >>> print(np.cov(std_sam, rowvar=False)) + """ + if len(sam.shape) != 2: + raise ValueError("Shape of `sam` must be (n_samples, n_features).") + if mean is None and cov is None: + # Mean and cov over the first axis + mean = _np.mean(sam, axis=0) + cov = _np.atleast_2d(_np.cov(sam, rowvar=False)) + elif mean is not None and cov is not None: + mean = _np.atleast_1d(mean) + cov = _np.atleast_2d(cov) + if len(mean) != sam.shape[1]: + raise ValueError("Dimensions of mean and sample don't match.") + if cov.shape[0] != sam.shape[1]: + raise ValueError("Dimensions of cov and sample don't match.") + + if diag: + cov = _np.diag(cov) * _np.eye(cov.shape[0]) + + if cholesky: + # Cholesky produces a tridiagonal matrix from A with: L L^T = A + # To get the correct trafo, we need to transpose the returned L: + # L.L^t + sqrtinvcov = _np.linalg.cholesky(_np.linalg.inv(cov)).T + else: + # The naive sqrt of eigenvalues. Is (at least) instable for > 3d + # A = Q lam Q^-1. If A is symmetric: A = Q lam Q^T + lam, Q = _np.linalg.eig(_np.linalg.inv(cov)) + sqrtlam = _np.sqrt(lam) + sqrtinvcov = _np.dot(sqrtlam * Q, Q.T) + + # Transform each sample point and reshape result (n_samples, n_features) + stand_sam = _np.dot(sqrtinvcov, (sam - mean).T).T + + if ret_stats: + return stand_sam, mean, cov + else: + return stand_sam + + +def shift_and_scale_nd_sample(sam, mean, cov, cholesky=True): + """ + Shift and scale a nD sample by given mean and covariance matrix. + + This is the inverse operation of `standardize_nd_sample`. If a + standardized sample :math:`x'` with zero mean vector and identity covariance + matrix is given, it is rescaled and shifted using + + .. math:: x = (\Sigma^{1/2} x) + y + + then having a mean vector `mean` and a covariance matrix `cov`. + + Parameters + ---------- + sam : array-like, shape (n_samples, n_features) + Data points in the sample, each column is a feature, each row a point. + mean : array-like, shape (n_features) + Mean vector used for the transformation. + cov : array-like, shape (n_features, n_features) + Covariance matrix used for the transformation. + + Returns + ------- + scaled_sam : array-like, shape (n_samples, n_features) + Scaled sample using the transformation with the given mean and cov. + """ + if len(sam.shape) != 2: + raise ValueError("Shape of `sam` must be (n_samples, n_features).") + mean = _np.atleast_1d(mean) + cov = _np.atleast_2d(cov) + if len(mean) != sam.shape[1]: + raise ValueError("Dimensions of mean and sample don't match.") + if cov.shape[0] != sam.shape[1]: + raise ValueError("Dimensions of cov and sample don't match.") + + # Transformation matrix: inverse of original trafo + sqrtinvcov = _np.linalg.cholesky(_np.linalg.inv(cov)).T + sqrtcov = _np.linalg.inv(sqrtinvcov) + + return _np.dot(sqrtcov, sam.T).T + mean diff --git a/src/awkde/cpp/backend.cpp b/src/awkde/cpp/backend.cpp new file mode 100644 index 00000000..e88b2ec3 --- /dev/null +++ b/src/awkde/cpp/backend.cpp @@ -0,0 +1,115 @@ +#include +#include +#include + + +namespace py = pybind11; + +// Actual C++ snippet. See `docstr` below for argument info. +template +py::array_t kernel_sum (const py::array_t& X, + const py::array_t& Y, + const py::array_t& invbw, + const py::array_t& norm) { + // Gather input shape info + auto bX = X.template unchecked<2>(); + auto bY = Y.template unchecked<2>(); + auto lenX = bX.shape(0); + auto ndim = bX.shape(1); + auto lenY = bY.shape(0); + auto ndimY = bY.shape(1); + auto binvbw = invbw.template unchecked<1>(); + auto bnorm = norm.template unchecked<1>(); + + // Check data integrity + if (ndim != ndimY) { + throw std::runtime_error( + "Points in X and Y must have the same number of dimensions."); + } + if (lenX != binvbw.shape(0) || lenX != bnorm.shape(0)) { + throw std::runtime_error( + "X, invbw and norm must have the same lengths."); + } + + // Set up output: shape (lenY) + py::array_t eval(lenY); + auto beval = eval.template mutable_unchecked<1>(); + + // Get squared distances for all in Y to all in X and sum up the PDF value + // from the gaussian kernel PDF for each Y. + T diff_ij; + T dist2_ij; + for (unsigned int i = 0; i < lenY; ++i) { // Loop over Y elements + beval(i) = 0.; + for (unsigned int j = 0; j < lenX; ++j) { // Loop over X elements + dist2_ij = 0.; + for (unsigned int k = 0; k < ndim; ++k) { // Loop over features + diff_ij = bY(i, k) - bX(j, k); + dist2_ij += diff_ij * diff_ij; + } + // PDF_i = sum_{j in X} (norm_j * exp(-0.5 * dist2_ij * invbw_j^2) + beval(i) += bnorm(j) * std::exp(-0.5 * dist2_ij * + binvbw(j) * binvbw(j)); + } + } + + return eval; +} + + +// //////////////////////////////////////////////////////////////////////////// +// pybind11 binding stuff +PYBIND11_MODULE(backend, m) { + // Module docstring + m.doc() = R"pbdoc( + Pybind11 C++ backend for awkde + ------------------------------ + + .. currentmodule:: awkde_backend + + .. autosummary:: + :toctree: _generate + + kernel_sum + )pbdoc"; + + // Method docstrings (easier to read when separated) + // Note: using C++ multi-line literals (pbdoc delimiter) + auto docstr = R"pbdoc( + kernel_sum + + Takes an array of kernel points `X` and points `Y` to + evaluate the KDE at and returns the KDE PDF values for + each point in `Y`. + + Parameters + ---------- + X : double array, shape (len(X), ndim) + Data points defining each kernel position. Each row is + a point, each column is a feature. + Y : double array, shape (len(Y), ndim) + Data points we want to evaluate the KDE at. Each row is + a point, each column is a feature. + invbw : double array, shape (len(X)) + Inverse kernel bandwidth, acting as :math:`1 / sigma^2`. + norm : double array, shape (len(X)) + Kernel gaussian norm for `ndim` dimensions. + + Returns + ------- + eval : float array, shape (len(Y)) + The probability from the KDE PDF for each point in `Y`. + )pbdoc"; + + // Define the actual template typess + m.def("kernel_sum", &kernel_sum, docstr, + py::arg("X"), py::arg("Y"), py::arg("invbw"), py::arg("norm")); + m.def("kernel_sum", &kernel_sum, "", + py::arg("X"), py::arg("Y"), py::arg("invbw"), py::arg("norm")); + +#ifdef VERSION_INFO + m.attr("__version__") = py::str(VERSION_INFO); +#else + m.attr("__version__") = py::str("dev"); +#endif +} \ No newline at end of file diff --git a/src/awkde/example/example.png b/src/awkde/example/example.png new file mode 100644 index 0000000000000000000000000000000000000000..4a3562a30da801baf2285d55df38ed87829b092b GIT binary patch literal 72255 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 literal 0 HcmV?d00001 diff --git a/src/awkde/example/example.py b/src/awkde/example/example.py new file mode 100644 index 00000000..15f8c513 --- /dev/null +++ b/src/awkde/example/example.py @@ -0,0 +1,127 @@ +# coding: utf-8 + +""" +A 2D example for the adaptive width KDE. + +Sample x1 from a gaussian and x2 from x*exp(-x). +Make a plot with the prediction and save the model to a JSON dump. +""" + +import numpy as np +import scipy.stats as scs +import matplotlib.pyplot as plt +import matplotlib.gridspec as gridspec +from matplotlib.colors import LogNorm + +from awkde import GaussianKDE + + +rndgen = np.random.RandomState(seed=3575) # ESEL +# Gaussian +mean = 3.0 +sigma = 0.25 +# a^2 * x * exp(-a * x) +a = 100.0 + +n_samples = 1000 +logE_sam = rndgen.normal(mean, sigma, size=n_samples) + +# From pythia8: home.thep.lu.se/~torbjorn/doxygen/Basics_8h_source.html +u1, u2 = rndgen.uniform(size=(2, n_samples)) +sigma_sam = -np.log(u1 * u2) / a + +# Shape must be (n_points, n_features) +sample = np.vstack((logE_sam, sigma_sam)).T + +# Create KDE and fit it. Save model in JSON format +print("Fitting model to {} sample points.".format(n_samples)) +kde = GaussianKDE(glob_bw="silverman", alpha=0.5, diag_cov=True) +kde.fit(sample) + +# Save and load the model +outf = "./example_KDE.json" +print("Saving model to {}".format(outf)) +kde.to_json(outf) +print("Loading same model from {}".format(outf)) +kde = GaussianKDE.from_json(outf) + +# Evaluate at dense grid +minx, maxx = np.amin(sample[:, 0]), np.amax(sample[:, 0]) +miny, maxy = np.amin(sample[:, 1]), np.amax(sample[:, 1]) + +x = np.linspace(minx, maxx, 100) +y = np.linspace(miny, maxy, 100) + +XX, YY = np.meshgrid(x, y) +grid_pts = np.array(list(map(np.ravel, [XX, YY]))).T + +zz = kde.predict(grid_pts) +ZZ = zz.reshape(XX.shape) + +# These are bin edges for pcolormesh, len = len(x) + 1 +dx2, dy2 = (x[1] - x[0]) / 2.0, (y[1] - y[0]) / 2.0 +bx = np.concatenate((x - dx2, [x[-1] + dx2])) +by = np.concatenate((y - dy2, [y[-1] + dy2])) + + +# Evaluate true PDFs at same grid +def fx(x): + return scs.norm.pdf(x, mean, sigma) + + +def fy(y): + return a**2 * y * np.exp(-a * y) + + +fZ = (fx(grid_pts[:, 0]) * fy(grid_pts[:, 1])).reshape(XX.shape) + +# Sample new points from KDE model +kde_sam = kde.sample(n_samples=100000, random_state=rndgen) + +print("Making example plot.") +# Big plot on the left (2D KDE + points ) and three right (1D margins + hist) +fig = plt.figure(figsize=(10, 6)) +gs = gridspec.GridSpec(3, 3) +axl = fig.add_subplot(gs[:, :2]) +axrt = fig.add_subplot(gs[0, 2]) +axrc = fig.add_subplot(gs[1, 2]) +axrb = fig.add_subplot(gs[2, 2]) + +color_of_points = "#351322" +color_of_dist = "#1e90ff" + +# Main plot +axl.pcolormesh(bx, by, ZZ, cmap="Blues", norm=LogNorm(), shading="flat") +axl.scatter( + logE_sam, sigma_sam, marker=".", color=color_of_points, edgecolor="none", s=30 +) +axl.set_title("KDE log PDF + original sample") + +# Top right: truth with scatter +axrt.pcolormesh(bx, by, fZ, cmap="Blues", norm=LogNorm(), shading="flat") +axrt.scatter(logE_sam, sigma_sam, marker=".", color=color_of_points, s=1) +axrt.set_title("True log PDF + KDE sample") + +# 1D x1, x2 hists. Hist very fine, so we get the shape of the PDF and don't +# have to integrate the KDE PDF numerically. +axrc.hist(kde_sam[:, 0], bins=250, density=True, color=color_of_points) +axrc.plot(x, fx(x), color=color_of_dist) +axrb.hist(kde_sam[:, 1], bins=250, density=True, color=color_of_points) +axrb.plot(y, fy(y), color=color_of_dist) +axrc.set_title("True 1D PDF + KDE sample") +axrb.set_title("True 1D PDF + KDE sample") + +for axi in (axl, axrt): + axi.set_xlim(minx, maxx) + axi.set_ylim(0, maxy) + axi.set_xlabel("x1") + axi.set_ylabel("x2") + +axrc.set_xlim(minx, maxx) +axrb.set_xlim(miny, maxy) +axrc.set_xlabel("x1") +axrb.set_xlabel("x2") + +fig.tight_layout() +fig.savefig("example.png", dpi=50) +# plt.show() diff --git a/src/awkde/example/example_KDE.json b/src/awkde/example/example_KDE.json new file mode 100644 index 00000000..b12fc55c --- /dev/null +++ b/src/awkde/example/example_KDE.json @@ -0,0 +1,5023 @@ +{ + "kde_X_cov": [ + [ + 0.055394409593707866, + 0.0 + ], + [ + 0.0, + 0.000189259752803009 + ] + ], + "glob_bw": 0.31622776601683794, + "kde_X_std": [ + [ + -0.038772367739634397, + -1.1254927149286837 + ], + [ + 0.91283236066410689, + -1.0203477536431722 + ], + [ + -0.053052130849891473, + 0.043403576093835834 + ], + [ + -1.0756456141606578, + 0.42504425101493282 + ], + [ + 0.12079924319366782, + 0.84469339896658147 + ], + [ + -1.0539632687647917, + -0.5483372178811039 + ], + [ + 1.5767696954279486, + -0.78224177248956683 + ], + [ + -1.2190236670242769, + -0.99111259730203682 + ], + [ + 1.4931503939595865, + -1.300980586705534 + ], + [ + 0.1220377935327538, + 0.061519148878938459 + ], + [ + 2.2069432312913313, + -0.7143264313133022 + ], + [ + 1.9341883310230343, + 0.99504117628753064 + ], + [ + 0.72551610777568942, + 0.28456885096661361 + ], + [ + 1.5285619237773624, + -0.55287318744585356 + ], + [ + 0.16333960386251034, + -0.53061949111115592 + ], + [ + -0.5050524027018567, + 1.2524600532486772 + ], + [ + 0.23234176914316912, + -0.18131358604187067 + ], + [ + -0.90780269926272628, + 0.036142650371662817 + ], + [ + 0.36800071918168614, + -0.0070031795904719179 + ], + [ + -0.10064751715853765, + 1.5304585212365116 + ], + [ + -0.35122794397872431, + 0.27943077479246325 + ], + [ + -0.80382666045113094, + -0.12898312177038987 + ], + [ + 0.41224958215799318, + 0.64365480467782732 + ], + [ + 2.7129398019058595, + -0.32810905962283138 + ], + [ + -2.2361614923831334, + 0.16002049630640255 + ], + [ + -1.3206348042010336, + 0.98041885279393159 + ], + [ + -0.34139280736010874, + -1.2286699964943877 + ], + [ + 1.7729512081167225, + 0.91163034764109918 + ], + [ + 0.57505284564283687, + -1.0972390183490282 + ], + [ + 0.19825977243802756, + -1.0873055838346457 + ], + [ + -0.654932972471994, + -1.3078385530466843 + ], + [ + -0.58475208340517848, + -1.0580303697727917 + ], + [ + 0.42983230302562808, + 2.0044995350940944 + ], + [ + -0.27815222403779749, + -0.43678173076992693 + ], + [ + -0.60728286225878769, + -1.1700500534079419 + ], + [ + -0.78891057551636723, + 0.59585812659142612 + ], + [ + -0.016170617822073137, + -0.95961686832095305 + ], + [ + -2.1426063401230699, + -1.3315591188358176 + ], + [ + -0.30090661571572924, + 2.6456443611317471 + ], + [ + -0.15802001927584688, + 0.45495088779220688 + ], + [ + -0.83488247617177946, + -0.44589633575639986 + ], + [ + 0.2479730662335021, + -0.084092313195468629 + ], + [ + 1.5254718117934776, + -1.1404409003946978 + ], + [ + 1.2238974647235652, + 0.34090541177725814 + ], + [ + 0.91465263273951047, + 0.44160441828566543 + ], + [ + -0.066259199584315018, + 0.56380852126987846 + ], + [ + -0.39542212734122262, + 0.17718601155493119 + ], + [ + 0.17652094257423095, + -0.39508111489101982 + ], + [ + 0.068107825083629031, + 0.69008735825929512 + ], + [ + -0.56695604118475917, + 0.3275177676362917 + ], + [ + -0.22399671484983688, + -0.001379326037921005 + ], + [ + -0.15367203570186891, + 1.3294631530719758 + ], + [ + -0.23324842028993184, + -0.93250741110297264 + ], + [ + 0.98047025711942104, + 1.8479876249111546 + ], + [ + 1.0238816220332314, + -0.62935347216543913 + ], + [ + -0.41792921871027139, + 1.7055333860412465 + ], + [ + 1.6228851342570911, + 1.7892960657909092 + ], + [ + -0.028484886684660357, + 0.86975888426881254 + ], + [ + 0.33489307530858553, + -0.46931069767422345 + ], + [ + -0.081242722847126303, + 0.18488730963420796 + ], + [ + -0.5007790087922257, + -0.79155910992885026 + ], + [ + -0.72034839456750921, + -0.6650074954682067 + ], + [ + -0.41252933420480936, + -0.48949394331785628 + ], + [ + 0.38996746421843415, + -0.64509175234983829 + ], + [ + -0.85012548480957884, + -0.034286906329572403 + ], + [ + 1.9687233064963148, + 2.3046159837380054 + ], + [ + 0.72823689131001434, + -0.19626461186956734 + ], + [ + -1.2118822992970855, + -0.76934394415088303 + ], + [ + -0.19297178364046058, + -0.41834660295120024 + ], + [ + 0.61563343534856618, + -0.11845238952535454 + ], + [ + 0.70167061759060212, + -0.74833812899924113 + ], + [ + -0.070465004791077632, + 1.8055424732738568 + ], + [ + -1.3638929226972762, + -0.89510132739248938 + ], + [ + -1.4529943556801053, + -1.1818187779871725 + ], + [ + -1.2606917362347754, + -0.4301030229653996 + ], + [ + -1.2273726958298214, + 0.36584025502615763 + ], + [ + 1.0863784937705043, + -0.20155908611548315 + ], + [ + 0.24309476807382935, + 0.4109723885746695 + ], + [ + 1.1036479238383679, + -1.0412773345339248 + ], + [ + -0.99185219253367318, + -0.86210030402568805 + ], + [ + 0.94724982938884028, + -0.97758633409625328 + ], + [ + -0.12875083391666997, + -1.0597380645788717 + ], + [ + 1.2944206187944147, + 0.53650163036127041 + ], + [ + -1.293252604981163, + -0.85211866718453977 + ], + [ + -0.18609554341345411, + -1.0489853388664461 + ], + [ + -2.5534850985478732, + -0.27068344556963386 + ], + [ + -0.091969682364326386, + -0.23420189267828612 + ], + [ + 0.17298936823033406, + -0.19084454636041906 + ], + [ + 0.79166305555512406, + 0.12303226027725996 + ], + [ + 0.83417560704215055, + 0.42771761436946582 + ], + [ + -0.72406631107421193, + 1.6492482353640665 + ], + [ + 2.5296769249474353, + -1.1944429926515672 + ], + [ + -1.3351024481102842, + 2.2501007625819249 + ], + [ + -1.7266120099747977, + -1.2066642818074598 + ], + [ + -0.65803886018625757, + -0.42458375854079838 + ], + [ + -1.4751932272875081, + 0.03627627608030197 + ], + [ + 0.50870519076321097, + -1.1041803060942859 + ], + [ + 2.3876324293900817, + -0.065491912365537905 + ], + [ + 0.46050388632359573, + -0.90306586825358603 + ], + [ + -1.3157209197658335, + -0.048096838642655057 + ], + [ + -0.47008421513190757, + 0.26771642480144492 + ], + [ + 0.58373521102510872, + -0.65413820068944328 + ], + [ + -0.89548301995423063, + -1.2534087588670748 + ], + [ + -1.8304030833253615, + -0.85349112885425837 + ], + [ + 0.40778211224941996, + -1.1891623150576829 + ], + [ + -1.5063201088328682, + -0.034693614602703704 + ], + [ + 0.077394827047095063, + -0.48079377456933525 + ], + [ + 1.8872348565628514, + -0.99100401556364426 + ], + [ + -0.57983754184705638, + -0.069222549088807261 + ], + [ + 0.63205639406195957, + 0.040974523293963346 + ], + [ + 0.69070940799810543, + -0.52952487183260122 + ], + [ + -2.0183416947523241, + -1.1738751914291645 + ], + [ + -0.23232863884416557, + 1.1253437050027864 + ], + [ + -0.33270088596271385, + 0.17169354028770778 + ], + [ + -1.7776536530548805, + -0.67581426204984585 + ], + [ + -0.18813186215523445, + -0.055577446545041619 + ], + [ + 0.80496678542421618, + 0.34579195436671761 + ], + [ + -0.31887618979112076, + -1.3471343588011564 + ], + [ + 0.46671827236945357, + 1.120698581857722 + ], + [ + -1.080246617945092, + -0.8367469372976718 + ], + [ + 1.8684702823371175, + -0.24514232476644246 + ], + [ + 0.63284900258848775, + -0.065054649027471823 + ], + [ + -0.0506976364495378, + -0.20743569170279827 + ], + [ + -2.1322566738075071, + 0.23179887530253848 + ], + [ + 1.1446042978333772, + 3.07776901701085 + ], + [ + 0.66843336391437047, + -1.0031320601347922 + ], + [ + 0.016509218339861579, + 4.0513080405612758 + ], + [ + 2.1004373648957362, + -0.44531771019951666 + ], + [ + 0.78075616290166516, + -0.32842613834560586 + ], + [ + 0.13016871926236007, + -0.048037283489279596 + ], + [ + 0.48696002404338373, + 0.11079036304780647 + ], + [ + -0.35852091006074049, + -0.62481725704504065 + ], + [ + -0.84856541980158517, + -0.18807486230713741 + ], + [ + -0.73713678884965439, + 0.20361340058431293 + ], + [ + -0.55901765955143923, + 1.3966559490697048 + ], + [ + 1.0245902185486961, + 0.57016475567687619 + ], + [ + 0.12439137474745653, + 0.57804562782782098 + ], + [ + 0.9227204032733437, + 1.7272179211285759 + ], + [ + 1.1129534258487503, + -0.62880004779541732 + ], + [ + -0.56260201865246617, + -0.77449635413316964 + ], + [ + 1.0695428278985164, + 0.24135785164700549 + ], + [ + 0.10511656252554125, + 0.22227012884682679 + ], + [ + 0.66899149347343356, + -0.74326663440881935 + ], + [ + 0.57594460914975154, + -1.0352070625914438 + ], + [ + 0.63140022559718145, + -0.47914365212599352 + ], + [ + -0.36175692574754931, + -1.1111035181890572 + ], + [ + 0.45918854118962094, + 0.90291757666583505 + ], + [ + 0.62797180607299585, + -1.0022068876321306 + ], + [ + -0.80998512772424813, + -1.0099204639373431 + ], + [ + -1.1525043094121921, + -1.2384537226113088 + ], + [ + 1.2171438489881916, + 0.11207717513910258 + ], + [ + 1.3166105228343228, + 1.7449027854895383 + ], + [ + 0.061434181754760481, + 0.68786128655135514 + ], + [ + -0.76594256403931316, + -0.49398561381701117 + ], + [ + 1.7362652563759693, + -0.17398681290053361 + ], + [ + -0.85423174450574246, + 0.27616823819484776 + ], + [ + -0.69683213650374265, + 2.3795666222152803 + ], + [ + 1.0615877681027768, + 0.18585301362333759 + ], + [ + 1.3241362247841066, + 0.40681190078073048 + ], + [ + -0.23617873940978798, + -0.9250586245365261 + ], + [ + 0.30614001089815185, + 1.8155252075806645 + ], + [ + 1.1447902753480921, + -0.35350137720339486 + ], + [ + 2.2193115033287838, + -0.12501181744103168 + ], + [ + -0.36161163527524959, + -0.83512028922215076 + ], + [ + 0.85769413844023845, + -0.5964211893654342 + ], + [ + 1.3263983911040482, + 1.4300922383927743 + ], + [ + -0.14044019719883249, + 4.0847224381413456 + ], + [ + -1.9164805785535866, + 0.26176065966185952 + ], + [ + -1.2205965197881774, + -0.448947175875897 + ], + [ + -0.95929931312859262, + -0.17727592645617476 + ], + [ + -1.8260296395509554, + 0.92890503993689955 + ], + [ + 0.31033945951677444, + 0.18070744806028158 + ], + [ + -0.46473371296099525, + 1.1221774850395263 + ], + [ + -0.43048835312942246, + -0.81807681983944036 + ], + [ + -0.084383655173623381, + -0.48378913724778372 + ], + [ + 0.32579630937407844, + 0.041551188262265462 + ], + [ + -1.2982712510279686, + -0.66307225202100273 + ], + [ + 0.4317412641500768, + 0.81972401222948443 + ], + [ + -0.37127360085483413, + 0.12639698660058676 + ], + [ + 0.69692819441339326, + -0.23773434981674194 + ], + [ + -0.0074801683471671983, + -0.20104741922358621 + ], + [ + -0.055147440662418543, + -0.43452629558626565 + ], + [ + 0.50478587778940565, + -0.84443531229231206 + ], + [ + 1.1307622274138558, + 1.5853231181599845 + ], + [ + 1.1959743113386254, + -1.0787095913829654 + ], + [ + 1.5696343300299844, + -1.1747629367630215 + ], + [ + 0.2816675394476203, + -0.40299502508143409 + ], + [ + 0.23151506141696973, + 1.8706673665136597 + ], + [ + 1.3883010472771509, + 0.32315693057847727 + ], + [ + -0.54460716881955906, + 1.5688309903376627 + ], + [ + -0.5317213266115034, + -1.0166494084974111 + ], + [ + -2.0984918740299756, + -1.26639178175762 + ], + [ + -0.18360212569648834, + 0.64294180715265281 + ], + [ + 0.10365598178725659, + -1.0318580774405659 + ], + [ + -1.1398433327839337, + 0.18709003014587619 + ], + [ + -1.1322231761991095, + 1.67457090495573 + ], + [ + -1.7083367159353426, + 0.5069947817121021 + ], + [ + 1.0463254795378605, + -1.0178800522694997 + ], + [ + 0.30177844720871189, + -0.82392407631122222 + ], + [ + 0.078450619741106495, + 0.12711093961029016 + ], + [ + -0.55829413029875252, + -0.62384473059007384 + ], + [ + 0.59651665633358031, + 1.8770321860630763 + ], + [ + -0.26008743438510146, + -0.2153572802037064 + ], + [ + -1.1571302038178415, + -0.85140591889631878 + ], + [ + 0.41586464912586862, + 0.74729441986402323 + ], + [ + 0.3216650292147652, + -0.37517562881151606 + ], + [ + -0.77576829238067124, + 0.71082302414057108 + ], + [ + 0.058716208065102686, + 2.4264876555529509 + ], + [ + -0.84656310622970665, + -1.2251104183368262 + ], + [ + -0.16957889600888504, + 0.96681336485228975 + ], + [ + 0.050541605216527223, + -0.35577652634348655 + ], + [ + -1.009633012791783, + 0.72972084650696534 + ], + [ + 1.200054936246054, + -0.027295846102759116 + ], + [ + -0.72131061371335781, + 0.70802097763500749 + ], + [ + 1.4073082403256783, + -1.25434998978715 + ], + [ + -0.11501738116978749, + 0.2196298777965433 + ], + [ + 0.3595481269433865, + 0.27339310794141219 + ], + [ + 0.22181458596256512, + -0.37092426441722048 + ], + [ + 1.2760796847578442, + -0.66892965265429238 + ], + [ + 1.0386951705787386, + -0.87921787432277365 + ], + [ + 0.083344673016501003, + -0.65103857425159406 + ], + [ + -0.77056961898768894, + -0.25119061428510997 + ], + [ + 0.89172439215447818, + 0.17177598214858897 + ], + [ + 0.32786004032878474, + 0.59506986307945897 + ], + [ + -0.99458966089482292, + -0.60404146551631377 + ], + [ + 1.0461491482098195, + 0.72839284850390229 + ], + [ + 0.77211642362359068, + -1.1358760767547065 + ], + [ + 0.081326524674480927, + -1.2828246803900651 + ], + [ + -1.4141726917342572, + -0.69867427938741933 + ], + [ + -0.77440081976785913, + 0.06239382341632374 + ], + [ + -1.0410523724932224, + 0.67458830133685688 + ], + [ + 0.24394134356542713, + 0.092916826582491299 + ], + [ + 2.3634735236775639, + -0.76932513088265531 + ], + [ + 1.3148937143981232, + 2.0174121198730335 + ], + [ + 0.86737832418597116, + -1.3603777328869375 + ], + [ + 1.0840866533936795, + 2.7711026162264334 + ], + [ + 0.06373545090123546, + -0.0064245026989267926 + ], + [ + -0.10431039177819733, + -0.96115766850677509 + ], + [ + -0.075881020247073355, + 0.88721386023077464 + ], + [ + -0.22821886483635412, + -0.38710836517487501 + ], + [ + 1.8841888052477882, + -0.59467269668651668 + ], + [ + 0.29220168615373221, + -0.76987412993647286 + ], + [ + 0.64610690923558822, + -0.64955376155301092 + ], + [ + -1.0682233585017915, + 0.80166151733259261 + ], + [ + -1.2612078796538013, + -0.75270538581342383 + ], + [ + 0.7095214533715094, + 2.3105040813806843 + ], + [ + 1.5039504086331914, + 0.14007868633098647 + ], + [ + 1.3380543118563046, + -0.25640617920655334 + ], + [ + 1.2226498482995041, + -0.00089506022554323343 + ], + [ + -0.019661793258092527, + 0.40803889265168197 + ], + [ + 1.2775920040208901, + -1.2684459286823662 + ], + [ + -1.2778071657107795, + -1.0910451912242203 + ], + [ + 0.34965871177150609, + -1.0474561550775634 + ], + [ + 1.1486569046524178, + -0.42994811484625634 + ], + [ + -0.21630698013390459, + -0.44211907762238783 + ], + [ + -0.00054254421756896507, + -1.0562998085229567 + ], + [ + -1.4188769921773732, + -0.47822218704892583 + ], + [ + 0.36247378978261835, + -0.23348653935813538 + ], + [ + -0.093595988606501104, + -0.4674922746157647 + ], + [ + -1.2656609064589821, + 1.0710325755653278 + ], + [ + -1.096220508616192, + 1.7252725039180747 + ], + [ + -0.19951263494514818, + -0.32560511284556964 + ], + [ + -0.069865506857691231, + 3.3161992083517862 + ], + [ + 1.036672989723346, + 1.2633752037288446 + ], + [ + 0.57974183950416758, + -0.81058177940404685 + ], + [ + -0.20550602420698749, + -0.27769559682023948 + ], + [ + -0.46830590405679301, + -1.0608242236545382 + ], + [ + -1.0762261852300323, + 0.81986017379618048 + ], + [ + 1.9930414263229996, + -0.39275358704938135 + ], + [ + -0.94519134206770239, + -0.49717907065587114 + ], + [ + 1.0906462992263881, + 0.0027652534656527313 + ], + [ + -0.89732334321138552, + -0.029523365664926301 + ], + [ + -1.7595987971855063, + 1.1660091550327485 + ], + [ + 1.8599759429718832, + -1.2467098752507697 + ], + [ + 0.38627242430293346, + -0.83747870753241516 + ], + [ + -0.34607289334662922, + 0.66524124525691342 + ], + [ + 0.45893279021302841, + 2.9886044421613684 + ], + [ + -1.6394844540621569, + 0.062834283414431494 + ], + [ + -2.2905629318242244, + -0.26131590863109183 + ], + [ + -0.15409076534397678, + 3.016934913739441 + ], + [ + -0.89856952257515821, + -0.66929507366412522 + ], + [ + 0.53674950878614414, + 0.45022328723557359 + ], + [ + 0.15118098017793752, + 0.93095453632969627 + ], + [ + 0.23378769094664395, + -0.042035731699233213 + ], + [ + 1.4674417789334102, + 4.7920913309784332 + ], + [ + -1.7825917409912677, + -0.85247406041774643 + ], + [ + -0.80722822241566372, + 2.25424255274091 + ], + [ + 1.3443094164774547, + 0.47684181963771854 + ], + [ + 0.04940316072602844, + -1.1013571616803501 + ], + [ + -2.0348243714058953, + 0.17559625427594222 + ], + [ + 0.88052985123750027, + -0.22012597378284263 + ], + [ + -1.3008893255035219, + -1.1355787104007635 + ], + [ + -0.02040288320632944, + 0.21177891591912584 + ], + [ + 1.2827834030433407, + -0.049807641636370734 + ], + [ + -0.89810292118688995, + -0.66900271872748496 + ], + [ + 1.7325879493282812, + 1.0308464004837354 + ], + [ + 1.0067103331422083, + 0.31910135122814298 + ], + [ + -0.44392001514028584, + -0.78190006108094479 + ], + [ + 0.22587195510668104, + -0.72953114730101143 + ], + [ + 0.74206087734895743, + 1.0912328226346859 + ], + [ + 0.097145008343504174, + 0.17543784754044761 + ], + [ + -0.18329917693049047, + -0.66370207312170615 + ], + [ + -1.0367329523445921, + 0.15718729907400572 + ], + [ + -0.75982010745273121, + 0.90027471200362641 + ], + [ + 0.74439980334784384, + -0.45490082139974258 + ], + [ + -0.29787008377543867, + -0.58428349891216835 + ], + [ + 0.43329429098381461, + -0.92500562378642448 + ], + [ + -1.4136935216029332, + -0.6051483145419323 + ], + [ + -0.062392624319586275, + -0.72888292718735304 + ], + [ + -0.7284226073267529, + -1.4090611416125385 + ], + [ + -0.38148482457464095, + -0.87818785432045721 + ], + [ + 0.5544247250305514, + -0.42170318155706582 + ], + [ + -0.4699083803584202, + -0.64791137955879086 + ], + [ + -1.1085309215766259, + 0.57018147921229867 + ], + [ + -1.4940346557637216, + -0.20027517085768176 + ], + [ + -0.030812521177231756, + 0.32410496747570144 + ], + [ + -0.82856950520380779, + 0.61932671793036964 + ], + [ + 2.0794758226811285, + -0.91223144753231289 + ], + [ + 0.58769733087590903, + 0.76768366455908299 + ], + [ + -0.085259128106072085, + -0.50065190675183102 + ], + [ + 0.3676126261279562, + -1.1399376911189127 + ], + [ + -0.46390793423409821, + -1.0327151617022614 + ], + [ + -0.53892159942564744, + -0.87126869290383413 + ], + [ + 0.91318971643561664, + 0.46923374564339271 + ], + [ + -1.259060502860178, + -0.71233592639689747 + ], + [ + 0.25535666869549545, + -0.17130602786113208 + ], + [ + -1.7182048579765581, + -0.4861211262382632 + ], + [ + 1.148696259249856, + -0.061672198789416169 + ], + [ + 0.46919210494501473, + 1.4717653497109209 + ], + [ + -0.11947921387279919, + 2.1702093129614832 + ], + [ + 1.269835281241769, + 0.04536870654057229 + ], + [ + 0.24526552002884472, + -0.26385028861922227 + ], + [ + -0.43964413776480354, + 0.21562246474285321 + ], + [ + -0.52785080228036119, + -1.2637280721668753 + ], + [ + -1.5420525983395876, + -0.35012342931878127 + ], + [ + 1.653279192170418, + -0.63465087131149278 + ], + [ + -0.42062684537668843, + -0.068081690792821753 + ], + [ + -0.83184620159220046, + 0.86143159737118802 + ], + [ + -1.7020690159867411, + 3.1194186765196639 + ], + [ + -1.106879180714013, + -1.2304074119069459 + ], + [ + -0.29489926007964634, + 1.0718234265019582 + ], + [ + 0.39280793617139204, + -1.0023891709216715 + ], + [ + 0.26451526784563567, + 1.048540002866303 + ], + [ + -1.6522504055194287, + 0.2950149551907737 + ], + [ + -1.2387236438636988, + -0.7929346478870406 + ], + [ + 0.55066217685413543, + -0.20317647284134285 + ], + [ + 2.6740559260418082, + 1.7347625255172812 + ], + [ + 1.4160450037908057, + -0.36694221900205815 + ], + [ + 0.83052792119356356, + -0.1673232160557562 + ], + [ + -0.27023299143369245, + 0.062958840172052374 + ], + [ + -1.7417166110181892, + -1.1320939435595274 + ], + [ + 1.1442951880720658, + -1.0398573884126241 + ], + [ + -0.22463424366598642, + 0.70312868578524479 + ], + [ + 1.3450007232012335, + 0.16750227047793401 + ], + [ + 0.24078620013191107, + -0.47070799902892879 + ], + [ + -2.3664436483846769, + -0.39540330921270317 + ], + [ + 0.77235177321267912, + 1.693275523084059 + ], + [ + 1.6496490948634868, + 0.89634275890721227 + ], + [ + -1.8994487253664945, + -1.2288824133662326 + ], + [ + -0.24560605830569862, + 3.2743797152863117 + ], + [ + -1.2599205198505798, + 0.89143679809129872 + ], + [ + -0.15612778603254088, + 0.10401744461807529 + ], + [ + 0.59442624332418603, + 1.3891710708076974 + ], + [ + 0.40841416640963429, + -0.80808870987488868 + ], + [ + -0.65992023098670083, + -0.069518262047872453 + ], + [ + 0.13618945021488899, + -0.68712626886700301 + ], + [ + -0.95140752991998789, + 0.16339088575613187 + ], + [ + -0.96073969777784773, + -1.1262363370236042 + ], + [ + 0.29470868105739795, + 1.9152879866969408 + ], + [ + 0.62083937704722714, + 0.63585980200661252 + ], + [ + 0.36683291040766353, + -0.03469039768447383 + ], + [ + -1.349464664534628, + -0.94702658578263466 + ], + [ + -0.25679884730621289, + 1.2254657698059013 + ], + [ + -0.18003360913046398, + -0.45868362965832615 + ], + [ + -1.7351253395854325, + -0.43779615941407313 + ], + [ + -0.35706001537260618, + -1.2371884418096708 + ], + [ + 1.1199504313233037, + -0.45844399118471812 + ], + [ + -0.60635508813620975, + 2.1155620377282363 + ], + [ + -1.531351146992882, + -0.6370202185222541 + ], + [ + -1.1730683580361221, + -0.56933803746889389 + ], + [ + 0.87282813056700514, + 0.66051601828226036 + ], + [ + 0.63427541304832358, + -0.29840789589526534 + ], + [ + 0.41921213408448832, + -0.64064590438346625 + ], + [ + -0.55152371664973909, + 0.59531335560615706 + ], + [ + 0.40587513739332126, + 0.5251911697063737 + ], + [ + 0.27342225316800395, + -0.70194674286044823 + ], + [ + 0.44571139722156911, + 0.034439406957182263 + ], + [ + -1.0584077971392292, + 1.6173172291684141 + ], + [ + -0.652685443749627, + -0.9651623447399601 + ], + [ + -2.0306867493968777, + 0.32984619145604022 + ], + [ + -1.5575857018971058, + 1.3410793174275275 + ], + [ + 0.41847193743296374, + 1.9562859611789249 + ], + [ + 0.02799674758998226, + 0.43777611357044477 + ], + [ + -1.4007213418350453, + -0.77040995977134552 + ], + [ + 0.46608038439296007, + -0.79489825138451742 + ], + [ + 0.18622769520271207, + 0.082029552696723324 + ], + [ + 0.20561471046884777, + -0.52594286334315954 + ], + [ + 0.28354076706057418, + 0.60903805604741834 + ], + [ + 0.34031968648652694, + 0.51684052251500123 + ], + [ + 0.79723432417027673, + 0.65255145459067321 + ], + [ + -0.32807577186950271, + 0.58493767041583355 + ], + [ + -1.3494872861816536, + -1.1733874079592674 + ], + [ + -0.61952990931183693, + 0.4737208039314299 + ], + [ + -0.38427429113315603, + -0.60776861847695429 + ], + [ + -0.75462049958834543, + -0.19264075451232762 + ], + [ + -0.85326764518070963, + -0.97876039091088207 + ], + [ + 0.66911275074137844, + -0.6199656271307652 + ], + [ + -0.015604410980802454, + -0.88599186597239921 + ], + [ + 0.39553952513365331, + 0.20832923129660177 + ], + [ + -1.5287075713183713, + 1.2066634030934982 + ], + [ + 0.27517842324312253, + 0.02725865892610646 + ], + [ + 0.46270733961663657, + -0.90072028555045003 + ], + [ + -1.726005346418569, + -0.95555176330199509 + ], + [ + -1.5458390942286737, + -0.27537853242350641 + ], + [ + 0.18509197783479991, + -0.12306335963542384 + ], + [ + -0.032075769686101326, + -0.032126769435998348 + ], + [ + 1.16460965855905, + -0.71891786802006719 + ], + [ + -0.73633625933156521, + 0.34696049389242883 + ], + [ + 0.85066518577317318, + -0.7009027705190749 + ], + [ + 0.41042088606399463, + -0.96693029540255904 + ], + [ + 0.29624392272240158, + 0.14339724465325043 + ], + [ + 0.69186415774720622, + 1.9639597199176677 + ], + [ + 0.21411099824136356, + 0.53487432108907329 + ], + [ + -0.74953226714111221, + -0.62801052268158952 + ], + [ + 0.12183895289908145, + -1.1436483076905128 + ], + [ + 0.38965211308850173, + -0.66570941522884342 + ], + [ + 0.079487471487274794, + -1.0379010130716657 + ], + [ + 1.7274002792905663, + 0.92482159614853987 + ], + [ + -0.31662903285267152, + -0.68054430314990932 + ], + [ + 1.5609748542203803, + -0.81633076572424534 + ], + [ + 0.54545298375430407, + -1.2270792724307749 + ], + [ + 1.4587899217164493, + -1.1727095877961453 + ], + [ + -0.42300707104670537, + -0.86380502683328775 + ], + [ + 1.0971522642048472, + 0.50152846593946587 + ], + [ + 1.1352721348899601, + -0.40392951682898776 + ], + [ + 0.56737877129407122, + 0.47235379506935998 + ], + [ + 0.74922822615053508, + -0.4824069093053247 + ], + [ + 1.7918142140843081, + 0.070172397555055555 + ], + [ + -0.75762853804939212, + -1.1328532830669313 + ], + [ + -0.42304339441158395, + -0.46008195146630343 + ], + [ + -1.341201412662226, + -0.24979894876135578 + ], + [ + 0.54395278221441357, + 0.82369301792408267 + ], + [ + -1.4392952255672031, + -0.029086134551374317 + ], + [ + -0.0085933388170272903, + -0.92969254382684019 + ], + [ + -0.25070191774215328, + -0.1857877906151362 + ], + [ + -0.12451801311022484, + 1.9151591741476923 + ], + [ + -0.51572237686215694, + -0.42993558459150322 + ], + [ + -0.074692260643293276, + -0.27874860649762578 + ], + [ + 1.1673482454716386, + -0.68465941425614818 + ], + [ + -0.048746758052004312, + -0.80264234873090934 + ], + [ + -0.10766013162620562, + -1.2507886571224582 + ], + [ + -1.3624148671079765, + -0.82452015069772122 + ], + [ + 1.4738360532854535, + -0.36397217114893543 + ], + [ + -1.8028738101377959, + 0.54243132357497981 + ], + [ + -0.78381224036880504, + -0.74887855338110187 + ], + [ + -1.2176441005354581, + 1.6771386140428375 + ], + [ + 0.6506109977469301, + 0.41833590708362844 + ], + [ + 0.17475206016906358, + 0.017363105379250007 + ], + [ + 0.51982753596126774, + -0.19798956433791148 + ], + [ + -0.12232958664217702, + 0.045182736636573059 + ], + [ + -0.83489081328543557, + -0.75218916188954676 + ], + [ + -0.18125780910074607, + 0.54121802910019712 + ], + [ + -1.8594144213748516, + -0.4495708687690298 + ], + [ + 0.40959628285355376, + 4.1456707132810928 + ], + [ + 1.9621575184866216, + -0.52403581776960373 + ], + [ + 1.2021682219360754, + -0.788722959367956 + ], + [ + -0.48072327933240816, + -0.54036933556712641 + ], + [ + 0.68719767358707917, + -1.1162574593847145 + ], + [ + 0.011389857062708302, + -0.51484595162882218 + ], + [ + -0.11501274776326752, + -0.84392062425267178 + ], + [ + 1.7275566226455863, + -1.0147637845280002 + ], + [ + 0.54826118472461072, + -1.0704029838446221 + ], + [ + -0.11550868973492655, + 0.58752568327945864 + ], + [ + 0.21852595981093942, + -0.49393607974925952 + ], + [ + -0.57929661052350923, + 0.066773443167881974 + ], + [ + -0.90028869183995475, + 0.28764731977488822 + ], + [ + 0.47927410861717595, + 0.56838728600388699 + ], + [ + -0.82294813674700629, + 4.6466063441023353 + ], + [ + -1.2780121876531243, + -0.22471318131939297 + ], + [ + 0.54628127848944508, + -0.83909839132931074 + ], + [ + -0.0510633719910547, + 0.38838776536813469 + ], + [ + -0.22704067371550618, + -0.34975846878104477 + ], + [ + 1.7632088390120277, + -0.9404994954230409 + ], + [ + 1.3797657810704411, + 1.0245191873750374 + ], + [ + 0.28626696463026502, + -0.12828060800589741 + ], + [ + -1.6657921823477875, + 0.88088849458582796 + ], + [ + 0.84032960550909452, + 0.12093766108149392 + ], + [ + -1.3057899369654606, + 0.47902269005622511 + ], + [ + -2.4328490217302732, + -0.036277429764608751 + ], + [ + -0.87196582882682572, + 1.0090558296192642 + ], + [ + -1.1761334494997122, + -0.61601977218276005 + ], + [ + -1.358613540648512, + -0.94793374369000261 + ], + [ + 0.045373829071832232, + 0.56640136925671558 + ], + [ + -0.42459517712832884, + -1.2190447445159518 + ], + [ + -0.50032211586188824, + -0.75518245639041048 + ], + [ + -1.4380576058005687, + 0.32336710128982038 + ], + [ + 0.019201698308925787, + -0.46510748744097208 + ], + [ + 0.52375465899271045, + 0.53199294398310726 + ], + [ + -0.10585351689837114, + 1.1360857165080338 + ], + [ + 0.20769312136434381, + -1.2631490960567631 + ], + [ + 0.33024109192373124, + -0.96770527482189517 + ], + [ + 1.2879830145819355, + 0.01188577066183695 + ], + [ + 0.40660876720700628, + 1.1626303036858234 + ], + [ + 1.0069891932531609, + -0.5963466662921062 + ], + [ + -0.58254235421261291, + -0.95069153975843068 + ], + [ + -1.1245968351435438, + 4.3538894592881956 + ], + [ + -0.98328965864717599, + -1.1194180737253812 + ], + [ + 2.5382357183001063, + -1.0326306155893687 + ], + [ + 0.89783454156886211, + -0.60779235467941239 + ], + [ + 1.5925657628516241, + 0.085009208669705391 + ], + [ + 0.20024668177255719, + 0.011712822835025016 + ], + [ + 0.75146729862466544, + -0.45870818100448102 + ], + [ + -1.0500141999557266, + 2.4728390505874827 + ], + [ + -1.8717659027054936, + -0.39880888585104957 + ], + [ + 1.2376418785315864, + -0.47739366232602076 + ], + [ + 1.4942631026508342, + -0.75481123524698912 + ], + [ + 2.5102280957182783, + 0.72793991787782786 + ], + [ + 0.53288293072720083, + 0.20623214193948269 + ], + [ + -0.79816913350711716, + -0.73900914919297922 + ], + [ + -2.0633810050985404, + -0.94545314767168642 + ], + [ + 0.57919986938124213, + -0.92589241249779275 + ], + [ + -0.38192737016004136, + 3.7891140209449223 + ], + [ + 0.21130950316818473, + 0.16579263570172084 + ], + [ + 0.28266686310556949, + -0.59018341030184629 + ], + [ + -0.13942126205280719, + -0.98796519444759601 + ], + [ + 1.636145353314252, + 1.8545033419780752 + ], + [ + -0.12522341090194475, + -0.82812532599695032 + ], + [ + -0.59599893612523658, + -0.77903138160648555 + ], + [ + 0.50272236526258751, + -0.30134619696588133 + ], + [ + 1.4199734531250037, + -0.70618421105847451 + ], + [ + -0.73504063134721376, + 1.4124192967373226 + ], + [ + -0.8119478858550162, + 0.74759609496403756 + ], + [ + -0.3473364110100215, + -0.95306155291366257 + ], + [ + -0.88910690842249596, + -0.70499869514138525 + ], + [ + 0.80964251598120973, + 1.5463286400315523 + ], + [ + -0.1211433108823691, + -0.36563019271101216 + ], + [ + 1.1554528543662683, + -1.0820594437219524 + ], + [ + -1.8713750030423453, + 0.79898701073748957 + ], + [ + -1.5296515565485764, + -0.88462133233614837 + ], + [ + 0.38277639649608219, + -1.1824547411518469 + ], + [ + 0.5361019008125939, + -0.34378500246050003 + ], + [ + 0.9517023407702293, + 1.8796807669032525 + ], + [ + 0.47302939537601069, + 2.3425442506906946 + ], + [ + 1.6298990041572958, + -0.45129070296195717 + ], + [ + 2.0925367846229994, + 0.097634338946067462 + ], + [ + -1.394493186164445, + -0.30132678468006596 + ], + [ + 0.94419939947001974, + -0.20268034555279746 + ], + [ + 0.75237526324177129, + 0.1778709913540793 + ], + [ + -0.25569422891502258, + 0.88925480388259381 + ], + [ + 0.15386534907970928, + -1.1866915737743247 + ], + [ + 0.20961068690539456, + -0.95841980028906659 + ], + [ + 0.54576996065133787, + 2.8801671050878843 + ], + [ + 0.43779294917430794, + -1.0900305552815579 + ], + [ + -0.32761632897744636, + -0.17000792756682262 + ], + [ + -0.22734302280355356, + -0.055476587751778994 + ], + [ + 0.10760164169310379, + -0.58748077261779452 + ], + [ + 0.96583728328833063, + -1.3094992371810341 + ], + [ + 0.11954098633552884, + 0.083367147974049885 + ], + [ + 1.4757692546733225, + -1.0870906477352322 + ], + [ + -0.34541790870196204, + 2.0913918799016975 + ], + [ + -0.1260239230425598, + 1.4016232858653983 + ], + [ + 1.7904950058643005, + -0.53031182912575558 + ], + [ + 1.660285443836562, + 0.2833543708378074 + ], + [ + 1.9017469895337311, + 0.80892814658533974 + ], + [ + 1.124579632287692, + -0.56663096957413961 + ], + [ + 1.7212486956635624, + -1.2381004979014529 + ], + [ + 0.62478491579924778, + 0.23783318352958024 + ], + [ + 0.49189298828058076, + -1.2330370707888052 + ], + [ + 1.9931287992340192, + -0.059979595583994259 + ], + [ + 0.36664679801616601, + -0.30771617680569069 + ], + [ + 1.1083772541412531, + 0.647529078300634 + ], + [ + -0.17691935957471988, + -0.4706379665715078 + ], + [ + -0.71267149462758372, + 1.2438341715907075 + ], + [ + 1.3389082614383827, + -0.94915376741204183 + ], + [ + 0.29225141418512479, + -0.52338626570308244 + ], + [ + -0.53815426035102931, + -0.15269427788279644 + ], + [ + 0.28854856657024269, + -1.3503957024281525 + ], + [ + -0.73060434596328483, + -1.359946477552604 + ], + [ + -1.2727760861674593, + -0.49443687084427146 + ], + [ + -1.2384458790452693, + 1.3902779053717105 + ], + [ + -1.7564962105191564, + 1.3025181280068165 + ], + [ + 0.22232248014063899, + -0.70665073096594799 + ], + [ + -0.25684907557010789, + 0.28947727192854761 + ], + [ + 0.043617308126989975, + -1.2860290810753976 + ], + [ + -0.42557672511354017, + -0.48372930975825923 + ], + [ + -0.72080097088613215, + -1.1698178562908885 + ], + [ + 0.097126424664030861, + -0.68623841632929716 + ], + [ + 0.23225539403210607, + 1.0140301861987588 + ], + [ + 1.0152111317360764, + -0.62016126087918744 + ], + [ + 2.2167300898119469, + -1.0740235033879098 + ], + [ + -1.1348562725076465, + -0.0069826846631364592 + ], + [ + -0.33924641415238033, + -0.45958009061818333 + ], + [ + -1.0386540111874181, + -0.69229111812892896 + ], + [ + 1.1756705657876212, + 1.4949805878225575 + ], + [ + 0.83063535302500424, + -0.37773338179620275 + ], + [ + -1.2448058032510216, + -0.80877711956450871 + ], + [ + -0.61590466933836119, + -0.26193910801104481 + ], + [ + -0.94488156665926815, + -1.0537196332522067 + ], + [ + -0.034467871362708159, + 0.68376052557549172 + ], + [ + -1.5127760557399601, + 0.43957282065309777 + ], + [ + 1.1691522613172272, + 0.50861477507093911 + ], + [ + 0.60938391086495125, + -0.93783287247472069 + ], + [ + -0.40813651330022882, + 0.39468916819133826 + ], + [ + -0.84227786158550411, + 0.77221336875655211 + ], + [ + 0.41786082652127216, + 0.57578434788309096 + ], + [ + -1.9914819206780536, + 0.32145154398358616 + ], + [ + 0.14193034961544485, + 0.75674419421318273 + ], + [ + 0.36055227546109297, + -0.071390379829925132 + ], + [ + -0.7486821772000436, + 0.26076827498704536 + ], + [ + 0.36571449413285434, + 0.17504191755399423 + ], + [ + 2.3753737049877106, + -0.7825380019361563 + ], + [ + -0.20745047304345732, + -0.13160253269707417 + ], + [ + -0.54265382067515477, + 0.49748233411890153 + ], + [ + -0.89393672300573401, + 0.90236526460043354 + ], + [ + -0.36211088839710115, + -0.93824957616873039 + ], + [ + 0.22210686009206693, + -0.96129111264611866 + ], + [ + 0.58579519784270839, + 0.012843456355346021 + ], + [ + -2.1176662495736061, + 1.7976600124872024 + ], + [ + -0.67547569598293533, + 0.1690373674303918 + ], + [ + -0.096371081452420168, + 2.4494056887504749 + ], + [ + 0.069523894856745372, + 0.0048751427693802989 + ], + [ + 1.8571108549481392, + 0.55258518107743027 + ], + [ + -0.73617334154081371, + 1.6932388395480167 + ], + [ + 2.2437022294470532, + -0.02429134849515744 + ], + [ + -0.34508763659263647, + 0.45805308990323573 + ], + [ + -0.21053979409550394, + 0.077017483150054925 + ], + [ + 0.35553625439878067, + 0.32240430586329161 + ], + [ + -1.0100972582895185, + 1.5761029959993684 + ], + [ + 0.32482232737837385, + -0.54719101530289838 + ], + [ + 0.93168797216438703, + 0.5367040575788059 + ], + [ + 2.0443649368490071, + -0.5704790743313547 + ], + [ + 0.34096756622234475, + -1.2311450138468414 + ], + [ + 0.72502121566972044, + -0.85933928851056485 + ], + [ + -0.86523734468134961, + 0.99311604704004774 + ], + [ + 0.027404874066695985, + -0.33679071004271804 + ], + [ + 0.34142831684047442, + -0.10462391360456712 + ], + [ + -1.6323894609044642, + -1.126519534747745 + ], + [ + -1.4166970150102369, + 1.5608591320178149 + ], + [ + -0.40292802701007346, + 1.6025598103584273 + ], + [ + -0.064235998514311429, + 1.2899025502190546 + ], + [ + 0.26980893500490571, + -0.59411837978649029 + ], + [ + -0.5714575789324523, + 0.45104108058990461 + ], + [ + -1.072796028944871, + 0.49031873666064468 + ], + [ + 0.44047812236340272, + -0.88075222583011614 + ], + [ + 0.41084573880331809, + 0.37589408451227485 + ], + [ + 0.02899537567105712, + 0.29896270603125324 + ], + [ + 2.4381879725243132, + 1.7023322560462719 + ], + [ + -0.27125101758973508, + -0.46977034332266238 + ], + [ + -1.5056319976340771, + 0.50119444333541074 + ], + [ + 0.85422399680930994, + 0.27015774983778235 + ], + [ + 0.040075672643251813, + -0.92170722847878828 + ], + [ + 0.1198867291146198, + 2.4995869502757477 + ], + [ + -0.060843581762378508, + -0.96580589049308119 + ], + [ + 1.5358063196438907, + 0.5288598992907384 + ], + [ + 1.1784331299918469, + -0.63346184506085634 + ], + [ + 0.76824849736613987, + -0.0053144629474307032 + ], + [ + -0.11895631513444653, + 3.1884126764722773 + ], + [ + -0.52292595218697979, + -0.43524690616268935 + ], + [ + 0.12560013382204827, + 0.095316465906865669 + ], + [ + -0.076722846112039736, + 1.7109752143923243 + ], + [ + -1.3334385135296953, + 1.8660662388089109 + ], + [ + -0.21038865799719841, + -0.6468267728799727 + ], + [ + 0.41240575883415659, + -0.9915615701390833 + ], + [ + -0.67825456864330891, + 0.19441339016097092 + ], + [ + -0.056315406877964061, + -0.87536196758787232 + ], + [ + -0.8474948260714309, + -0.95549644270944356 + ], + [ + -0.94922495517050731, + 0.51412367393698433 + ], + [ + -0.24746936952909221, + 0.49766964699672561 + ], + [ + 0.97176325964357335, + 0.82651937664031683 + ], + [ + -0.99662467300273272, + -0.5474319846077973 + ], + [ + -0.20219609934375582, + -0.82796484579756546 + ], + [ + -1.0616268687530708, + -0.64016341131933951 + ], + [ + -0.24519690628273447, + 0.082838309699840712 + ], + [ + 0.78799794019478442, + 0.34019358152402951 + ], + [ + -1.400273862117341, + -0.57824520484389574 + ], + [ + -0.35008206760806126, + 0.40733168840864331 + ], + [ + -0.75138966559921294, + 1.4984658339154302 + ], + [ + 0.31624660159923484, + 0.85729913020520554 + ], + [ + -0.16901854230557731, + 1.4208622572687577 + ], + [ + -0.54866990336051846, + 0.60294565184496318 + ], + [ + 1.0295030783080428, + -0.35565790120229374 + ], + [ + -0.92545040275499812, + 0.79646786148460602 + ], + [ + 0.71578759714167273, + 0.34100064000512015 + ], + [ + 0.79417504154819207, + -0.13549382942264418 + ], + [ + -0.83285015419595942, + -1.1754681966204763 + ], + [ + 0.1277484744374752, + 0.70661991624300602 + ], + [ + -0.76210942950431559, + -1.0348976894493329 + ], + [ + 0.36985945845849405, + 0.45832415120606229 + ], + [ + 0.23037730199281453, + 1.5238655434236037 + ], + [ + -0.68873681967107558, + 0.23814309296902078 + ], + [ + 0.37895817722752401, + 0.86652545420350391 + ], + [ + -0.61452623121665328, + -0.83037697317432824 + ], + [ + -0.46759728485064272, + 3.0779222875125645 + ], + [ + 0.64297139999814568, + 0.32201013655908711 + ], + [ + 1.0499981428972764, + -0.4118948694303316 + ], + [ + 0.37991663175634144, + -0.38958009759662471 + ], + [ + -0.19051001427641906, + -0.32826026839237787 + ], + [ + -0.31957046500313896, + 1.9209574779212009 + ], + [ + -0.30278778776381277, + -0.42585929911560072 + ], + [ + -0.45862726512799457, + 1.4327051725463991 + ], + [ + -0.32123823837179416, + -0.7419694173105339 + ], + [ + -1.7314550767820003, + -0.43533629426662862 + ], + [ + 0.056283975698490071, + -0.80229526379454941 + ], + [ + -1.5488596476896033, + -0.20125070946410911 + ], + [ + -0.82676619717450306, + 0.86545714563440779 + ], + [ + -0.12990042764278903, + 0.74997607615010575 + ], + [ + 1.1544347030155846, + -0.80884470255449403 + ], + [ + 1.3897230514084447, + -0.05278022368339888 + ], + [ + 1.8101676732330501, + 1.2183786621122199 + ], + [ + -0.5293056693862318, + -0.58492421036694753 + ], + [ + 1.6260810309559155, + 3.3839331002649078 + ], + [ + -0.37035580433641124, + -0.88712847888409208 + ], + [ + 0.78685862487249358, + -0.85407236980951606 + ], + [ + -0.11235748644835822, + -0.43112880723590274 + ], + [ + 1.429094304511533, + -1.0805303046113981 + ], + [ + -1.7198178874445791, + -1.0515469229380745 + ], + [ + -0.76624214733263951, + -0.94055896405732242 + ], + [ + 1.4090479042505855, + -0.91689414157344595 + ], + [ + -0.91028803829609306, + 1.2612860663067751 + ], + [ + -1.0713796339794823, + -0.77529384562251946 + ], + [ + -1.1387924505618983, + 0.32661090706962498 + ], + [ + -0.6152830101846094, + -0.50972086664259841 + ], + [ + 1.0475953587461406, + -0.44925336066120702 + ], + [ + 0.43402925099450851, + 0.38522891519471469 + ], + [ + 2.2470752558728995, + -0.62609459047164917 + ], + [ + -0.60003097998206101, + -0.92645100806009617 + ], + [ + 0.35687256611987583, + 0.58996758239104496 + ], + [ + 0.41432556235482465, + -0.4292673967979872 + ], + [ + -1.5976920319636894, + 1.2320921580136515 + ], + [ + -1.381832418435387, + -0.38892505732745003 + ], + [ + -1.3850374970241497, + 0.51862834951326775 + ], + [ + -0.40923845361663136, + -0.73201421580043269 + ], + [ + -0.21895674129703099, + 1.1985162340415438 + ], + [ + -0.90918161003378428, + -0.2939347321358366 + ], + [ + -0.11062737843749168, + -0.77597234402056081 + ], + [ + 1.8092017231896984, + -0.41882426700232056 + ], + [ + -1.0220492345870229, + 0.74518306933503653 + ], + [ + -0.051658857921433682, + -1.0134056521077515 + ], + [ + -1.0990361036858254, + -0.96446624581242957 + ], + [ + -1.0137399509944411, + 2.5793782725031162 + ], + [ + -1.2230593390166693, + -0.3916488667974925 + ], + [ + -1.1412329150073897, + 0.87394813238953439 + ], + [ + -0.29899524236977426, + -1.1459972601245485 + ], + [ + -0.53602371178692387, + -0.58077343385764224 + ], + [ + -0.30302194525961973, + -0.73516913571807763 + ], + [ + 0.37947536491117068, + -0.45721238036532774 + ], + [ + -0.41525569328088741, + -0.58695734222633 + ], + [ + 0.17901638602669953, + 0.27645840648384762 + ], + [ + -0.45433552771271279, + 1.3821245813627188 + ], + [ + -0.78352015989380508, + -0.57911006437652457 + ], + [ + -1.1685097535494646, + -0.48976060131476051 + ], + [ + -0.23219271396864891, + 0.66714978236381406 + ], + [ + -0.34606951337702724, + -0.28593700727711252 + ], + [ + 1.7856086258179171, + -0.0089694636979336991 + ], + [ + 0.68455371873593496, + -0.46693997631585843 + ], + [ + 0.49438092426553903, + -0.45216111819910049 + ], + [ + -0.80637273715923641, + -1.4007336951201212 + ], + [ + -1.1661731478932367, + -1.2233150115157199 + ], + [ + -0.93500127247118203, + 1.0409690949494512 + ], + [ + -0.30512241824863906, + 0.73532122916177067 + ], + [ + -0.59839576795447702, + -0.19112523803812698 + ], + [ + 1.3020017240136244, + -0.51278957542459624 + ], + [ + 0.17591170485113131, + 0.45338320577774116 + ], + [ + 0.20973442788065649, + -0.81371994942729542 + ], + [ + 0.43379913382290991, + -0.30231742959720276 + ], + [ + -0.93970980990469166, + -0.025987209112253568 + ], + [ + -1.1875665815956753, + -0.38066421888239582 + ], + [ + 0.43403995933553041, + -0.51248565562300419 + ], + [ + 0.25996537419014454, + -0.49599530457327512 + ], + [ + -0.00081995101648347102, + -0.64029131265401096 + ], + [ + -1.2073456605651858, + -0.18498452423770223 + ], + [ + 0.65138475950055297, + -0.9270612184712651 + ], + [ + -2.469590206466366, + -1.2188027838992124 + ], + [ + 0.49645525921707501, + 0.28135873077246054 + ], + [ + 0.22310932460834471, + -0.64348478972473944 + ], + [ + 0.51604303414572983, + -1.2221615215556112 + ], + [ + 0.23772043353427724, + 1.3287552752618657 + ], + [ + 2.7152528174695734, + -0.15100212800471838 + ], + [ + 0.15178158009275267, + -0.24537494323872699 + ], + [ + 0.097685183714898108, + -0.055752432912720661 + ], + [ + 0.45740441095843426, + 0.62665547317068293 + ], + [ + -0.61638162286099285, + 1.0455925649519933 + ], + [ + 0.56580382906466498, + 1.9277618048040581 + ], + [ + 0.39616136787117634, + -1.2978397931467791 + ], + [ + -0.27828968610826205, + 0.051521126931848141 + ], + [ + -0.37206461213409253, + -0.10700939840845389 + ], + [ + -0.47717689854213896, + -0.48175377050797863 + ], + [ + 0.086916845444621554, + -0.76314838319567579 + ], + [ + 0.63304929218941786, + -0.65397754023077215 + ], + [ + -0.42024847941317484, + -0.4846434253922729 + ], + [ + 0.69217759667108292, + 0.56326035189570156 + ], + [ + -0.80431044620547343, + -0.7443293506898655 + ], + [ + -0.7307150380719073, + -0.70127964851282865 + ], + [ + -1.4769163586315339, + -0.34070108366356211 + ], + [ + 2.5608129024825779, + -0.69687102019295488 + ], + [ + 2.6066317092745503, + 1.1755956622843371 + ], + [ + -0.72527060672351373, + -0.73679493294022691 + ], + [ + -0.32661408007727744, + -1.2223708241625497 + ], + [ + -0.48055445412039888, + 0.21946462052807153 + ], + [ + -0.57470643044992231, + 0.72271425239237408 + ], + [ + -1.7419972533490153, + 0.0201359289185193 + ], + [ + 0.32022324201780772, + -0.64187952277812754 + ], + [ + -1.0608263737074271, + 0.70579408401938704 + ], + [ + -0.25936228872365658, + -1.0981310136991134 + ], + [ + 1.4852368239336982, + -1.0256228695579712 + ], + [ + -1.1445370194442355, + -0.017858521651390433 + ], + [ + 1.2588973316983996, + -0.90716142388893717 + ], + [ + -0.57812505431399919, + -1.1587819180742105 + ], + [ + 0.94919138297041528, + -0.39561413936620432 + ], + [ + 0.68879177485099508, + -0.9796118758675163 + ], + [ + -1.1215305942888565, + 1.2407480306766532 + ], + [ + -0.11414266067329142, + -0.1838334202778617 + ], + [ + 1.3305159004159859, + -0.70905242193912832 + ], + [ + 0.25479943289360568, + -0.16812772935319192 + ], + [ + -0.62385523336936788, + -0.76684440092925066 + ], + [ + -0.39415553351032995, + -0.92884974890744432 + ], + [ + -1.7270053259709028, + 0.060222182250420177 + ], + [ + 0.15598888873213934, + 0.84223257730056711 + ], + [ + 0.50545901504650892, + -0.81519232381659956 + ], + [ + -0.34125024189926206, + -0.70467513091452028 + ], + [ + 1.9843728888124075, + 0.52968110592402351 + ], + [ + -0.080643101689739496, + 2.2168396795209611 + ], + [ + -0.95739330917728305, + -0.9703890321870392 + ], + [ + 0.50832529424896156, + -0.24355797628438755 + ], + [ + 1.1932815357952666, + -0.27833129056538691 + ], + [ + 0.78552416660124491, + -0.54724040130057949 + ], + [ + 1.3744535990903839, + -0.44738456564148077 + ], + [ + -0.31221492024917996, + 0.61442675801638569 + ], + [ + -1.227995405821138, + 0.086405967764408884 + ], + [ + 0.4572897192776082, + -1.020754747001404 + ], + [ + 1.0865279526442122, + 0.36697892718447234 + ], + [ + -0.3574708614182075, + -0.92940006304693823 + ], + [ + -0.53701845451920094, + 0.49415276859287988 + ], + [ + -0.072738925343856356, + -0.63496797359015655 + ], + [ + 0.70158307105352158, + -0.79258839526711145 + ], + [ + -0.43187664450344715, + 1.0416250134304654 + ], + [ + -0.91158916566312131, + 0.27014241164222269 + ], + [ + 1.9035810583850181, + -1.0757251717567651 + ], + [ + 1.6568495254864082, + 3.4003730331927549 + ], + [ + -0.33475306638736591, + -0.63782126414193796 + ], + [ + 0.70166090637479928, + 2.1508391416191679 + ], + [ + 0.75947690907833276, + 1.7410542902049924 + ], + [ + -1.3713212363943286, + 1.1839584299253301 + ], + [ + -0.18267161442293209, + 1.560613791288449 + ], + [ + 0.72894340755077935, + -0.78823319563095762 + ], + [ + 0.39861705393701607, + 1.6761946087646589 + ], + [ + -1.0447890476824329, + -0.94984483654838869 + ], + [ + -0.92516509280340131, + 0.5751488557790756 + ], + [ + -0.77536882903877247, + 0.70699343900209355 + ], + [ + -0.29534372393334407, + -0.018146183414483003 + ], + [ + -1.3294394769029612, + -0.81995323789358976 + ], + [ + -0.42511256794529595, + -0.47433156351473171 + ], + [ + -0.45569146372950686, + 1.2192100168809292 + ], + [ + -0.1658737941930748, + 0.37814973666150298 + ], + [ + 1.0774403319510983, + -0.29298616457832438 + ], + [ + 0.32335459001658295, + 0.27597020499898556 + ], + [ + -0.7380306705450066, + 0.63553483345944406 + ], + [ + -0.13417764779342811, + 0.14409994558849756 + ], + [ + 0.97530095917266968, + -0.74012476843708352 + ], + [ + -1.7490213228935065, + 1.0841141846076847 + ], + [ + 1.7430247722768664, + -0.84871510532589645 + ], + [ + -0.17649711268543405, + -0.83085857447928968 + ], + [ + -0.73371351106393778, + -1.1471309547736939 + ], + [ + 0.61949512085543523, + -1.0710560560171998 + ], + [ + -1.0216998404311013, + -0.6655290437341761 + ], + [ + -0.87063590749529562, + 0.99672256367844103 + ], + [ + 1.8593419885099842, + -0.3670718513634264 + ], + [ + -1.6911944474763698, + -0.06020089218561353 + ], + [ + 1.2590429980897362, + -0.17414907160975573 + ], + [ + 1.1895994320515475, + 0.073273945205572039 + ], + [ + -0.66148883065972486, + 0.46996699316976137 + ], + [ + 1.3950470194435363, + -0.98464496768394494 + ], + [ + -0.74312762982041214, + 1.33197065209145 + ], + [ + 0.75342417050233801, + -1.099276110530828 + ], + [ + -1.137066594754087, + 1.9835584912553574 + ], + [ + -0.9127200493960016, + -1.0200454781323858 + ], + [ + -0.75134507187536492, + 0.033227469574114168 + ], + [ + 0.021653180561481675, + -0.84794279564935882 + ], + [ + -0.4023633745065856, + -0.59058280918097916 + ], + [ + 0.23959709252433919, + 0.64230207126039252 + ], + [ + 0.57504161541406762, + -1.0624203760691524 + ], + [ + 1.1716450875421218, + -0.38324806424996788 + ], + [ + -0.091377218241175243, + 0.86390312353203458 + ], + [ + -0.55832882139697682, + -0.95333634135293666 + ], + [ + 0.44842577537256462, + -0.82899963373758379 + ], + [ + -0.55723398791081957, + -0.7166549786370694 + ], + [ + 1.8751981114640184, + -0.60377026438693371 + ], + [ + -0.39612416336761125, + 1.7969394636020231 + ], + [ + 0.61010917696934841, + -0.77826655244239262 + ], + [ + 2.014247524438233, + 0.83624747729413473 + ], + [ + -0.086294531582960396, + -1.3841504405304073 + ], + [ + -0.18614210089546629, + -0.99540562150519085 + ], + [ + 0.26033342865643572, + -0.40727409202444903 + ], + [ + 0.93683859812215731, + 0.19900764663603784 + ], + [ + 0.53635674422729596, + 0.078221744366387722 + ], + [ + 0.7285287055815034, + -0.67739849579317379 + ], + [ + -1.4651167337267308, + -0.11148680446540411 + ], + [ + -0.68812317611456753, + 0.43964130486540071 + ], + [ + 0.48070083750058712, + 0.048700805644858208 + ], + [ + 0.94706833172484173, + -0.046480070727231558 + ], + [ + 0.55281648141689022, + 1.0370303322820973 + ], + [ + 1.3338176248801223, + 0.77191447357626142 + ], + [ + -0.15728990969292053, + 0.51657290774209808 + ], + [ + 1.1813339218102028, + 1.6737533769658159 + ], + [ + 1.6959978916096572, + -1.147893995709742 + ], + [ + 0.48114095983581218, + -0.72438726693117028 + ], + [ + -3.1098943690266934, + -0.90331012874292815 + ], + [ + 1.6213434124867383, + 0.73527072846995334 + ], + [ + 0.90029227387115041, + -0.64660222303079862 + ], + [ + -1.4908716920370286, + 0.070677661470540512 + ], + [ + -0.46630588223069031, + -0.35878892897671855 + ], + [ + 0.66607829001505903, + 2.4616979115067332 + ], + [ + -0.9277689144319331, + 0.69101189872559665 + ], + [ + -0.13937963191623176, + -0.61259855181129186 + ], + [ + -1.6344491299933943, + 0.10235682610233486 + ], + [ + 1.8196902967530668, + -0.577273653087512 + ], + [ + -1.9791421767803392, + -0.96108550607150323 + ], + [ + -1.5678353237302709, + -0.0062857254093395395 + ], + [ + 0.093399061648542031, + -0.76028212749222324 + ], + [ + -0.21027954009066835, + 0.38908868283951875 + ], + [ + -1.3566773553024079, + 0.96288613225318864 + ], + [ + -0.02671394923972745, + -1.046715692530058 + ], + [ + -0.14154560788559292, + 0.8098878484035944 + ], + [ + 2.4705661916282859, + 0.041660644863640288 + ], + [ + 0.93702118640954701, + 0.42335336159135828 + ], + [ + 0.051137778754577499, + 0.13436980965718021 + ], + [ + 1.4046464588479264, + -0.52054365987973394 + ], + [ + -1.1622117541285157, + -1.208671978003458 + ], + [ + -1.8138244125806526, + 1.1003252933691874 + ], + [ + -1.2265874618321888, + 1.775558808341867 + ], + [ + -0.73130786163005979, + 2.6607538714051944 + ], + [ + -1.389551833549894, + -0.27657184219998721 + ], + [ + -0.68037431724136566, + -0.073178405903521551 + ], + [ + 1.1478586868877843, + -0.61730075204123214 + ], + [ + -1.5823301281551125, + 0.87762620955523296 + ], + [ + 1.1267555104550091, + -0.43883307912922981 + ], + [ + -0.25560250925081746, + -1.0087955847865093 + ], + [ + -1.452930504970505, + -0.79403218585055813 + ], + [ + 1.0233438317016526, + 0.50088077539263653 + ], + [ + -0.20362814776019092, + -0.50648492102808773 + ], + [ + 1.6005968759460532, + 2.074324210806008 + ], + [ + -0.10498972787240267, + -1.2239076975943382 + ], + [ + -1.8687767760537586, + 0.33453990602779926 + ], + [ + 0.8683733920298089, + -0.50871540654546521 + ], + [ + 0.85794764497907328, + -0.7588109837532836 + ], + [ + -0.22028593158861151, + -0.86352513986292367 + ], + [ + 1.2279992189970097, + 0.24793744745506513 + ], + [ + 0.50377685464604771, + 0.27534467858084111 + ], + [ + 0.40979547921555132, + -0.87354103885453904 + ], + [ + -0.99235011788124194, + -0.8486239151255669 + ], + [ + -1.4311908773560886, + -0.11504762446315678 + ], + [ + 1.4785946267553578, + -0.65066022257784251 + ], + [ + -0.47480157720656735, + 0.09644531237731381 + ], + [ + -2.1794375743328542, + -0.84233746268252108 + ], + [ + 1.1101782208257609, + 1.0017617896845226 + ], + [ + 0.11419896582735879, + -0.2639149081336839 + ], + [ + 0.80432516515295871, + 1.2707905282780276 + ], + [ + 0.19902248103833883, + -0.59936584736639786 + ], + [ + 0.92597828524005954, + -0.22489320188794387 + ], + [ + -0.088727333990267651, + -0.67998892115370646 + ], + [ + 1.8520033385470844, + -0.22206836353309395 + ], + [ + -0.4828279072122445, + 0.067483912228601867 + ], + [ + -0.40816071089190326, + -0.81103914655746046 + ], + [ + -0.86401178129977596, + -0.76472826459382337 + ], + [ + -0.61302428779116813, + 1.1310824222520093 + ], + [ + -0.65991154639283667, + 0.21485087910052386 + ], + [ + -0.49791715552480392, + 0.44408443655113822 + ], + [ + -1.0492267346154001, + 0.50987611934150656 + ], + [ + -1.1562149108302007, + -0.50527730714086172 + ], + [ + 1.6940147339355371, + -0.60153875736691598 + ], + [ + -0.14012919277893718, + 0.14149123618650314 + ], + [ + 0.78745067934201285, + -1.0634598844052747 + ], + [ + -0.1998015474720331, + -0.81319634765656279 + ], + [ + 2.1428992452830786, + -0.62101854828573921 + ], + [ + 0.1267235727073461, + -0.040093384099933752 + ], + [ + 0.47775011857078031, + -0.71087817191621194 + ], + [ + 0.80438009742914285, + -0.74602546309607376 + ], + [ + -0.68070875667918207, + -0.89049991487907365 + ], + [ + 1.1113846017085027, + -1.3858166624886763 + ], + [ + 0.89372830255954416, + 0.17933403131655243 + ], + [ + -0.42615648456386629, + -0.38818370234181748 + ], + [ + -0.39302361226174787, + 0.10760031020823717 + ], + [ + -0.019854830480376041, + -0.7482579631181635 + ], + [ + 0.85283826130183538, + 1.8469428948997217 + ], + [ + -1.6414969720484809, + -0.5220809912665455 + ], + [ + 1.2794873049557611, + 0.56866326077848972 + ], + [ + 0.89304974398458514, + -0.83682069316650154 + ], + [ + 0.36894644108728508, + 2.7122618249565908 + ], + [ + -0.43386961706205135, + -0.21865003017375065 + ], + [ + -1.6885191310987748, + 1.797976857648826 + ], + [ + 0.08394375900139571, + -0.17878689217042129 + ], + [ + 0.31763523089072587, + 0.19666923738566897 + ], + [ + -0.52025063880369793, + 0.88015466944995036 + ], + [ + 0.26728720113124599, + -0.21922270979900474 + ], + [ + -0.44510128852844111, + -0.92139374907316141 + ], + [ + -0.16939981681572505, + -0.63915149367459856 + ], + [ + -0.94926523889940295, + -1.3123733609666077 + ], + [ + -1.4051014141151579, + 0.40607208688640134 + ], + [ + 0.046569046258715059, + -1.4049934406408175 + ], + [ + -1.0260618526705936, + 0.10936729210002812 + ] + ], + "diag_cov": true, + "kde_X_mean": [ + 2.9957584207719301, + 0.019682788619989001 + ], + "alpha": 0.5, + "kde_Y": [ + 36.318970486538532, + 27.156436109632285, + 44.104300127601832, + 20.906374218285425, + 22.630343438003468, + 31.436499618143849, + 18.327554665953208, + 24.882629805269445, + 10.005867304821107, + 44.612869506431871, + 8.2369520422874807, + 4.4258411409684415, + 29.817225179724069, + 19.808113508887143, + 53.405110448687509, + 14.787696033739161, + 48.110427760591946, + 25.347712878632457, + 42.850792751415376, + 10.277472920174112, + 34.942635588910235, + 28.777794596305082, + 26.735040880792411, + 2.5750920037104912, + 4.6252101350748758, + 11.970092721832399, + 28.844627460969019, + 5.7511352170743733, + 32.864318512398434, + 37.94930061055593, + 21.554230075429334, + 36.763318185972906, + 6.9888466541161263, + 51.075892975615439, + 30.156409927055517, + 25.098703864676665, + 46.163229132560076, + 3.7675019150115778, + 2.9817199994007968, + 33.530881436376937, + 34.056584450981234, + 46.329451189232586, + 13.601862347009982, + 18.404815232397624, + 23.154578887516351, + 31.209109656220932, + 35.712248883387439, + 51.952025929803007, + 27.702313291776335, + 30.815362103319487, + 42.276207617838878, + 12.901676060641908, + 47.659220353357448, + 6.5311852262994128, + 32.85646663506143, + 9.1377844621646958, + 2.9547885458147536, + 22.237700028345127, + 50.255558669184566, + 40.71006572976917, + 48.156075924185053, + 41.647740152114984, + 48.91547449236019, + 50.117926333323012, + 26.905207762568235, + 0.96014163572736, + 35.694384019624756, + 29.128444197896084, + 52.118601150653383, + 37.659086624866447, + 41.550537667738105, + 7.8743129306837449, + 23.226671189246812, + 13.640847308138333, + 26.163567656664892, + 18.010487446671885, + 27.56593806453014, + 35.51615815157637, + 21.87804068646189, + 33.519622478502683, + 27.81570830257531, + 40.732377140629957, + 14.055526826187277, + 25.977744220776081, + 41.388686765371254, + 2.1730641279468497, + 49.402769318945573, + 48.952562525729284, + 30.256190518857835, + 24.995925655838047, + 8.9286999792299877, + 2.4043964266893525, + 2.4061994874607362, + 8.8278348667784705, + 38.975464190971159, + 17.32191108530823, + 33.798474215344612, + 4.4746965487379429, + 44.293525328394118, + 20.332902656568287, + 33.125892038035033, + 45.55211791926223, + 21.395780940117294, + 11.048831967409411, + 30.006162363903865, + 17.603897285547035, + 53.802308782991901, + 10.669158851107733, + 34.138927923687525, + 35.178572022409064, + 41.858189930003064, + 6.0731632672868763, + 16.451301652182977, + 37.021115148382293, + 12.966786451342342, + 44.075372118213124, + 27.134826560911304, + 21.044854821193248, + 11.880698564104401, + 31.716982218316879, + 11.312885563038707, + 36.448921954121722, + 49.256578307416312, + 5.7186470370939357, + 1.1391502084171377, + 35.218142234230889, + 1.3651832022734713, + 9.7010608704578853, + 36.54045731554924, + 46.749956126358157, + 38.1511267207119, + 52.336408576445805, + 28.498518359344395, + 28.427185671981178, + 12.761072504244732, + 18.237057336187117, + 31.094984921991877, + 7.1403198776093539, + 30.449357048658342, + 46.663690304087616, + 23.062826727264085, + 40.953091491447381, + 42.610388997529753, + 36.136608325063733, + 42.916317068562179, + 36.604652738889357, + 17.629539639971775, + 36.393507752663218, + 34.096976796664187, + 17.505589494839374, + 20.937853649352487, + 4.801589087181358, + 27.776928459401464, + 37.158763959415104, + 12.333565863896998, + 25.831112800958056, + 3.3790007051316882, + 23.810819552767096, + 15.282875075720888, + 47.991201586853173, + 7.567359721507037, + 28.246425623625875, + 6.3250049785111626, + 50.122639738885745, + 37.546489837366487, + 4.6743659565154481, + 1.334811642185872, + 8.5822281243088412, + 27.080652616617392, + 26.205029357791613, + 6.1513623878398995, + 40.501966455492223, + 16.754849681184854, + 49.302131831619917, + 54.136073082975443, + 42.911536956317768, + 27.253993435857982, + 20.65272144681316, + 36.934670341483454, + 37.193970330584911, + 49.437541289784171, + 53.515432295954355, + 45.180965129437752, + 5.9934365367055058, + 19.119796764569958, + 12.311138069967445, + 50.497537844717677, + 7.3056063278438446, + 14.735622238442716, + 10.594010122769339, + 39.842235981384356, + 4.6057798497744109, + 28.406610107727087, + 41.692513885045699, + 20.535383730205719, + 7.1662491096656842, + 9.4787908910198837, + 23.874052737391036, + 49.096452798618287, + 43.167666736914356, + 46.636057452177738, + 7.6732097197512825, + 46.074077163914552, + 29.598315307380624, + 23.270131628764695, + 49.367168670506857, + 23.715149384449326, + 4.1916314225920717, + 23.576349579681434, + 19.70280880005631, + 52.2945186743001, + 20.405768336934262, + 22.720254954393329, + 24.145802413329864, + 11.84964537765825, + 39.539484885859636, + 37.733599205085341, + 51.053997612175877, + 25.931263716242245, + 28.425778128402811, + 54.17945326472514, + 31.455009939801428, + 27.554907433602942, + 29.325030195682345, + 33.458982936701126, + 13.941603707914556, + 25.818240243331292, + 25.400151954115472, + 23.96002858719147, + 28.09955615621557, + 20.34750454015823, + 43.177616280628698, + 6.0562815557575096, + 3.6424578178348872, + 13.048000875305942, + 1.3958633882817615, + 45.968840729564462, + 46.364603808713653, + 21.765726680883006, + 50.88966909711165, + 13.304780879188751, + 50.444765892945306, + 43.79716043372499, + 18.468446428343967, + 27.966315810131771, + 4.4041241319840614, + 13.611164117546664, + 21.960000694107702, + 21.893116842913731, + 35.708045029475286, + 12.311966287973945, + 20.311579292079678, + 39.224411810937319, + 28.972407670069799, + 52.270306120077713, + 40.659274526591226, + 23.426206565518353, + 46.409704080175089, + 53.875058899597271, + 11.786060345246657, + 6.8974528413201632, + 49.949102904440558, + 2.2049936543287072, + 6.1218798302751809, + 44.121101908321592, + 48.706992704816628, + 38.507369883912382, + 18.08802211311848, + 10.941345863599086, + 32.610047492688757, + 24.932505479161115, + 25.902716990349596, + 6.1519098738647946, + 7.2681955045018727, + 47.585076760329088, + 26.870630451540165, + 2.0187259819950505, + 14.409695086391228, + 3.8744839185939854, + 2.6733748799062345, + 36.483288912504925, + 30.402406466574252, + 19.747744909926094, + 45.810590164258251, + 0.4918131894553216, + 12.160438304835512, + 3.6855464274131333, + 13.947158360199692, + 37.658494523339492, + 7.1779887457608753, + 32.391483145757647, + 18.279580011454645, + 40.667208298297638, + 20.908180979923728, + 36.492655811303898, + 5.2108697266666377, + 23.433699037595087, + 49.714674937382213, + 51.926000869007183, + 9.5854401203683075, + 42.078704440240656, + 54.728899251409935, + 22.473538919249766, + 20.412077619987738, + 39.469240638845193, + 53.192387958519554, + 43.959606344234608, + 24.100694568585663, + 54.156010671020915, + 15.539692595380675, + 48.451154327842787, + 44.222463455358039, + 49.639143302426668, + 19.605903271753071, + 19.445619128101288, + 37.826871835312303, + 24.366281070413624, + 8.6820569640871277, + 19.901064419465005, + 54.344367574076408, + 33.540944063937673, + 40.138964768418546, + 45.426756447211957, + 22.591608917318336, + 28.205483725616276, + 47.60977731256957, + 14.858554090618405, + 24.321504052180057, + 8.0465022315402237, + 5.3910220846802019, + 20.264168924855099, + 49.178812116239222, + 34.337542777576672, + 25.305401880630072, + 19.52193976388514, + 17.333974381115247, + 38.695328201349781, + 20.723975513523481, + 0.51790893797721504, + 18.706032533850113, + 17.551372346853096, + 41.113762516379516, + 15.472876360693943, + 12.106791940310767, + 28.229871403909133, + 40.808954105418572, + 0.98581562201568285, + 21.193120258219082, + 32.72371437590418, + 40.114660215132858, + 9.894703927509255, + 21.186249879261322, + 26.550621232917731, + 17.249223087794302, + 51.931243477699105, + 3.1012528691074759, + 7.6565541953280913, + 6.3882413252737145, + 6.6841605299672429, + 2.3458891399033979, + 13.803932643561019, + 41.427414098762412, + 7.9289610363318195, + 47.942931482844642, + 31.880329145645604, + 53.406744622166457, + 24.080770514075237, + 26.08189868995288, + 7.2022533504867656, + 23.507975686568624, + 43.31066729720478, + 22.546334050275355, + 14.886956367995539, + 53.059365636019017, + 14.319739244332137, + 28.18855216191653, + 29.957873596755501, + 4.6893446999374575, + 20.568078873843689, + 29.505714400293606, + 18.331164407445002, + 39.944599090698823, + 49.534682202534512, + 27.139354081427271, + 30.503022840245738, + 51.685115674464363, + 40.343495090881838, + 7.9462389900928239, + 39.512336056484216, + 6.6479280586512184, + 6.8516222995283265, + 7.2244788461990135, + 35.100555489578923, + 23.883930340643943, + 47.126543954748037, + 43.920443319265502, + 52.864715544942548, + 29.309630207066867, + 31.585272902226436, + 19.824951061056488, + 28.951492081905062, + 15.960314724315921, + 28.417258597703491, + 51.611290406701102, + 30.877859753934626, + 34.154898938299603, + 43.086823898197991, + 49.515941894649927, + 38.49421596198242, + 8.0499374478947949, + 44.01632232432933, + 44.334475969320863, + 12.600114966165179, + 18.945317839357994, + 47.723104017194608, + 45.887103274052556, + 28.304859111653606, + 27.827527799906544, + 37.389405328917348, + 42.555858026597122, + 41.480434348353455, + 7.1475205146957199, + 32.093218120553651, + 40.279805008772826, + 34.666593541644097, + 50.069309426833158, + 41.450166915156927, + 5.8946481742637085, + 53.226465007624711, + 18.35635697042261, + 25.726539113550064, + 13.557948654420791, + 48.211056079146985, + 18.460514889565207, + 29.063286972621093, + 29.244042000507871, + 39.699730417236175, + 8.9925691662168674, + 29.753720882275417, + 47.922753477630245, + 22.536049965301647, + 18.843080689849778, + 18.557929836984989, + 47.584220212449438, + 45.59111571214796, + 7.1160446078449651, + 44.121003298579446, + 50.507389446016923, + 28.60321542949541, + 52.500286170273895, + 27.781838785522023, + 24.409007355395232, + 19.69678036516677, + 8.0622899032925535, + 40.032858770319756, + 6.7413031824492746, + 28.904598694887415, + 45.288748406785054, + 41.630748064963136, + 43.154188518346018, + 38.553782662529905, + 31.14454708688594, + 10.858084187496427, + 0.83525399858056149, + 11.995951336812285, + 26.355374998374362, + 47.874106987240438, + 29.092435490797275, + 54.439390771903867, + 51.419296955020698, + 12.971612180798248, + 34.918772522966236, + 30.304892756252062, + 52.461986134252584, + 32.756523932633336, + 24.87260103445481, + 28.085002704027723, + 0.71186213372331975, + 23.009384136567572, + 44.341788350103784, + 36.039580902547769, + 50.036742807998657, + 13.349795323688566, + 6.178356091658924, + 46.416830292535124, + 8.1065018623664624, + 29.171849064979327, + 15.829899003162184, + 2.9809134940834583, + 17.560477889703883, + 29.885175281442688, + 22.273107031154506, + 31.462782966292966, + 28.99492827934974, + 48.631378424321241, + 14.802538895222032, + 53.91370509811, + 28.40397492835525, + 15.763743077642754, + 26.407761744951291, + 43.507505733175165, + 20.134582810535282, + 11.584956103249869, + 33.41218691886062, + 41.715929719771594, + 0.70433048845115243, + 25.898479775404699, + 3.2254175689536089, + 36.417225827529307, + 12.165237542613809, + 45.19988129808538, + 39.331353771104695, + 2.5651199506199802, + 10.524033781175424, + 26.961468881952602, + 20.221448742854335, + 1.3525495124539006, + 35.53545043448208, + 39.614364443420143, + 6.5471898096765475, + 40.83852147947114, + 1.2429476090065579, + 41.932400240615443, + 51.995791309036328, + 44.979782293205794, + 2.8170111365178179, + 51.94612485916231, + 45.624188814993552, + 43.750987496496272, + 22.192523730935342, + 11.80792760475709, + 22.843178331351371, + 45.793692650595439, + 36.98140503277876, + 7.3119525891138055, + 51.869802620761781, + 19.61129384563678, + 5.9388898085491979, + 18.59813611638571, + 30.68932371883071, + 43.494633968476052, + 6.5378842946993849, + 4.6766598290442385, + 17.051372427736837, + 5.7150817396366298, + 22.31014956055197, + 30.716572551477846, + 30.591162526919753, + 21.549494920047024, + 31.70300128250436, + 44.956920984345203, + 2.254521828724164, + 35.751812940105765, + 43.327354987485492, + 43.281169018999826, + 54.143157868668212, + 13.782174372220251, + 44.154149545806675, + 15.41141491611647, + 5.524357952411898, + 11.816952102971555, + 14.667364354364452, + 9.3689027163595942, + 5.26473566772599, + 30.285267439026935, + 9.1474128634016516, + 32.842737779336716, + 26.173909905314726, + 8.0152064520270798, + 47.418743924113066, + 15.024682204338431, + 53.302421369937008, + 14.284718785302672, + 20.425272007043549, + 51.533579737753087, + 36.688272766519802, + 20.455766436624526, + 18.022133216129589, + 26.753188199109072, + 8.7516488087862196, + 5.4169648205461929, + 52.272828637859945, + 36.176670796491479, + 25.244594097404295, + 48.399345920959163, + 28.467787436462274, + 53.768549978621735, + 16.694722360432436, + 33.130789317828125, + 5.4991626777315021, + 21.959601260434304, + 50.220679851590532, + 33.312545294414861, + 5.5839547046289741, + 36.103240046435126, + 27.897649178242418, + 36.387346807282462, + 29.368943019396358, + 27.827671031426593, + 12.642062936813161, + 16.944270892290159, + 39.592960370982119, + 32.160579935067339, + 22.176525277698527, + 28.803387162119595, + 7.2153130240714525, + 25.39216033377485, + 44.018203151610422, + 27.985770094686007, + 39.707796480511753, + 5.8739178448004408, + 45.300201716707861, + 28.902869296601086, + 19.417118961211937, + 46.307896460139688, + 44.732853958246785, + 36.805143863194608, + 1.0403842268640591, + 29.880827918718367, + 3.9719542885717591, + 45.756034179211483, + 5.8318364619855618, + 8.3566351785194843, + 5.4204294314143313, + 31.666763266695806, + 41.027344674499545, + 36.64708467544181, + 8.5215988549035142, + 51.108665698028162, + 20.672472669506146, + 10.836509324668253, + 27.862490274279523, + 38.644107756259416, + 17.926873109491879, + 52.018178509635661, + 44.951959383379538, + 11.745308858925672, + 6.2753090554992035, + 10.402506666865762, + 12.85133627230554, + 52.200763230012633, + 29.277191657061977, + 20.748529946403281, + 45.409872870918299, + 34.498237160844901, + 38.811971945081709, + 1.0931221372973035, + 51.906552236311519, + 12.229311467810859, + 27.236337618558412, + 47.700895972576312, + 3.8792306110059283, + 46.012614525712294, + 9.8831595977644042, + 28.682090490778233, + 32.134629495505415, + 2.5091010910557654, + 44.008906725986357, + 43.888437976138427, + 8.6045394949823422, + 4.7367241805222937, + 54.589163976622295, + 41.379693382240241, + 29.699170081577005, + 50.114080482877533, + 35.019915932983508, + 23.214425302032065, + 31.712285813756985, + 12.422440989715579, + 32.526164468844911, + 51.848004613083575, + 32.458185143702664, + 40.258470287616305, + 27.582427939166038, + 24.409363859697496, + 32.640324830264412, + 10.640377804582986, + 20.806849107747183, + 11.860451219614809, + 27.016824132769475, + 31.082540304669205, + 20.852782654506381, + 29.099760975527136, + 33.125368921692484, + 26.282644448186829, + 27.06221231986023, + 34.200436325223407, + 32.913971233886578, + 8.5192972226808319, + 29.272174885994175, + 19.808120598057677, + 44.343097815181579, + 2.0686236754932161, + 31.031553067262308, + 31.283328018566962, + 48.289441645540457, + 50.159213666930768, + 6.9730002409391387, + 50.302964916197034, + 12.489518481327167, + 52.659867221402649, + 14.424768526076889, + 51.914845647183462, + 18.328440502701472, + 20.687721172687219, + 25.629438542278439, + 27.13783278567599, + 18.202979131485026, + 3.6245489273321585, + 47.06467986911661, + 1.0956640995328628, + 48.297724135862872, + 36.773822999433499, + 53.187017437395276, + 16.142969263985609, + 11.491116897431926, + 37.512082220523176, + 19.863975325619986, + 12.763600276582078, + 32.508842822816185, + 19.920404282668631, + 42.585193698095537, + 31.721204945799006, + 33.886220846571455, + 7.8621221015947356, + 42.186900473770685, + 29.1601992528417, + 48.013825541909661, + 7.3028846229521704, + 23.485913855780161, + 14.078026166392331, + 51.124299425207901, + 15.16114254724916, + 29.004797372725921, + 53.345202454194983, + 13.73489901709752, + 20.004714047539789, + 43.377446455439369, + 28.636981481605119, + 2.2962966249677401, + 26.180540624569243, + 16.181115761950863, + 34.694448691650074, + 46.773139689665527, + 53.006252954912021, + 49.175667584925655, + 50.582505810199223, + 39.456538457202726, + 13.131150815978327, + 38.428578539927933, + 28.532739729358497, + 27.480150231499032, + 45.658945067916797, + 9.8414778159534269, + 41.271097365154837, + 46.294024133656599, + 15.29981634560643, + 17.849744799794554, + 16.375945277520032, + 25.310891158156448, + 35.496702512632346, + 25.398163997851572, + 34.660244734153494, + 50.347114614737031, + 45.657629175232074, + 25.073916217891757, + 26.494155729887442, + 48.530635667399416, + 51.858880755762101, + 54.794098185085062, + 23.222271114501645, + 38.800355742946799, + 1.9789483863123571, + 35.010457211409538, + 52.773667038920891, + 26.502182568789642, + 10.122087898783139, + 2.3788103572937294, + 50.01342748433774, + 46.962323629006924, + 26.617425520714605, + 17.934737438945206, + 7.4812993026954997, + 23.104076456096635, + 40.149509050567559, + 40.771098461802332, + 46.723374899845972, + 52.635796956964541, + 44.172083659817019, + 48.579634680209686, + 24.347856994604054, + 39.434790898720955, + 41.573765938902454, + 21.026605024597043, + 3.9932827960797801, + 1.0533036636859447, + 41.82355614963339, + 29.343807949363171, + 33.506796570301731, + 24.536990689735092, + 12.759997635851883, + 51.372484494965725, + 19.66663385046856, + 38.060730249818164, + 16.592055826276749, + 21.938103060854161, + 22.780193705418771, + 31.219259930307274, + 33.511318723075853, + 35.636576316642845, + 11.235021378830382, + 48.047326057557967, + 24.284577297183393, + 47.569184979666282, + 44.884342057252411, + 46.283035604278183, + 12.824645414853348, + 22.541498469913247, + 45.861486835024714, + 52.694507448857586, + 4.6666355359449723, + 5.1611445243559118, + 31.900858964772265, + 42.67103286493542, + 26.047842958596643, + 39.351979877286261, + 23.044032671963386, + 28.343824330733181, + 19.946938676047807, + 39.247586667905445, + 21.073333877699426, + 46.760851341167395, + 29.013052631886257, + 55.042580872304796, + 40.885541602667914, + 18.145896800828897, + 24.675137405278139, + 9.3017621695631423, + 1.0733077242944951, + 52.887550316723278, + 5.7224566808089392, + 7.6960529523554788, + 9.5552186193791595, + 10.40559670302105, + 40.097720313781188, + 7.8563901317277347, + 30.35600628746154, + 23.299021977679555, + 23.776742908537543, + 41.031206447278578, + 25.42163817618184, + 48.19729227049028, + 15.290708710424536, + 35.333112182256265, + 29.084465651484177, + 38.198137681078045, + 25.124006920866719, + 40.927737008843806, + 33.170123192486578, + 6.6040121942653878, + 14.661859731972147, + 51.832485970238423, + 29.449770882028407, + 33.233422823071976, + 33.530017994606389, + 17.812913250567938, + 12.594319259034958, + 14.253989744087066, + 22.990516673628314, + 21.963071429637179, + 27.96050061636506, + 18.770001818209437, + 12.839330375167572, + 28.17229893397765, + 4.6667985098828693, + 31.342865368255325, + 28.766494302243771, + 50.734140498280354, + 50.970862539716585, + 28.587909248576455, + 34.755641269292028, + 27.903732791373844, + 22.427836463823169, + 42.157679244272472, + 46.731760693912491, + 47.176026657907826, + 13.450548450738633, + 8.1128913279853929, + 43.866693792689333, + 4.3394433300189323, + 18.983180617701212, + 44.547540210971071, + 50.919662642673735, + 26.324359939212492, + 37.327227097263304, + 41.294350655098846, + 19.072134306540487, + 27.918123581256179, + 39.225876918122701, + 28.551495618149172, + 12.769161714227161, + 9.6653161392732105, + 31.958550403262258, + 5.7404511944700154, + 11.222923666045629, + 47.804356789001716, + 0.57027547357606601, + 7.5153789194363965, + 36.260376481446194, + 16.720736992997807, + 43.908791998194147, + 3.5710106546605873, + 22.211432491073893, + 54.985592889771382, + 14.158579507562456, + 14.319189369670475, + 7.7996374807844049, + 16.284212380756816, + 52.644725301314423, + 34.620930269307401, + 11.603027699150203, + 41.329513686656405, + 23.893220540608787, + 3.35726337055902, + 23.092115453703997, + 42.91675627478088, + 22.703510332271698, + 18.512582138539187, + 5.8355763839843506, + 5.9658312232276325, + 2.42518569344475, + 22.117049709080668, + 31.359257689932228, + 29.568199358633507, + 9.094466539299555, + 29.619216870382324, + 43.578324363505843, + 22.066960771913884, + 19.852750460183696, + 53.579607372711664, + 2.3783433659767281, + 29.644875520377518, + 8.8027546924996685, + 36.791790214451979, + 36.454094739492099, + 50.588704800035238, + 19.370408581706556, + 34.971383532994309, + 46.158730733043924, + 33.709989490058035, + 19.638448901732374, + 21.052762214824543, + 34.997025092242289, + 4.9270640856981833, + 7.7683317737252393, + 50.566424908782459, + 7.3568951718136599, + 53.174811893116093, + 31.456130949649658, + 54.813499718710439, + 11.280591146127239, + 35.133817673925449, + 49.916080966325332, + 37.722830835505079, + 16.436101327031679, + 29.974271949367534, + 30.240331735694799, + 21.183672230077256, + 28.970994890540663, + 16.535206396309981, + 40.897340746796466, + 28.928573088106919, + 52.289039045227284, + 9.3571900179660084, + 46.612744837571363, + 47.995318271519757, + 38.336506498140558, + 41.166985213366388, + 9.6802631889116704, + 27.436112839496531, + 45.993712380390342, + 36.730619567706249, + 53.638757822070176, + 7.1762278004760258, + 17.209221569866042, + 13.799859459842168, + 33.779727721046328, + 2.996432239544859, + 41.371424000539982, + 2.8477112501289699, + 49.219046990937962, + 40.056090946982764, + 21.311370819047767, + 48.147130011209825, + 45.74857187216324, + 54.866374157734441, + 17.764577485033492, + 14.577875212950264, + 17.676516435232401, + 22.851717190124688 + ] +} \ No newline at end of file diff --git a/src/awkde/pyproject.toml b/src/awkde/pyproject.toml new file mode 100644 index 00000000..38a53fd1 --- /dev/null +++ b/src/awkde/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools>=42", "wheel", "pybind11"] +build-backend = "setuptools.build_meta" diff --git a/src/awkde/setup.py b/src/awkde/setup.py new file mode 100644 index 00000000..d77c9bfd --- /dev/null +++ b/src/awkde/setup.py @@ -0,0 +1,36 @@ +""" +Note: `pip install --user pybind11` mandatory. Did not really test if the +instal_requires and import workaround below works. If not, just install it +manually first. + +Credits: +- https://pybind11.readthedocs.io/en/latest/compiling.html +- https://github.com/pybind/python_example +""" + +from setuptools import setup, find_packages + +from pybind11.setup_helpers import Pybind11Extension, build_ext + + +ext_modules = [ + Pybind11Extension( + # Module name (toplevel same as python, then same as in C++ file) + name="awkde.backend", + sources=["cpp/backend.cpp"], + extra_compile_args=["-O3"], # "-ggdb" for debugging stuff + ), +] + +setup( + name="awkde", + version="0.1", + author="Thorben Menne", + author_email="thorben.menne@tu-dortmund.de", + url="https://github.com/mennthor/awkde", + description="Adaptive width gaussian KDE", + packages=find_packages(), + install_requires=["numpy", "scipy", "scikit-learn", "pybind11", "future"], + ext_modules=ext_modules, # Compiled external modules + cmdclass={"build_ext": build_ext}, # Finds highest supported C++ version +) diff --git a/src/awkde/tex/kernel_dens.png b/src/awkde/tex/kernel_dens.png new file mode 100644 index 0000000000000000000000000000000000000000..6affc9b73ab96262b0edc10b27255d55401d3812 GIT binary patch literal 23705 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 G@BRn5!1yo# literal 0 HcmV?d00001 diff --git a/src/awkde/tex/lambda.png b/src/awkde/tex/lambda.png new file mode 100644 index 0000000000000000000000000000000000000000..7e062ea8c018b12c4ca1dee41a80a9db2dea9eb0 GIT binary patch literal 16951 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%0DT-STae`qiC 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 literal 0 HcmV?d00001 diff --git a/src/awkde/tex/log_g.png b/src/awkde/tex/log_g.png new file mode 100644 index 0000000000000000000000000000000000000000..b6f01fd13f86f2b67fb20cfbdd5aa58efbc3fd12 GIT binary patch literal 17996 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 to5A?-4rzHMwD?$D{y#SM9pDM~_Zki9j Date: Wed, 30 Aug 2023 09:40:08 -0400 Subject: [PATCH 2/3] cleanup --- src/config/config.py | 2 +- src/script.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/config/config.py b/src/config/config.py index da4a07fc..d0e8184e 100644 --- a/src/config/config.py +++ b/src/config/config.py @@ -1,5 +1,5 @@ import os -FORCE_RELOAD = False +FORCE_RELOAD = True USE_CRS = "EPSG:2272" MAPBOX_TOKEN = os.environ.get("CFP_MAPBOX_TOKEN_UPLOADER") \ No newline at end of file diff --git a/src/script.py b/src/script.py index 04280f2c..c5e15ed0 100644 --- a/src/script.py +++ b/src/script.py @@ -57,6 +57,7 @@ """ Post to Mapbox """ +vacant_properties.drop_columns() vacant_properties.upload_to_mapbox('vacant_properties') # Clean up From 4740bb07f93163c5b195430f871e3b7301987b9a Mon Sep 17 00:00:00 2001 From: Brandon Cohen Date: Wed, 30 Aug 2023 10:21:29 -0400 Subject: [PATCH 3/3] black formatting --- src/classes/featurelayer.py | 23 +++++++++++------------ src/config/config.py | 2 +- src/data_utils/gun_crimes.py | 2 +- src/data_utils/rco_geoms.py | 6 ++++-- src/script.py | 2 +- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/classes/featurelayer.py b/src/classes/featurelayer.py index 3d62264e..2e42ad22 100644 --- a/src/classes/featurelayer.py +++ b/src/classes/featurelayer.py @@ -160,47 +160,46 @@ def spatial_join(self, other_layer, how="left", predicate="intersects"): def rebuild_gdf(self): self.gdf = gpd.GeoDataFrame(self.gdf, geometry="geometry") - def upload_to_mapbox(self, tileset_id): """Upload GeoDataFrame to Mapbox as Tileset.""" - + # Initialize Mapbox Uploader uploader = Uploader() uploader.session.params.update(access_token=MAPBOX_TOKEN) - # Reproject + # Reproject self.gdf_wm = self.gdf.to_crs(epsg=4326) # Convert to GeoJSON geojson_data = json.loads(self.gdf_wm.to_json()) # Save to a temporary file - with open('tmp/temp.geojson', 'w') as f: + with open("tmp/temp.geojson", "w") as f: json.dump(geojson_data, f) # Stage the data on S3 - print('Beginning Mapbox upload.') - s3_url = uploader.stage(open('tmp/temp.geojson', 'rb')) + print("Beginning Mapbox upload.") + s3_url = uploader.stage(open("tmp/temp.geojson", "rb")) # Create Tileset response = uploader.create(s3_url, tileset_id) - print('Uploaded gdf tileset to Mapbox.') + print("Uploaded gdf tileset to Mapbox.") return response - + def drop_columns(self): - ''' + """ Method to clean up the database by dropping columns that are not needed. Ideally we'll do this in each data_utils file, but for now we'll do it here. - ''' + """ columns = [ "OBJECTID_left", "Shape__Area_left", "Shape__Length_left", - "OBJECTID_right", + "OBJECTID_right", "Shape__Area_right", "Shape__Length_right", "MAPREG_1", ] - self.gdf.drop(columns=columns, inplace=True) \ No newline at end of file + self.gdf.drop(columns=columns, inplace=True) diff --git a/src/config/config.py b/src/config/config.py index d0e8184e..0a027bd0 100644 --- a/src/config/config.py +++ b/src/config/config.py @@ -2,4 +2,4 @@ FORCE_RELOAD = True USE_CRS = "EPSG:2272" -MAPBOX_TOKEN = os.environ.get("CFP_MAPBOX_TOKEN_UPLOADER") \ No newline at end of file +MAPBOX_TOKEN = os.environ.get("CFP_MAPBOX_TOKEN_UPLOADER") diff --git a/src/data_utils/gun_crimes.py b/src/data_utils/gun_crimes.py index eb597b22..47115196 100644 --- a/src/data_utils/gun_crimes.py +++ b/src/data_utils/gun_crimes.py @@ -33,7 +33,7 @@ def gun_crimes(primary_featurelayer): grid_points = np.array([xx.ravel(), yy.ravel()]).T # Compute adaptive KDE values - print('fitting KDE for gun crime data') + print("fitting KDE for gun crime data") kde = GaussianKDE(glob_bw="silverman", alpha=0.999, diag_cov=True) kde.fit(X) diff --git a/src/data_utils/rco_geoms.py b/src/data_utils/rco_geoms.py index fbc7d3d0..c81c48f3 100644 --- a/src/data_utils/rco_geoms.py +++ b/src/data_utils/rco_geoms.py @@ -12,8 +12,10 @@ def rco_geoms(primary_featurelayer): "PRIMARY_PHONE", ] - rco_geoms.gdf["rco_info"] = rco_geoms.gdf[rco_aggregate_cols].apply(lambda x: "; ".join(map(str, x)), axis=1) - + rco_geoms.gdf["rco_info"] = rco_geoms.gdf[rco_aggregate_cols].apply( + lambda x: "; ".join(map(str, x)), axis=1 + ) + rco_geoms.gdf = rco_geoms.gdf[["rco_info", "geometry"]] rco_geoms.rebuild_gdf() diff --git a/src/script.py b/src/script.py index c5e15ed0..35b657db 100644 --- a/src/script.py +++ b/src/script.py @@ -58,7 +58,7 @@ Post to Mapbox """ vacant_properties.drop_columns() -vacant_properties.upload_to_mapbox('vacant_properties') +vacant_properties.upload_to_mapbox("vacant_properties") # Clean up vacant_properties.gdf.to_postgis(