diff --git a/.github/workflows/build_one.yml b/.github/workflows/build_one.yml index 0e0203905..2faa97aaf 100644 --- a/.github/workflows/build_one.yml +++ b/.github/workflows/build_one.yml @@ -120,7 +120,7 @@ jobs: git add ./doc/$DIR git commit -m "adding $DIR" git push --force "https://pyviz-developers:${{ secrets.GITHUB_TOKEN }}@github.com/holoviz-topics/examples.git" HEAD:$BRANCHNAME - git checkout - + git checkout @{-1} - name: clean up run: doit clean --clean-dep build:${{ inputs.project }} - name: git diff diff --git a/attractors/anaconda-project-lock.yml b/attractors/anaconda-project-lock.yml index 1e3f00002..d615e8646 100644 --- a/attractors/anaconda-project-lock.yml +++ b/attractors/anaconda-project-lock.yml @@ -15,662 +15,619 @@ locking_enabled: true # A key goes in here for each env spec. # env_specs: - test: - locked: true - env_spec_hash: f4754db9d2eb2686248ed993d9d52f6117c02b5a - platforms: - - linux-64 - - osx-64 - - win-64 - packages: - all: - - async_generator=1.10=py37h28b3542_0 - - atomicwrites=1.4.0=py_0 - - attrs=21.2.0=pyhd3eb1b0_0 - - backcall=0.2.0=pyhd3eb1b0_0 - - beautifulsoup4=4.9.3=pyha847dfd_0 - - blas=1.0=mkl - - bleach=3.3.0=pyhd3eb1b0_0 - - click=8.0.1=pyhd3eb1b0_0 - - cloudpickle=1.6.0=py_0 - - colorcet=2.0.6=py_0 - - cycler=0.10.0=py37_0 - - dask-core=2021.7.0=pyhd3eb1b0_0 - - dask=2021.7.0=pyhd3eb1b0_0 - - datashader=0.13.0=py_0 - - decorator=5.0.9=pyhd3eb1b0_0 - - defusedxml=0.7.1=pyhd3eb1b0_0 - - entrypoints=0.3=py37_0 - - fsspec=2021.6.0=pyhd3eb1b0_0 - - heapdict=1.0.1=py_0 - - holoviews=1.14.4=py_0 - - idna=2.10=pyhd3eb1b0_0 - - importlib_metadata=3.10.0=hd3eb1b0_0 - - ipykernel=5.3.4=py37h5ca1d4c_0 - - ipython_genutils=0.2.0=pyhd3eb1b0_1 - - jedi=0.17.0=py37_0 - - jinja2=3.0.1=pyhd3eb1b0_0 - - jsonschema=3.2.0=py_2 - - jupyter_client=6.1.12=pyhd3eb1b0_0 - - jupyterlab_pygments=0.1.2=py_0 - - more-itertools=8.8.0=pyhd3eb1b0_0 - - multipledispatch=0.6.0=py37_0 - - nbclient=0.5.3=pyhd3eb1b0_0 - - nbformat=5.1.3=pyhd3eb1b0_0 - - nbsmoke=0.2.8=py_0 - - nest-asyncio=1.5.1=pyhd3eb1b0_0 - - olefile=0.46=py37_0 - - packaging=21.0=pyhd3eb1b0_0 - - panel=0.11.3=py_0 - - param=1.11.1=py_0 - - parso=0.8.2=pyhd3eb1b0_0 - - partd=1.2.0=pyhd3eb1b0_0 - - pickleshare=0.7.5=pyhd3eb1b0_1003 - - prometheus_client=0.11.0=pyhd3eb1b0_0 - - prompt-toolkit=3.0.17=pyh06a4308_0 - - py=1.10.0=pyhd3eb1b0_0 - - pycparser=2.20=py_2 - - pyct-core=0.4.8=py_0 - - pyct=0.4.8=py_0 - - pyflakes=2.3.1=pyhd3eb1b0_0 - - pygments=2.9.0=pyhd3eb1b0_0 - - pyopenssl=20.0.1=pyhd3eb1b0_1 - - pyparsing=2.4.7=pyhd3eb1b0_0 - - pytest=4.4.1=py37_0 - - python-dateutil=2.8.2=pyhd3eb1b0_0 - - pytz=2021.1=pyhd3eb1b0_0 - - pyviz_comms=2.1.0=py_0 - - requests=2.25.1=pyhd3eb1b0_0 - - send2trash=1.5.0=pyhd3eb1b0_1 - - six=1.16.0=pyhd3eb1b0_0 - - sortedcontainers=2.4.0=pyhd3eb1b0_0 - - soupsieve=2.2.1=pyhd3eb1b0_0 - - tblib=1.7.0=py_0 - - testpath=0.5.0=pyhd3eb1b0_0 - - toolz=0.11.1=pyhd3eb1b0_0 - - tqdm=4.61.2=pyhd3eb1b0_1 - - traitlets=5.0.5=pyhd3eb1b0_0 - - typing-extensions=3.10.0.0=hd3eb1b0_0 - - typing_extensions=3.10.0.0=pyh06a4308_0 - - urllib3=1.26.6=pyhd3eb1b0_1 - - wcwidth=0.2.5=py_0 - - webencodings=0.5.1=py37_1 - - wheel=0.36.2=pyhd3eb1b0_0 - - xarray=0.18.2=pyhd3eb1b0_1 - - zict=2.0.0=pyhd3eb1b0_0 - - zipp=3.5.0=pyhd3eb1b0_0 - unix: - - pexpect=4.8.0=pyhd3eb1b0_3 - - ptyprocess=0.7.0=pyhd3eb1b0_2 - linux-64: - - _libgcc_mutex=0.1=main - - argon2-cffi=20.1.0=py37h27cfd23_1 - - bokeh=2.3.3=py37h06a4308_0 - - brotlipy=0.7.0=py37h27cfd23_1003 - - ca-certificates=2021.7.5=h06a4308_1 - - certifi=2021.5.30=py37h06a4308_0 - - cffi=1.14.6=py37h400218f_0 - - chardet=4.0.0=py37h06a4308_1003 - - cryptography=3.4.7=py37hd23ed53_0 - - cytoolz=0.11.0=py37h7b6447c_0 - - datashape=0.5.4=py37h06a4308_1 - - dbus=1.13.18=hb2f20db_0 - - distributed=2021.7.0=py37h06a4308_0 - - expat=2.4.1=h2531618_2 - - fontconfig=2.13.1=h6c09931_0 - - freetype=2.10.4=h5ab3b9f_0 - - glib=2.69.0=h5202010_0 - - gst-plugins-base=1.14.0=h8213a91_2 - - gstreamer=1.14.0=h28cd5cc_2 - - icu=58.2=he6710b0_3 - - importlib-metadata=3.10.0=py37h06a4308_0 - - intel-openmp=2021.3.0=h06a4308_3350 - - ipython=7.22.0=py37hb070fc8_0 - - jpeg=9b=h024ee3a_2 - - jupyter_core=4.7.1=py37h06a4308_0 - - kiwisolver=1.3.1=py37h2531618_0 - - lcms2=2.12=h3be6417_0 - - ld_impl_linux-64=2.35.1=h7274673_9 - - libffi=3.3=he6710b0_2 - - libgcc-ng=9.1.0=hdf63c60_0 - - libgfortran-ng=7.3.0=hdf63c60_0 - - libllvm10=10.0.1=hbcb73fb_5 - - libpng=1.6.37=hbc83047_0 - - libsodium=1.0.18=h7b6447c_0 - - libstdcxx-ng=9.1.0=hdf63c60_0 - - libtiff=4.2.0=h85742a9_0 - - libuuid=1.0.3=h1bed415_2 - - libwebp-base=1.2.0=h27cfd23_0 - - libxcb=1.14=h7b6447c_0 - - libxml2=2.9.10=hb55368b_3 - - llvmlite=0.36.0=py37h612dafd_4 - - locket=0.2.1=py37h06a4308_1 - - lz4-c=1.9.3=h2531618_0 - - markdown=3.3.4=py37h06a4308_0 - - markupsafe=2.0.1=py37h27cfd23_0 - - matplotlib-base=3.3.4=py37h62a2d02_0 - - matplotlib=3.3.4=py37h06a4308_0 - - mistune=0.8.4=py37h14c3975_1001 - - mkl-service=2.4.0=py37h7f8727e_0 - - mkl=2021.3.0=h06a4308_520 - - mkl_fft=1.3.0=py37h42c9631_2 - - mkl_random=1.2.2=py37h51133e4_0 - - msgpack-python=1.0.2=py37hff7bd54_1 - - nbconvert=6.1.0=py37h06a4308_0 - - ncurses=6.2=he6710b0_1 - - notebook=6.4.0=py37h06a4308_0 - - numba=0.53.1=py37ha9443f7_0 - - numpy-base=1.20.3=py37h74d4b33_0 - - numpy=1.20.3=py37hf144106_0 - - openjpeg=2.3.0=h05c96fa_1 - - openssl=1.1.1k=h27cfd23_0 - - pandas=1.2.5=py37h295c915_0 - - pandocfilters=1.4.3=py37h06a4308_1 - - pcre=8.45=h295c915_0 - - pillow=8.3.1=py37h2c7a002_0 - - pip=21.1.3=py37h06a4308_0 - - pluggy=0.13.1=py37h06a4308_0 - - psutil=5.8.0=py37h27cfd23_1 - - pyqt=5.9.2=py37h05f1152_2 - - pyrsistent=0.17.3=py37h7b6447c_0 - - pysocks=1.7.1=py37_1 - - python=3.7.10=h12debd9_4 - - pyyaml=5.4.1=py37h27cfd23_1 - - pyzmq=20.0.0=py37h2531618_1 - - qt=5.9.7=h5867ecd_1 - - readline=8.1=h27cfd23_0 - - scipy=1.6.2=py37had2a1c9_1 - - setuptools=52.0.0=py37h06a4308_0 - - sip=4.19.8=py37hf484d3e_0 - - sqlite=3.36.0=hc218d9a_0 - - tbb=2020.3=hfd86e86_0 - - terminado=0.9.4=py37h06a4308_0 - - tk=8.6.10=hbc83047_0 - - tornado=6.1=py37h27cfd23_0 - - xz=5.2.5=h7b6447c_0 - - yaml=0.2.5=h7b6447c_0 - - zeromq=4.3.4=h2531618_0 - - zlib=1.2.11=h7b6447c_3 - - zstd=1.4.9=haebb681_0 - osx-64: - - appnope=0.1.2=py37hecd8cb5_1001 - - argon2-cffi=20.1.0=py37h9ed2024_1 - - bokeh=2.3.3=py37hecd8cb5_0 - - brotlipy=0.7.0=py37h9ed2024_1003 - - ca-certificates=2021.7.5=hecd8cb5_1 - - certifi=2021.5.30=py37hecd8cb5_0 - - cffi=1.14.6=py37h2125817_0 - - chardet=4.0.0=py37hecd8cb5_1003 - - cryptography=3.4.7=py37h2fd3fbb_0 - - cytoolz=0.11.0=py37haf1e3a3_0 - - datashape=0.5.4=py37hecd8cb5_1 - - distributed=2021.7.0=py37hecd8cb5_0 - - freetype=2.10.4=ha233b18_0 - - importlib-metadata=3.10.0=py37hecd8cb5_0 - - intel-openmp=2021.3.0=hecd8cb5_3375 - - ipython=7.22.0=py37h01d92e1_0 - - jpeg=9b=he5867d9_2 - - jupyter_core=4.7.1=py37hecd8cb5_0 - - kiwisolver=1.3.1=py37h23ab428_0 - - lcms2=2.12=hf1fd2bf_0 - - libcxx=10.0.0=1 - - libffi=3.3=hb1e8313_2 - - libgfortran=3.0.1=h93005f0_2 - - libllvm10=10.0.1=h76017ad_5 - - libpng=1.6.37=ha441bb4_0 - - libsodium=1.0.18=h1de35cc_0 - - libtiff=4.2.0=h87d7836_0 - - libwebp-base=1.2.0=h9ed2024_0 - - llvm-openmp=10.0.0=h28b9765_0 - - llvmlite=0.36.0=py37he4411ff_4 - - locket=0.2.1=py37hecd8cb5_1 - - lz4-c=1.9.3=h23ab428_0 - - markdown=3.3.4=py37hecd8cb5_0 - - markupsafe=2.0.1=py37h9ed2024_0 - - matplotlib-base=3.3.4=py37h8b3ea08_0 - - matplotlib=3.3.4=py37hecd8cb5_0 - - mistune=0.8.4=py37h1de35cc_0 - - mkl-service=2.4.0=py37h9ed2024_0 - - mkl=2021.3.0=hecd8cb5_517 - - mkl_fft=1.3.0=py37h4a7008c_2 - - mkl_random=1.2.2=py37hb2f4e1b_0 - - msgpack-python=1.0.2=py37hf7b0b51_1 - - nbconvert=6.1.0=py37hecd8cb5_0 - - ncurses=6.2=h0a44026_1 - - notebook=6.4.0=py37hecd8cb5_0 - - numba=0.53.1=py37hb2f4e1b_0 - - numpy-base=1.20.3=py37he0bd621_0 - - numpy=1.20.3=py37h4b4dc7a_0 - - openjpeg=2.3.0=hb95cd4c_1 - - openssl=1.1.1k=h9ed2024_0 - - pandas=1.2.5=py37h23ab428_0 - - pandocfilters=1.4.3=py37hecd8cb5_1 - - pillow=8.3.1=py37ha4cf6ea_0 - - pip=21.1.3=py37hecd8cb5_0 - - pluggy=0.13.1=py37hecd8cb5_0 - - psutil=5.8.0=py37h9ed2024_1 - - pyrsistent=0.17.3=py37haf1e3a3_0 - - pysocks=1.7.1=py37hecd8cb5_0 - - python=3.7.10=h88f2d9e_0 - - pyyaml=5.4.1=py37h9ed2024_1 - - pyzmq=20.0.0=py37h23ab428_1 - - readline=8.1=h9ed2024_0 - - scipy=1.6.2=py37hd5f7400_1 - - setuptools=52.0.0=py37hecd8cb5_0 - - sqlite=3.36.0=hce871da_0 - - tbb=2020.3=h879752b_0 - - terminado=0.9.4=py37hecd8cb5_0 - - tk=8.6.10=hb0a8c7a_0 - - tornado=6.1=py37h9ed2024_0 - - xz=5.2.5=h1de35cc_0 - - yaml=0.2.5=haf1e3a3_0 - - zeromq=4.3.4=h23ab428_0 - - zlib=1.2.11=h1de35cc_3 - - zstd=1.4.9=h322a384_0 - win-64: - - argon2-cffi=20.1.0=py37h2bbff1b_1 - - bokeh=2.3.3=py37haa95532_0 - - brotlipy=0.7.0=py37h2bbff1b_1003 - - ca-certificates=2021.7.5=haa95532_1 - - certifi=2021.5.30=py37haa95532_0 - - cffi=1.14.6=py37h2bbff1b_0 - - chardet=4.0.0=py37haa95532_1003 - - colorama=0.4.4=pyhd3eb1b0_0 - - cryptography=3.4.7=py37h71e12ea_0 - - cytoolz=0.11.0=py37he774522_0 - - datashape=0.5.4=py37haa95532_1 - - distributed=2021.7.0=py37haa95532_0 - - freetype=2.10.4=hd328e21_0 - - icc_rt=2019.0.0=h0cc432a_1 - - icu=58.2=ha925a31_3 - - importlib-metadata=3.10.0=py37haa95532_0 - - intel-openmp=2021.3.0=haa95532_3372 - - ipython=7.22.0=py37hd4e2768_0 - - jpeg=9b=hb83a4c4_2 - - jupyter_core=4.7.1=py37haa95532_0 - - kiwisolver=1.3.1=py37hd77b12b_0 - - libpng=1.6.37=h2a8f88b_0 - - libsodium=1.0.18=h62dcd97_0 - - libtiff=4.2.0=hd0e1b90_0 - - llvmlite=0.36.0=py37h34b8924_4 - - locket=0.2.1=py37haa95532_1 - - lz4-c=1.9.3=h2bbff1b_0 - - m2w64-gcc-libgfortran=5.3.0=6 - - m2w64-gcc-libs-core=5.3.0=7 - - m2w64-gcc-libs=5.3.0=7 - - m2w64-gmp=6.1.0=2 - - m2w64-libwinpthread-git=5.0.0.4634.697f757=2 - - markdown=3.3.4=py37haa95532_0 - - markupsafe=2.0.1=py37h2bbff1b_0 - - matplotlib-base=3.3.4=py37h49ac443_0 - - matplotlib=3.3.4=py37haa95532_0 - - mistune=0.8.4=py37hfa6e2cd_1001 - - mkl-service=2.4.0=py37h2bbff1b_0 - - mkl=2021.3.0=haa95532_524 - - mkl_fft=1.3.0=py37h277e83a_2 - - mkl_random=1.2.2=py37hf11a4ad_0 - - msgpack-python=1.0.2=py37h59b6b97_1 - - msys2-conda-epoch=20160418=1 - - nbconvert=6.1.0=py37haa95532_0 - - notebook=6.4.0=py37haa95532_0 - - numba=0.53.1=py37hf11a4ad_0 - - numpy-base=1.20.3=py37hc2deb75_0 - - numpy=1.20.3=py37ha4e8547_0 - - openssl=1.1.1k=h2bbff1b_0 - - pandas=1.2.5=py37hd77b12b_0 - - pandocfilters=1.4.3=py37haa95532_1 - - pillow=8.3.1=py37h4fa10fc_0 - - pip=21.1.3=py37haa95532_0 - - pluggy=0.13.1=py37haa95532_0 - - psutil=5.8.0=py37h2bbff1b_1 - - pyqt=5.9.2=py37h6538335_2 - - pyrsistent=0.17.3=py37he774522_0 - - pysocks=1.7.1=py37_1 - - python=3.7.10=h6244533_0 - - pywin32=227=py37he774522_1 - - pywinpty=0.5.7=py37_0 - - pyyaml=5.4.1=py37h2bbff1b_1 - - pyzmq=20.0.0=py37hd77b12b_1 - - qt=5.9.7=vc14h73c81de_0 - - scipy=1.6.2=py37h66253e8_1 - - setuptools=52.0.0=py37haa95532_0 - - sip=4.19.8=py37h6538335_0 - - sqlite=3.36.0=h2bbff1b_0 - - tbb=2020.3=h74a9793_0 - - terminado=0.9.4=py37haa95532_0 - - tk=8.6.10=he774522_0 - - tornado=6.1=py37h2bbff1b_0 - - vc=14.2=h21ff451_1 - - vs2015_runtime=14.27.29016=h5e58377_2 - - win_inet_pton=1.1.0=py37haa95532_0 - - wincertstore=0.2=py37_0 - - winpty=0.4.3=4 - - xz=5.2.5=h62dcd97_0 - - yaml=0.2.5=he774522_0 - - zeromq=4.3.3=ha925a31_3 - - zlib=1.2.11=h62dcd97_4 - - zstd=1.4.9=h19a0ad4_0 default: locked: true - env_spec_hash: bb8dcb1b584f9f91982a5532713fee39e24d44b4 + env_spec_hash: f164fa9c78ca498fe93cd8e5fe4ca75ce3d49a53 platforms: - linux-64 - osx-64 + - osx-arm64 - win-64 packages: all: - - async_generator=1.10=py37h28b3542_0 - - attrs=21.2.0=pyhd3eb1b0_0 + - argon2-cffi=21.3.0=pyhd3eb1b0_0 + - asttokens=2.0.5=pyhd3eb1b0_0 - backcall=0.2.0=pyhd3eb1b0_0 - - blas=1.0=mkl - - bleach=3.3.0=pyhd3eb1b0_0 - - click=8.0.1=pyhd3eb1b0_0 - - cloudpickle=1.6.0=py_0 - - colorcet=2.0.6=py_0 - - cycler=0.10.0=py37_0 - - dask-core=2021.7.0=pyhd3eb1b0_0 - - dask=2021.7.0=pyhd3eb1b0_0 - - datashader=0.13.0=py_0 - - decorator=5.0.9=pyhd3eb1b0_0 + - bleach=4.1.0=pyhd3eb1b0_0 + - charset-normalizer=2.0.4=pyhd3eb1b0_0 + - colorcet=3.0.1=py_0 + - cycler=0.11.0=pyhd3eb1b0_0 + - datashader=0.15.2=py_0 + - decorator=5.1.1=pyhd3eb1b0_0 - defusedxml=0.7.1=pyhd3eb1b0_0 - - entrypoints=0.3=py37_0 - - fsspec=2021.6.0=pyhd3eb1b0_0 - - heapdict=1.0.1=py_0 - - holoviews=1.14.4=py_0 - - idna=2.10=pyhd3eb1b0_0 - - importlib_metadata=3.10.0=hd3eb1b0_0 - - ipykernel=5.3.4=py37h5ca1d4c_0 + - executing=0.8.3=pyhd3eb1b0_0 + - fonttools=4.25.0=pyhd3eb1b0_0 + - holoviews=1.17.1=py_0 - ipython_genutils=0.2.0=pyhd3eb1b0_1 - - jedi=0.17.0=py37_0 - - jinja2=3.0.1=pyhd3eb1b0_0 - - jsonschema=3.2.0=py_2 - - jupyter_client=6.1.12=pyhd3eb1b0_0 - jupyterlab_pygments=0.1.2=py_0 - - multipledispatch=0.6.0=py37_0 - - nbclient=0.5.3=pyhd3eb1b0_0 - - nbformat=5.1.3=pyhd3eb1b0_0 - - nest-asyncio=1.5.1=pyhd3eb1b0_0 - - olefile=0.46=py37_0 - - packaging=21.0=pyhd3eb1b0_0 - - panel=0.11.3=py_0 - - param=1.11.1=py_0 - - parso=0.8.2=pyhd3eb1b0_0 - - partd=1.2.0=pyhd3eb1b0_0 + - munkres=1.1.4=py_0 + - pandocfilters=1.5.0=pyhd3eb1b0_0 + - panel=0.14.4=py_0 + - param=1.13.0=py_0 + - parso=0.8.3=pyhd3eb1b0_0 - pickleshare=0.7.5=pyhd3eb1b0_1003 - - prometheus_client=0.11.0=pyhd3eb1b0_0 - - prompt-toolkit=3.0.17=pyh06a4308_0 - - pycparser=2.20=py_2 - - pyct-core=0.4.8=py_0 - - pyct=0.4.8=py_0 - - pygments=2.9.0=pyhd3eb1b0_0 - - pyopenssl=20.0.1=pyhd3eb1b0_1 - - pyparsing=2.4.7=pyhd3eb1b0_0 + - pure_eval=0.2.2=pyhd3eb1b0_0 + - pycparser=2.21=pyhd3eb1b0_0 + - pyct-core=0.5.0=py_0 + - pyct=0.5.0=py_0 - python-dateutil=2.8.2=pyhd3eb1b0_0 - - pytz=2021.1=pyhd3eb1b0_0 - - pyviz_comms=2.1.0=py_0 - - requests=2.25.1=pyhd3eb1b0_0 - - send2trash=1.5.0=pyhd3eb1b0_1 - - six=1.16.0=pyhd3eb1b0_0 - - sortedcontainers=2.4.0=pyhd3eb1b0_0 - - tblib=1.7.0=py_0 - - testpath=0.5.0=pyhd3eb1b0_0 - - toolz=0.11.1=pyhd3eb1b0_0 - - tqdm=4.61.2=pyhd3eb1b0_1 - - traitlets=5.0.5=pyhd3eb1b0_0 - - typing-extensions=3.10.0.0=hd3eb1b0_0 - - typing_extensions=3.10.0.0=pyh06a4308_0 - - urllib3=1.26.6=pyhd3eb1b0_1 - - wcwidth=0.2.5=py_0 - - webencodings=0.5.1=py37_1 - - wheel=0.36.2=pyhd3eb1b0_0 - - xarray=0.18.2=pyhd3eb1b0_1 - - zict=2.0.0=pyhd3eb1b0_0 - - zipp=3.5.0=pyhd3eb1b0_0 + - pyviz_comms=2.3.2=py_0 + - send2trash=1.8.0=pyhd3eb1b0_1 + - six=1.16.0=pyhd3eb1b0_1 + - stack_data=0.2.0=pyhd3eb1b0_0 + - tzdata=2023c=h04d1e81_0 + - wcwidth=0.2.5=pyhd3eb1b0_0 unix: - pexpect=4.8.0=pyhd3eb1b0_3 - ptyprocess=0.7.0=pyhd3eb1b0_2 + osx: + - importlib_resources=5.2.0=pyhd3eb1b0_1 + - python-tzdata=2023.3=pyhd3eb1b0_0 linux-64: - _libgcc_mutex=0.1=main - - argon2-cffi=20.1.0=py37h27cfd23_1 - - bokeh=2.3.3=py37h06a4308_0 - - brotlipy=0.7.0=py37h27cfd23_1003 - - ca-certificates=2021.7.5=h06a4308_1 - - certifi=2021.5.30=py37h06a4308_0 - - cffi=1.14.6=py37h400218f_0 - - chardet=4.0.0=py37h06a4308_1003 - - cryptography=3.4.7=py37hd23ed53_0 - - cytoolz=0.11.0=py37h7b6447c_0 - - datashape=0.5.4=py37h06a4308_1 + - _openmp_mutex=5.1=1_gnu + - anyio=3.5.0=py39h06a4308_0 + - argon2-cffi-bindings=21.2.0=py39h7f8727e_0 + - attrs=23.1.0=py39h06a4308_0 + - beautifulsoup4=4.12.2=py39h06a4308_0 + - blas=1.0=mkl + - bokeh=2.4.3=py39h06a4308_0 + - bottleneck=1.3.4=py39hce1f21e_0 + - brotli=1.0.9=he6710b0_2 + - brotlipy=0.7.0=py39h27cfd23_1003 + - ca-certificates=2023.08.22=h06a4308_0 + - certifi=2023.7.22=py39h06a4308_0 + - cffi=1.15.0=py39hd667e15_1 + - click=8.0.4=py39h06a4308_0 + - cloudpickle=2.2.1=py39h06a4308_0 + - comm=0.1.2=py39h06a4308_0 + - cryptography=41.0.3=py39h130f0dd_0 + - dask-core=2023.6.0=py39h06a4308_0 + - datashape=0.5.4=py39h06a4308_1 - dbus=1.13.18=hb2f20db_0 - - distributed=2021.7.0=py37h06a4308_0 - - expat=2.4.1=h2531618_2 + - debugpy=1.5.1=py39h295c915_0 + - entrypoints=0.4=py39h06a4308_0 + - exceptiongroup=1.0.4=py39h06a4308_0 + - expat=2.4.4=h295c915_0 - fontconfig=2.13.1=h6c09931_0 - - freetype=2.10.4=h5ab3b9f_0 - - glib=2.69.0=h5202010_0 + - freetype=2.11.0=h70c0345_0 + - fsspec=2023.9.2=py39h06a4308_0 + - giflib=5.2.1=h7b6447c_0 + - glib=2.69.1=h4ff587b_1 - gst-plugins-base=1.14.0=h8213a91_2 - gstreamer=1.14.0=h28cd5cc_2 - icu=58.2=he6710b0_3 - - importlib-metadata=3.10.0=py37h06a4308_0 - - intel-openmp=2021.3.0=h06a4308_3350 - - ipython=7.22.0=py37hb070fc8_0 - - jpeg=9b=h024ee3a_2 - - jupyter_core=4.7.1=py37h06a4308_0 - - kiwisolver=1.3.1=py37h2531618_0 + - idna=3.4=py39h06a4308_0 + - importlib-metadata=6.0.0=py39h06a4308_0 + - intel-openmp=2021.4.0=h06a4308_3561 + - ipykernel=6.19.2=py39hb070fc8_0 + - ipython=8.15.0=py39h06a4308_0 + - jedi=0.18.1=py39h06a4308_1 + - jinja2=3.1.2=py39h06a4308_0 + - jpeg=9e=h7f8727e_0 + - jsonschema=4.17.3=py39h06a4308_0 + - jupyter_client=7.2.2=py39h06a4308_0 + - jupyter_core=5.3.0=py39h06a4308_0 + - jupyter_server=1.23.4=py39h06a4308_0 + - kiwisolver=1.4.2=py39h295c915_0 - lcms2=2.12=h3be6417_0 - - ld_impl_linux-64=2.35.1=h7274673_9 + - ld_impl_linux-64=2.38=h1181459_1 - libffi=3.3=he6710b0_2 - libgcc-ng=9.1.0=hdf63c60_0 - libgfortran-ng=7.3.0=hdf63c60_0 - - libllvm10=10.0.1=hbcb73fb_5 + - libgomp=11.2.0=h1234567_1 + - libllvm11=11.1.0=h3826bc1_1 - libpng=1.6.37=hbc83047_0 - libsodium=1.0.18=h7b6447c_0 - libstdcxx-ng=9.1.0=hdf63c60_0 - - libtiff=4.2.0=h85742a9_0 - - libuuid=1.0.3=h1bed415_2 - - libwebp-base=1.2.0=h27cfd23_0 - - libxcb=1.14=h7b6447c_0 - - libxml2=2.9.10=hb55368b_3 - - llvmlite=0.36.0=py37h612dafd_4 - - locket=0.2.1=py37h06a4308_1 - - lz4-c=1.9.3=h2531618_0 - - markdown=3.3.4=py37h06a4308_0 - - markupsafe=2.0.1=py37h27cfd23_0 - - matplotlib-base=3.3.4=py37h62a2d02_0 - - matplotlib=3.3.4=py37h06a4308_0 - - mistune=0.8.4=py37h14c3975_1001 - - mkl-service=2.4.0=py37h7f8727e_0 - - mkl=2021.3.0=h06a4308_520 - - mkl_fft=1.3.0=py37h42c9631_2 - - mkl_random=1.2.2=py37h51133e4_0 - - msgpack-python=1.0.2=py37hff7bd54_1 - - nbconvert=6.1.0=py37h06a4308_0 - - ncurses=6.2=he6710b0_1 - - notebook=6.4.0=py37h06a4308_0 - - numba=0.53.1=py37ha9443f7_0 - - numpy-base=1.20.3=py37h74d4b33_0 - - numpy=1.20.3=py37hf144106_0 - - openjpeg=2.3.0=h05c96fa_1 - - openssl=1.1.1k=h27cfd23_0 - - pandas=1.2.5=py37h295c915_0 - - pandocfilters=1.4.3=py37h06a4308_1 + - libtiff=4.2.0=h2818925_1 + - libuuid=1.0.3=h7f8727e_2 + - libwebp-base=1.2.2=h7f8727e_0 + - libwebp=1.2.2=h55f646e_0 + - libxcb=1.15=h7f8727e_0 + - libxml2=2.9.14=h74e7548_0 + - libxslt=1.1.35=h4e12654_0 + - llvmlite=0.38.0=py39h4ff587b_0 + - locket=1.0.0=py39h06a4308_0 + - lxml=4.8.0=py39h1f438cf_0 + - lz4-c=1.9.3=h295c915_1 + - markdown=3.4.1=py39h06a4308_0 + - markupsafe=2.1.1=py39h7f8727e_0 + - matplotlib-base=3.5.1=py39ha18d171_1 + - matplotlib-inline=0.1.6=py39h06a4308_0 + - matplotlib=3.5.1=py39h06a4308_1 + - mistune=0.8.4=py39h27cfd23_1000 + - mkl-service=2.4.0=py39h7f8727e_0 + - mkl=2021.4.0=h06a4308_640 + - mkl_fft=1.3.1=py39hd3c417c_0 + - mkl_random=1.2.2=py39h51133e4_0 + - multipledispatch=0.6.0=py39h06a4308_0 + - nbclassic=0.5.5=py39h06a4308_0 + - nbclient=0.5.13=py39h06a4308_0 + - nbconvert=6.5.4=py39h06a4308_0 + - nbformat=5.9.2=py39h06a4308_0 + - ncurses=6.3=h7f8727e_2 + - nest-asyncio=1.5.6=py39h06a4308_0 + - notebook-shim=0.2.2=py39h06a4308_0 + - notebook=6.5.4=py39h06a4308_1 + - numba=0.55.1=py39h51133e4_0 + - numexpr=2.8.1=py39h6abb31d_0 + - numpy-base=1.21.5=py39hf524024_2 + - numpy=1.21.5=py39he7a7128_2 + - openssl=1.1.1w=h7f8727e_0 + - packaging=23.1=py39h06a4308_0 + - pandas=1.4.2=py39h295c915_0 + - partd=1.4.0=py39h06a4308_0 - pcre=8.45=h295c915_0 - - pillow=8.3.1=py37h2c7a002_0 - - pip=21.1.3=py37h06a4308_0 - - psutil=5.8.0=py37h27cfd23_1 - - pyqt=5.9.2=py37h05f1152_2 - - pyrsistent=0.17.3=py37h7b6447c_0 - - pysocks=1.7.1=py37_1 - - python=3.7.10=h12debd9_4 - - pyyaml=5.4.1=py37h27cfd23_1 - - pyzmq=20.0.0=py37h2531618_1 + - pillow=9.0.1=py39h22f2fdc_0 + - pip=23.3=py39h06a4308_0 + - platformdirs=3.10.0=py39h06a4308_0 + - prometheus_client=0.14.1=py39h06a4308_0 + - prompt-toolkit=3.0.36=py39h06a4308_0 + - psutil=5.8.0=py39h27cfd23_1 + - pygments=2.15.1=py39h06a4308_1 + - pyopenssl=23.2.0=py39h06a4308_0 + - pyparsing=3.0.9=py39h06a4308_0 + - pyqt=5.9.2=py39h2531618_6 + - pyrsistent=0.18.0=py39heee7806_0 + - pysocks=1.7.1=py39h06a4308_0 + - python-fastjsonschema=2.16.2=py39h06a4308_0 + - python=3.9.12=h12debd9_1 + - pytz=2023.3.post1=py39h06a4308_0 + - pyyaml=6.0=py39h7f8727e_1 + - pyzmq=22.3.0=py39h295c915_2 - qt=5.9.7=h5867ecd_1 - - readline=8.1=h27cfd23_0 - - scipy=1.6.2=py37had2a1c9_1 - - setuptools=52.0.0=py37h06a4308_0 - - sip=4.19.8=py37hf484d3e_0 - - sqlite=3.36.0=hc218d9a_0 - - tbb=2020.3=hfd86e86_0 - - terminado=0.9.4=py37h06a4308_0 - - tk=8.6.10=hbc83047_0 - - tornado=6.1=py37h27cfd23_0 - - xz=5.2.5=h7b6447c_0 + - readline=8.1.2=h7f8727e_1 + - requests=2.31.0=py39h06a4308_0 + - scipy=1.6.2=py39had2a1c9_1 + - setuptools=68.0.0=py39h06a4308_0 + - sip=4.19.13=py39h295c915_0 + - sniffio=1.2.0=py39h06a4308_1 + - soupsieve=2.5=py39h06a4308_0 + - sqlite=3.38.5=hc218d9a_0 + - tbb=2021.5.0=hd09550d_0 + - terminado=0.17.1=py39h06a4308_0 + - tinycss2=1.2.1=py39h06a4308_0 + - tk=8.6.12=h1ccaba5_0 + - toolz=0.12.0=py39h06a4308_0 + - tornado=6.1=py39h27cfd23_0 + - tqdm=4.65.0=py39hb070fc8_0 + - traitlets=5.7.1=py39h06a4308_0 + - typing-extensions=4.7.1=py39h06a4308_0 + - typing_extensions=4.7.1=py39h06a4308_0 + - urllib3=1.26.16=py39h06a4308_0 + - webencodings=0.5.1=py39h06a4308_1 + - websocket-client=0.58.0=py39h06a4308_4 + - wheel=0.41.2=py39h06a4308_0 + - xarray=2023.6.0=py39h06a4308_0 + - xz=5.2.5=h7f8727e_1 - yaml=0.2.5=h7b6447c_0 - zeromq=4.3.4=h2531618_0 - - zlib=1.2.11=h7b6447c_3 - - zstd=1.4.9=haebb681_0 + - zipp=3.11.0=py39h06a4308_0 + - zlib=1.2.12=h7f8727e_2 + - zstd=1.5.2=ha4553b6_0 osx-64: - - appnope=0.1.2=py37hecd8cb5_1001 - - argon2-cffi=20.1.0=py37h9ed2024_1 - - bokeh=2.3.3=py37hecd8cb5_0 - - brotlipy=0.7.0=py37h9ed2024_1003 - - ca-certificates=2021.7.5=hecd8cb5_1 - - certifi=2021.5.30=py37hecd8cb5_0 - - cffi=1.14.6=py37h2125817_0 - - chardet=4.0.0=py37hecd8cb5_1003 - - cryptography=3.4.7=py37h2fd3fbb_0 - - cytoolz=0.11.0=py37haf1e3a3_0 - - datashape=0.5.4=py37hecd8cb5_1 - - distributed=2021.7.0=py37hecd8cb5_0 - - freetype=2.10.4=ha233b18_0 - - importlib-metadata=3.10.0=py37hecd8cb5_0 - - intel-openmp=2021.3.0=hecd8cb5_3375 - - ipython=7.22.0=py37h01d92e1_0 - - jpeg=9b=he5867d9_2 - - jupyter_core=4.7.1=py37hecd8cb5_0 - - kiwisolver=1.3.1=py37h23ab428_0 + - anyio=3.5.0=py39hecd8cb5_0 + - appnope=0.1.2=py39hecd8cb5_1001 + - argon2-cffi-bindings=21.2.0=py39hca72f7f_0 + - attrs=23.1.0=py39hecd8cb5_0 + - beautifulsoup4=4.12.2=py39hecd8cb5_0 + - blas=1.0=mkl + - bokeh=2.4.3=py39hecd8cb5_0 + - bottleneck=1.3.5=py39h67323c0_0 + - brotli-bin=1.0.9=hca72f7f_7 + - brotli=1.0.9=hca72f7f_7 + - brotlipy=0.7.0=py39h9ed2024_1003 + - ca-certificates=2023.08.22=hecd8cb5_0 + - certifi=2023.7.22=py39hecd8cb5_0 + - cffi=1.15.1=py39h6c40b1e_3 + - click=8.0.4=py39hecd8cb5_0 + - cloudpickle=2.2.1=py39hecd8cb5_0 + - comm=0.1.2=py39hecd8cb5_0 + - contourpy=1.0.5=py39haf03e11_0 + - cryptography=41.0.3=py39h30e54ef_0 + - dask-core=2023.6.0=py39hecd8cb5_0 + - datashape=0.5.4=py39hecd8cb5_1 + - debugpy=1.6.7=py39hcec6c5f_0 + - entrypoints=0.4=py39hecd8cb5_0 + - exceptiongroup=1.0.4=py39hecd8cb5_0 + - freetype=2.12.1=hd8bbffd_0 + - fsspec=2023.9.2=py39hecd8cb5_0 + - giflib=5.2.1=h6c40b1e_3 + - icu=73.1=hcec6c5f_0 + - idna=3.4=py39hecd8cb5_0 + - importlib-metadata=6.0.0=py39hecd8cb5_0 + - intel-openmp=2023.1.0=ha357a0b_43547 + - ipykernel=6.25.0=py39h20db666_0 + - ipython=8.15.0=py39hecd8cb5_0 + - jedi=0.18.1=py39hecd8cb5_1 + - jinja2=3.1.2=py39hecd8cb5_0 + - jpeg=9e=h6c40b1e_1 + - jsonschema=4.17.3=py39hecd8cb5_0 + - jupyter_client=7.4.9=py39hecd8cb5_0 + - jupyter_core=5.3.0=py39hecd8cb5_0 + - jupyter_server=1.23.4=py39hecd8cb5_0 + - kiwisolver=1.4.4=py39hcec6c5f_0 - lcms2=2.12=hf1fd2bf_0 - - libcxx=10.0.0=1 - - libffi=3.3=hb1e8313_2 - - libgfortran=3.0.1=h93005f0_2 - - libllvm10=10.0.1=h76017ad_5 - - libpng=1.6.37=ha441bb4_0 + - lerc=3.0=he9d5cce_0 + - libbrotlicommon=1.0.9=hca72f7f_7 + - libbrotlidec=1.0.9=hca72f7f_7 + - libbrotlienc=1.0.9=hca72f7f_7 + - libcxx=14.0.6=h9765a3e_0 + - libdeflate=1.17=hb664fd8_1 + - libffi=3.4.4=hecd8cb5_0 + - libgfortran5=11.3.0=h9dfd629_28 + - libgfortran=5.0.0=11_3_0_hecd8cb5_28 + - libiconv=1.16=hca72f7f_2 + - libllvm14=14.0.6=h91fad77_3 + - libpng=1.6.39=h6c40b1e_0 - libsodium=1.0.18=h1de35cc_0 - - libtiff=4.2.0=h87d7836_0 - - libwebp-base=1.2.0=h9ed2024_0 - - llvm-openmp=10.0.0=h28b9765_0 - - llvmlite=0.36.0=py37he4411ff_4 - - locket=0.2.1=py37hecd8cb5_1 - - lz4-c=1.9.3=h23ab428_0 - - markdown=3.3.4=py37hecd8cb5_0 - - markupsafe=2.0.1=py37h9ed2024_0 - - matplotlib-base=3.3.4=py37h8b3ea08_0 - - matplotlib=3.3.4=py37hecd8cb5_0 - - mistune=0.8.4=py37h1de35cc_0 - - mkl-service=2.4.0=py37h9ed2024_0 - - mkl=2021.3.0=hecd8cb5_517 - - mkl_fft=1.3.0=py37h4a7008c_2 - - mkl_random=1.2.2=py37hb2f4e1b_0 - - msgpack-python=1.0.2=py37hf7b0b51_1 - - nbconvert=6.1.0=py37hecd8cb5_0 - - ncurses=6.2=h0a44026_1 - - notebook=6.4.0=py37hecd8cb5_0 - - numba=0.53.1=py37hb2f4e1b_0 - - numpy-base=1.20.3=py37he0bd621_0 - - numpy=1.20.3=py37h4b4dc7a_0 - - openjpeg=2.3.0=hb95cd4c_1 - - openssl=1.1.1k=h9ed2024_0 - - pandas=1.2.5=py37h23ab428_0 - - pandocfilters=1.4.3=py37hecd8cb5_1 - - pillow=8.3.1=py37ha4cf6ea_0 - - pip=21.1.3=py37hecd8cb5_0 - - psutil=5.8.0=py37h9ed2024_1 - - pyrsistent=0.17.3=py37haf1e3a3_0 - - pysocks=1.7.1=py37hecd8cb5_0 - - python=3.7.10=h88f2d9e_0 - - pyyaml=5.4.1=py37h9ed2024_1 - - pyzmq=20.0.0=py37h23ab428_1 - - readline=8.1=h9ed2024_0 - - scipy=1.6.2=py37hd5f7400_1 - - setuptools=52.0.0=py37hecd8cb5_0 - - sqlite=3.36.0=hce871da_0 - - tbb=2020.3=h879752b_0 - - terminado=0.9.4=py37hecd8cb5_0 - - tk=8.6.10=hb0a8c7a_0 - - tornado=6.1=py37h9ed2024_0 - - xz=5.2.5=h1de35cc_0 + - libtiff=4.5.1=hcec6c5f_0 + - libwebp-base=1.3.2=h6c40b1e_0 + - libwebp=1.3.2=hf6ce154_0 + - libxml2=2.10.4=h1bd7e62_1 + - libxslt=1.1.37=h6c40b1e_1 + - llvm-openmp=14.0.6=h0dcd299_0 + - llvmlite=0.41.0=py39hfff2838_0 + - locket=1.0.0=py39hecd8cb5_0 + - lxml=4.9.3=py39h946e0e5_0 + - lz4-c=1.9.4=hcec6c5f_0 + - markdown=3.4.1=py39hecd8cb5_0 + - markupsafe=2.1.1=py39hca72f7f_0 + - matplotlib-base=3.7.2=py39hee32256_0 + - matplotlib-inline=0.1.6=py39hecd8cb5_0 + - matplotlib=3.7.2=py39hecd8cb5_0 + - mistune=0.8.4=py39h9ed2024_1000 + - mkl-service=2.4.0=py39h6c40b1e_1 + - mkl=2023.1.0=h8e150cf_43559 + - mkl_fft=1.3.8=py39h6c40b1e_0 + - mkl_random=1.2.4=py39ha357a0b_0 + - multipledispatch=0.6.0=py39hecd8cb5_0 + - nbclassic=0.5.5=py39hecd8cb5_0 + - nbclient=0.5.13=py39hecd8cb5_0 + - nbconvert=6.5.4=py39hecd8cb5_0 + - nbformat=5.9.2=py39hecd8cb5_0 + - ncurses=6.4=hcec6c5f_0 + - nest-asyncio=1.5.6=py39hecd8cb5_0 + - notebook-shim=0.2.2=py39hecd8cb5_0 + - notebook=6.5.4=py39hecd8cb5_1 + - numba=0.58.0=py39h3ea8b11_0 + - numexpr=2.8.7=py39h827a554_0 + - numpy-base=1.25.2=py39ha186be2_0 + - numpy=1.25.2=py39h827a554_0 + - openjpeg=2.4.0=h66ea3da_0 + - openssl=3.0.11=hca72f7f_2 + - packaging=23.1=py39hecd8cb5_0 + - pandas=2.1.1=py39h3ea8b11_0 + - partd=1.4.0=py39hecd8cb5_0 + - pillow=10.0.1=py39h7d39338_0 + - pip=23.3=py39hecd8cb5_0 + - platformdirs=3.10.0=py39hecd8cb5_0 + - prometheus_client=0.14.1=py39hecd8cb5_0 + - prompt-toolkit=3.0.36=py39hecd8cb5_0 + - psutil=5.9.0=py39hca72f7f_0 + - pygments=2.15.1=py39hecd8cb5_1 + - pyopenssl=23.2.0=py39hecd8cb5_0 + - pyparsing=3.0.9=py39hecd8cb5_0 + - pyrsistent=0.18.0=py39hca72f7f_0 + - pysocks=1.7.1=py39hecd8cb5_0 + - python-fastjsonschema=2.16.2=py39hecd8cb5_0 + - python=3.9.18=h5ee71fb_0 + - pytz=2023.3.post1=py39hecd8cb5_0 + - pyyaml=6.0=py39h6c40b1e_1 + - pyzmq=23.2.0=py39he9d5cce_0 + - readline=8.2=hca72f7f_0 + - requests=2.31.0=py39hecd8cb5_0 + - scipy=1.11.3=py39hdb2ea58_0 + - setuptools=68.0.0=py39hecd8cb5_0 + - sniffio=1.2.0=py39hecd8cb5_1 + - soupsieve=2.5=py39hecd8cb5_0 + - sqlite=3.41.2=h6c40b1e_0 + - tbb=2021.8.0=ha357a0b_0 + - terminado=0.17.1=py39hecd8cb5_0 + - tinycss2=1.2.1=py39hecd8cb5_0 + - tk=8.6.12=h5d9f67b_0 + - toolz=0.12.0=py39hecd8cb5_0 + - tornado=6.3.3=py39h6c40b1e_0 + - tqdm=4.65.0=py39h01d92e1_0 + - traitlets=5.7.1=py39hecd8cb5_0 + - typing-extensions=4.7.1=py39hecd8cb5_0 + - typing_extensions=4.7.1=py39hecd8cb5_0 + - urllib3=1.26.16=py39hecd8cb5_0 + - webencodings=0.5.1=py39hecd8cb5_1 + - websocket-client=0.58.0=py39hecd8cb5_4 + - wheel=0.41.2=py39hecd8cb5_0 + - xarray=2023.6.0=py39hecd8cb5_0 + - xz=5.4.2=h6c40b1e_0 - yaml=0.2.5=haf1e3a3_0 - zeromq=4.3.4=h23ab428_0 - - zlib=1.2.11=h1de35cc_3 - - zstd=1.4.9=h322a384_0 + - zipp=3.11.0=py39hecd8cb5_0 + - zlib=1.2.13=h4dc903c_0 + - zstd=1.5.5=hc035e20_0 + osx-arm64: + - anyio=3.5.0=py39hca03da5_0 + - appnope=0.1.2=py39hca03da5_1001 + - argon2-cffi-bindings=21.2.0=py39h1a28f6b_0 + - attrs=23.1.0=py39hca03da5_0 + - beautifulsoup4=4.12.2=py39hca03da5_0 + - blas=1.0=openblas + - bokeh=2.4.3=py39hca03da5_0 + - bottleneck=1.3.5=py39heec5a64_0 + - brotli-bin=1.0.9=h1a28f6b_7 + - brotli=1.0.9=h1a28f6b_7 + - brotlipy=0.7.0=py39h1a28f6b_1002 + - ca-certificates=2023.08.22=hca03da5_0 + - certifi=2023.7.22=py39hca03da5_0 + - cffi=1.15.1=py39h80987f9_3 + - click=8.0.4=py39hca03da5_0 + - cloudpickle=2.2.1=py39hca03da5_0 + - comm=0.1.2=py39hca03da5_0 + - contourpy=1.0.5=py39h525c30c_0 + - cryptography=41.0.3=py39hd4332d6_0 + - dask-core=2023.6.0=py39hca03da5_0 + - datashape=0.5.4=py39hca03da5_1 + - debugpy=1.6.7=py39h313beb8_0 + - entrypoints=0.4=py39hca03da5_0 + - exceptiongroup=1.0.4=py39hca03da5_0 + - freetype=2.12.1=h1192e45_0 + - fsspec=2023.9.2=py39hca03da5_0 + - giflib=5.2.1=h80987f9_3 + - icu=73.1=h313beb8_0 + - idna=3.4=py39hca03da5_0 + - importlib-metadata=6.0.0=py39hca03da5_0 + - ipykernel=6.25.0=py39h33ce5c2_0 + - ipython=8.15.0=py39hca03da5_0 + - jedi=0.18.1=py39hca03da5_1 + - jinja2=3.1.2=py39hca03da5_0 + - jpeg=9e=h80987f9_1 + - jsonschema=4.17.3=py39hca03da5_0 + - jupyter_client=7.4.9=py39hca03da5_0 + - jupyter_core=5.3.0=py39hca03da5_0 + - jupyter_server=1.23.4=py39hca03da5_0 + - kiwisolver=1.4.4=py39h313beb8_0 + - lcms2=2.12=hba8e193_0 + - lerc=3.0=hc377ac9_0 + - libbrotlicommon=1.0.9=h1a28f6b_7 + - libbrotlidec=1.0.9=h1a28f6b_7 + - libbrotlienc=1.0.9=h1a28f6b_7 + - libcxx=14.0.6=h848a8c0_0 + - libdeflate=1.17=h80987f9_1 + - libffi=3.4.4=hca03da5_0 + - libgfortran5=11.3.0=h009349e_28 + - libgfortran=5.0.0=11_3_0_hca03da5_28 + - libiconv=1.16=h1a28f6b_2 + - libllvm14=14.0.6=h7ec7a93_3 + - libopenblas=0.3.21=h269037a_0 + - libpng=1.6.39=h80987f9_0 + - libsodium=1.0.18=h1a28f6b_0 + - libtiff=4.5.1=h313beb8_0 + - libwebp-base=1.3.2=h80987f9_0 + - libwebp=1.3.2=ha3663a8_0 + - libxml2=2.10.4=h0dcf63f_1 + - libxslt=1.1.37=h80987f9_1 + - llvm-openmp=14.0.6=hc6e5704_0 + - llvmlite=0.41.0=py39h514c7bf_0 + - locket=1.0.0=py39hca03da5_0 + - lxml=4.9.3=py39h50ffb84_0 + - lz4-c=1.9.4=h313beb8_0 + - markdown=3.4.1=py39hca03da5_0 + - markupsafe=2.1.1=py39h1a28f6b_0 + - matplotlib-base=3.7.2=py39h46d7db6_0 + - matplotlib-inline=0.1.6=py39hca03da5_0 + - matplotlib=3.7.2=py39hca03da5_0 + - mistune=0.8.4=py39h1a28f6b_1000 + - multipledispatch=0.6.0=py39hca03da5_0 + - nbclassic=0.5.5=py39hca03da5_0 + - nbclient=0.5.13=py39hca03da5_0 + - nbconvert=6.5.4=py39hca03da5_0 + - nbformat=5.9.2=py39hca03da5_0 + - ncurses=6.4=h313beb8_0 + - nest-asyncio=1.5.6=py39hca03da5_0 + - notebook-shim=0.2.2=py39hca03da5_0 + - notebook=6.5.4=py39hca03da5_1 + - numba=0.58.0=py39h46d7db6_0 + - numexpr=2.8.7=py39hecc3335_0 + - numpy-base=1.25.2=py39ha9811e2_0 + - numpy=1.25.2=py39h3b2db8e_0 + - openjpeg=2.3.0=h7a6adac_2 + - openssl=3.0.11=h1a28f6b_2 + - packaging=23.1=py39hca03da5_0 + - pandas=2.1.1=py39h46d7db6_0 + - partd=1.4.0=py39hca03da5_0 + - pillow=10.0.1=py39h3b245a6_0 + - pip=23.3=py39hca03da5_0 + - platformdirs=3.10.0=py39hca03da5_0 + - prometheus_client=0.14.1=py39hca03da5_0 + - prompt-toolkit=3.0.36=py39hca03da5_0 + - psutil=5.9.0=py39h1a28f6b_0 + - pygments=2.15.1=py39hca03da5_1 + - pyopenssl=23.2.0=py39hca03da5_0 + - pyparsing=3.0.9=py39hca03da5_0 + - pyrsistent=0.18.0=py39h1a28f6b_0 + - pysocks=1.7.1=py39hca03da5_0 + - python-fastjsonschema=2.16.2=py39hca03da5_0 + - python=3.9.18=hb885b13_0 + - pytz=2023.3.post1=py39hca03da5_0 + - pyyaml=6.0=py39h80987f9_1 + - pyzmq=23.2.0=py39hc377ac9_0 + - readline=8.2=h1a28f6b_0 + - requests=2.31.0=py39hca03da5_0 + - scipy=1.11.3=py39h20cbe94_0 + - setuptools=68.0.0=py39hca03da5_0 + - sniffio=1.2.0=py39hca03da5_1 + - soupsieve=2.5=py39hca03da5_0 + - sqlite=3.41.2=h80987f9_0 + - tbb=2021.8.0=h48ca7d4_0 + - terminado=0.17.1=py39hca03da5_0 + - tinycss2=1.2.1=py39hca03da5_0 + - tk=8.6.12=hb8d0fd4_0 + - toolz=0.12.0=py39hca03da5_0 + - tornado=6.3.3=py39h80987f9_0 + - tqdm=4.65.0=py39h86d0a89_0 + - traitlets=5.7.1=py39hca03da5_0 + - typing-extensions=4.7.1=py39hca03da5_0 + - typing_extensions=4.7.1=py39hca03da5_0 + - urllib3=1.26.16=py39hca03da5_0 + - webencodings=0.5.1=py39hca03da5_1 + - websocket-client=0.58.0=py39hca03da5_4 + - wheel=0.41.2=py39hca03da5_0 + - xarray=2023.6.0=py39hca03da5_0 + - xz=5.4.2=h80987f9_0 + - yaml=0.2.5=h1a28f6b_0 + - zeromq=4.3.4=hc377ac9_0 + - zipp=3.11.0=py39hca03da5_0 + - zlib=1.2.13=h5a0b063_0 + - zstd=1.5.5=hd90d995_0 win-64: - - argon2-cffi=20.1.0=py37h2bbff1b_1 - - bokeh=2.3.3=py37haa95532_0 - - brotlipy=0.7.0=py37h2bbff1b_1003 - - ca-certificates=2021.7.5=haa95532_1 - - certifi=2021.5.30=py37haa95532_0 - - cffi=1.14.6=py37h2bbff1b_0 - - chardet=4.0.0=py37haa95532_1003 - - colorama=0.4.4=pyhd3eb1b0_0 - - cryptography=3.4.7=py37h71e12ea_0 - - cytoolz=0.11.0=py37he774522_0 - - datashape=0.5.4=py37haa95532_1 - - distributed=2021.7.0=py37haa95532_0 - - freetype=2.10.4=hd328e21_0 - - icc_rt=2019.0.0=h0cc432a_1 + - anyio=3.5.0=py39haa95532_0 + - argon2-cffi-bindings=21.2.0=py39h2bbff1b_0 + - attrs=23.1.0=py39haa95532_0 + - beautifulsoup4=4.12.2=py39haa95532_0 + - blas=1.0=mkl + - bokeh=2.4.3=py39haa95532_0 + - bottleneck=1.3.5=py39h080aedc_0 + - brotli-bin=1.0.9=h2bbff1b_7 + - brotli=1.0.9=h2bbff1b_7 + - brotlipy=0.7.0=py39h2bbff1b_1003 + - ca-certificates=2023.08.22=haa95532_0 + - certifi=2023.7.22=py39haa95532_0 + - cffi=1.15.1=py39h2bbff1b_3 + - click=8.0.4=py39haa95532_0 + - cloudpickle=2.2.1=py39haa95532_0 + - colorama=0.4.6=py39haa95532_0 + - comm=0.1.2=py39haa95532_0 + - contourpy=1.0.5=py39h59b6b97_0 + - cryptography=41.0.3=py39h89fc84f_0 + - dask-core=2023.6.0=py39haa95532_0 + - datashape=0.5.4=py39haa95532_1 + - debugpy=1.6.7=py39hd77b12b_0 + - entrypoints=0.4=py39haa95532_0 + - exceptiongroup=1.0.4=py39haa95532_0 + - freetype=2.12.1=ha860e81_0 + - fsspec=2023.9.2=py39haa95532_0 + - giflib=5.2.1=h8cc25b3_3 + - glib=2.69.1=h5dc1a3c_2 + - icc_rt=2022.1.0=h6049295_2 - icu=58.2=ha925a31_3 - - importlib-metadata=3.10.0=py37haa95532_0 - - intel-openmp=2021.3.0=haa95532_3372 - - ipython=7.22.0=py37hd4e2768_0 - - jpeg=9b=hb83a4c4_2 - - jupyter_core=4.7.1=py37haa95532_0 - - kiwisolver=1.3.1=py37hd77b12b_0 - - libpng=1.6.37=h2a8f88b_0 + - idna=3.4=py39haa95532_0 + - importlib-metadata=6.0.0=py39haa95532_0 + - importlib_resources=5.2.0=pyhd3eb1b0_1 + - intel-openmp=2023.1.0=h59b6b97_46319 + - ipykernel=6.25.0=py39h9909e9c_0 + - ipython=8.15.0=py39haa95532_0 + - jedi=0.18.1=py39haa95532_1 + - jinja2=3.1.2=py39haa95532_0 + - jpeg=9e=h2bbff1b_1 + - jsonschema=4.17.3=py39haa95532_0 + - jupyter_client=7.4.9=py39haa95532_0 + - jupyter_core=5.3.0=py39haa95532_0 + - jupyter_server=1.23.4=py39haa95532_0 + - kiwisolver=1.4.4=py39hd77b12b_0 + - krb5=1.20.1=h5b6d351_0 + - lerc=3.0=hd77b12b_0 + - libbrotlicommon=1.0.9=h2bbff1b_7 + - libbrotlidec=1.0.9=h2bbff1b_7 + - libbrotlienc=1.0.9=h2bbff1b_7 + - libclang13=14.0.6=default_h8e68704_1 + - libclang=14.0.6=default_hb5a9fac_1 + - libdeflate=1.17=h2bbff1b_1 + - libffi=3.4.4=hd77b12b_0 + - libiconv=1.16=h2bbff1b_2 + - libpng=1.6.39=h8cc25b3_0 + - libpq=12.15=h906ac69_1 - libsodium=1.0.18=h62dcd97_0 - - libtiff=4.2.0=hd0e1b90_0 - - llvmlite=0.36.0=py37h34b8924_4 - - locket=0.2.1=py37haa95532_1 - - lz4-c=1.9.3=h2bbff1b_0 - - m2w64-gcc-libgfortran=5.3.0=6 - - m2w64-gcc-libs-core=5.3.0=7 - - m2w64-gcc-libs=5.3.0=7 - - m2w64-gmp=6.1.0=2 - - m2w64-libwinpthread-git=5.0.0.4634.697f757=2 - - markdown=3.3.4=py37haa95532_0 - - markupsafe=2.0.1=py37h2bbff1b_0 - - matplotlib-base=3.3.4=py37h49ac443_0 - - matplotlib=3.3.4=py37haa95532_0 - - mistune=0.8.4=py37hfa6e2cd_1001 - - mkl-service=2.4.0=py37h2bbff1b_0 - - mkl=2021.3.0=haa95532_524 - - mkl_fft=1.3.0=py37h277e83a_2 - - mkl_random=1.2.2=py37hf11a4ad_0 - - msgpack-python=1.0.2=py37h59b6b97_1 - - msys2-conda-epoch=20160418=1 - - nbconvert=6.1.0=py37haa95532_0 - - notebook=6.4.0=py37haa95532_0 - - numba=0.53.1=py37hf11a4ad_0 - - numpy-base=1.20.3=py37hc2deb75_0 - - numpy=1.20.3=py37ha4e8547_0 - - openssl=1.1.1k=h2bbff1b_0 - - pandas=1.2.5=py37hd77b12b_0 - - pandocfilters=1.4.3=py37haa95532_1 - - pillow=8.3.1=py37h4fa10fc_0 - - pip=21.1.3=py37haa95532_0 - - psutil=5.8.0=py37h2bbff1b_1 - - pyqt=5.9.2=py37h6538335_2 - - pyrsistent=0.17.3=py37he774522_0 - - pysocks=1.7.1=py37_1 - - python=3.7.10=h6244533_0 - - pywin32=227=py37he774522_1 - - pywinpty=0.5.7=py37_0 - - pyyaml=5.4.1=py37h2bbff1b_1 - - pyzmq=20.0.0=py37hd77b12b_1 - - qt=5.9.7=vc14h73c81de_0 - - scipy=1.6.2=py37h66253e8_1 - - setuptools=52.0.0=py37haa95532_0 - - sip=4.19.8=py37h6538335_0 - - sqlite=3.36.0=h2bbff1b_0 - - tbb=2020.3=h74a9793_0 - - terminado=0.9.4=py37haa95532_0 - - tk=8.6.10=he774522_0 - - tornado=6.1=py37h2bbff1b_0 + - libtiff=4.5.1=hd77b12b_0 + - libwebp-base=1.3.2=h2bbff1b_0 + - libwebp=1.3.2=hbc33d0d_0 + - libxml2=2.10.4=h0ad7f3c_1 + - libxslt=1.1.37=h2bbff1b_1 + - llvmlite=0.41.0=py39hf2fb9eb_0 + - locket=1.0.0=py39haa95532_0 + - lxml=4.9.3=py39h09808a7_0 + - lz4-c=1.9.4=h2bbff1b_0 + - markdown=3.4.1=py39haa95532_0 + - markupsafe=2.1.1=py39h2bbff1b_0 + - matplotlib-base=3.7.2=py39h4ed8f06_0 + - matplotlib-inline=0.1.6=py39haa95532_0 + - matplotlib=3.7.2=py39haa95532_0 + - mistune=0.8.4=py39h2bbff1b_1000 + - mkl-service=2.4.0=py39h2bbff1b_1 + - mkl=2023.1.0=h6b88ed4_46357 + - mkl_fft=1.3.8=py39h2bbff1b_0 + - mkl_random=1.2.4=py39h59b6b97_0 + - multipledispatch=0.6.0=py39haa95532_0 + - nbclassic=0.5.5=py39haa95532_0 + - nbclient=0.5.13=py39haa95532_0 + - nbconvert=6.5.4=py39haa95532_0 + - nbformat=5.9.2=py39haa95532_0 + - nest-asyncio=1.5.6=py39haa95532_0 + - notebook-shim=0.2.2=py39haa95532_0 + - notebook=6.5.4=py39haa95532_1 + - numba=0.58.0=py39h4ed8f06_0 + - numexpr=2.8.7=py39h2cd9be0_0 + - numpy-base=1.25.2=py39h65a83cf_0 + - numpy=1.25.2=py39h055cbcc_0 + - openjpeg=2.4.0=h4fc8c34_0 + - openssl=3.0.11=h2bbff1b_2 + - packaging=23.1=py39haa95532_0 + - pandas=2.1.1=py39h4ed8f06_0 + - partd=1.4.0=py39haa95532_0 + - pcre=8.45=hd77b12b_0 + - pillow=10.0.1=py39h045eedc_0 + - pip=23.3=py39haa95532_0 + - platformdirs=3.10.0=py39haa95532_0 + - ply=3.11=py39haa95532_0 + - prometheus_client=0.14.1=py39haa95532_0 + - prompt-toolkit=3.0.36=py39haa95532_0 + - psutil=5.9.0=py39h2bbff1b_0 + - pygments=2.15.1=py39haa95532_1 + - pyopenssl=23.2.0=py39haa95532_0 + - pyparsing=3.0.9=py39haa95532_0 + - pyqt5-sip=12.11.0=py39hd77b12b_0 + - pyqt=5.15.7=py39hd77b12b_0 + - pyrsistent=0.18.0=py39h196d8e1_0 + - pysocks=1.7.1=py39haa95532_0 + - python-fastjsonschema=2.16.2=py39haa95532_0 + - python-tzdata=2023.3=pyhd3eb1b0_0 + - python=3.9.18=h1aa4202_0 + - pytz=2023.3.post1=py39haa95532_0 + - pywin32=305=py39h2bbff1b_0 + - pywinpty=2.0.10=py39h5da7b33_0 + - pyyaml=6.0=py39h2bbff1b_1 + - pyzmq=23.2.0=py39hd77b12b_0 + - qt-main=5.15.2=h879a1e9_9 + - qt-webengine=5.15.9=h5bd16bc_7 + - qtwebkit=5.212=h2bbfb41_5 + - requests=2.31.0=py39haa95532_0 + - scipy=1.11.3=py39h309d312_0 + - setuptools=68.0.0=py39haa95532_0 + - sip=6.6.2=py39hd77b12b_0 + - sniffio=1.2.0=py39haa95532_1 + - soupsieve=2.5=py39haa95532_0 + - sqlite=3.41.2=h2bbff1b_0 + - tbb=2021.8.0=h59b6b97_0 + - terminado=0.17.1=py39haa95532_0 + - tinycss2=1.2.1=py39haa95532_0 + - tk=8.6.12=h2bbff1b_0 + - toml=0.10.2=pyhd3eb1b0_0 + - toolz=0.12.0=py39haa95532_0 + - tornado=6.3.3=py39h2bbff1b_0 + - tqdm=4.65.0=py39hd4e2768_0 + - traitlets=5.7.1=py39haa95532_0 + - typing-extensions=4.7.1=py39haa95532_0 + - typing_extensions=4.7.1=py39haa95532_0 + - urllib3=1.26.16=py39haa95532_0 - vc=14.2=h21ff451_1 - vs2015_runtime=14.27.29016=h5e58377_2 - - win_inet_pton=1.1.0=py37haa95532_0 - - wincertstore=0.2=py37_0 + - webencodings=0.5.1=py39haa95532_1 + - websocket-client=0.58.0=py39haa95532_4 + - wheel=0.41.2=py39haa95532_0 + - win_inet_pton=1.1.0=py39haa95532_0 - winpty=0.4.3=4 - - xz=5.2.5=h62dcd97_0 + - xarray=2023.6.0=py39haa95532_0 + - xz=5.4.2=h8cc25b3_0 - yaml=0.2.5=he774522_0 - - zeromq=4.3.3=ha925a31_3 - - zlib=1.2.11=h62dcd97_4 - - zstd=1.4.9=h19a0ad4_0 + - zeromq=4.3.4=hd77b12b_0 + - zipp=3.11.0=py39haa95532_0 + - zlib=1.2.13=h8cc25b3_0 + - zstd=1.5.5=hd43e919_0 diff --git a/attractors/anaconda-project.yml b/attractors/anaconda-project.yml index e3ef644fc..e090bc5cd 100644 --- a/attractors/anaconda-project.yml +++ b/attractors/anaconda-project.yml @@ -2,11 +2,15 @@ name: attractors description: Calculate and plot two-dimensional attractors of a variety of types examples_config: + created: 2018-09-17 maintainers: - jbednar labels: - datashader - panel + deployments: + - command: notebook + - command: dashboard channels: - pyviz @@ -15,11 +19,11 @@ channels: user_fields: [examples_config] packages: &pkgs -- python=3.7 -- bokeh=2.3.3 +- python=3.9 +- bokeh=2.4.3 - notebook - pyyaml -- pandas<1.3 +- pandas - numba - datashader - colorcet @@ -31,30 +35,16 @@ dependencies: *pkgs commands: dashboard: - unix: panel serve *_panel.ipynb --show + unix: panel serve *_panel.ipynb -rest-session-info --session-history -1 --show supports_http_options: true - notebooks: - notebook: . - test: - unix: pytest --nbsmoke-run --ignore envs - windows: pytest --nbsmoke-run --ignore envs - env_spec: test - lint: - unix: pytest --nbsmoke-lint --ignore envs - windows: pytest --nbsmoke-lint --ignore envs - env_spec: test + notebook: + notebook: index.ipynb attractors.ipynb attractors_panel.ipynb clifford_panel.ipynb variables: {} downloads: {} -env_specs: - default: {} - test: - packages: &test-pkgs - - nbsmoke=0.2.8 - - pytest=4.4.1 - dependencies: *test-pkgs platforms: - linux-64 - osx-64 - win-64 +- osx-arm64 diff --git a/attractors/attractors.ipynb b/attractors/attractors.ipynb index c8e142b92..6d0a487fd 100644 --- a/attractors/attractors.ipynb +++ b/attractors/attractors.ipynb @@ -4,17 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Attractors\n", - "Written by James A. Bednar
\n", - "Created: 2018
\n", - "Last updated: July 15, 2021" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Visualizing Attractors\n", + "# Visualizing Attractors\n", "\n", "An [attractor](https://en.wikipedia.org/wiki/Attractor#Strange_attractor) is a set of values to which a numerical system tends to evolve. An attractor is called a [strange attractor](https://en.wikipedia.org/wiki/Attractor#Strange_attractor) if the resulting pattern has a fractal structure. This notebook shows how to calculate and plot two-dimensional attractors of a variety of types, using code and parameters primarily from [Lázaro Alonso](https://lazarusa.github.io/Webpage/codepython2.html), [François Pacull](https://aetperf.github.io/2018/08/29/Plotting-Hopalong-attractor-with-Datashader-and-Numba.html), [Jason Rampe](https://softologyblog.wordpress.com/2017/03/04/2d-strange-attractors), [Paul Bourke](http://paulbourke.net/fractals/), and [James A. Bednar](http://github.io/jbednar).\n", "\n", @@ -191,11 +181,11 @@ "outputs": [], "source": [ "import yaml\n", - "vals = yaml.load(open(\"strange_attractors.yml\",\"r\"), Loader=yaml.FullLoader)\n", + "vals = yaml.load(open(\"data/strange_attractors.yml\",\"r\"), Loader=yaml.FullLoader)\n", "\n", "def args(name):\n", " \"\"\"Return a list of available argument lists for the given type of attractor\"\"\"\n", - " return [v[1:] for v in vals if v[0]==name] \n", + " return [v[1:] for v in vals if v[0]==name]\n", "\n", "def plot(fn, vals=None, **kw):\n", " \"\"\"Plot the given attractor `fn` once per provided set of arguments.\"\"\"\n", @@ -414,16 +404,15 @@ " zzbar = x*x + y*y\n", " p = a*zzbar + l\n", " zreal, zimag = x, y\n", - " \n", + "\n", " for i in range(1, d-1):\n", " za, zb = zreal * x - zimag * y, zimag * x + zreal * y\n", " zreal, zimag = za, zb\n", - " \n", + "\n", " zn = x*zreal - y*zimag\n", " p += b*zn\n", - " \n", - " return p*x + g*zreal - om*y, \\\n", - " p*y - g*zimag + om*x\n", + "\n", + " return p*x + g*zreal - om*y, p*y - g*zimag + om*x\n", "\n", "plot(Symmetric_Icon)" ] @@ -506,11 +495,24 @@ } ], "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", "name": "python", - "pygments_lexer": "ipython3" + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/attractors/attractors.py b/attractors/attractors.py index b4863b1cd..7fd1bf05f 100644 --- a/attractors/attractors.py +++ b/attractors/attractors.py @@ -10,6 +10,7 @@ """ from collections import OrderedDict +from pathlib import Path import numpy as np import pandas as pd @@ -239,7 +240,8 @@ class ParameterSets(param.Parameterized): Assumes the YAML file returns a list of groups of values. """ - examples_filename = param.Filename("attractors.yml") + input_examples_filename = param.String("attractors.yml") + output_examples_filename = param.String("saved_attractors.yml", precedence=0.81) current = param.Callable(lambda: None, precedence=-1) remember_this_one = param.Action(lambda x: x._remember()) @@ -250,35 +252,49 @@ class ParameterSets(param.Parameterized): example = param.Selector(objects=[[]], precedence=-1) def __init__(self,**params): - super(ParameterSets,self).__init__(**params) + super().__init__(**params) + self._load() - self.attractors = OrderedDict(sorted([(k,v(name=k + " parameters")) for k,v in concrete_descendents(Attractor).items()])) + self.attractors = { + k: v(name=f'{k} parameters') + for k, v in sorted(concrete_descendents(Attractor).items()) + } for k in self.attractors: self.attractor(k, *self.args(k)[0]) def _load(self): - with open(self.examples_filename,"r") as f: + with open(Path('data', self.input_examples_filename), "r") as f: vals = yaml.safe_load(f) - assert(vals and len(vals)>0) - self.param.example.objects=vals + assert(vals and len(vals) > 0) + self.param.example.objects[:] = vals self.example = vals[0] def _save(self): - with open(self.examples_filename,"w") as f: + if self.output_examples_filename == self.param.input_examples_filename.default: + raise FileExistsError('Cannot override the default attractors file.') + with open(Path('data', self.output_examples_filename), "w") as f: yaml.dump(self.param.example.objects,f) - def __call__(self): return self.example - def _randomize(self): npr.shuffle(self.param.example.objects) - def _sort(self): self.param.example.objects = list(sorted(self.param.example.objects)) - def _add_item(self, item): self.param.example.objects += [item] ; self.example=item + def __call__(self): + return self.example + + def _randomize(self): + npr.shuffle(self.param.example.objects) + + def _sort(self): + self.param.example.objects[:] = list(sorted(self.param.example.objects)) + + def _add_item(self, item): + self.param.example.objects += [item] + self.example = item def _remember(self): vals = self.current().vals() self._add_item(vals) def args(self, name): - return [v[1:] for v in self.param.example.objects if v[0]==name] + return [v[1:] for v in self.param.example.objects if v[0] == name] def attractor(self, name, *args): """Factory function to return an Attractor object with the given name and arg values""" diff --git a/attractors/attractors_panel.ipynb b/attractors/attractors_panel.ipynb index c014584f3..5e5b63fd7 100644 --- a/attractors/attractors_panel.ipynb +++ b/attractors/attractors_panel.ipynb @@ -4,10 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Attractors Panel\n", - "Written by James A. Bednar
\n", - "Created: 2018
\n", - "Last updated: July 15, 2021" + "# Strange Attractors App" ] }, { @@ -16,7 +13,6 @@ "source": [ "\n", "\n", - "## Panel/Numba/Datashader Strange Attractors app\n", "\n", "[Strange attractors](attractors.ipynb) are a type of iterative equation that traces the path of a particle through a 2D space, forming interesting patterns in the trajectories. The patterns differ depending on which sets of equations are used and which parameter values are selected for those equations.\n", "\n", @@ -24,12 +20,12 @@ "\n", "This dashboard code also functions as an example of how to build a Panel application for working with an arbitrarily large family of Python objects organized into a class hierarchy, without depending on the details of that structure and without that code depending on any GUI libraries. In this approach, each object defines its own parameters in a GUI-independent way, but then Panel can access this information and construct appropriate widgets to provide interactive control of the values. This approach can allow the same codebase be used in a GUI with full interactivity while also supporting non-GUI command-line, batch, or headless usage. New classes added to the .py file, even with entirely different parameters, will automatically be supported by this GUI code.\n", "\n", - "If you aren't familiar with Panel, you may wish to check out the much simpler [Clifford-only app](clifford_panel.ipynb) first, to understand the basic structure of an app and of how to compute an attractor.\n", + "If you aren't familiar with Panel, you may wish to check out the much simpler [Clifford-only app](./clifford_panel.ipynb) first, to understand the basic structure of an app and of how to compute an attractor.\n", "\n", "\n", "## Attractor definitions\n", "\n", - "Here, we'll make use of a family of attractors whose code is defined in the separate file [attractors.py](attractors.py), currently including classes for Clifford, De Jong, Svensson, Fractal Dream, Bedhead, Hopalong1, Hopalong2, Gumowski Mira, and Symmetric Icon attractors. That module also provides support for working with a separate YAML-format list of examples of each type of attractor, in [attractors.yml](attractors.yml).\n", + "Here, we'll make use of a family of attractors whose code is defined in the separate file [attractors.py](attractors.py), currently including classes for Clifford, De Jong, Svensson, Fractal Dream, Bedhead, Hopalong1, Hopalong2, Gumowski Mira, and Symmetric Icon attractors. That module also provides support for working with a separate YAML-format list of examples of each type of attractor, in [attractors.yml](./data/attractors.yml).\n", "\n", "Each attractor family is a subclass of the Attractor class, capturing the attractor equations as runnable Python code, the equations in LaTeX for for displaying, the parameters of the equations, and their expected ranges of values:" ] @@ -52,8 +48,7 @@ "metadata": {}, "outputs": [], "source": [ - "from IPython.core.display import display, HTML, Latex\n", - "display(HTML(\"\"))\n", + "from IPython.display import display, Latex\n", "\n", "display(*[Latex(e) for e in h.equations])" ] @@ -65,6 +60,7 @@ "outputs": [], "source": [ "import inspect\n", + "\n", "print(inspect.getsource(h.fn))" ] }, @@ -138,10 +134,10 @@ "from datashader import transfer_functions as tf\n", "from datashader.colors import inferno, viridis\n", "from colorcet import palette\n", - "palette[\"viridis\"]=viridis\n", - "palette[\"inferno\"]=inferno\n", "\n", - "size=700\n", + "palette[\"viridis\"] = viridis\n", + "palette[\"inferno\"] = inferno\n", + "size = 700\n", "\n", "def datashade(df, plot_type='points', cmap=palette[\"inferno\"], size=size):\n", " cvs = ds.Canvas(plot_width=size, plot_height=size)\n", @@ -171,34 +167,36 @@ "pn.extension('katex')\n", "\n", "class Attractors(param.Parameterized):\n", - " attractor_type = param.ObjectSelector(params.attractors[\"Clifford\"], \n", + " attractor_type = param.ObjectSelector(params.attractors[\"Clifford\"],\n", " params.attractors, precedence=0.9)\n", "\n", " parameters = param.ObjectSelector(params, precedence=-0.5, readonly=True)\n", "\n", - " plot_type = param.ObjectSelector(\"points\", precedence=0.8, \n", - " objects=['points', 'line'], doc=\"Type of aggregation to use\")\n", + " plot_type = param.ObjectSelector(\n", + " \"points\", precedence=0.8, objects=['points', 'line'],\n", + " doc=\"Type of aggregation to use\"\n", + " )\n", "\n", " n = param.Integer(2000000, bounds=(1,None), softbounds=(1,50000000),\n", " doc=\"Number of points\", precedence=0.85)\n", - " \n", + "\n", " @param.depends(\"parameters.param\", watch=True)\n", " def _update_from_parameters(self):\n", " a = params.attractor(*self.parameters())\n", " if a is not self.attractor_type:\n", " self.param.set_param(attractor_type=a)\n", - " \n", + "\n", " @param.depends(\"attractor_type.param\", \"plot_type\", \"n\")\n", " def view(self):\n", - " return datashade(self.attractor_type(n=self.n), self.plot_type, \n", + " return datashade(self.attractor_type(n=self.n), self.plot_type,\n", " palette[self.attractor_type.colormap][::-1])\n", "\n", " @param.depends(\"attractor_type\")\n", " def equations(self):\n", " if not self.attractor_type.equations:\n", " return pn.Column()\n", - " return pn.Column(\"\"+self.attractor_type.__class__.name+\" attractor\", \n", - " *[LaTeX(e) for e in self.attractor_type.equations])\n", + " return pn.Column(\"\"+self.attractor_type.__class__.name+\" attractor\",\n", + " *[LaTeX(e) for e in self.attractor_type.equations])\n", "\n", "ats = Attractors(name=\"Options\")\n", "params.current = lambda: ats.attractor_type\n", @@ -240,13 +238,13 @@ "text = pn.panel(\"\"\"\n", "\n", "\n", - "

This [Panel](https://github.com/pyviz/panel) app lets you explore \n", - "[strange attractors](attractors.ipynb) -- \n", - "fractal-like patterns that can emerge from the trajectory of a particle \n", + "

This [Panel](https://github.com/pyviz/panel) app lets you explore\n", + "[strange attractors](attractors.ipynb) --\n", + "fractal-like patterns that can emerge from the trajectory of a particle\n", "in 2D space.

\n", "\n", "Here you can choose between different attractor families, selecting from\n", - "predefined examples or adjusting your own values and adding them to the \n", + "predefined examples or adjusting your own values and adding them to the\n", "saved list when you discover something interesting.

\n", "\n", "The trajectories are calculated quickly using [Numba](http://numba.pydata.org),\n", @@ -273,7 +271,8 @@ " pn.Column(text, pn.panel(ats.equations,margin=(0,-500,0,0))), pn.Spacer(max_width=20),\n", " pn.Column(ats.view, player), pn.Spacer(max_width=20),\n", " pn.Column(pn.Param(ats.param, expand=True, width=220)),\n", - " HSpacer()).servable(\"Attractors\")" + " HSpacer()\n", + " ).servable(\"Attractors\")" ] }, { @@ -285,11 +284,24 @@ } ], "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", "name": "python", - "pygments_lexer": "ipython3" + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/attractors/clifford_panel.ipynb b/attractors/clifford_panel.ipynb index 278f972df..4e8b8021d 100644 --- a/attractors/clifford_panel.ipynb +++ b/attractors/clifford_panel.ipynb @@ -4,10 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Clifford Attractors\n", - "Written by James A. Bednar
\n", - "Created: 2018
\n", - "Last updated: July 15, 2021" + "# Clifford attractors\n" ] }, { @@ -17,13 +14,12 @@ "\n", "\n", - "## Clifford attractors with Datashader, Panel, and interact\n", "\n", - "[Clifford attractors](https://examples.pyviz.org/attractors) are a type of iterative equation that traces the path of a particle through a 2D space using functions of sine and cosine terms that make interesting \"attractor\" patterns (covering only some portions of the possible space, in certain shapes). \n", + "[Clifford attractors](./attractors.py) are a type of iterative equation that traces the path of a particle through a 2D space using functions of sine and cosine terms that make interesting \"attractor\" patterns (covering only some portions of the possible space, in certain shapes). \n", "\n", "Here we use Numpy and Pandas to calculate a dataframe consisting of millions of such locations, using [Numba](https://numba.pydata.org) to make generating them 50X faster than bare Python. We'll then plot the results as a static image using [Datashader](http://datashader.org), which renders arbitrarily large data into fixed-sized images. \n", "\n", - "If you can have a live Python process running (not just a static webpage or anaconda.org notebook viewer), we'll also show you how to make an interactive app for exploring parameter values, and a standalone dashboard suitable for sharing widely. Before you run the notebook or server, you'll need to set up a [conda](http://conda.pydata.org/miniconda.html) environment and run `conda install -c pyviz datashader panel`." + "If you can have a live Python process running (not just a static webpage or anaconda.org notebook viewer), we'll also show you how to make an interactive app for exploring parameter values, and a standalone dashboard suitable for sharing widely. Before you run the notebook or server, you'll need to set up a [conda](https://docs.conda.io/miniconda.html) environment and run `conda install -c pyviz datashader panel`." ] }, { @@ -114,7 +110,7 @@ "metadata": {}, "outputs": [], "source": [ - "i = pn.interact(clifford_plot, a=(0,2), b=(0,2), c=(0,2), d=(0,2), \n", + "i = pn.interact(clifford_plot, a=(0,2), b=(0,2), c=(0,2), d=(0,2),\n", " n=(1,20000000), colormap=ps, panel_layout=pn.Row)\n", "print(i)" ] @@ -139,7 +135,7 @@ "text = pn.panel(\"#### Use the widgets to vary the parameters of this \"\n", " \"[Clifford attractor](attractors.ipynb).\\n\\n\"\n", " \"#### Note that many values result in nearly \"\n", - " \"blank plots that contain only a few scattered points.\", \n", + " \"blank plots that contain only a few scattered points.\",\n", " width=310, height=100)\n", "\n", "pn.Row(pn.Column(logo, text, i[0]), i[1]).servable();" @@ -163,11 +159,24 @@ } ], "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", "name": "python", - "pygments_lexer": "ipython3" + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/attractors/attractors.yml b/attractors/data/attractors.yml similarity index 98% rename from attractors/attractors.yml rename to attractors/data/attractors.yml index 9455597d4..3ea681f94 100644 --- a/attractors/attractors.yml +++ b/attractors/data/attractors.yml @@ -388,13 +388,6 @@ - -2.3419 - -1.9799 - 2.1828 -- - Hopalong1 - - bmw - - 0 - - 0 - - -11.0 - - 0.05 - - 0.5 - - Gumowski_Mira - bgyw - 0.5 diff --git a/attractors/strange_attractors.yml b/attractors/data/strange_attractors.yml similarity index 100% rename from attractors/strange_attractors.yml rename to attractors/data/strange_attractors.yml diff --git a/attractors/index.ipynb b/attractors/index.ipynb new file mode 100644 index 000000000..88b28eac7 --- /dev/null +++ b/attractors/index.ipynb @@ -0,0 +1,27 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Attractors\n", + "\n", + "An [attractor](https://en.wikipedia.org/wiki/Attractor#Strange_attractor) is a set of values to which a numerical system tends to evolve. An attractor is called a [strange attractor](https://en.wikipedia.org/wiki/Attractor#Strange_attractor) if the resulting pattern has a fractal structure. This topic example is composed of three notebooks, two of them being deployable Panel dashboard:\n", + "\n", + "1. [Visualizing Attractors](./attractors.ipynb): This notebook shows how to calculate and plot two-dimensional attractors of a variety of types, using code and parameters primarily from [Lázaro Alonso](https://lazarusa.github.io/Webpage/codepython2.html), [François Pacull](https://aetperf.github.io/2018/08/29/Plotting-Hopalong-attractor-with-Datashader-and-Numba.html), [Jason Rampe](https://softologyblog.wordpress.com/2017/03/04/2d-strange-attractors), [Paul Bourke](http://paulbourke.net/fractals/), and [James A. Bednar](https://github.com/jbednar).\n", + "\n", + "2. [Clifford Attractors App](./clifford_panel.ipynb): *Clifford attractors* are a type of iterative equation that traces the path of a particle through a 2D space using functions of sine and cosine terms that make interesting \"attractor\" patterns (covering only some portions of the possible space, in certain shapes). This notebook shows how to use [Datashader](https://datashader.org), [Numba](https://numba.pydata.org) and [Panel](https://panel.holoviz.org) to build a simple app to interact with such attractors.\n", + "\n", + "3. [Strange Attractors App](./attractors_panel.ipynb): *Strange attractors* are a type of iterative equation that traces the path of a particle through a 2D space, forming interesting patterns in the trajectories. The patterns differ depending on which sets of equations are used and which parameter values are selected for those equations. This notebook demonstrates how to build a more complex [Panel](https://panel.holoviz.org) app that makes the parameter spaces easy to explore, allowing to select between the attractor families, to adjust the parameter values for that type of attractor, and see the results rendered using [Datashader](https://datashader.org).\n" + ] + } + ], + "metadata": { + "language_info": { + "name": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/attractors/thumbnails/attractors.png b/attractors/thumbnails/attractors.png deleted file mode 100644 index ca83877a2..000000000 Binary files a/attractors/thumbnails/attractors.png and /dev/null differ diff --git a/attractors/thumbnails/attractors_panel.png b/attractors/thumbnails/attractors_panel.png deleted file mode 100644 index 2ed80c099..000000000 Binary files a/attractors/thumbnails/attractors_panel.png and /dev/null differ diff --git a/attractors/thumbnails/clifford_panel.png b/attractors/thumbnails/clifford_panel.png deleted file mode 100644 index 8dc4244d6..000000000 Binary files a/attractors/thumbnails/clifford_panel.png and /dev/null differ diff --git a/attractors/thumbnails/index.png b/attractors/thumbnails/index.png new file mode 100644 index 000000000..04ad284e9 Binary files /dev/null and b/attractors/thumbnails/index.png differ diff --git a/dodo.py b/dodo.py index 333c693e0..6f61c08ef 100644 --- a/dodo.py +++ b/dodo.py @@ -1494,7 +1494,6 @@ def prepare_project(name): 'clean': [f'rm -rf {name}/envs'], } - def task_test_lint_project(): """Lint a project with nbqa flake8 @@ -1504,12 +1503,8 @@ def task_test_lint_project(): """ def lint_notebooks(name): notebooks = find_notebooks(name) - notebooks = " ".join(f'{name}/{nb.name}' for nb in notebooks) - subprocess.run([ - 'nbqa', - 'flake8', - f'{notebooks}', - ], check=True) + notebooks = [str(nb) for nb in notebooks] + subprocess.run(['nbqa', 'flake8'] + notebooks, check=True) for name in all_project_names(root=''): yield { @@ -1538,14 +1533,16 @@ def has_test_command(name): def test_notebooks(name): notebooks = find_notebooks(name) - notebooks = " ".join(f'{name}/{nb.name}' for nb in notebooks) - subprocess.run([ - 'pytest', - '--nbval-lax', - '--nbval-cell-timeout=3600', - f'--nbval-kernel-name={name}-kernel', - f'{notebooks}', - ], check=True) + notebooks = [str(nb) for nb in notebooks] + subprocess.run( + [ + 'pytest', + '--nbval-lax', + '--nbval-cell-timeout=3600', + f'--nbval-kernel-name={name}-kernel', + ] + notebooks, + check=True + ) for name in all_project_names(root=''): if has_test_command(name):