diff --git a/music/Mozart Serenade in G, Eine kleine Nachtmusik.mp3 b/music/Mozart Serenade in G, Eine kleine Nachtmusik.mp3 new file mode 100644 index 0000000..21f2e36 Binary files /dev/null and b/music/Mozart Serenade in G, Eine kleine Nachtmusik.mp3 differ diff --git a/music/Radetzky March.mp3 b/music/Radetzky March.mp3 new file mode 100644 index 0000000..2f8859e Binary files /dev/null and b/music/Radetzky March.mp3 differ diff --git a/music/The Blue Danube - Op. 314.mp3 b/music/The Blue Danube - Op. 314.mp3 new file mode 100644 index 0000000..770e9a1 Binary files /dev/null and b/music/The Blue Danube - Op. 314.mp3 differ diff --git a/music/eine_kleine_nachtmusik.LICENSE b/music/eine_kleine_nachtmusik.LICENSE new file mode 100644 index 0000000..22f9f21 --- /dev/null +++ b/music/eine_kleine_nachtmusik.LICENSE @@ -0,0 +1,7 @@ +CC BY-NC-ND 3.0 DEED + +https://creativecommons.org/licenses/by-nc-nd/3.0/ + +Performance by A Far Cry + +https://musopen.org/music/28074-serenade-no-13-a-little-night-music-eine-kleine-nachtmusik-k-525/ diff --git a/music/radetzky_march.LICENSE b/music/radetzky_march.LICENSE new file mode 100644 index 0000000..871f0c8 --- /dev/null +++ b/music/radetzky_march.LICENSE @@ -0,0 +1,7 @@ +Public Domain (US Government Work) + +https://creativecommons.org/publicdomain/mark/1.0/ + +Recording by "The President's Own" United States Marine Band, from Sound Off!, recorded May 18–21, 1992 at Center for the Arts, George Mason University; conducted by John R. Bourgeois + +https://www.marineband.marines.mil/Portals/175/Docs/Audio/Educational_Series/sound_off/radetzky_march.mp3 diff --git a/music/the_blue_danube.LICENSE b/music/the_blue_danube.LICENSE new file mode 100644 index 0000000..456a39f --- /dev/null +++ b/music/the_blue_danube.LICENSE @@ -0,0 +1,7 @@ +CC BY-NC 4.0 + +https://creativecommons.org/licenses/by-nc/4.0/ + +Live concert recording by: Das Orchester Tsumugi / Takashi Inoue (Recorded on 10/Mar. 2024, Fukuoka Symphony Hall, Japan) / Source: IMSLP + +https://www.classicals.de/strauss-2-blue-danube \ No newline at end of file diff --git a/pixi.lock b/pixi.lock index 8d91c4b..04c2f0e 100644 --- a/pixi.lock +++ b/pixi.lock @@ -39,7 +39,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.14-h994f30f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.15-h6a952e8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rust-1.95.0-h53717f1_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda @@ -77,6 +77,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/7c/b7b24e10e5cb0213c85204d53fcd60d0568d986ea0001a00a815e14e01e1/tensorstore-0.1.84-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/a6/907a406bb7d359e6a63f99c313846d9eec4f7e6f7437809e03aa00fa3074/absl_py-2.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/54/196d0c1db10af76baa4f64894448505d60d3cdf70ef92cbb35f46a4e4c71/starlette-1.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/24/ed72f68cbc1333ca9b9f2200aa048bb6658ae41709bc1caad4310f4bdffd/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl @@ -134,8 +135,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/65/4bd2abfd4cb6e917b2626de5cbfc034dfc94b74dd95b8272d93f2ad66bed/flax-0.12.7-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/93/79/920b8e0a8b20f793e8d64855095cb8febabf6175b8550b6f7a547d813891/starlette-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/16/70255075a9859a0e3adb789b68ceb0e210dec03934245fd98d248226572f/idna-3.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/97/74/b7a304feb2b49df9fafa9382d4d09061a96ee9a9449a7cbea7988dda0828/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl @@ -167,6 +166,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/a7/f76514cc40ad6234098ecdebda08732d75964776c51a42845b7da10649e2/idna-3.17-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/e4/1ba6f44e491c4eece978685230dde56b14d51a0365bc1b774ddaa94d14cd/pyopengl-3.1.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/82/45359b62a067409bd929ae8a56b8ed13e5a8c8a61194b3c236920999ab83/fastapi-0.136.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl @@ -246,7 +246,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/freeimage-3.18.0-h165c975_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.7.0-py312h447239a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.8.0-py312h447239a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-13.4.0-h0dff253_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.4.0-h23e9d51_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.4.0-h5174b15_25.conda @@ -291,10 +291,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.28.4-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.29.0-hb700be7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libacl-2.3.2-h0f662aa_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda @@ -311,7 +311,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-hd0affe5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.8-default_h99862b1_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp21.1-21.1.0-default_h99862b1_1.conda @@ -385,7 +385,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.19-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-17.7-h5c52fec_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h49aed37_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-hfb7daa7_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libraw-0.21.5-h074291d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-h49af25d_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.4.0-h2a15e64_19.conda @@ -394,10 +394,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-hd0affe5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h4ab18f5_1006.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-hd0affe5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liburcu-0.14.0-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liburing-2.12-hb700be7_0.conda @@ -452,7 +452,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.3.1-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.5.2-py312h8a5da7c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.15-h3f63f65_0.conda @@ -472,7 +472,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.7.1-h8fae777_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.3-hd590300_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.14-h994f30f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.15-h6a952e8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rust-1.95.0-h53717f1_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.32.56-h54a6638_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.2.24-h68140b3_0.conda @@ -571,7 +571,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.3.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-7.3.0-pyhd8ed1ab_0.conda @@ -587,7 +587,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.15-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda @@ -961,6 +961,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/7c/b7b24e10e5cb0213c85204d53fcd60d0568d986ea0001a00a815e14e01e1/tensorstore-0.1.84-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/a6/907a406bb7d359e6a63f99c313846d9eec4f7e6f7437809e03aa00fa3074/absl_py-2.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/54/196d0c1db10af76baa4f64894448505d60d3cdf70ef92cbb35f46a4e4c71/starlette-1.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/24/ed72f68cbc1333ca9b9f2200aa048bb6658ae41709bc1caad4310f4bdffd/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl @@ -1013,7 +1014,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/65/4bd2abfd4cb6e917b2626de5cbfc034dfc94b74dd95b8272d93f2ad66bed/flax-0.12.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/93/4f/c43a0a8f0c66fd40a1d6cc47332a5a1d1043e9b331f7070ea701b91a7598/tyro-1.0.13-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/93/79/920b8e0a8b20f793e8d64855095cb8febabf6175b8550b6f7a547d813891/starlette-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/97/74/b7a304feb2b49df9fafa9382d4d09061a96ee9a9449a7cbea7988dda0828/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl @@ -1099,7 +1099,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.14-h994f30f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.15-h6a952e8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rust-1.95.0-h53717f1_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py312h20c3967_3.conda @@ -1116,7 +1116,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.15-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda @@ -1132,7 +1132,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.21.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda @@ -1167,6 +1167,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/54/196d0c1db10af76baa4f64894448505d60d3cdf70ef92cbb35f46a4e4c71/starlette-1.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/24/ed72f68cbc1333ca9b9f2200aa048bb6658ae41709bc1caad4310f4bdffd/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl @@ -1202,7 +1203,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/db/55a262f3606bebcae07cc14095338471ad7c0bbcaa37707e6f0ee49725b7/importlib_resources-7.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/93/79/920b8e0a8b20f793e8d64855095cb8febabf6175b8550b6f7a547d813891/starlette-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/97/74/b7a304feb2b49df9fafa9382d4d09061a96ee9a9449a7cbea7988dda0828/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl @@ -1299,7 +1299,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/freeimage-3.18.0-h165c975_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.7.0-py312h447239a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.8.0-py312h447239a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-13.4.0-h0dff253_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.4.0-h23e9d51_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.4.0-h5174b15_25.conda @@ -1344,10 +1344,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.28.4-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.29.0-hb700be7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libacl-2.3.2-h0f662aa_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda @@ -1364,7 +1364,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-hd0affe5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.8-default_h99862b1_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp21.1-21.1.0-default_h99862b1_1.conda @@ -1438,7 +1438,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.19-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-17.7-h5c52fec_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h49aed37_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-hfb7daa7_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libraw-0.21.5-h074291d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-h49af25d_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.4.0-h2a15e64_19.conda @@ -1447,10 +1447,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-hd0affe5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h4ab18f5_1006.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-hd0affe5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liburcu-0.14.0-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liburing-2.12-hb700be7_0.conda @@ -1505,7 +1505,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.3.1-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.5.2-py312h8a5da7c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.15-h3f63f65_0.conda @@ -1525,7 +1525,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.7.1-h8fae777_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.3-hd590300_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.14-h994f30f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.15-h6a952e8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rust-1.95.0-h53717f1_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.32.56-h54a6638_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.2.24-h68140b3_0.conda @@ -1625,7 +1625,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.3.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-7.3.0-pyhd8ed1ab_0.conda @@ -1641,7 +1641,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.15-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda @@ -2003,7 +2003,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/01/be/72532be3da7acc5fdfbccdb95215cd04f995a0886532a5b423f929cda4cc/uvicorn-0.48.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/02/28/167b291356c2cc315a2d62a95b0ceace72b5b0bf547de30b89313110f032/av-17.0.1-cp311-abi3-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/04/40/a2ea4d8f032bfd6c220d50b6f92cd61f33d48f31959da39ed1b178cfee54/cuda_bindings-13.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/98/716a473cfb24750858ddd5d14e6527539dd206583a46408d08eeb2844a75/trimesh-4.12.2-py3-none-any.whl @@ -2018,6 +2017,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/7c/b7b24e10e5cb0213c85204d53fcd60d0568d986ea0001a00a815e14e01e1/tensorstore-0.1.84-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/a6/907a406bb7d359e6a63f99c313846d9eec4f7e6f7437809e03aa00fa3074/absl_py-2.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/54/196d0c1db10af76baa4f64894448505d60d3cdf70ef92cbb35f46a4e4c71/starlette-1.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/24/ed72f68cbc1333ca9b9f2200aa048bb6658ae41709bc1caad4310f4bdffd/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl @@ -2032,6 +2032,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/33/d1/8bb87d21e9aeb323cc03034f5eaf2c8f69841e40e4853c2627edf8111ed3/termcolor-3.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/7d/2661f2fb3ac4302f3a246f5fc030213ac60c1fe0bce84f9783dbd831dbb7/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/38/69/2912ab63036e21c72748019e1d8e09e8a1fc3368b3e83fc27898a1858575/jaxlib-0.10.1-cp312-cp312-manylinux_2_27_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/39/2a/6d2e9047d1fb243dbaa364b01e0297534b9ed7fd27dba1c9f361519cf69b/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3a/cb/28ce52eb94390dda42599c98ea0204d74799e4d8047a0eb559b6fd648056/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3b/cd/154ca20c38269e05eff77c1464e6c1da89f50a6390b565e9d82e06bc11e1/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl @@ -2086,7 +2087,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/65/4bd2abfd4cb6e917b2626de5cbfc034dfc94b74dd95b8272d93f2ad66bed/flax-0.12.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/93/4f/c43a0a8f0c66fd40a1d6cc47332a5a1d1043e9b331f7070ea701b91a7598/tyro-1.0.13-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/93/79/920b8e0a8b20f793e8d64855095cb8febabf6175b8550b6f7a547d813891/starlette-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/97/74/b7a304feb2b49df9fafa9382d4d09061a96ee9a9449a7cbea7988dda0828/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl @@ -2600,6 +2600,7 @@ packages: - python_abi 3.12.* *_cp312 - tomli license: Apache-2.0 + license_family: APACHE purls: - pkg:pypi/coverage?source=hash-mapping size: 389696 @@ -2966,9 +2967,9 @@ packages: purls: [] size: 61244 timestamp: 1757438574066 -- conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.7.0-py312h447239a_0.conda - sha256: f4e0e6cd241bc24afb2d6d08e5d2ba170fad2475e522bdf297b7271bba268be6 - md5: 63e20cf7b7460019b423fc06abb96c60 +- conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.8.0-py312h447239a_0.conda + sha256: 7f36a4fc42f6d4cb9c5b210b6604b54eba2e5745c92d76241b6f8fce446818d1 + md5: 6a42923f35087cc88a9fac31ef096ce6 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -2978,9 +2979,9 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/frozenlist?source=hash-mapping - size: 55037 - timestamp: 1752167383781 + - pkg:pypi/frozenlist?source=compressed-mapping + size: 55016 + timestamp: 1779999817627 - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-13.4.0-h0dff253_19.conda sha256: 814fce48b3b16736cc46e76fab2be8736f876915327af4df5febb1de1758c0ad md5: df630a4b8f5d5e2d79b7462cf56d3d4e @@ -3643,9 +3644,9 @@ packages: purls: [] size: 508258 timestamp: 1664996250081 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda - sha256: eb89c6c39f2f6a93db55723dbb2f6bba8c8e63e6312bf1abf13e6e9ff45849c8 - md5: f92f984b558e6e6204014b16d212b271 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda + sha256: 112b5b9462572d970f4abd2912f76a25ee7db158b1e7260163d91dd8a630db84 + md5: 8b3ce45e929cd8e8e5f4d18586b56d8b depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -3654,8 +3655,8 @@ packages: license: MIT license_family: MIT purls: [] - size: 251086 - timestamp: 1778079286384 + size: 251971 + timestamp: 1780211695895 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c md5: 18335a698559cdbcd86150a48bf54ba6 @@ -3681,9 +3682,9 @@ packages: purls: [] size: 261513 timestamp: 1773113328888 -- conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.28.4-hb700be7_0.conda - sha256: ed1eb569df9bbfcb4b451478eaba03cbd2d26efed88152ad2e4b7b7b2297ef84 - md5: c44c0485271b7b4c92dec39e9f7d096e +- conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.29.0-hb700be7_0.conda + sha256: d87cfc5eaa08eefff97d891ecb49faa958fcfc32a425767796269c4100d4e516 + md5: f3c3bc77c96af553f761af0e78bc8d9d depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -3691,8 +3692,8 @@ packages: license: MIT license_family: MIT purls: [] - size: 858263 - timestamp: 1777157859593 + size: 875773 + timestamp: 1780142086148 - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda sha256: dcd1429a1782864c452057a6c5bc1860f2b637dc20a2b7e6eacd57395bbceff8 md5: 83b160d4da3e1e847bf044997621ed63 @@ -3811,6 +3812,7 @@ packages: - liblapack 3.11.0 8*_openblas - liblapacke 3.11.0 8*_openblas license: BSD-3-Clause + license_family: BSD purls: [] size: 18804 timestamp: 1779859100675 @@ -3905,17 +3907,17 @@ packages: purls: [] size: 298378 timestamp: 1764017210931 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-hd0affe5_1.conda - sha256: 37c41b1024d0c75da76822e3c079aabaf121618a32fe05e53a897b35a88008fc - md5: 499cd8e2d4358986dbe3b30e8fe1bf6a +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda + sha256: cc8c9fc6ddf0fbd3d1275b558ae9abad6cda23bced268732e2da21a87bb358cd + md5: f9f17eab7f3df1c6fd4b1a548a2f683a depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: BSD-3-Clause license_family: BSD purls: [] - size: 124432 - timestamp: 1774333989027 + size: 124335 + timestamp: 1775488792584 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda build_number: 8 sha256: 1a2bc77bb26520255904a3d9b1f40e6bf0bf9d8d3405c7709dd162282820915a @@ -3927,6 +3929,7 @@ packages: - liblapacke 3.11.0 8*_openblas - liblapack 3.11.0 8*_openblas license: BSD-3-Clause + license_family: BSD purls: [] size: 18778 timestamp: 1779859107964 @@ -4442,6 +4445,7 @@ packages: - libcblas 3.11.0 8*_openblas - liblapacke 3.11.0 8*_openblas license: BSD-3-Clause + license_family: BSD purls: [] size: 18790 timestamp: 1779859115086 @@ -4456,6 +4460,7 @@ packages: constrains: - blas 2.308 openblas license: BSD-3-Clause + license_family: BSD purls: [] size: 18824 timestamp: 1779859122364 @@ -4889,21 +4894,21 @@ packages: purls: [] size: 2649881 timestamp: 1763565297202 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h49aed37_4.conda - sha256: 0ef142ac31e6fd59b4af89ac800acb6deb3fbd9cc4ccf070c03cc2c784dc7296 - md5: 07479fc04ba3ddd5d9f760ef1635cfa7 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-hfb7daa7_5.conda + sha256: b04322e2128684d4043e256f56b74528b0a0a296ba4a81299056ec04655a0580 + md5: da31d891434e50d7e7be8adc5832269b depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libgcc >=14 - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 4372578 - timestamp: 1766316228461 + size: 4204474 + timestamp: 1780003940664 - conda: https://conda.anaconda.org/conda-forge/linux-64/libraw-0.21.5-h074291d_0.conda sha256: 7b11ab45e471ba77eab1a21872be3dce8cc81edc2500cd782a6ff49816bce6d4 md5: c307c91b10217c31fc9d8e18cd58dc64 @@ -5029,17 +5034,17 @@ packages: purls: [] size: 27776 timestamp: 1778269074600 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-hd0affe5_0.conda - sha256: c5008b602cb5c819f7b52d418b3ed17e1818cbbf6705b189e7ab36bb70cce3d8 - md5: 8ee3cb7f64be0e8c4787f3a4dbe024e6 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + sha256: 2293884d59cf0436c37fc0a4bad71011a8de2a6913610d1c701a7703377c1f75 + md5: ea0da9c20bbb221b530810c3c68bbe62 depends: - __glibc >=2.17,<3.0.a0 - - libcap >=2.77,<2.78.0a0 + - libcap >=2.78,<2.79.0a0 - libgcc >=14 license: LGPL-2.1-or-later purls: [] - size: 492799 - timestamp: 1773797095649 + size: 493022 + timestamp: 1780084748140 - conda: https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h4ab18f5_1006.conda sha256: 50c8cd416ac8425e415264de167b41ae8442de22a91098dfdd993ddbf9f13067 md5: 553281a034e9cf8693c9df49f6c78ea1 @@ -5072,17 +5077,17 @@ packages: purls: [] size: 435273 timestamp: 1762022005702 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-hd0affe5_0.conda - sha256: 1a1e367c04d66030aa93b4d33905f7f6fbb59cfc292e816fe3e9c1e8b3f4d1e2 - md5: 2c2270f93d6f9073cbf72d821dfc7d72 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + sha256: 287d05680e49eea51b8145fbf34bc213c0618b04f32e450e9da5d715e5134e38 + md5: 89e5671a076d99516a6acd72a35b1640 depends: - __glibc >=2.17,<3.0.a0 - - libcap >=2.77,<2.78.0a0 + - libcap >=2.78,<2.79.0a0 - libgcc >=14 license: LGPL-2.1-or-later purls: [] - size: 145087 - timestamp: 1773797108513 + size: 145969 + timestamp: 1780084753104 - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda sha256: 71c8b9d5c72473752a0bb6e91b01dd209a03916cb71f36cc6a564e3a2a132d7a md5: e179a69edd30d75c0144d7a380b88f28 @@ -5882,20 +5887,20 @@ packages: purls: [] size: 3240415 timestamp: 1754927975218 -- conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.3.1-py312h178313f_0.conda - sha256: d0ff67d89cf379a9f0367f563320621f0bc3969fe7f5c85e020f437de0927bb4 - md5: 0cf580c1b73146bb9ff1bbdb4d4c8cf9 +- conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.5.2-py312h8a5da7c_0.conda + sha256: c9138bbb53d4bac010526a8deace8cf764aac13fad5280d0a71556bad6c04d29 + md5: d681d6ad9fa2ca3c8cacb7f3b23d54f3 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libgcc >=14 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/propcache?source=hash-mapping - size: 54233 - timestamp: 1744525107433 + - pkg:pypi/propcache?source=compressed-mapping + size: 51586 + timestamp: 1780037816755 - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_0.conda sha256: d834fd656133c9e4eaf63ffe9a117c7d0917d86d89f7d64073f4e3a0020bd8a7 md5: dd94c506b119130aef5a9382aed648e7 @@ -6291,10 +6296,10 @@ packages: purls: [] size: 184509 timestamp: 1693427593121 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.14-h994f30f_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.15-h6a952e8_1.conda noarch: python - sha256: 787f6608c4d23abe735875cfcfe316790e06ba43654ff269a43b920e83482bbe - md5: 605e065354fc2525ae245adbe189eb84 + sha256: 69254aead1c5f6c7e6d7ca195219b655fae4f9d0111ced58b6ceb6cb849cbcd1 + md5: e296d828d3b0cfec4e553ed59c52f17c depends: - python - __glibc >=2.17,<3.0.a0 @@ -6305,8 +6310,8 @@ packages: license_family: MIT purls: - pkg:pypi/ruff?source=compressed-mapping - size: 9340598 - timestamp: 1779388159173 + size: 9174319 + timestamp: 1780055663369 - conda: https://conda.anaconda.org/conda-forge/linux-64/rust-1.95.0-h53717f1_1.conda sha256: 0f7965acec00e5b35d7b4748ea0da57249ab3db2177d13eb87909c0a142148b5 md5: 26172b61a3f03c31e56065413ffc1f2f @@ -7151,7 +7156,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/yarl?source=compressed-mapping + - pkg:pypi/yarl?source=hash-mapping size: 155061 timestamp: 1779246264888 - conda: https://conda.anaconda.org/conda-forge/linux-64/zenoh-rust-abi-1.5.1.1.85.0-h8619998_0.conda @@ -7697,16 +7702,18 @@ packages: - pkg:pypi/distro?source=hash-mapping size: 41773 timestamp: 1734729953882 -- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda - sha256: 0d605569a77350fb681f9ed8d357cc71649b59a304099dc9d09fbeec5e84a65e - md5: d6bd3cd217e62bbd7efe67ff224cd667 +- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda + sha256: def3b2566a1702fa083a8984753ac0b3e3f7381048f88714e03d55b7bd930b74 + md5: 2c3958e02221c2504ec036139e648d8b depends: - python >=3.10 - license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 + - python + license: LGPL-3.0-only + license_family: LGPL purls: - pkg:pypi/docutils?source=hash-mapping - size: 438002 - timestamp: 1766092633160 + size: 459540 + timestamp: 1779967837277 - conda: https://conda.anaconda.org/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2 sha256: 75e04755df8d8db7a7711dddaf68963c11258b755c9c24565bfefa493ee383e3 md5: e4be10fd1a907b223da5be93f06709d2 @@ -7921,9 +7928,9 @@ packages: - pkg:pypi/hyperframe?source=hash-mapping size: 17397 timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.15-pyhcf101f3_0.conda - sha256: 3d25f9f6f7ab3e1ce6429fc8c8aae0335cf446692e715068488536d220cc43de - md5: 1b9083b7f00609605d1483dbc6071a81 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda + sha256: f9fe1f9e539c544405ccb7ba632d4ba79edf243c05554d76ace073158a80b691 + md5: c75e517ebd7a5c5272fe111e8b162228 depends: - python >=3.10 - python @@ -7931,8 +7938,8 @@ packages: license_family: BSD purls: - pkg:pypi/idna?source=compressed-mapping - size: 62642 - timestamp: 1779294335905 + size: 56858 + timestamp: 1779999227630 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda sha256: 43e2a5497cad1598ff88a3e69f69bc88b7b8f141fa63c60eab5db296317318b8 md5: ffc17e785d64e12fc311af9184221839 @@ -7941,6 +7948,7 @@ packages: - zipp >=3.20 - python license: Apache-2.0 + license_family: APACHE purls: - pkg:pypi/importlib-metadata?source=compressed-mapping size: 34766 @@ -8239,18 +8247,18 @@ packages: - pkg:pypi/pip?source=hash-mapping size: 1177534 timestamp: 1762776258783 -- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - sha256: 8f29915c172f1f7f4f7c9391cd5dac3ebf5d13745c8b7c8006032615246345a5 - md5: 89c0b6d1793601a2a3a3f7d2d3d8b937 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda + sha256: 9e5e1fd3506ccfc4d444fc4d2d39b0ed097d5d0e3bd3d4bdf6bcc81aaf66860d + md5: 2c5ef45db85d34799771629bd5860fd7 depends: - python >=3.10 - python license: MIT license_family: MIT purls: - - pkg:pypi/platformdirs?source=hash-mapping - size: 25862 - timestamp: 1775741140609 + - pkg:pypi/platformdirs?source=compressed-mapping + size: 26308 + timestamp: 1779972894916 - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e md5: d7585b6550ad04c8c5e21097ada2888e @@ -8658,6 +8666,7 @@ packages: depends: - python >=3.10 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/snowballstemmer?source=hash-mapping size: 74201 @@ -15878,17 +15887,6 @@ packages: version: 17.0.1 sha256: c58c71bffd9383908c85695ac61d3184c668accb04a5bd1b262e0fb8d09f60a5 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/04/40/a2ea4d8f032bfd6c220d50b6f92cd61f33d48f31959da39ed1b178cfee54/cuda_bindings-13.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - name: cuda-bindings - version: 13.3.0 - sha256: a99c3b8d584f266c616bd0f30c7cd83e33553e3ef2abad41ff5a74fbc033a69a - requires_dist: - - cuda-pathfinder>=1.4.2 - - cuda-toolkit[nvfatbin,nvjitlink,nvrtc,nvvm]==13.* ; extra == 'all' - - cuda-toolkit[cufile]==13.* ; sys_platform == 'linux' and extra == 'all' - - cuda-toolkit==13.* ; extra == 'all' - - nvidia-cudla==13.* ; platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'all' - requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl name: h11 version: 0.16.0 @@ -16095,6 +16093,19 @@ packages: version: 2.4.0 sha256: 88476fd881ca8aab94ffa78b7b6c632a782ab3ba1cd19c9bd423abc4fb4cd28d requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/1c/54/196d0c1db10af76baa4f64894448505d60d3cdf70ef92cbb35f46a4e4c71/starlette-1.2.1-py3-none-any.whl + name: starlette + version: 1.2.1 + sha256: 4de0082d08c8f6764a85a54cf1120d6939507a19905c7768acad2a9f875d2b89 + requires_dist: + - anyio>=3.6.2,<5 + - typing-extensions>=4.10.0 ; python_full_version < '3.13' + - httpx>=0.27.0,<0.29.0 ; extra == 'full' + - itsdangerous ; extra == 'full' + - jinja2 ; extra == 'full' + - python-multipart>=0.0.18 ; extra == 'full' + - pyyaml ; extra == 'full' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl name: annotated-doc version: 0.0.4 @@ -16233,6 +16244,17 @@ packages: - numpy>=2.0 - ml-dtypes>=0.5.0 requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/39/2a/6d2e9047d1fb243dbaa364b01e0297534b9ed7fd27dba1c9f361519cf69b/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + name: cuda-bindings + version: 13.3.1 + sha256: e32d08f71ebcdf00f0f41eab2eb37e8da94c8ed411cc9f7f7a019ce6b34abe3a + requires_dist: + - cuda-pathfinder>=1.4.2 + - cuda-toolkit[nvfatbin,nvjitlink,nvrtc,nvvm]==13.* ; extra == 'all' + - cuda-toolkit[cufile]==13.* ; sys_platform == 'linux' and extra == 'all' + - cuda-toolkit==13.* ; extra == 'all' + - nvidia-cudla==13.* ; platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'all' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/3a/13/547360d81e6d88d58492968ffda9f9542854f11310ee556fef14260cc886/zipp-4.1.0-py3-none-any.whl name: zipp version: 4.1.0 @@ -17211,28 +17233,6 @@ packages: - torch>=1.10.0 ; python_full_version >= '3.9' and python_full_version < '3.14' and extra == 'dev-nn' - universal-pathlib>=0.2.0 ; extra == 'dev-nn' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/93/79/920b8e0a8b20f793e8d64855095cb8febabf6175b8550b6f7a547d813891/starlette-1.1.0-py3-none-any.whl - name: starlette - version: 1.1.0 - sha256: 7f0dfd38e428aad5cb6f9f667f0ca1d2d8ca3f3385dccac8305f79ec98458382 - requires_dist: - - anyio>=3.6.2,<5 - - typing-extensions>=4.10.0 ; python_full_version < '3.13' - - httpx>=0.27.0,<0.29.0 ; extra == 'full' - - itsdangerous ; extra == 'full' - - jinja2 ; extra == 'full' - - python-multipart>=0.0.18 ; extra == 'full' - - pyyaml ; extra == 'full' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/94/16/70255075a9859a0e3adb789b68ceb0e210dec03934245fd98d248226572f/idna-3.16-py3-none-any.whl - name: idna - version: '3.16' - sha256: cc246e3a3f89580c3a951b5ad298ca4638078b2cdd4f115654332b5c26daded5 - requires_dist: - - ruff>=0.6.2 ; extra == 'all' - - mypy>=1.11.2 ; extra == 'all' - - pytest>=8.3.2 ; extra == 'all' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/97/74/b7a304feb2b49df9fafa9382d4d09061a96ee9a9449a7cbea7988dda0828/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: scikit-learn version: 1.8.0 @@ -18022,6 +18022,15 @@ packages: requires_dist: - typing-extensions>=4.12.0 requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/de/a7/f76514cc40ad6234098ecdebda08732d75964776c51a42845b7da10649e2/idna-3.17-py3-none-any.whl + name: idna + version: '3.17' + sha256: 466e48829084efe2548012b855df21540b96f2e20e51bd124c851536556a592c + requires_dist: + - ruff>=0.6.2 ; extra == 'all' + - mypy>=1.11.2 ; extra == 'all' + - pytest>=8.3.2 ; extra == 'all' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/de/e4/1ba6f44e491c4eece978685230dde56b14d51a0365bc1b774ddaa94d14cd/pyopengl-3.1.10-py3-none-any.whl name: pyopengl version: 3.1.10 diff --git a/swarm_gpt/core/backend.py b/swarm_gpt/core/backend.py index e98dbd5..3c88a45 100644 --- a/swarm_gpt/core/backend.py +++ b/swarm_gpt/core/backend.py @@ -312,9 +312,7 @@ def deploy(self, drone_ids: list[int] | None = None) -> bool: ... if not self.music_manager.verify_libvlc(): - logger.error( - "VLC/libvlc is not available. Install VLC (see README) before deploying." - ) + logger.error("VLC/libvlc is not available. Install VLC (see README) before deploying.") return False swarm = DroneSwarm(self.choreographer.drones, lighthouse=self.settings["lighthouse"]) @@ -340,14 +338,20 @@ def deploy(self, drone_ids: list[int] | None = None) -> bool: logger.warning( f"Drone {uri} is too far from the expected initial position. pos={obs['pos']}, exp={d['pos']}" ) - landing_pos = obs["pos"] + landing_pos = obs["pos"] if self.settings["land_on_docks"] else d["pos"] # TODO fix hard coded yaw init_pos_dict[uri] = np.array([*init_pos, 0.0]) final_pos_dict[uri] = np.array([*landing_pos + np.array([0.0, 0.0, 0.8]), 0.0]) landing_pos_dict[uri] = np.array([*landing_pos - np.array([0.0, 0.0, 0.2]), 0.0]) choreography_dict[uri] = self.splines[i] - color_top[uri] = {0.0: colors_array[i]} - color_bot[uri] = {0.0: colors_array[i]} + color_top[uri] = { + 0.0: colors_array[i], + self.waypoints["time"][0, -1] - 0.1: np.zeros(4), + } + color_bot[uri] = { + 0.0: colors_array[i], + self.waypoints["time"][0, -1] - 0.1: np.zeros(4), + } try: if not correct_positions: @@ -376,19 +380,10 @@ def deploy(self, drone_ids: list[int] | None = None) -> bool: color_top=color_top, color_bot=color_bot, ) - swarm.apply_colors(None, None) # Turn off colors after choreography - swarm.goto(final_pos_dict, duration=1.0) # Transition from ideal point to hover pos - swarm.setpoint(final_pos_dict, duration=10.0) # Hovering - for i, d in enumerate(self.choreographer.drones.values()): - uri = d["uri"] - print(swarm.get_obs(uri)["pos"]) - print(landing_pos_dict[uri]) + swarm.goto(final_pos_dict, duration=2.0) # Transition from ideal point to hover pos + if self.settings["land_on_docks"]: + swarm.goto(final_pos_dict, duration=5.0) # Hovering swarm.goto(landing_pos_dict, duration=1.5) # Landing - # swarm.land(0.0, duration=1.0) - for i, d in enumerate(self.choreographer.drones.values()): - uri = d["uri"] - print(swarm.get_obs(uri)["pos"]) - print(landing_pos_dict[uri]) finally: swarm.close() self.music_manager.song = original_song diff --git a/swarm_gpt/core/drone_swarm.py b/swarm_gpt/core/drone_swarm.py index c9413f2..1ebf7a4 100644 --- a/swarm_gpt/core/drone_swarm.py +++ b/swarm_gpt/core/drone_swarm.py @@ -108,7 +108,14 @@ def takeoff(self, height: float = 1.5, duration: float = 3.0): """Take off the drones to a given height over a given duration.""" async def _takeoff(uri: str) -> None: - await self._takeoff_one(uri, height, duration) + cf = self._cf(uri) + await self._send_external_pose(uri) + commander = cf.commander() + await commander.send_stop_setpoint() + await commander.send_notify_setpoint_stop(0) + await cf.param().set("commander.enHighLevel", 1) + await cf.high_level_commander().take_off(height, None, duration, None) + await self._update_external_pose_during(uri, duration) self._run(self._parallel_by_uri("Taking off", self.uris, _takeoff)) @@ -116,16 +123,24 @@ def land(self, height: float = 0.0, duration: float = 3.0): """Land the drones at a given height over a given duration.""" async def _land(uri: str) -> None: - await self._land_one(uri, height, duration) + cf = self._cf(uri) + commander = cf.commander() + await commander.send_stop_setpoint() + await commander.send_notify_setpoint_stop(0) + await cf.param().set("commander.enHighLevel", 1) + high_level_commander = cf.high_level_commander() + await high_level_commander.land(height, None, duration, None) + await self._update_external_pose_during(uri, duration) + await high_level_commander.stop(None) self._run(self._parallel_by_uri("Landing", self.uris, _land)) def goto(self, target: dict[str, list], duration: float = 3.0): - """Execute a goto command for all drones by linearly interpolating references. + """Execute a high-level goto command for all drones. Args: target: Position+Yaw references in the form {'uri1': [target], ...}. - duration: Duration of the connection in seconds. + duration: Duration of the motion in seconds. """ self._validate_required_uris("pos", target) for uri, setpoint in target.items(): @@ -133,16 +148,26 @@ def goto(self, target: dict[str, list], duration: float = 3.0): raise ValueError(f"pos[{uri!r}] must contain exactly four elements.") async def _goto(uri: str) -> None: - await self._goto_one(uri, target[uri], duration) + cf = self._cf(uri) + if not self.lighthouse: + await self._send_external_pose(uri) + commander = cf.commander() + await commander.send_stop_setpoint() + await commander.send_notify_setpoint_stop(0) + await cf.param().set("commander.enHighLevel", 1) + await cf.high_level_commander().go_to( + *target[uri], duration, relative=False, linear=True, group_mask=None + ) + await self._update_external_pose_during(uri, duration) self._run(self._parallel_by_uri("Goto", self.uris, _goto)) def setpoint(self, target: dict[str, list], duration: float = 3.0): - """Execute a setpoint command for all drones by linearly interpolating references. + """Stream a constant position+yaw setpoint to all drones. Args: target: Position+Yaw references in the form {'uri1': [target], ...}. - duration: Duration of the connection in seconds. + duration: Duration of the setpoint stream in seconds. """ self._validate_required_uris("pos", target) for uri, setpoint in target.items(): @@ -150,7 +175,14 @@ def setpoint(self, target: dict[str, list], duration: float = 3.0): raise ValueError(f"pos[{uri!r}] must contain exactly four elements.") async def _setpoint(uri: str) -> None: - await self._setpoint_one(uri, target[uri], duration) + cf = self._cf(uri) + await cf.param().set("commander.enHighLevel", 0) + ref = interp1d( + [0.0, duration], + [np.asarray(target[uri], dtype=float), np.asarray(target[uri], dtype=float)], + axis=0, + ) + await self._stream_reference(uri, duration, lambda t: np.asarray(ref(t), dtype=float)) self._run(self._parallel_by_uri("Setpoint", self.uris, _setpoint)) @@ -177,10 +209,12 @@ def execute_choreography( self._validate_known_uris("color_bot", color_bot or {}) async def _execute(uri: str) -> None: - await self._execute_one( + cf = self._cf(uri) + await cf.param().set("commander.enHighLevel", 0) + await self._stream_reference( uri, - choreography[uri], t_end, + lambda t: np.asarray([*choreography[uri](t), 0.0], dtype=float), (color_top or {}).get(uri, {}), (color_bot or {}).get(uri, {}), ) @@ -218,28 +252,76 @@ def set_param(self, param: str, value: float): """ async def _set_param(uri: str) -> None: - await self._set_param_one(uri, param, value) + await self._cf(uri).param().set(param, value) self._run(self._parallel_by_uri(f"Setting parameter {param}", self.uris, _set_param)) - def emergency_stop(self, id: int | None = None): - """Send an emergency stop signal to one (id) or all drones (default).""" - if id is not None: - raise NotImplementedError("Sending emergency stop to one drone not implemented.") - - self._run(self._parallel_by_uri("Emergency stop", self.uris, self._emergency_stop_one)) + def emergency_stop(self, uri: str | None = None): + """Send an emergency stop signal to one URI or all drones (default).""" + if uri is None: + uris = self.uris + else: + self._validate_known_uris("uri", {uri: None}) + uris = [uri] + self._run(self._parallel_by_uri("Emergency stop", uris, self._emergency_stop)) def reset(self): """Reset all active drones.""" - self._run(self._parallel_by_uri("Resetting", self.uris, self._reset_one)) + + async def _reset(uri: str) -> None: + cf = self._cf(uri) + param = cf.param() + # Estimator setting; 1: complementary, 2: kalman + await param.set("stabilizer.estimator", 2) + # Enable/disable tumble control. Required 0 for aggressive maneuvers. + await param.set("supervisor.tmblChckEn", 1) + # Choose controller: 1: PID; 2: Mellinger. + await param.set("stabilizer.controller", 2) + await param.set("led.bitmask", 128) # turn off all indicator LEDs + await asyncio.sleep(0.1) + + if not self.lighthouse: + obs = await self._read_observation(uri) + await param.set("kalman.initialX", float(obs["pos"][0])) + await param.set("kalman.initialY", float(obs["pos"][1])) + await param.set("kalman.initialZ", float(obs["pos"][2])) + await param.set("kalman.initialYaw", float(obs["rpy"][2])) + + await param.set("kalman.resetEstimation", 1) + await asyncio.sleep(0.1) + await param.set("kalman.resetEstimation", 0) + await cf.platform().send_arming_request(do_arm=True) + await asyncio.sleep(0.8) + + self._run(self._parallel_by_uri("Resetting", self.uris, _reset)) def close(self): """Close the swarm and ROS connection.""" if self._closed: return self._closed = True + + async def _shutdown_leds(uri: str) -> None: + await self._cf(uri).param().set("led.bitmask", 0) # turn on all indicator LEDs + await self._apply_drone_color(uri, np.zeros(4), "both") + + async def _close() -> None: + active_uris = [uri for uri in self.uris if uri in self.active_uris] + if active_uris: + try: + await self._parallel_by_uri( + "Emergency stop", active_uris, self._emergency_stop + ) + await asyncio.sleep(0.1) + await self._parallel_by_uri("Shutdown LEDs", active_uris, _shutdown_leds) + await asyncio.sleep(0.2) + except RuntimeError as exc: + logger.warning(f"Shutdown failed: {exc}") + + await self._disconnect() + try: - self._run(self._close()) + self._run(_close()) finally: self._loop.close() if self.ros_connector is not None: @@ -276,7 +358,15 @@ def _validate_known_uris(self, name: str, mapping: Mapping[str, object]) -> None raise ValueError(f"{name} contains unknown drone URIs: {sorted(unknown)}") async def _connect(self) -> None: - await self._power_cycle() + async def _power_cycle(uri: str) -> None: + try: + await Crazyflie.power_off_stm32_domain(self.context, uri) + await asyncio.sleep(0.1) + await Crazyflie.power_on_stm32_domain(self.context, uri) + except CrazyflieError as exc: + logger.warning(f"Power cycling {uri} failed: {exc}") + + await asyncio.gather(*[_power_cycle(uri) for uri in self.uris]) await asyncio.sleep(_POWER_CYCLE_BOOT_WAIT) results = await asyncio.gather( @@ -321,17 +411,6 @@ async def _check_lighthouse_decks(self) -> None: f"{_LIGHTHOUSE_DECK_PARAM}=1 for every drone: {'; '.join(failures)}" ) - async def _power_cycle(self) -> None: - async def _cycle(uri: str) -> None: - try: - await Crazyflie.power_off_stm32_domain(self.context, uri) - await asyncio.sleep(0.1) - await Crazyflie.power_on_stm32_domain(self.context, uri) - except CrazyflieError as exc: - logger.warning(f"Power cycling {uri} failed: {exc}") - - await asyncio.gather(*[_cycle(uri) for uri in self.uris]) - async def _parallel_by_uri( self, action_name: str, uris: Iterable[str], action: Callable[[str], Awaitable[None]] ) -> None: @@ -350,6 +429,9 @@ async def _parallel_by_uri( else: logger.error(f"{action_name} failed for {uri}: {result}") + async def _emergency_stop(self, uri: str) -> None: + await self._cf(uri).localization().emergency().send_emergency_stop() + async def _read_observation(self, uri: str) -> dict[str, Array]: if self.lighthouse: return await self._read_lighthouse_observation(uri) @@ -416,34 +498,6 @@ async def _apply_drone_color( if deck == "bot" or deck == "both": await param.set("colorLedBot.wrgb8888", color) - async def _set_param_one(self, uri: str, param_name: str, value: float) -> None: - await self._cf(uri).param().set(param_name, value) - - async def _reset_one(self, uri: str) -> None: - cf = self._cf(uri) - param = cf.param() - # Estimator setting; 1: complementary, 2: kalman - await param.set("stabilizer.estimator", 2) - # Enable/disable tumble control. Required 0 for aggressive maneuvers. - await param.set("supervisor.tmblChckEn", 1) - # Choose controller: 1: PID; 2: Mellinger. - await param.set("stabilizer.controller", 2) - await param.set("led.bitmask", 128) # turn off all LEDs - await asyncio.sleep(0.1) - - if not self.lighthouse: - obs = await self._read_observation(uri) - await param.set("kalman.initialX", float(obs["pos"][0])) - await param.set("kalman.initialY", float(obs["pos"][1])) - await param.set("kalman.initialZ", float(obs["pos"][2])) - await param.set("kalman.initialYaw", float(obs["rpy"][2])) - - await param.set("kalman.resetEstimation", 1) - await asyncio.sleep(0.1) - await param.set("kalman.resetEstimation", 0) - await cf.platform().send_arming_request(do_arm=True) - await asyncio.sleep(0.8) - async def _send_external_pose(self, uri: str) -> None: if self.lighthouse: return @@ -458,69 +512,12 @@ async def _send_external_pose(self, uri: str) -> None: ) ) - async def _takeoff_one(self, uri: str, height: float, duration: float) -> None: - cf = self._cf(uri) - await self._send_external_pose(uri) - commander = cf.commander() - await commander.send_stop_setpoint() - await commander.send_notify_setpoint_stop(0) - await cf.param().set("commander.enHighLevel", 1) - await cf.high_level_commander().take_off(height, None, duration, None) - await self._update_external_pose_during(uri, duration) - - async def _land_one(self, uri: str, height: float, duration: float) -> None: - cf = self._cf(uri) - commander = cf.commander() - await commander.send_stop_setpoint() - await commander.send_notify_setpoint_stop(0) - await cf.param().set("commander.enHighLevel", 1) - high_level_commander = cf.high_level_commander() - await high_level_commander.land(height, None, duration, None) - await self._update_external_pose_during(uri, duration) - await high_level_commander.stop(None) - async def _update_external_pose_during(self, uri: str, duration: float) -> None: end_time = asyncio.get_running_loop().time() + duration while asyncio.get_running_loop().time() < end_time: await self._send_external_pose(uri) await asyncio.sleep(1 / self.update_freq) - async def _setpoint_one(self, uri: str, target: Array, duration: float) -> None: - cf = self._cf(uri) - await cf.param().set("commander.enHighLevel", 0) - ref = interp1d( - [0.0, duration], - [np.asarray(target, dtype=float), np.asarray(target, dtype=float)], - axis=0, - ) - await self._stream_reference(uri, duration, lambda t: np.asarray(ref(t), dtype=float)) - - async def _goto_one(self, uri: str, target: Array, duration: float) -> None: - cf = self._cf(uri) - await cf.param().set("commander.enHighLevel", 1) - await cf.high_level_commander().go_to( - *target, duration, relative=False, linear=True, group_mask=None - ) - await asyncio.sleep(duration - 0.05) - - async def _execute_one( - self, - uri: str, - choreography: BSpline, - t_end: float, - color_top: dict[float, Array], - color_bot: dict[float, Array], - ) -> None: - cf = self._cf(uri) - await cf.param().set("commander.enHighLevel", 0) - await self._stream_reference( - uri, - t_end, - lambda t: np.asarray([*choreography(t), 0.0], dtype=float), - color_top, - color_bot, - ) - async def _stream_reference( self, uri: str, @@ -536,8 +533,10 @@ async def _stream_reference( i_next_top = 0 i_next_bot = 0 period = 1 / self.ctrl_freq + color_period = 1 / self.col_freq start_time = asyncio.get_running_loop().time() next_tick = start_time + t_col = -np.inf while (t_cur := asyncio.get_running_loop().time() - start_time) < duration: if not self.lighthouse and t_cur - t_est >= 1 / self.update_freq: @@ -546,36 +545,18 @@ async def _stream_reference( await commander.send_setpoint_position(*reference(t_cur)) - while i_next_top < len(top_cues) and t_cur >= top_cues[i_next_top][0]: - await self._apply_drone_color(uri, top_cues[i_next_top][1], "top") - i_next_top += 1 - while i_next_bot < len(bot_cues) and t_cur >= bot_cues[i_next_bot][0]: - await self._apply_drone_color(uri, bot_cues[i_next_bot][1], "bot") - i_next_bot += 1 + if t_cur - t_col >= color_period: + if i_next_top < len(top_cues) and t_cur >= top_cues[i_next_top][0]: + await self._apply_drone_color(uri, top_cues[i_next_top][1], "top") + i_next_top += 1 + if i_next_bot < len(bot_cues) and t_cur >= bot_cues[i_next_bot][0]: + await self._apply_drone_color(uri, bot_cues[i_next_bot][1], "bot") + i_next_bot += 1 + t_col = t_cur next_tick += period await asyncio.sleep(max(0.0, next_tick - asyncio.get_running_loop().time())) - async def _emergency_stop_one(self, uri: str) -> None: - await self._cf(uri).localization().emergency().send_emergency_stop() - - async def _shutdown_leds_one(self, uri: str) -> None: - await self._cf(uri).param().set("led.bitmask", 0) # turn on all LEDs to indicate shutdown - await self._apply_drone_color(uri, np.zeros(4), "both") - - async def _close(self) -> None: - active_uris = [uri for uri in self.uris if uri in self.active_uris] - if active_uris: - try: - await self._parallel_by_uri("Emergency stop", active_uris, self._emergency_stop_one) - await asyncio.sleep(0.1) - await self._parallel_by_uri("Shutdown LEDs", active_uris, self._shutdown_leds_one) - await asyncio.sleep(0.2) - except RuntimeError as exc: - logger.warning(f"Shutdown failed: {exc}") - - await self._disconnect() - async def _disconnect(self) -> None: disconnect_results = await asyncio.gather( *[cf.disconnect() for cf in self.cfs.values()], return_exceptions=True diff --git a/swarm_gpt/data/settings.yaml b/swarm_gpt/data/settings.yaml index e9a53a2..97c1afc 100644 --- a/swarm_gpt/data/settings.yaml +++ b/swarm_gpt/data/settings.yaml @@ -1,5 +1,6 @@ starting_height: 1.0 # Starting height for all drones lighthouse: false # Whether to use lighthouse or mocap for localization +land_on_docks: false # Simulation sim_freq: 500 # Frequency for the crazyflow simulation