From fbbb4bc49f9dc662b405f57ba0b5a6d4441fbc77 Mon Sep 17 00:00:00 2001 From: Shahrad Date: Sun, 27 Apr 2025 11:42:12 -0400 Subject: [PATCH 1/7] full validation scripts add --- jobs/validate_all_static.sh | 164 ++++++-------------------- jobs/validate_all_static_diversity.sh | 49 ++++++++ 2 files changed, 86 insertions(+), 127 deletions(-) create mode 100644 jobs/validate_all_static_diversity.sh diff --git a/jobs/validate_all_static.sh b/jobs/validate_all_static.sh index 06ff546a..f32c6612 100644 --- a/jobs/validate_all_static.sh +++ b/jobs/validate_all_static.sh @@ -10,130 +10,40 @@ source .env -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/education_qna_direct/*/data.json \ -data/70B_15_validation/70B/education_qna_direct/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/education_qna_eli5/*/data.json \ -data/70B_15_validation/70B/education_qna_eli5/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/education_qna_expert/*/data.json \ -data/70B_15_validation/70B/education_qna_expert/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/education_qna_hinted/*/data.json \ -data/70B_15_validation/70B/education_qna_hinted/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/education_summary_eli5/*/data.json \ -data/70B_15_validation/70B/education_summary_eli5/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/education_summary_expert/*/data.json \ -data/70B_15_validation/70B/education_summary_expert/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_generate_long/*/data.json \ -data/70B_15_validation/70B/politics_generate_long/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_generate_short/*/data.json \ -data/70B_15_validation/70B/politics_generate_short/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_qna_eli5/*/data.json \ -data/70B_15_validation/70B/politics_qna_eli5/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_qna_expert/*/data.json \ -data/70B_15_validation/70B/politics_qna_expert/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_summary_eli5/*/data.json \ -data/70B_15_validation/70B/politics_summary_eli5/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_summary_expert/*/data.json \ -data/70B_15_validation/70B/politics_summary_expert/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_generate_short/*/data.json \ -data/70B_15_validation/70B/politics_generate_short/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_qna_eli5/*/data.json \ -data/70B_15_validation/70B/politics_qna_eli5/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_summary_eli5/*/data.json \ -data/70B_15_validation/70B/politics_summary_eli5/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/tech_healthcare_summary_expert/*/data.json \ -data/70B_15_validation/70B/tech_healthcare_summary_expert/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct +MODEL="gpt-4o-mini" +MAX_CONC=256 + +# list all sub‐tasks +tasks=( + education_qna_direct + education_qna_eli5 + education_qna_expert + education_qna_hinted + education_summary_eli5 + education_summary_expert + politics_generate_formal + politics_generate_rapper + politics_generate_shakespeare + politics_qna_eli5 + politics_qna_expert + politics_summary_eli5 + politics_summary_expert + tech_healthcare_qna_eli5 + tech_healthcare_qna_expert + tech_physics_summary_eli5 + tech_physics_summary_expert +) + +for t in "${tasks[@]}"; do + echo "Validating $t..." + uv run aif validate \ + --max_concurrency "$MAX_CONC" \ + "data/4omini_generation/$t/data.json" \ + "data/4omini_validation_no_diversity/$t/validate.json" \ + --no-validate-diversity \ + --no-validate-embedding-diversity \ + --model "$MODEL" \ + || { echo "Validation failed on $t"; exit 1; } +done + +echo "All validations completed successfully." diff --git a/jobs/validate_all_static_diversity.sh b/jobs/validate_all_static_diversity.sh new file mode 100644 index 00000000..4781848b --- /dev/null +++ b/jobs/validate_all_static_diversity.sh @@ -0,0 +1,49 @@ +#!/bin/bash +#SBATCH --job-name=validate_static_all_diversity +#SBATCH --partition=unkillable-cpu +#SBATCH --cpus-per-task=2 +#SBATCH --time=24:00:00 +#SBATCH --output=slurm-%j.out +#SBATCH --error=slurm-%j.err +#SBATCH --mail-type=ALL +#SBATCH --mail-user= + +source .env + +# list all sub‐tasks +tasks=( + education_qna_direct + education_qna_eli5 + education_qna_expert + education_qna_hinted + education_summary_eli5 + education_summary_expert + politics_generate_formal + politics_generate_rapper + politics_generate_shakespeare + politics_qna_eli5 + politics_qna_expert + politics_summary_eli5 + politics_summary_expert + tech_healthcare_qna_eli5 + tech_healthcare_qna_expert + tech_physics_summary_eli5 + tech_physics_summary_expert +) + +for t in "${tasks[@]}"; do + echo "Validating $t..." + uv run aif validate \ + "data/4omini_generation/$t/data.json" \ + "data/4omini_validation_no_diversity/$t/validate.json" \ + --no-validate-diversity \ + --no-validate-count \ + --no-validate-entropy \ + --no-validate-llm-judge \ + --embedding-model "bge-m3" \ + --embedding-batch-size 256 \ + --max-concurrency 16 \ + || { echo "Validation failed on $t"; exit 1; } +done + +echo "All validations completed successfully." From 3f068d7e1fd6764f2b4f81703ad1c53d701ee36b Mon Sep 17 00:00:00 2001 From: Shahrad Date: Sun, 27 Apr 2025 11:43:45 -0400 Subject: [PATCH 2/7] full validation scripts add --- jobs/validate_all_static.sh | 1 + jobs/validate_all_static_diversity.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/jobs/validate_all_static.sh b/jobs/validate_all_static.sh index f32c6612..6f155c41 100644 --- a/jobs/validate_all_static.sh +++ b/jobs/validate_all_static.sh @@ -32,6 +32,7 @@ tasks=( tech_healthcare_qna_expert tech_physics_summary_eli5 tech_physics_summary_expert + tech_physics_summary_highschool ) for t in "${tasks[@]}"; do diff --git a/jobs/validate_all_static_diversity.sh b/jobs/validate_all_static_diversity.sh index 4781848b..85921f80 100644 --- a/jobs/validate_all_static_diversity.sh +++ b/jobs/validate_all_static_diversity.sh @@ -29,6 +29,7 @@ tasks=( tech_healthcare_qna_expert tech_physics_summary_eli5 tech_physics_summary_expert + tech_physics_summary_highschool ) for t in "${tasks[@]}"; do From b6817e3f8cd270db751f88aede9c58ee6822a73f Mon Sep 17 00:00:00 2001 From: Shahrad Mohammadzadeh Date: Mon, 28 Apr 2025 14:02:53 -0400 Subject: [PATCH 3/7] configs for validation --- .../accelerate_configs/deepspeed_zero2.yaml | 3 +- jobs/validate_all_static_diversity.sh | 45 +- pyproject.toml | 3 + uv.lock | 839 +++++++++++++++++- 4 files changed, 858 insertions(+), 32 deletions(-) diff --git a/benchmarks/ppo/accelerate_configs/deepspeed_zero2.yaml b/benchmarks/ppo/accelerate_configs/deepspeed_zero2.yaml index 8046cccc..6281ecec 100644 --- a/benchmarks/ppo/accelerate_configs/deepspeed_zero2.yaml +++ b/benchmarks/ppo/accelerate_configs/deepspeed_zero2.yaml @@ -12,10 +12,11 @@ machine_rank: 0 main_training_function: main mixed_precision: 'bf16' num_machines: 1 -num_processes: 1 +num_processes: 2 rdzv_backend: static same_network: true tpu_env: [] tpu_use_cluster: false tpu_use_sudo: false use_cpu: false +main_process_port: 0 diff --git a/jobs/validate_all_static_diversity.sh b/jobs/validate_all_static_diversity.sh index 85921f80..f643b966 100644 --- a/jobs/validate_all_static_diversity.sh +++ b/jobs/validate_all_static_diversity.sh @@ -1,15 +1,50 @@ #!/bin/bash #SBATCH --job-name=validate_static_all_diversity -#SBATCH --partition=unkillable-cpu +#SBATCH --partition=main +#SBATCH --gres=gpu:a100l:1 #SBATCH --cpus-per-task=2 #SBATCH --time=24:00:00 #SBATCH --output=slurm-%j.out #SBATCH --error=slurm-%j.err #SBATCH --mail-type=ALL -#SBATCH --mail-user= +#SBATCH --mail-user=shahrad_m@icloud.com +cd +module load python/3.10 +module load cuda/12.6.0 +source .venv/bin/activate +echo "Starting vLLM server..." +uv run vllm serve BAAI/bge-m3 --dtype float16 --api-key openai --task embed & + +# Save server process ID +SERVER_PID=$! + +echo "Waiting for server to start..." +while true; do + echo "Checking if server is up..." + RESPONSE=$(curl -s http://localhost:8000/v1/models -H "Authorization: Bearer $OPENAI_API_KEY" 2>&1) + + if [[ "$RESPONSE" == *"data"* ]]; then + echo "Server is up and running!" + break + fi + + # Check if server is still running + if ! kill -0 $SERVER_PID 2>/dev/null; then + echo "Server process died unexpectedly" + exit 1 + fi + + echo "Server not ready yet. Waiting 5 seconds..." + sleep 5 +done + +deactivate +cd projects/AIF-Gen source .env +echo "Starting validation process..." + # list all sub‐tasks tasks=( education_qna_direct @@ -36,14 +71,14 @@ for t in "${tasks[@]}"; do echo "Validating $t..." uv run aif validate \ "data/4omini_generation/$t/data.json" \ - "data/4omini_validation_no_diversity/$t/validate.json" \ + "data/4omini_validation_diversity/$t/validate.json" \ --no-validate-diversity \ --no-validate-count \ --no-validate-entropy \ --no-validate-llm-judge \ - --embedding-model "bge-m3" \ + --embedding-model "BAAI/bge-m3" \ --embedding-batch-size 256 \ - --max-concurrency 16 \ + --max_concurrency 16 \ || { echo "Validation failed on $t"; exit 1; } done diff --git a/pyproject.toml b/pyproject.toml index b90c8e52..e696354d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,6 +26,7 @@ dependencies = [ "pydantic>=2.10.4", "pytest-asyncio>=0.25.3", "pytest-mock>=3.14.0", + "setuptools>=75.8.2", "torch==2.3.0", "types-pyyaml>=6.0.12.20241230", ] @@ -40,6 +41,8 @@ dev = [ "ruff>=0.7.3", "sphinx>=7.4.7", "sphinx-rtd-theme>=3.0.2", + "ipykernel>=6.29.5", + "matplotlib>=3.10.1", ] benchmarks-dpo = [ "datasets>=3.2.0", diff --git a/uv.lock b/uv.lock index ad720968..74080991 100644 --- a/uv.lock +++ b/uv.lock @@ -43,6 +43,7 @@ dependencies = [ { name = "pydantic" }, { name = "pytest-asyncio" }, { name = "pytest-mock" }, + { name = "setuptools" }, { name = "torch" }, { name = "types-pyyaml" }, ] @@ -72,7 +73,9 @@ benchmarks-ppo = [ { name = "wandb" }, ] dev = [ + { name = "ipykernel" }, { name = "isort" }, + { name = "matplotlib" }, { name = "mypy" }, { name = "pre-commit" }, { name = "pytest" }, @@ -95,6 +98,7 @@ requires-dist = [ { name = "pydantic", specifier = ">=2.10.4" }, { name = "pytest-asyncio", specifier = ">=0.25.3" }, { name = "pytest-mock", specifier = ">=3.14.0" }, + { name = "setuptools", specifier = ">=75.8.2" }, { name = "torch", specifier = "==2.3.0" }, { name = "types-pyyaml", specifier = ">=6.0.12.20241230" }, ] @@ -124,7 +128,9 @@ benchmarks-ppo = [ { name = "wandb", specifier = ">=0.19.6" }, ] dev = [ + { name = "ipykernel", specifier = ">=6.29.5" }, { name = "isort", specifier = ">=5.13.2" }, + { name = "matplotlib", specifier = ">=3.10.1" }, { name = "mypy", specifier = ">=1.13.0" }, { name = "pre-commit", specifier = ">=4.0.1" }, { name = "pytest", specifier = ">=8.3.3" }, @@ -270,6 +276,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, ] +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 }, +] + +[[package]] +name = "asttokens" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, +] + [[package]] name = "async-timeout" version = "5.0.1" @@ -315,6 +339,63 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, ] +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, + { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, + { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, + { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, + { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, + { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 }, + { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 }, + { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, + { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, + { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, + { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, + { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +] + [[package]] name = "cfgv" version = "3.4.0" @@ -390,7 +471,7 @@ name = "click" version = "8.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } wheels = [ @@ -415,6 +496,85 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] +[[package]] +name = "comm" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 }, +] + +[[package]] +name = "contourpy" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/a3/da4153ec8fe25d263aa48c1a4cbde7f49b59af86f0b6f7862788c60da737/contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", size = 268551 }, + { url = "https://files.pythonhosted.org/packages/2f/6c/330de89ae1087eb622bfca0177d32a7ece50c3ef07b28002de4757d9d875/contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", size = 253399 }, + { url = "https://files.pythonhosted.org/packages/c1/bd/20c6726b1b7f81a8bee5271bed5c165f0a8e1f572578a9d27e2ccb763cb2/contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", size = 312061 }, + { url = "https://files.pythonhosted.org/packages/22/fc/a9665c88f8a2473f823cf1ec601de9e5375050f1958cbb356cdf06ef1ab6/contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", size = 351956 }, + { url = "https://files.pythonhosted.org/packages/25/eb/9f0a0238f305ad8fb7ef42481020d6e20cf15e46be99a1fcf939546a177e/contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", size = 320872 }, + { url = "https://files.pythonhosted.org/packages/32/5c/1ee32d1c7956923202f00cf8d2a14a62ed7517bdc0ee1e55301227fc273c/contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", size = 325027 }, + { url = "https://files.pythonhosted.org/packages/83/bf/9baed89785ba743ef329c2b07fd0611d12bfecbedbdd3eeecf929d8d3b52/contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", size = 1306641 }, + { url = "https://files.pythonhosted.org/packages/d4/cc/74e5e83d1e35de2d28bd97033426b450bc4fd96e092a1f7a63dc7369b55d/contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", size = 1374075 }, + { url = "https://files.pythonhosted.org/packages/0c/42/17f3b798fd5e033b46a16f8d9fcb39f1aba051307f5ebf441bad1ecf78f8/contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", size = 177534 }, + { url = "https://files.pythonhosted.org/packages/54/ec/5162b8582f2c994721018d0c9ece9dc6ff769d298a8ac6b6a652c307e7df/contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", size = 221188 }, + { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636 }, + { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636 }, + { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053 }, + { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985 }, + { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750 }, + { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246 }, + { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728 }, + { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762 }, + { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196 }, + { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017 }, + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580 }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530 }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688 }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331 }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963 }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681 }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674 }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480 }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489 }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042 }, + { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630 }, + { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670 }, + { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694 }, + { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986 }, + { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060 }, + { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747 }, + { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895 }, + { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098 }, + { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535 }, + { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096 }, + { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090 }, + { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643 }, + { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443 }, + { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865 }, + { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162 }, + { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355 }, + { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935 }, + { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168 }, + { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550 }, + { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214 }, + { url = "https://files.pythonhosted.org/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", size = 265681 }, + { url = "https://files.pythonhosted.org/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", size = 315101 }, + { url = "https://files.pythonhosted.org/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", size = 220599 }, + { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807 }, + { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729 }, + { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791 }, +] + [[package]] name = "coverage" version = "7.6.12" @@ -480,6 +640,15 @@ toml = [ { name = "tomli", marker = "python_full_version <= '3.11'" }, ] +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321 }, +] + [[package]] name = "datasets" version = "3.3.2" @@ -505,6 +674,40 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4c/37/22ef7675bef4ffe9577b937ddca2e22791534cbbe11c30714972a91532dc/datasets-3.3.2-py3-none-any.whl", hash = "sha256:fdaf3d5d70242621210b044e9b9b15a56e908bfc3e9d077bcf5605ac390f70bd", size = 485360 }, ] +[[package]] +name = "debugpy" +version = "1.8.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/75/087fe07d40f490a78782ff3b0a30e3968936854105487decdb33446d4b0e/debugpy-1.8.14.tar.gz", hash = "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322", size = 1641444 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/df/156df75a41aaebd97cee9d3870fe68f8001b6c1c4ca023e221cfce69bece/debugpy-1.8.14-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:93fee753097e85623cab1c0e6a68c76308cd9f13ffdf44127e6fab4fbf024339", size = 2076510 }, + { url = "https://files.pythonhosted.org/packages/69/cd/4fc391607bca0996db5f3658762106e3d2427beaef9bfd363fd370a3c054/debugpy-1.8.14-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d937d93ae4fa51cdc94d3e865f535f185d5f9748efb41d0d49e33bf3365bd79", size = 3559614 }, + { url = "https://files.pythonhosted.org/packages/1a/42/4e6d2b9d63e002db79edfd0cb5656f1c403958915e0e73ab3e9220012eec/debugpy-1.8.14-cp310-cp310-win32.whl", hash = "sha256:c442f20577b38cc7a9aafecffe1094f78f07fb8423c3dddb384e6b8f49fd2987", size = 5208588 }, + { url = "https://files.pythonhosted.org/packages/97/b1/cc9e4e5faadc9d00df1a64a3c2d5c5f4b9df28196c39ada06361c5141f89/debugpy-1.8.14-cp310-cp310-win_amd64.whl", hash = "sha256:f117dedda6d969c5c9483e23f573b38f4e39412845c7bc487b6f2648df30fe84", size = 5241043 }, + { url = "https://files.pythonhosted.org/packages/67/e8/57fe0c86915671fd6a3d2d8746e40485fd55e8d9e682388fbb3a3d42b86f/debugpy-1.8.14-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:1b2ac8c13b2645e0b1eaf30e816404990fbdb168e193322be8f545e8c01644a9", size = 2175064 }, + { url = "https://files.pythonhosted.org/packages/3b/97/2b2fd1b1c9569c6764ccdb650a6f752e4ac31be465049563c9eb127a8487/debugpy-1.8.14-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf431c343a99384ac7eab2f763980724834f933a271e90496944195318c619e2", size = 3132359 }, + { url = "https://files.pythonhosted.org/packages/c0/ee/b825c87ed06256ee2a7ed8bab8fb3bb5851293bf9465409fdffc6261c426/debugpy-1.8.14-cp311-cp311-win32.whl", hash = "sha256:c99295c76161ad8d507b413cd33422d7c542889fbb73035889420ac1fad354f2", size = 5133269 }, + { url = "https://files.pythonhosted.org/packages/d5/a6/6c70cd15afa43d37839d60f324213843174c1d1e6bb616bd89f7c1341bac/debugpy-1.8.14-cp311-cp311-win_amd64.whl", hash = "sha256:7816acea4a46d7e4e50ad8d09d963a680ecc814ae31cdef3622eb05ccacf7b01", size = 5158156 }, + { url = "https://files.pythonhosted.org/packages/d9/2a/ac2df0eda4898f29c46eb6713a5148e6f8b2b389c8ec9e425a4a1d67bf07/debugpy-1.8.14-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:8899c17920d089cfa23e6005ad9f22582fd86f144b23acb9feeda59e84405b84", size = 2501268 }, + { url = "https://files.pythonhosted.org/packages/10/53/0a0cb5d79dd9f7039169f8bf94a144ad3efa52cc519940b3b7dde23bcb89/debugpy-1.8.14-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6bb5c0dcf80ad5dbc7b7d6eac484e2af34bdacdf81df09b6a3e62792b722826", size = 4221077 }, + { url = "https://files.pythonhosted.org/packages/f8/d5/84e01821f362327bf4828728aa31e907a2eca7c78cd7c6ec062780d249f8/debugpy-1.8.14-cp312-cp312-win32.whl", hash = "sha256:281d44d248a0e1791ad0eafdbbd2912ff0de9eec48022a5bfbc332957487ed3f", size = 5255127 }, + { url = "https://files.pythonhosted.org/packages/33/16/1ed929d812c758295cac7f9cf3dab5c73439c83d9091f2d91871e648093e/debugpy-1.8.14-cp312-cp312-win_amd64.whl", hash = "sha256:5aa56ef8538893e4502a7d79047fe39b1dae08d9ae257074c6464a7b290b806f", size = 5297249 }, + { url = "https://files.pythonhosted.org/packages/4d/e4/395c792b243f2367d84202dc33689aa3d910fb9826a7491ba20fc9e261f5/debugpy-1.8.14-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:329a15d0660ee09fec6786acdb6e0443d595f64f5d096fc3e3ccf09a4259033f", size = 2485676 }, + { url = "https://files.pythonhosted.org/packages/ba/f1/6f2ee3f991327ad9e4c2f8b82611a467052a0fb0e247390192580e89f7ff/debugpy-1.8.14-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15", size = 4217514 }, + { url = "https://files.pythonhosted.org/packages/79/28/b9d146f8f2dc535c236ee09ad3e5ac899adb39d7a19b49f03ac95d216beb/debugpy-1.8.14-cp313-cp313-win32.whl", hash = "sha256:3784ec6e8600c66cbdd4ca2726c72d8ca781e94bce2f396cc606d458146f8f4e", size = 5254756 }, + { url = "https://files.pythonhosted.org/packages/e0/62/a7b4a57013eac4ccaef6977966e6bec5c63906dd25a86e35f155952e29a1/debugpy-1.8.14-cp313-cp313-win_amd64.whl", hash = "sha256:684eaf43c95a3ec39a96f1f5195a7ff3d4144e4a18d69bb66beeb1a6de605d6e", size = 5297119 }, + { url = "https://files.pythonhosted.org/packages/97/1a/481f33c37ee3ac8040d3d51fc4c4e4e7e61cb08b8bc8971d6032acc2279f/debugpy-1.8.14-py2.py3-none-any.whl", hash = "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20", size = 5256230 }, +] + +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 }, +] + [[package]] name = "deepspeed" version = "0.16.3" @@ -626,6 +829,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, ] +[[package]] +name = "executing" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702 }, +] + [[package]] name = "filelock" version = "3.17.0" @@ -635,6 +847,47 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/89/ec/00d68c4ddfedfe64159999e5f8a98fb8442729a63e2077eb9dcd89623d27/filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338", size = 16164 }, ] +[[package]] +name = "fonttools" +version = "4.57.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/2d/a9a0b6e3a0cf6bd502e64fc16d894269011930cabfc89aee20d1635b1441/fonttools-4.57.0.tar.gz", hash = "sha256:727ece10e065be2f9dd239d15dd5d60a66e17eac11aea47d447f9f03fdbc42de", size = 3492448 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/17/3ddfd1881878b3f856065130bb603f5922e81ae8a4eb53bce0ea78f765a8/fonttools-4.57.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:babe8d1eb059a53e560e7bf29f8e8f4accc8b6cfb9b5fd10e485bde77e71ef41", size = 2756260 }, + { url = "https://files.pythonhosted.org/packages/26/2b/6957890c52c030b0bf9e0add53e5badab4682c6ff024fac9a332bb2ae063/fonttools-4.57.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81aa97669cd726349eb7bd43ca540cf418b279ee3caba5e2e295fb4e8f841c02", size = 2284691 }, + { url = "https://files.pythonhosted.org/packages/cc/8e/c043b4081774e5eb06a834cedfdb7d432b4935bc8c4acf27207bdc34dfc4/fonttools-4.57.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0e9618630edd1910ad4f07f60d77c184b2f572c8ee43305ea3265675cbbfe7e", size = 4566077 }, + { url = "https://files.pythonhosted.org/packages/59/bc/e16ae5d9eee6c70830ce11d1e0b23d6018ddfeb28025fda092cae7889c8b/fonttools-4.57.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34687a5d21f1d688d7d8d416cb4c5b9c87fca8a1797ec0d74b9fdebfa55c09ab", size = 4608729 }, + { url = "https://files.pythonhosted.org/packages/25/13/e557bf10bb38e4e4c436d3a9627aadf691bc7392ae460910447fda5fad2b/fonttools-4.57.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69ab81b66ebaa8d430ba56c7a5f9abe0183afefd3a2d6e483060343398b13fb1", size = 4759646 }, + { url = "https://files.pythonhosted.org/packages/bc/c9/5e2952214d4a8e31026bf80beb18187199b7001e60e99a6ce19773249124/fonttools-4.57.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d639397de852f2ccfb3134b152c741406752640a266d9c1365b0f23d7b88077f", size = 4941652 }, + { url = "https://files.pythonhosted.org/packages/df/04/e80242b3d9ec91a1f785d949edc277a13ecfdcfae744de4b170df9ed77d8/fonttools-4.57.0-cp310-cp310-win32.whl", hash = "sha256:cc066cb98b912f525ae901a24cd381a656f024f76203bc85f78fcc9e66ae5aec", size = 2159432 }, + { url = "https://files.pythonhosted.org/packages/33/ba/e858cdca275daf16e03c0362aa43734ea71104c3b356b2100b98543dba1b/fonttools-4.57.0-cp310-cp310-win_amd64.whl", hash = "sha256:7a64edd3ff6a7f711a15bd70b4458611fb240176ec11ad8845ccbab4fe6745db", size = 2203869 }, + { url = "https://files.pythonhosted.org/packages/81/1f/e67c99aa3c6d3d2f93d956627e62a57ae0d35dc42f26611ea2a91053f6d6/fonttools-4.57.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3871349303bdec958360eedb619169a779956503ffb4543bb3e6211e09b647c4", size = 2757392 }, + { url = "https://files.pythonhosted.org/packages/aa/f1/f75770d0ddc67db504850898d96d75adde238c35313409bfcd8db4e4a5fe/fonttools-4.57.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c59375e85126b15a90fcba3443eaac58f3073ba091f02410eaa286da9ad80ed8", size = 2285609 }, + { url = "https://files.pythonhosted.org/packages/f5/d3/bc34e4953cb204bae0c50b527307dce559b810e624a733351a654cfc318e/fonttools-4.57.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967b65232e104f4b0f6370a62eb33089e00024f2ce143aecbf9755649421c683", size = 4873292 }, + { url = "https://files.pythonhosted.org/packages/41/b8/d5933559303a4ab18c799105f4c91ee0318cc95db4a2a09e300116625e7a/fonttools-4.57.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39acf68abdfc74e19de7485f8f7396fa4d2418efea239b7061d6ed6a2510c746", size = 4902503 }, + { url = "https://files.pythonhosted.org/packages/32/13/acb36bfaa316f481153ce78de1fa3926a8bad42162caa3b049e1afe2408b/fonttools-4.57.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d077f909f2343daf4495ba22bb0e23b62886e8ec7c109ee8234bdbd678cf344", size = 5077351 }, + { url = "https://files.pythonhosted.org/packages/b5/23/6d383a2ca83b7516d73975d8cca9d81a01acdcaa5e4db8579e4f3de78518/fonttools-4.57.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:46370ac47a1e91895d40e9ad48effbe8e9d9db1a4b80888095bc00e7beaa042f", size = 5275067 }, + { url = "https://files.pythonhosted.org/packages/bc/ca/31b8919c6da0198d5d522f1d26c980201378c087bdd733a359a1e7485769/fonttools-4.57.0-cp311-cp311-win32.whl", hash = "sha256:ca2aed95855506b7ae94e8f1f6217b7673c929e4f4f1217bcaa236253055cb36", size = 2158263 }, + { url = "https://files.pythonhosted.org/packages/13/4c/de2612ea2216eb45cfc8eb91a8501615dd87716feaf5f8fb65cbca576289/fonttools-4.57.0-cp311-cp311-win_amd64.whl", hash = "sha256:17168a4670bbe3775f3f3f72d23ee786bd965395381dfbb70111e25e81505b9d", size = 2204968 }, + { url = "https://files.pythonhosted.org/packages/cb/98/d4bc42d43392982eecaaca117d79845734d675219680cd43070bb001bc1f/fonttools-4.57.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:889e45e976c74abc7256d3064aa7c1295aa283c6bb19810b9f8b604dfe5c7f31", size = 2751824 }, + { url = "https://files.pythonhosted.org/packages/1a/62/7168030eeca3742fecf45f31e63b5ef48969fa230a672216b805f1d61548/fonttools-4.57.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0425c2e052a5f1516c94e5855dbda706ae5a768631e9fcc34e57d074d1b65b92", size = 2283072 }, + { url = "https://files.pythonhosted.org/packages/5d/82/121a26d9646f0986ddb35fbbaf58ef791c25b59ecb63ffea2aab0099044f/fonttools-4.57.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44c26a311be2ac130f40a96769264809d3b0cb297518669db437d1cc82974888", size = 4788020 }, + { url = "https://files.pythonhosted.org/packages/5b/26/e0f2fb662e022d565bbe280a3cfe6dafdaabf58889ff86fdef2d31ff1dde/fonttools-4.57.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c41ba992df5b8d680b89fd84c6a1f2aca2b9f1ae8a67400c8930cd4ea115f6", size = 4859096 }, + { url = "https://files.pythonhosted.org/packages/9e/44/9075e323347b1891cdece4b3f10a3b84a8f4c42a7684077429d9ce842056/fonttools-4.57.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ea1e9e43ca56b0c12440a7c689b1350066595bebcaa83baad05b8b2675129d98", size = 4964356 }, + { url = "https://files.pythonhosted.org/packages/48/28/caa8df32743462fb966be6de6a79d7f30393859636d7732e82efa09fbbb4/fonttools-4.57.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84fd56c78d431606332a0627c16e2a63d243d0d8b05521257d77c6529abe14d8", size = 5226546 }, + { url = "https://files.pythonhosted.org/packages/f6/46/95ab0f0d2e33c5b1a4fc1c0efe5e286ba9359602c0a9907adb1faca44175/fonttools-4.57.0-cp312-cp312-win32.whl", hash = "sha256:f4376819c1c778d59e0a31db5dc6ede854e9edf28bbfa5b756604727f7f800ac", size = 2146776 }, + { url = "https://files.pythonhosted.org/packages/06/5d/1be5424bb305880e1113631f49a55ea7c7da3a5fe02608ca7c16a03a21da/fonttools-4.57.0-cp312-cp312-win_amd64.whl", hash = "sha256:57e30241524879ea10cdf79c737037221f77cc126a8cdc8ff2c94d4a522504b9", size = 2193956 }, + { url = "https://files.pythonhosted.org/packages/e9/2f/11439f3af51e4bb75ac9598c29f8601aa501902dcedf034bdc41f47dd799/fonttools-4.57.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:408ce299696012d503b714778d89aa476f032414ae57e57b42e4b92363e0b8ef", size = 2739175 }, + { url = "https://files.pythonhosted.org/packages/25/52/677b55a4c0972dc3820c8dba20a29c358197a78229daa2ea219fdb19e5d5/fonttools-4.57.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bbceffc80aa02d9e8b99f2a7491ed8c4a783b2fc4020119dc405ca14fb5c758c", size = 2276583 }, + { url = "https://files.pythonhosted.org/packages/64/79/184555f8fa77b827b9460a4acdbbc0b5952bb6915332b84c615c3a236826/fonttools-4.57.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f022601f3ee9e1f6658ed6d184ce27fa5216cee5b82d279e0f0bde5deebece72", size = 4766437 }, + { url = "https://files.pythonhosted.org/packages/f8/ad/c25116352f456c0d1287545a7aa24e98987b6d99c5b0456c4bd14321f20f/fonttools-4.57.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dea5893b58d4637ffa925536462ba626f8a1b9ffbe2f5c272cdf2c6ebadb817", size = 4838431 }, + { url = "https://files.pythonhosted.org/packages/53/ae/398b2a833897297797a44f519c9af911c2136eb7aa27d3f1352c6d1129fa/fonttools-4.57.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dff02c5c8423a657c550b48231d0a48d7e2b2e131088e55983cfe74ccc2c7cc9", size = 4951011 }, + { url = "https://files.pythonhosted.org/packages/b7/5d/7cb31c4bc9ffb9a2bbe8b08f8f53bad94aeb158efad75da645b40b62cb73/fonttools-4.57.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:767604f244dc17c68d3e2dbf98e038d11a18abc078f2d0f84b6c24571d9c0b13", size = 5205679 }, + { url = "https://files.pythonhosted.org/packages/4c/e4/6934513ec2c4d3d69ca1bc3bd34d5c69dafcbf68c15388dd3bb062daf345/fonttools-4.57.0-cp313-cp313-win32.whl", hash = "sha256:8e2e12d0d862f43d51e5afb8b9751c77e6bec7d2dc00aad80641364e9df5b199", size = 2144833 }, + { url = "https://files.pythonhosted.org/packages/c4/0d/2177b7fdd23d017bcfb702fd41e47d4573766b9114da2fddbac20dcc4957/fonttools-4.57.0-cp313-cp313-win_amd64.whl", hash = "sha256:f1d6bc9c23356908db712d282acb3eebd4ae5ec6d8b696aa40342b1d84f8e9e3", size = 2190799 }, + { url = "https://files.pythonhosted.org/packages/90/27/45f8957c3132917f91aaa56b700bcfc2396be1253f685bd5c68529b6f610/fonttools-4.57.0-py3-none-any.whl", hash = "sha256:3122c604a675513c68bd24c6a8f9091f1c2376d18e8f5fe5a101746c81b3e98f", size = 1093605 }, +] + [[package]] name = "frozenlist" version = "1.5.0" @@ -851,6 +1104,52 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/21/b590c0cc3888b24f2ac9898c41d852d7454a1695fbad34bee85dba6dc408/intel_openmp-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:eef4c8bcc8acefd7f5cd3b9384dbf73d59e2c99fc56545712ded913f43c4a94f", size = 3516906 }, ] +[[package]] +name = "ipykernel" +version = "6.29.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173 }, +] + +[[package]] +name = "ipython" +version = "8.36.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, + { name = "typing-extensions", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/9f/d9a73710df947b7804bd9d93509463fb3a89e0ddc99c9fcc67279cddbeb6/ipython-8.36.0.tar.gz", hash = "sha256:24658e9fe5c5c819455043235ba59cfffded4a35936eefceceab6b192f7092ff", size = 5604997 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/d7/c1c9f371790b3a181e343c4815a361e5a0cc7d90ef6642d64ba5d05de289/ipython-8.36.0-py3-none-any.whl", hash = "sha256:12b913914d010dcffa2711505ec8be4bf0180742d97f1e5175e51f22086428c1", size = 831074 }, +] + [[package]] name = "isort" version = "6.0.1" @@ -860,6 +1159,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/11/114d0a5f4dabbdcedc1125dee0888514c3c3b16d3e9facad87ed96fad97c/isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615", size = 94186 }, ] +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, +] + [[package]] name = "jinja2" version = "3.1.5" @@ -940,6 +1251,123 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", size = 301817 }, ] +[[package]] +name = "jupyter-client" +version = "8.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 }, +] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", size = 87629 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/5f/4d8e9e852d98ecd26cdf8eaf7ed8bc33174033bba5e07001b289f07308fd/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db", size = 124623 }, + { url = "https://files.pythonhosted.org/packages/1d/70/7f5af2a18a76fe92ea14675f8bd88ce53ee79e37900fa5f1a1d8e0b42998/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b", size = 66720 }, + { url = "https://files.pythonhosted.org/packages/c6/13/e15f804a142353aefd089fadc8f1d985561a15358c97aca27b0979cb0785/kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d", size = 65413 }, + { url = "https://files.pythonhosted.org/packages/ce/6d/67d36c4d2054e83fb875c6b59d0809d5c530de8148846b1370475eeeece9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d", size = 1650826 }, + { url = "https://files.pythonhosted.org/packages/de/c6/7b9bb8044e150d4d1558423a1568e4f227193662a02231064e3824f37e0a/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c", size = 1628231 }, + { url = "https://files.pythonhosted.org/packages/b6/38/ad10d437563063eaaedbe2c3540a71101fc7fb07a7e71f855e93ea4de605/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3", size = 1408938 }, + { url = "https://files.pythonhosted.org/packages/52/ce/c0106b3bd7f9e665c5f5bc1e07cc95b5dabd4e08e3dad42dbe2faad467e7/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed", size = 1422799 }, + { url = "https://files.pythonhosted.org/packages/d0/87/efb704b1d75dc9758087ba374c0f23d3254505edaedd09cf9d247f7878b9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f", size = 1354362 }, + { url = "https://files.pythonhosted.org/packages/eb/b3/fd760dc214ec9a8f208b99e42e8f0130ff4b384eca8b29dd0efc62052176/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff", size = 2222695 }, + { url = "https://files.pythonhosted.org/packages/a2/09/a27fb36cca3fc01700687cc45dae7a6a5f8eeb5f657b9f710f788748e10d/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d", size = 2370802 }, + { url = "https://files.pythonhosted.org/packages/3d/c3/ba0a0346db35fe4dc1f2f2cf8b99362fbb922d7562e5f911f7ce7a7b60fa/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c", size = 2334646 }, + { url = "https://files.pythonhosted.org/packages/41/52/942cf69e562f5ed253ac67d5c92a693745f0bed3c81f49fc0cbebe4d6b00/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605", size = 2467260 }, + { url = "https://files.pythonhosted.org/packages/32/26/2d9668f30d8a494b0411d4d7d4ea1345ba12deb6a75274d58dd6ea01e951/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e", size = 2288633 }, + { url = "https://files.pythonhosted.org/packages/98/99/0dd05071654aa44fe5d5e350729961e7bb535372935a45ac89a8924316e6/kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751", size = 71885 }, + { url = "https://files.pythonhosted.org/packages/6c/fc/822e532262a97442989335394d441cd1d0448c2e46d26d3e04efca84df22/kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271", size = 65175 }, + { url = "https://files.pythonhosted.org/packages/da/ed/c913ee28936c371418cb167b128066ffb20bbf37771eecc2c97edf8a6e4c/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", size = 124635 }, + { url = "https://files.pythonhosted.org/packages/4c/45/4a7f896f7467aaf5f56ef093d1f329346f3b594e77c6a3c327b2d415f521/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", size = 66717 }, + { url = "https://files.pythonhosted.org/packages/5f/b4/c12b3ac0852a3a68f94598d4c8d569f55361beef6159dce4e7b624160da2/kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", size = 65413 }, + { url = "https://files.pythonhosted.org/packages/a9/98/1df4089b1ed23d83d410adfdc5947245c753bddfbe06541c4aae330e9e70/kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03", size = 1343994 }, + { url = "https://files.pythonhosted.org/packages/8d/bf/b4b169b050c8421a7c53ea1ea74e4ef9c335ee9013216c558a047f162d20/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", size = 1434804 }, + { url = "https://files.pythonhosted.org/packages/66/5a/e13bd341fbcf73325ea60fdc8af752addf75c5079867af2e04cc41f34434/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", size = 1450690 }, + { url = "https://files.pythonhosted.org/packages/9b/4f/5955dcb376ba4a830384cc6fab7d7547bd6759fe75a09564910e9e3bb8ea/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", size = 1376839 }, + { url = "https://files.pythonhosted.org/packages/3a/97/5edbed69a9d0caa2e4aa616ae7df8127e10f6586940aa683a496c2c280b9/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", size = 1435109 }, + { url = "https://files.pythonhosted.org/packages/13/fc/e756382cb64e556af6c1809a1bbb22c141bbc2445049f2da06b420fe52bf/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", size = 2245269 }, + { url = "https://files.pythonhosted.org/packages/76/15/e59e45829d7f41c776d138245cabae6515cb4eb44b418f6d4109c478b481/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc", size = 2393468 }, + { url = "https://files.pythonhosted.org/packages/e9/39/483558c2a913ab8384d6e4b66a932406f87c95a6080112433da5ed668559/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", size = 2355394 }, + { url = "https://files.pythonhosted.org/packages/01/aa/efad1fbca6570a161d29224f14b082960c7e08268a133fe5dc0f6906820e/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", size = 2490901 }, + { url = "https://files.pythonhosted.org/packages/c9/4f/15988966ba46bcd5ab9d0c8296914436720dd67fca689ae1a75b4ec1c72f/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", size = 2312306 }, + { url = "https://files.pythonhosted.org/packages/2d/27/bdf1c769c83f74d98cbc34483a972f221440703054894a37d174fba8aa68/kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", size = 71966 }, + { url = "https://files.pythonhosted.org/packages/4a/c9/9642ea855604aeb2968a8e145fc662edf61db7632ad2e4fb92424be6b6c0/kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2", size = 65311 }, + { url = "https://files.pythonhosted.org/packages/fc/aa/cea685c4ab647f349c3bc92d2daf7ae34c8e8cf405a6dcd3a497f58a2ac3/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", size = 124152 }, + { url = "https://files.pythonhosted.org/packages/c5/0b/8db6d2e2452d60d5ebc4ce4b204feeb16176a851fd42462f66ade6808084/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/60/26/d6a0db6785dd35d3ba5bf2b2df0aedc5af089962c6eb2cbf67a15b81369e/kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", size = 65067 }, + { url = "https://files.pythonhosted.org/packages/c9/ed/1d97f7e3561e09757a196231edccc1bcf59d55ddccefa2afc9c615abd8e0/kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", size = 1378443 }, + { url = "https://files.pythonhosted.org/packages/29/61/39d30b99954e6b46f760e6289c12fede2ab96a254c443639052d1b573fbc/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", size = 1472728 }, + { url = "https://files.pythonhosted.org/packages/0c/3e/804163b932f7603ef256e4a715e5843a9600802bb23a68b4e08c8c0ff61d/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", size = 1478388 }, + { url = "https://files.pythonhosted.org/packages/8a/9e/60eaa75169a154700be74f875a4d9961b11ba048bef315fbe89cb6999056/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", size = 1413849 }, + { url = "https://files.pythonhosted.org/packages/bc/b3/9458adb9472e61a998c8c4d95cfdfec91c73c53a375b30b1428310f923e4/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", size = 1475533 }, + { url = "https://files.pythonhosted.org/packages/e4/7a/0a42d9571e35798de80aef4bb43a9b672aa7f8e58643d7bd1950398ffb0a/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", size = 2268898 }, + { url = "https://files.pythonhosted.org/packages/d9/07/1255dc8d80271400126ed8db35a1795b1a2c098ac3a72645075d06fe5c5d/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", size = 2425605 }, + { url = "https://files.pythonhosted.org/packages/84/df/5a3b4cf13780ef6f6942df67b138b03b7e79e9f1f08f57c49957d5867f6e/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", size = 2375801 }, + { url = "https://files.pythonhosted.org/packages/8f/10/2348d068e8b0f635c8c86892788dac7a6b5c0cb12356620ab575775aad89/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", size = 2520077 }, + { url = "https://files.pythonhosted.org/packages/32/d8/014b89fee5d4dce157d814303b0fce4d31385a2af4c41fed194b173b81ac/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", size = 2338410 }, + { url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", size = 71853 }, + { url = "https://files.pythonhosted.org/packages/dc/85/220d13d914485c0948a00f0b9eb419efaf6da81b7d72e88ce2391f7aed8d/kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", size = 65424 }, + { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156 }, + { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071 }, + { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053 }, + { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278 }, + { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139 }, + { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517 }, + { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952 }, + { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132 }, + { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997 }, + { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060 }, + { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471 }, + { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793 }, + { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855 }, + { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430 }, + { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294 }, + { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736 }, + { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194 }, + { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942 }, + { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341 }, + { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455 }, + { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138 }, + { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857 }, + { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129 }, + { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538 }, + { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661 }, + { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710 }, + { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213 }, + { url = "https://files.pythonhosted.org/packages/1f/f9/ae81c47a43e33b93b0a9819cac6723257f5da2a5a60daf46aa5c7226ea85/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a", size = 60403 }, + { url = "https://files.pythonhosted.org/packages/58/ca/f92b5cb6f4ce0c1ebfcfe3e2e42b96917e16f7090e45b21102941924f18f/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8", size = 58657 }, + { url = "https://files.pythonhosted.org/packages/80/28/ae0240f732f0484d3a4dc885d055653c47144bdf59b670aae0ec3c65a7c8/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0", size = 84948 }, + { url = "https://files.pythonhosted.org/packages/5d/eb/78d50346c51db22c7203c1611f9b513075f35c4e0e4877c5dde378d66043/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c", size = 81186 }, + { url = "https://files.pythonhosted.org/packages/43/f8/7259f18c77adca88d5f64f9a522792e178b2691f3748817a8750c2d216ef/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b", size = 80279 }, + { url = "https://files.pythonhosted.org/packages/3a/1d/50ad811d1c5dae091e4cf046beba925bcae0a610e79ae4c538f996f63ed5/kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b", size = 71762 }, +] + [[package]] name = "markdown-it-py" version = "3.0.0" @@ -1010,6 +1438,70 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, ] +[[package]] +name = "matplotlib" +version = "3.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/08/b89867ecea2e305f408fbb417139a8dd941ecf7b23a2e02157c36da546f0/matplotlib-3.10.1.tar.gz", hash = "sha256:e8d2d0e3881b129268585bf4765ad3ee73a4591d77b9a18c214ac7e3a79fb2ba", size = 36743335 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/b1/f70e27cf1cd76ce2a5e1aa5579d05afe3236052c6d9b9a96325bc823a17e/matplotlib-3.10.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ff2ae14910be903f4a24afdbb6d7d3a6c44da210fc7d42790b87aeac92238a16", size = 8163654 }, + { url = "https://files.pythonhosted.org/packages/26/af/5ec3d4636106718bb62503a03297125d4514f98fe818461bd9e6b9d116e4/matplotlib-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0721a3fd3d5756ed593220a8b86808a36c5031fce489adb5b31ee6dbb47dd5b2", size = 8037943 }, + { url = "https://files.pythonhosted.org/packages/a1/3d/07f9003a71b698b848c9925d05979ffa94a75cd25d1a587202f0bb58aa81/matplotlib-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0673b4b8f131890eb3a1ad058d6e065fb3c6e71f160089b65f8515373394698", size = 8449510 }, + { url = "https://files.pythonhosted.org/packages/12/87/9472d4513ff83b7cd864311821793ab72234fa201ab77310ec1b585d27e2/matplotlib-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e875b95ac59a7908978fe307ecdbdd9a26af7fa0f33f474a27fcf8c99f64a19", size = 8586585 }, + { url = "https://files.pythonhosted.org/packages/31/9e/fe74d237d2963adae8608faeb21f778cf246dbbf4746cef87cffbc82c4b6/matplotlib-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2589659ea30726284c6c91037216f64a506a9822f8e50592d48ac16a2f29e044", size = 9397911 }, + { url = "https://files.pythonhosted.org/packages/b6/1b/025d3e59e8a4281ab463162ad7d072575354a1916aba81b6a11507dfc524/matplotlib-3.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a97ff127f295817bc34517255c9db6e71de8eddaab7f837b7d341dee9f2f587f", size = 8052998 }, + { url = "https://files.pythonhosted.org/packages/a5/14/a1b840075be247bb1834b22c1e1d558740b0f618fe3a823740181ca557a1/matplotlib-3.10.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:057206ff2d6ab82ff3e94ebd94463d084760ca682ed5f150817b859372ec4401", size = 8174669 }, + { url = "https://files.pythonhosted.org/packages/0a/e4/300b08e3e08f9c98b0d5635f42edabf2f7a1d634e64cb0318a71a44ff720/matplotlib-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a144867dd6bf8ba8cb5fc81a158b645037e11b3e5cf8a50bd5f9917cb863adfe", size = 8047996 }, + { url = "https://files.pythonhosted.org/packages/75/f9/8d99ff5a2498a5f1ccf919fb46fb945109623c6108216f10f96428f388bc/matplotlib-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56c5d9fcd9879aa8040f196a235e2dcbdf7dd03ab5b07c0696f80bc6cf04bedd", size = 8461612 }, + { url = "https://files.pythonhosted.org/packages/40/b8/53fa08a5eaf78d3a7213fd6da1feec4bae14a81d9805e567013811ff0e85/matplotlib-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f69dc9713e4ad2fb21a1c30e37bd445d496524257dfda40ff4a8efb3604ab5c", size = 8602258 }, + { url = "https://files.pythonhosted.org/packages/40/87/4397d2ce808467af86684a622dd112664553e81752ea8bf61bdd89d24a41/matplotlib-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c59af3e8aca75d7744b68e8e78a669e91ccbcf1ac35d0102a7b1b46883f1dd7", size = 9408896 }, + { url = "https://files.pythonhosted.org/packages/d7/68/0d03098b3feb786cbd494df0aac15b571effda7f7cbdec267e8a8d398c16/matplotlib-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:11b65088c6f3dae784bc72e8d039a2580186285f87448babb9ddb2ad0082993a", size = 8061281 }, + { url = "https://files.pythonhosted.org/packages/7c/1d/5e0dc3b59c034e43de16f94deb68f4ad8a96b3ea00f4b37c160b7474928e/matplotlib-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:66e907a06e68cb6cfd652c193311d61a12b54f56809cafbed9736ce5ad92f107", size = 8175488 }, + { url = "https://files.pythonhosted.org/packages/7a/81/dae7e14042e74da658c3336ab9799128e09a1ee03964f2d89630b5d12106/matplotlib-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b4bb156abb8fa5e5b2b460196f7db7264fc6d62678c03457979e7d5254b7be", size = 8046264 }, + { url = "https://files.pythonhosted.org/packages/21/c4/22516775dcde10fc9c9571d155f90710761b028fc44f660508106c363c97/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1985ad3d97f51307a2cbfc801a930f120def19ba22864182dacef55277102ba6", size = 8452048 }, + { url = "https://files.pythonhosted.org/packages/63/23/c0615001f67ce7c96b3051d856baedc0c818a2ed84570b9bf9bde200f85d/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c96f2c2f825d1257e437a1482c5a2cf4fee15db4261bd6fc0750f81ba2b4ba3d", size = 8597111 }, + { url = "https://files.pythonhosted.org/packages/ca/c0/a07939a82aed77770514348f4568177d7dadab9787ebc618a616fe3d665e/matplotlib-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35e87384ee9e488d8dd5a2dd7baf471178d38b90618d8ea147aced4ab59c9bea", size = 9402771 }, + { url = "https://files.pythonhosted.org/packages/a6/b6/a9405484fb40746fdc6ae4502b16a9d6e53282ba5baaf9ebe2da579f68c4/matplotlib-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfd414bce89cc78a7e1d25202e979b3f1af799e416010a20ab2b5ebb3a02425c", size = 8063742 }, + { url = "https://files.pythonhosted.org/packages/60/73/6770ff5e5523d00f3bc584acb6031e29ee5c8adc2336b16cd1d003675fe0/matplotlib-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42eee41e1b60fd83ee3292ed83a97a5f2a8239b10c26715d8a6172226988d7b", size = 8176112 }, + { url = "https://files.pythonhosted.org/packages/08/97/b0ca5da0ed54a3f6599c3ab568bdda65269bc27c21a2c97868c1625e4554/matplotlib-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4f0647b17b667ae745c13721602b540f7aadb2a32c5b96e924cd4fea5dcb90f1", size = 8046931 }, + { url = "https://files.pythonhosted.org/packages/df/9a/1acbdc3b165d4ce2dcd2b1a6d4ffb46a7220ceee960c922c3d50d8514067/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa3854b5f9473564ef40a41bc922be978fab217776e9ae1545c9b3a5cf2092a3", size = 8453422 }, + { url = "https://files.pythonhosted.org/packages/51/d0/2bc4368abf766203e548dc7ab57cf7e9c621f1a3c72b516cc7715347b179/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e496c01441be4c7d5f96d4e40f7fca06e20dcb40e44c8daa2e740e1757ad9e6", size = 8596819 }, + { url = "https://files.pythonhosted.org/packages/ab/1b/8b350f8a1746c37ab69dda7d7528d1fc696efb06db6ade9727b7887be16d/matplotlib-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d45d3f5245be5b469843450617dcad9af75ca50568acf59997bed9311131a0b", size = 9402782 }, + { url = "https://files.pythonhosted.org/packages/89/06/f570373d24d93503988ba8d04f213a372fa1ce48381c5eb15da985728498/matplotlib-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:8e8e25b1209161d20dfe93037c8a7f7ca796ec9aa326e6e4588d8c4a5dd1e473", size = 8063812 }, + { url = "https://files.pythonhosted.org/packages/fc/e0/8c811a925b5a7ad75135f0e5af46408b78af88bbb02a1df775100ef9bfef/matplotlib-3.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:19b06241ad89c3ae9469e07d77efa87041eac65d78df4fcf9cac318028009b01", size = 8214021 }, + { url = "https://files.pythonhosted.org/packages/4a/34/319ec2139f68ba26da9d00fce2ff9f27679fb799a6c8e7358539801fd629/matplotlib-3.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01e63101ebb3014e6e9f80d9cf9ee361a8599ddca2c3e166c563628b39305dbb", size = 8090782 }, + { url = "https://files.pythonhosted.org/packages/77/ea/9812124ab9a99df5b2eec1110e9b2edc0b8f77039abf4c56e0a376e84a29/matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f06bad951eea6422ac4e8bdebcf3a70c59ea0a03338c5d2b109f57b64eb3972", size = 8478901 }, + { url = "https://files.pythonhosted.org/packages/c9/db/b05bf463689134789b06dea85828f8ebe506fa1e37593f723b65b86c9582/matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfb036f34873b46978f55e240cff7a239f6c4409eac62d8145bad3fc6ba5a3", size = 8613864 }, + { url = "https://files.pythonhosted.org/packages/c2/04/41ccec4409f3023a7576df3b5c025f1a8c8b81fbfe922ecfd837ac36e081/matplotlib-3.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dc6ab14a7ab3b4d813b88ba957fc05c79493a037f54e246162033591e770de6f", size = 9409487 }, + { url = "https://files.pythonhosted.org/packages/ac/c2/0d5aae823bdcc42cc99327ecdd4d28585e15ccd5218c453b7bcd827f3421/matplotlib-3.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc411ebd5889a78dabbc457b3fa153203e22248bfa6eedc6797be5df0164dbf9", size = 8134832 }, + { url = "https://files.pythonhosted.org/packages/c8/f6/10adb696d8cbeed2ab4c2e26ecf1c80dd3847bbf3891f4a0c362e0e08a5a/matplotlib-3.10.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:648406f1899f9a818cef8c0231b44dcfc4ff36f167101c3fd1c9151f24220fdc", size = 8158685 }, + { url = "https://files.pythonhosted.org/packages/3f/84/0603d917406072763e7f9bb37747d3d74d7ecd4b943a8c947cc3ae1cf7af/matplotlib-3.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:02582304e352f40520727984a5a18f37e8187861f954fea9be7ef06569cf85b4", size = 8035491 }, + { url = "https://files.pythonhosted.org/packages/fd/7d/6a8b31dd07ed856b3eae001c9129670ef75c4698fa1c2a6ac9f00a4a7054/matplotlib-3.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3809916157ba871bcdd33d3493acd7fe3037db5daa917ca6e77975a94cef779", size = 8590087 }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, +] + [[package]] name = "mdurl" version = "0.1.2" @@ -1024,8 +1516,8 @@ name = "mkl" version = "2021.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "intel-openmp" }, - { name = "tbb" }, + { name = "intel-openmp", marker = "sys_platform != 'linux'" }, + { name = "tbb", marker = "sys_platform != 'linux'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/ce/c6/892fe3bc91e811b78e4f85653864f2d92541d5e5c306b0cb3c2311e9ca64/mkl-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:439c640b269a5668134e3dcbcea4350459c4a8bc46469669b2d67e07e3d330e8", size = 129048357 }, @@ -1230,6 +1722,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, ] +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, +] + [[package]] name = "networkx" version = "3.2.1" @@ -1381,7 +1882,7 @@ name = "nvidia-cudnn-cu12" version = "8.9.2.26" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12" }, + { name = "nvidia-cublas-cu12", marker = "sys_platform == 'linux'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/ff/74/a2e2be7fb83aaedec84f391f082cf765dfb635e7caa9b49065f73e4835d8/nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9", size = 731725872 }, @@ -1408,9 +1909,9 @@ name = "nvidia-cusolver-cu12" version = "11.4.5.107" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12" }, - { name = "nvidia-cusparse-cu12" }, - { name = "nvidia-nvjitlink-cu12" }, + { name = "nvidia-cublas-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cusparse-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/bc/1d/8de1e5c67099015c834315e333911273a8c6aaba78923dd1d1e25fc5f217/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd", size = 124161928 }, @@ -1421,7 +1922,7 @@ name = "nvidia-cusparse-cu12" version = "12.1.0.106" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12" }, + { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c", size = 195958278 }, @@ -1441,7 +1942,6 @@ name = "nvidia-nccl-cu12" version = "2.20.5" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/bb/d09dda47c881f9ff504afd6f9ca4f502ded6d8fc2f572cacc5e39da91c28/nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1fc150d5c3250b170b29410ba682384b14581db722b2531b0d8d33c595f33d01", size = 176238458 }, { url = "https://files.pythonhosted.org/packages/4b/2a/0a131f572aa09f741c30ccd45a8e56316e8be8dfc7bc19bf0ab7cfef7b19/nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56", size = 176249402 }, ] @@ -1451,7 +1951,6 @@ version = "12.8.61" source = { registry = "https://pypi.org/simple" } wheels = [ { url = "https://files.pythonhosted.org/packages/03/f8/9d85593582bd99b8d7c65634d2304780aefade049b2b94d96e44084be90b/nvidia_nvjitlink_cu12-12.8.61-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:45fd79f2ae20bd67e8bc411055939049873bfd8fac70ff13bd4865e0b9bdab17", size = 39243473 }, - { url = "https://files.pythonhosted.org/packages/af/53/698f3758f48c5fcb1112721e40cc6714da3980d3c7e93bae5b29dafa9857/nvidia_nvjitlink_cu12-12.8.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b80ecab31085dda3ce3b41d043be0ec739216c3fc633b8abe212d5a30026df0", size = 38374634 }, ] [[package]] @@ -1538,6 +2037,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 }, ] +[[package]] +name = "parso" +version = "0.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, +] + [[package]] name = "peft" version = "0.14.0" @@ -1559,6 +2067,95 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/88/05/e58e3aaa36544d30a917814e336fc65a746f708e5874945e92999bc22fa3/peft-0.14.0-py3-none-any.whl", hash = "sha256:2f04f3a870c3baf30f15e7dcaa5dd70d3e54cfdd146d3c6c187735d3ae0a0700", size = 374831 }, ] +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, +] + +[[package]] +name = "pillow" +version = "11.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/cb/bb5c01fcd2a69335b86c22142b2bccfc3464087efb7fd382eee5ffc7fdf7/pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6", size = 47026707 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/8b/b158ad57ed44d3cc54db8d68ad7c0a58b8fc0e4c7a3f995f9d62d5b464a1/pillow-11.2.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:d57a75d53922fc20c165016a20d9c44f73305e67c351bbc60d1adaf662e74047", size = 3198442 }, + { url = "https://files.pythonhosted.org/packages/b1/f8/bb5d956142f86c2d6cc36704943fa761f2d2e4c48b7436fd0a85c20f1713/pillow-11.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:127bf6ac4a5b58b3d32fc8289656f77f80567d65660bc46f72c0d77e6600cc95", size = 3030553 }, + { url = "https://files.pythonhosted.org/packages/22/7f/0e413bb3e2aa797b9ca2c5c38cb2e2e45d88654e5b12da91ad446964cfae/pillow-11.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ba4be812c7a40280629e55ae0b14a0aafa150dd6451297562e1764808bbe61", size = 4405503 }, + { url = "https://files.pythonhosted.org/packages/f3/b4/cc647f4d13f3eb837d3065824aa58b9bcf10821f029dc79955ee43f793bd/pillow-11.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8bd62331e5032bc396a93609982a9ab6b411c05078a52f5fe3cc59234a3abd1", size = 4490648 }, + { url = "https://files.pythonhosted.org/packages/c2/6f/240b772a3b35cdd7384166461567aa6713799b4e78d180c555bd284844ea/pillow-11.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:562d11134c97a62fe3af29581f083033179f7ff435f78392565a1ad2d1c2c45c", size = 4508937 }, + { url = "https://files.pythonhosted.org/packages/f3/5e/7ca9c815ade5fdca18853db86d812f2f188212792780208bdb37a0a6aef4/pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c97209e85b5be259994eb5b69ff50c5d20cca0f458ef9abd835e262d9d88b39d", size = 4599802 }, + { url = "https://files.pythonhosted.org/packages/02/81/c3d9d38ce0c4878a77245d4cf2c46d45a4ad0f93000227910a46caff52f3/pillow-11.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0c3e6d0f59171dfa2e25d7116217543310908dfa2770aa64b8f87605f8cacc97", size = 4576717 }, + { url = "https://files.pythonhosted.org/packages/42/49/52b719b89ac7da3185b8d29c94d0e6aec8140059e3d8adcaa46da3751180/pillow-11.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc1c3bc53befb6096b84165956e886b1729634a799e9d6329a0c512ab651e579", size = 4654874 }, + { url = "https://files.pythonhosted.org/packages/5b/0b/ede75063ba6023798267023dc0d0401f13695d228194d2242d5a7ba2f964/pillow-11.2.1-cp310-cp310-win32.whl", hash = "sha256:312c77b7f07ab2139924d2639860e084ec2a13e72af54d4f08ac843a5fc9c79d", size = 2331717 }, + { url = "https://files.pythonhosted.org/packages/ed/3c/9831da3edea527c2ed9a09f31a2c04e77cd705847f13b69ca60269eec370/pillow-11.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9bc7ae48b8057a611e5fe9f853baa88093b9a76303937449397899385da06fad", size = 2676204 }, + { url = "https://files.pythonhosted.org/packages/01/97/1f66ff8a1503d8cbfc5bae4dc99d54c6ec1e22ad2b946241365320caabc2/pillow-11.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:2728567e249cdd939f6cc3d1f049595c66e4187f3c34078cbc0a7d21c47482d2", size = 2414767 }, + { url = "https://files.pythonhosted.org/packages/68/08/3fbf4b98924c73037a8e8b4c2c774784805e0fb4ebca6c5bb60795c40125/pillow-11.2.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35ca289f712ccfc699508c4658a1d14652e8033e9b69839edf83cbdd0ba39e70", size = 3198450 }, + { url = "https://files.pythonhosted.org/packages/84/92/6505b1af3d2849d5e714fc75ba9e69b7255c05ee42383a35a4d58f576b16/pillow-11.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0409af9f829f87a2dfb7e259f78f317a5351f2045158be321fd135973fff7bf", size = 3030550 }, + { url = "https://files.pythonhosted.org/packages/3c/8c/ac2f99d2a70ff966bc7eb13dacacfaab57c0549b2ffb351b6537c7840b12/pillow-11.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e5c5edee874dce4f653dbe59db7c73a600119fbea8d31f53423586ee2aafd7", size = 4415018 }, + { url = "https://files.pythonhosted.org/packages/1f/e3/0a58b5d838687f40891fff9cbaf8669f90c96b64dc8f91f87894413856c6/pillow-11.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93a07e76d13bff9444f1a029e0af2964e654bfc2e2c2d46bfd080df5ad5f3d8", size = 4498006 }, + { url = "https://files.pythonhosted.org/packages/21/f5/6ba14718135f08fbfa33308efe027dd02b781d3f1d5c471444a395933aac/pillow-11.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e6def7eed9e7fa90fde255afaf08060dc4b343bbe524a8f69bdd2a2f0018f600", size = 4517773 }, + { url = "https://files.pythonhosted.org/packages/20/f2/805ad600fc59ebe4f1ba6129cd3a75fb0da126975c8579b8f57abeb61e80/pillow-11.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8f4f3724c068be008c08257207210c138d5f3731af6c155a81c2b09a9eb3a788", size = 4607069 }, + { url = "https://files.pythonhosted.org/packages/71/6b/4ef8a288b4bb2e0180cba13ca0a519fa27aa982875882392b65131401099/pillow-11.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0a6709b47019dff32e678bc12c63008311b82b9327613f534e496dacaefb71e", size = 4583460 }, + { url = "https://files.pythonhosted.org/packages/62/ae/f29c705a09cbc9e2a456590816e5c234382ae5d32584f451c3eb41a62062/pillow-11.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6b0c664ccb879109ee3ca702a9272d877f4fcd21e5eb63c26422fd6e415365e", size = 4661304 }, + { url = "https://files.pythonhosted.org/packages/6e/1a/c8217b6f2f73794a5e219fbad087701f412337ae6dbb956db37d69a9bc43/pillow-11.2.1-cp311-cp311-win32.whl", hash = "sha256:cc5d875d56e49f112b6def6813c4e3d3036d269c008bf8aef72cd08d20ca6df6", size = 2331809 }, + { url = "https://files.pythonhosted.org/packages/e2/72/25a8f40170dc262e86e90f37cb72cb3de5e307f75bf4b02535a61afcd519/pillow-11.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:0f5c7eda47bf8e3c8a283762cab94e496ba977a420868cb819159980b6709193", size = 2676338 }, + { url = "https://files.pythonhosted.org/packages/06/9e/76825e39efee61efea258b479391ca77d64dbd9e5804e4ad0fa453b4ba55/pillow-11.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:4d375eb838755f2528ac8cbc926c3e31cc49ca4ad0cf79cff48b20e30634a4a7", size = 2414918 }, + { url = "https://files.pythonhosted.org/packages/c7/40/052610b15a1b8961f52537cc8326ca6a881408bc2bdad0d852edeb6ed33b/pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f", size = 3190185 }, + { url = "https://files.pythonhosted.org/packages/e5/7e/b86dbd35a5f938632093dc40d1682874c33dcfe832558fc80ca56bfcb774/pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b", size = 3030306 }, + { url = "https://files.pythonhosted.org/packages/a4/5c/467a161f9ed53e5eab51a42923c33051bf8d1a2af4626ac04f5166e58e0c/pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d", size = 4416121 }, + { url = "https://files.pythonhosted.org/packages/62/73/972b7742e38ae0e2ac76ab137ca6005dcf877480da0d9d61d93b613065b4/pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4", size = 4501707 }, + { url = "https://files.pythonhosted.org/packages/e4/3a/427e4cb0b9e177efbc1a84798ed20498c4f233abde003c06d2650a6d60cb/pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d", size = 4522921 }, + { url = "https://files.pythonhosted.org/packages/fe/7c/d8b1330458e4d2f3f45d9508796d7caf0c0d3764c00c823d10f6f1a3b76d/pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4", size = 4612523 }, + { url = "https://files.pythonhosted.org/packages/b3/2f/65738384e0b1acf451de5a573d8153fe84103772d139e1e0bdf1596be2ea/pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443", size = 4587836 }, + { url = "https://files.pythonhosted.org/packages/6a/c5/e795c9f2ddf3debb2dedd0df889f2fe4b053308bb59a3cc02a0cd144d641/pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c", size = 4669390 }, + { url = "https://files.pythonhosted.org/packages/96/ae/ca0099a3995976a9fce2f423166f7bff9b12244afdc7520f6ed38911539a/pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3", size = 2332309 }, + { url = "https://files.pythonhosted.org/packages/7c/18/24bff2ad716257fc03da964c5e8f05d9790a779a8895d6566e493ccf0189/pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941", size = 2676768 }, + { url = "https://files.pythonhosted.org/packages/da/bb/e8d656c9543276517ee40184aaa39dcb41e683bca121022f9323ae11b39d/pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb", size = 2415087 }, + { url = "https://files.pythonhosted.org/packages/36/9c/447528ee3776e7ab8897fe33697a7ff3f0475bb490c5ac1456a03dc57956/pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28", size = 3190098 }, + { url = "https://files.pythonhosted.org/packages/b5/09/29d5cd052f7566a63e5b506fac9c60526e9ecc553825551333e1e18a4858/pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830", size = 3030166 }, + { url = "https://files.pythonhosted.org/packages/71/5d/446ee132ad35e7600652133f9c2840b4799bbd8e4adba881284860da0a36/pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0", size = 4408674 }, + { url = "https://files.pythonhosted.org/packages/69/5f/cbe509c0ddf91cc3a03bbacf40e5c2339c4912d16458fcb797bb47bcb269/pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1", size = 4496005 }, + { url = "https://files.pythonhosted.org/packages/f9/b3/dd4338d8fb8a5f312021f2977fb8198a1184893f9b00b02b75d565c33b51/pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f", size = 4518707 }, + { url = "https://files.pythonhosted.org/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155", size = 4610008 }, + { url = "https://files.pythonhosted.org/packages/72/d1/924ce51bea494cb6e7959522d69d7b1c7e74f6821d84c63c3dc430cbbf3b/pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14", size = 4585420 }, + { url = "https://files.pythonhosted.org/packages/43/ab/8f81312d255d713b99ca37479a4cb4b0f48195e530cdc1611990eb8fd04b/pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b", size = 4667655 }, + { url = "https://files.pythonhosted.org/packages/94/86/8f2e9d2dc3d308dfd137a07fe1cc478df0a23d42a6c4093b087e738e4827/pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2", size = 2332329 }, + { url = "https://files.pythonhosted.org/packages/6d/ec/1179083b8d6067a613e4d595359b5fdea65d0a3b7ad623fee906e1b3c4d2/pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691", size = 2676388 }, + { url = "https://files.pythonhosted.org/packages/23/f1/2fc1e1e294de897df39fa8622d829b8828ddad938b0eaea256d65b84dd72/pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c", size = 2414950 }, + { url = "https://files.pythonhosted.org/packages/c4/3e/c328c48b3f0ead7bab765a84b4977acb29f101d10e4ef57a5e3400447c03/pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22", size = 3192759 }, + { url = "https://files.pythonhosted.org/packages/18/0e/1c68532d833fc8b9f404d3a642991441d9058eccd5606eab31617f29b6d4/pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7", size = 3033284 }, + { url = "https://files.pythonhosted.org/packages/b7/cb/6faf3fb1e7705fd2db74e070f3bf6f88693601b0ed8e81049a8266de4754/pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16", size = 4445826 }, + { url = "https://files.pythonhosted.org/packages/07/94/8be03d50b70ca47fb434a358919d6a8d6580f282bbb7af7e4aa40103461d/pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b", size = 4527329 }, + { url = "https://files.pythonhosted.org/packages/fd/a4/bfe78777076dc405e3bd2080bc32da5ab3945b5a25dc5d8acaa9de64a162/pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406", size = 4549049 }, + { url = "https://files.pythonhosted.org/packages/65/4d/eaf9068dc687c24979e977ce5677e253624bd8b616b286f543f0c1b91662/pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91", size = 4635408 }, + { url = "https://files.pythonhosted.org/packages/1d/26/0fd443365d9c63bc79feb219f97d935cd4b93af28353cba78d8e77b61719/pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751", size = 4614863 }, + { url = "https://files.pythonhosted.org/packages/49/65/dca4d2506be482c2c6641cacdba5c602bc76d8ceb618fd37de855653a419/pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9", size = 4692938 }, + { url = "https://files.pythonhosted.org/packages/b3/92/1ca0c3f09233bd7decf8f7105a1c4e3162fb9142128c74adad0fb361b7eb/pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd", size = 2335774 }, + { url = "https://files.pythonhosted.org/packages/a5/ac/77525347cb43b83ae905ffe257bbe2cc6fd23acb9796639a1f56aa59d191/pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e", size = 2681895 }, + { url = "https://files.pythonhosted.org/packages/67/32/32dc030cfa91ca0fc52baebbba2e009bb001122a1daa8b6a79ad830b38d3/pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681", size = 2417234 }, + { url = "https://files.pythonhosted.org/packages/33/49/c8c21e4255b4f4a2c0c68ac18125d7f5460b109acc6dfdef1a24f9b960ef/pillow-11.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9b7b0d4fd2635f54ad82785d56bc0d94f147096493a79985d0ab57aedd563156", size = 3181727 }, + { url = "https://files.pythonhosted.org/packages/6d/f1/f7255c0838f8c1ef6d55b625cfb286835c17e8136ce4351c5577d02c443b/pillow-11.2.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:aa442755e31c64037aa7c1cb186e0b369f8416c567381852c63444dd666fb772", size = 2999833 }, + { url = "https://files.pythonhosted.org/packages/e2/57/9968114457bd131063da98d87790d080366218f64fa2943b65ac6739abb3/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d3348c95b766f54b76116d53d4cb171b52992a1027e7ca50c81b43b9d9e363", size = 3437472 }, + { url = "https://files.pythonhosted.org/packages/b2/1b/e35d8a158e21372ecc48aac9c453518cfe23907bb82f950d6e1c72811eb0/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85d27ea4c889342f7e35f6d56e7e1cb345632ad592e8c51b693d7b7556043ce0", size = 3459976 }, + { url = "https://files.pythonhosted.org/packages/26/da/2c11d03b765efff0ccc473f1c4186dc2770110464f2177efaed9cf6fae01/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bf2c33d6791c598142f00c9c4c7d47f6476731c31081331664eb26d6ab583e01", size = 3527133 }, + { url = "https://files.pythonhosted.org/packages/79/1a/4e85bd7cadf78412c2a3069249a09c32ef3323650fd3005c97cca7aa21df/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e616e7154c37669fc1dfc14584f11e284e05d1c650e1c0f972f281c4ccc53193", size = 3571555 }, + { url = "https://files.pythonhosted.org/packages/69/03/239939915216de1e95e0ce2334bf17a7870ae185eb390fab6d706aadbfc0/pillow-11.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39ad2e0f424394e3aebc40168845fee52df1394a4673a6ee512d840d14ab3013", size = 2674713 }, + { url = "https://files.pythonhosted.org/packages/a4/ad/2613c04633c7257d9481ab21d6b5364b59fc5d75faafd7cb8693523945a3/pillow-11.2.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80f1df8dbe9572b4b7abdfa17eb5d78dd620b1d55d9e25f834efdbee872d3aed", size = 3181734 }, + { url = "https://files.pythonhosted.org/packages/a4/fd/dcdda4471ed667de57bb5405bb42d751e6cfdd4011a12c248b455c778e03/pillow-11.2.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea926cfbc3957090becbcbbb65ad177161a2ff2ad578b5a6ec9bb1e1cd78753c", size = 2999841 }, + { url = "https://files.pythonhosted.org/packages/ac/89/8a2536e95e77432833f0db6fd72a8d310c8e4272a04461fb833eb021bf94/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:738db0e0941ca0376804d4de6a782c005245264edaa253ffce24e5a15cbdc7bd", size = 3437470 }, + { url = "https://files.pythonhosted.org/packages/9d/8f/abd47b73c60712f88e9eda32baced7bfc3e9bd6a7619bb64b93acff28c3e/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db98ab6565c69082ec9b0d4e40dd9f6181dab0dd236d26f7a50b8b9bfbd5076", size = 3460013 }, + { url = "https://files.pythonhosted.org/packages/f6/20/5c0a0aa83b213b7a07ec01e71a3d6ea2cf4ad1d2c686cc0168173b6089e7/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:036e53f4170e270ddb8797d4c590e6dd14d28e15c7da375c18978045f7e6c37b", size = 3527165 }, + { url = "https://files.pythonhosted.org/packages/58/0e/2abab98a72202d91146abc839e10c14f7cf36166f12838ea0c4db3ca6ecb/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14f73f7c291279bd65fda51ee87affd7c1e097709f7fdd0188957a16c264601f", size = 3571586 }, + { url = "https://files.pythonhosted.org/packages/21/2c/5e05f58658cf49b6667762cca03d6e7d85cededde2caf2ab37b81f80e574/pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044", size = 2674751 }, +] + [[package]] name = "platformdirs" version = "4.3.6" @@ -1593,6 +2190,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/43/b3/df14c580d82b9627d173ceea305ba898dca135feb360b6d84019d0803d3b/pre_commit-4.1.0-py2.py3-none-any.whl", hash = "sha256:d29e7cb346295bcc1cc75fc3e92e343495e3ea0196c9ec6ba53f49f10ab6ae7b", size = 220560 }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.51" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810 }, +] + [[package]] name = "propcache" version = "0.3.0" @@ -1711,6 +2320,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, ] +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 }, +] + [[package]] name = "py-cpuinfo" version = "9.0.0" @@ -1762,6 +2389,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ed/bd/54907846383dcc7ee28772d7e646f6c34276a17da740002a5cefe90f04f7/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:58d9397b2e273ef76264b45531e9d552d8ec8a6688b7390b5be44c02a37aade8", size = 42085744 }, ] +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + [[package]] name = "pydantic" version = "2.10.6" @@ -1860,6 +2496,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, ] +[[package]] +name = "pyparsing" +version = "3.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120 }, +] + [[package]] name = "pytest" version = "8.3.5" @@ -1935,6 +2580,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57", size = 507930 }, ] +[[package]] +name = "pywin32" +version = "310" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/da/a5f38fffbba2fb99aa4aa905480ac4b8e83ca486659ac8c95bce47fb5276/pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1", size = 8848240 }, + { url = "https://files.pythonhosted.org/packages/aa/fe/d873a773324fa565619ba555a82c9dabd677301720f3660a731a5d07e49a/pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d", size = 9601854 }, + { url = "https://files.pythonhosted.org/packages/3c/84/1a8e3d7a15490d28a5d816efa229ecb4999cdc51a7c30dd8914f669093b8/pywin32-310-cp310-cp310-win_arm64.whl", hash = "sha256:33babed0cf0c92a6f94cc6cc13546ab24ee13e3e800e61ed87609ab91e4c8213", size = 8522963 }, + { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284 }, + { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748 }, + { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941 }, + { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239 }, + { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839 }, + { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470 }, + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384 }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039 }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152 }, +] + [[package]] name = "pyyaml" version = "6.0.2" @@ -1979,6 +2643,79 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, ] +[[package]] +name = "pyzmq" +version = "26.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/11/b9213d25230ac18a71b39b3723494e57adebe36e066397b961657b3b41c1/pyzmq-26.4.0.tar.gz", hash = "sha256:4bd13f85f80962f91a651a7356fe0472791a5f7a92f227822b5acf44795c626d", size = 278293 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/b8/af1d814ffc3ff9730f9a970cbf216b6f078e5d251a25ef5201d7bc32a37c/pyzmq-26.4.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:0329bdf83e170ac133f44a233fc651f6ed66ef8e66693b5af7d54f45d1ef5918", size = 1339238 }, + { url = "https://files.pythonhosted.org/packages/ee/e4/5aafed4886c264f2ea6064601ad39c5fc4e9b6539c6ebe598a859832eeee/pyzmq-26.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:398a825d2dea96227cf6460ce0a174cf7657d6f6827807d4d1ae9d0f9ae64315", size = 672848 }, + { url = "https://files.pythonhosted.org/packages/79/39/026bf49c721cb42f1ef3ae0ee3d348212a7621d2adb739ba97599b6e4d50/pyzmq-26.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d52d62edc96787f5c1dfa6c6ccff9b581cfae5a70d94ec4c8da157656c73b5b", size = 911299 }, + { url = "https://files.pythonhosted.org/packages/03/23/b41f936a9403b8f92325c823c0f264c6102a0687a99c820f1aaeb99c1def/pyzmq-26.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1410c3a3705db68d11eb2424d75894d41cff2f64d948ffe245dd97a9debfebf4", size = 867920 }, + { url = "https://files.pythonhosted.org/packages/c1/3e/2de5928cdadc2105e7c8f890cc5f404136b41ce5b6eae5902167f1d5641c/pyzmq-26.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:7dacb06a9c83b007cc01e8e5277f94c95c453c5851aac5e83efe93e72226353f", size = 862514 }, + { url = "https://files.pythonhosted.org/packages/ce/57/109569514dd32e05a61d4382bc88980c95bfd2f02e58fea47ec0ccd96de1/pyzmq-26.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6bab961c8c9b3a4dc94d26e9b2cdf84de9918931d01d6ff38c721a83ab3c0ef5", size = 1204494 }, + { url = "https://files.pythonhosted.org/packages/aa/02/dc51068ff2ca70350d1151833643a598625feac7b632372d229ceb4de3e1/pyzmq-26.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7a5c09413b924d96af2aa8b57e76b9b0058284d60e2fc3730ce0f979031d162a", size = 1514525 }, + { url = "https://files.pythonhosted.org/packages/48/2a/a7d81873fff0645eb60afaec2b7c78a85a377af8f1d911aff045d8955bc7/pyzmq-26.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7d489ac234d38e57f458fdbd12a996bfe990ac028feaf6f3c1e81ff766513d3b", size = 1414659 }, + { url = "https://files.pythonhosted.org/packages/ef/ea/813af9c42ae21845c1ccfe495bd29c067622a621e85d7cda6bc437de8101/pyzmq-26.4.0-cp310-cp310-win32.whl", hash = "sha256:dea1c8db78fb1b4b7dc9f8e213d0af3fc8ecd2c51a1d5a3ca1cde1bda034a980", size = 580348 }, + { url = "https://files.pythonhosted.org/packages/20/68/318666a89a565252c81d3fed7f3b4c54bd80fd55c6095988dfa2cd04a62b/pyzmq-26.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:fa59e1f5a224b5e04dc6c101d7186058efa68288c2d714aa12d27603ae93318b", size = 643838 }, + { url = "https://files.pythonhosted.org/packages/91/f8/fb1a15b5f4ecd3e588bfde40c17d32ed84b735195b5c7d1d7ce88301a16f/pyzmq-26.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:a651fe2f447672f4a815e22e74630b6b1ec3a1ab670c95e5e5e28dcd4e69bbb5", size = 559565 }, + { url = "https://files.pythonhosted.org/packages/32/6d/234e3b0aa82fd0290b1896e9992f56bdddf1f97266110be54d0177a9d2d9/pyzmq-26.4.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:bfcf82644c9b45ddd7cd2a041f3ff8dce4a0904429b74d73a439e8cab1bd9e54", size = 1339723 }, + { url = "https://files.pythonhosted.org/packages/4f/11/6d561efe29ad83f7149a7cd48e498e539ed09019c6cd7ecc73f4cc725028/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9bcae3979b2654d5289d3490742378b2f3ce804b0b5fd42036074e2bf35b030", size = 672645 }, + { url = "https://files.pythonhosted.org/packages/19/fd/81bfe3e23f418644660bad1a90f0d22f0b3eebe33dd65a79385530bceb3d/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccdff8ac4246b6fb60dcf3982dfaeeff5dd04f36051fe0632748fc0aa0679c01", size = 910133 }, + { url = "https://files.pythonhosted.org/packages/97/68/321b9c775595ea3df832a9516252b653fe32818db66fdc8fa31c9b9fce37/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4550af385b442dc2d55ab7717837812799d3674cb12f9a3aa897611839c18e9e", size = 867428 }, + { url = "https://files.pythonhosted.org/packages/4e/6e/159cbf2055ef36aa2aa297e01b24523176e5b48ead283c23a94179fb2ba2/pyzmq-26.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f9f7ffe9db1187a253fca95191854b3fda24696f086e8789d1d449308a34b88", size = 862409 }, + { url = "https://files.pythonhosted.org/packages/05/1c/45fb8db7be5a7d0cadea1070a9cbded5199a2d578de2208197e592f219bd/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3709c9ff7ba61589b7372923fd82b99a81932b592a5c7f1a24147c91da9a68d6", size = 1205007 }, + { url = "https://files.pythonhosted.org/packages/f8/fa/658c7f583af6498b463f2fa600f34e298e1b330886f82f1feba0dc2dd6c3/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f8f3c30fb2d26ae5ce36b59768ba60fb72507ea9efc72f8f69fa088450cff1df", size = 1514599 }, + { url = "https://files.pythonhosted.org/packages/4d/d7/44d641522353ce0a2bbd150379cb5ec32f7120944e6bfba4846586945658/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:382a4a48c8080e273427fc692037e3f7d2851959ffe40864f2db32646eeb3cef", size = 1414546 }, + { url = "https://files.pythonhosted.org/packages/72/76/c8ed7263218b3d1e9bce07b9058502024188bd52cc0b0a267a9513b431fc/pyzmq-26.4.0-cp311-cp311-win32.whl", hash = "sha256:d56aad0517d4c09e3b4f15adebba8f6372c5102c27742a5bdbfc74a7dceb8fca", size = 579247 }, + { url = "https://files.pythonhosted.org/packages/c3/d0/2d9abfa2571a0b1a67c0ada79a8aa1ba1cce57992d80f771abcdf99bb32c/pyzmq-26.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:963977ac8baed7058c1e126014f3fe58b3773f45c78cce7af5c26c09b6823896", size = 644727 }, + { url = "https://files.pythonhosted.org/packages/0d/d1/c8ad82393be6ccedfc3c9f3adb07f8f3976e3c4802640fe3f71441941e70/pyzmq-26.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0c8e8cadc81e44cc5088fcd53b9b3b4ce9344815f6c4a03aec653509296fae3", size = 559942 }, + { url = "https://files.pythonhosted.org/packages/10/44/a778555ebfdf6c7fc00816aad12d185d10a74d975800341b1bc36bad1187/pyzmq-26.4.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:5227cb8da4b6f68acfd48d20c588197fd67745c278827d5238c707daf579227b", size = 1341586 }, + { url = "https://files.pythonhosted.org/packages/9c/4f/f3a58dc69ac757e5103be3bd41fb78721a5e17da7cc617ddb56d973a365c/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1c07a7fa7f7ba86554a2b1bef198c9fed570c08ee062fd2fd6a4dcacd45f905", size = 665880 }, + { url = "https://files.pythonhosted.org/packages/fe/45/50230bcfb3ae5cb98bee683b6edeba1919f2565d7cc1851d3c38e2260795/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae775fa83f52f52de73183f7ef5395186f7105d5ed65b1ae65ba27cb1260de2b", size = 902216 }, + { url = "https://files.pythonhosted.org/packages/41/59/56bbdc5689be5e13727491ad2ba5efd7cd564365750514f9bc8f212eef82/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66c760d0226ebd52f1e6b644a9e839b5db1e107a23f2fcd46ec0569a4fdd4e63", size = 859814 }, + { url = "https://files.pythonhosted.org/packages/81/b1/57db58cfc8af592ce94f40649bd1804369c05b2190e4cbc0a2dad572baeb/pyzmq-26.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ef8c6ecc1d520debc147173eaa3765d53f06cd8dbe7bd377064cdbc53ab456f5", size = 855889 }, + { url = "https://files.pythonhosted.org/packages/e8/92/47542e629cbac8f221c230a6d0f38dd3d9cff9f6f589ed45fdf572ffd726/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3150ef4084e163dec29ae667b10d96aad309b668fac6810c9e8c27cf543d6e0b", size = 1197153 }, + { url = "https://files.pythonhosted.org/packages/07/e5/b10a979d1d565d54410afc87499b16c96b4a181af46e7645ab4831b1088c/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4448c9e55bf8329fa1dcedd32f661bf611214fa70c8e02fee4347bc589d39a84", size = 1507352 }, + { url = "https://files.pythonhosted.org/packages/ab/58/5a23db84507ab9c01c04b1232a7a763be66e992aa2e66498521bbbc72a71/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e07dde3647afb084d985310d067a3efa6efad0621ee10826f2cb2f9a31b89d2f", size = 1406834 }, + { url = "https://files.pythonhosted.org/packages/22/74/aaa837b331580c13b79ac39396601fb361454ee184ca85e8861914769b99/pyzmq-26.4.0-cp312-cp312-win32.whl", hash = "sha256:ba034a32ecf9af72adfa5ee383ad0fd4f4e38cdb62b13624278ef768fe5b5b44", size = 577992 }, + { url = "https://files.pythonhosted.org/packages/30/0f/55f8c02c182856743b82dde46b2dc3e314edda7f1098c12a8227eeda0833/pyzmq-26.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:056a97aab4064f526ecb32f4343917a4022a5d9efb6b9df990ff72e1879e40be", size = 640466 }, + { url = "https://files.pythonhosted.org/packages/e4/29/073779afc3ef6f830b8de95026ef20b2d1ec22d0324d767748d806e57379/pyzmq-26.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f23c750e485ce1eb639dbd576d27d168595908aa2d60b149e2d9e34c9df40e0", size = 556342 }, + { url = "https://files.pythonhosted.org/packages/d7/20/fb2c92542488db70f833b92893769a569458311a76474bda89dc4264bd18/pyzmq-26.4.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:c43fac689880f5174d6fc864857d1247fe5cfa22b09ed058a344ca92bf5301e3", size = 1339484 }, + { url = "https://files.pythonhosted.org/packages/58/29/2f06b9cabda3a6ea2c10f43e67ded3e47fc25c54822e2506dfb8325155d4/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:902aca7eba477657c5fb81c808318460328758e8367ecdd1964b6330c73cae43", size = 666106 }, + { url = "https://files.pythonhosted.org/packages/77/e4/dcf62bd29e5e190bd21bfccaa4f3386e01bf40d948c239239c2f1e726729/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e48a830bfd152fe17fbdeaf99ac5271aa4122521bf0d275b6b24e52ef35eb6", size = 902056 }, + { url = "https://files.pythonhosted.org/packages/1a/cf/b36b3d7aea236087d20189bec1a87eeb2b66009731d7055e5c65f845cdba/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31be2b6de98c824c06f5574331f805707c667dc8f60cb18580b7de078479891e", size = 860148 }, + { url = "https://files.pythonhosted.org/packages/18/a6/f048826bc87528c208e90604c3bf573801e54bd91e390cbd2dfa860e82dc/pyzmq-26.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6332452034be001bbf3206ac59c0d2a7713de5f25bb38b06519fc6967b7cf771", size = 855983 }, + { url = "https://files.pythonhosted.org/packages/0a/27/454d34ab6a1d9772a36add22f17f6b85baf7c16e14325fa29e7202ca8ee8/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:da8c0f5dd352136853e6a09b1b986ee5278dfddfebd30515e16eae425c872b30", size = 1197274 }, + { url = "https://files.pythonhosted.org/packages/f4/3d/7abfeab6b83ad38aa34cbd57c6fc29752c391e3954fd12848bd8d2ec0df6/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f4ccc1a0a2c9806dda2a2dd118a3b7b681e448f3bb354056cad44a65169f6d86", size = 1507120 }, + { url = "https://files.pythonhosted.org/packages/13/ff/bc8d21dbb9bc8705126e875438a1969c4f77e03fc8565d6901c7933a3d01/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1c0b5fceadbab461578daf8d1dcc918ebe7ddd2952f748cf30c7cf2de5d51101", size = 1406738 }, + { url = "https://files.pythonhosted.org/packages/f5/5d/d4cd85b24de71d84d81229e3bbb13392b2698432cf8fdcea5afda253d587/pyzmq-26.4.0-cp313-cp313-win32.whl", hash = "sha256:28e2b0ff5ba4b3dd11062d905682bad33385cfa3cc03e81abd7f0822263e6637", size = 577826 }, + { url = "https://files.pythonhosted.org/packages/c6/6c/f289c1789d7bb6e5a3b3bef7b2a55089b8561d17132be7d960d3ff33b14e/pyzmq-26.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:23ecc9d241004c10e8b4f49d12ac064cd7000e1643343944a10df98e57bc544b", size = 640406 }, + { url = "https://files.pythonhosted.org/packages/b3/99/676b8851cb955eb5236a0c1e9ec679ea5ede092bf8bf2c8a68d7e965cac3/pyzmq-26.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:1edb0385c7f025045d6e0f759d4d3afe43c17a3d898914ec6582e6f464203c08", size = 556216 }, + { url = "https://files.pythonhosted.org/packages/65/c2/1fac340de9d7df71efc59d9c50fc7a635a77b103392d1842898dd023afcb/pyzmq-26.4.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:93a29e882b2ba1db86ba5dd5e88e18e0ac6b627026c5cfbec9983422011b82d4", size = 1333769 }, + { url = "https://files.pythonhosted.org/packages/5c/c7/6c03637e8d742c3b00bec4f5e4cd9d1c01b2f3694c6f140742e93ca637ed/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45684f276f57110bb89e4300c00f1233ca631f08f5f42528a5c408a79efc4a", size = 658826 }, + { url = "https://files.pythonhosted.org/packages/a5/97/a8dca65913c0f78e0545af2bb5078aebfc142ca7d91cdaffa1fbc73e5dbd/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72073e75260cb301aad4258ad6150fa7f57c719b3f498cb91e31df16784d89b", size = 891650 }, + { url = "https://files.pythonhosted.org/packages/7d/7e/f63af1031eb060bf02d033732b910fe48548dcfdbe9c785e9f74a6cc6ae4/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be37e24b13026cfedd233bcbbccd8c0bcd2fdd186216094d095f60076201538d", size = 849776 }, + { url = "https://files.pythonhosted.org/packages/f6/fa/1a009ce582802a895c0d5fe9413f029c940a0a8ee828657a3bb0acffd88b/pyzmq-26.4.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:237b283044934d26f1eeff4075f751b05d2f3ed42a257fc44386d00df6a270cf", size = 842516 }, + { url = "https://files.pythonhosted.org/packages/6e/bc/f88b0bad0f7a7f500547d71e99f10336f2314e525d4ebf576a1ea4a1d903/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b30f862f6768b17040929a68432c8a8be77780317f45a353cb17e423127d250c", size = 1189183 }, + { url = "https://files.pythonhosted.org/packages/d9/8c/db446a3dd9cf894406dec2e61eeffaa3c07c3abb783deaebb9812c4af6a5/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:c80fcd3504232f13617c6ab501124d373e4895424e65de8b72042333316f64a8", size = 1495501 }, + { url = "https://files.pythonhosted.org/packages/05/4c/bf3cad0d64c3214ac881299c4562b815f05d503bccc513e3fd4fdc6f67e4/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:26a2a7451606b87f67cdeca2c2789d86f605da08b4bd616b1a9981605ca3a364", size = 1395540 }, + { url = "https://files.pythonhosted.org/packages/47/03/96004704a84095f493be8d2b476641f5c967b269390173f85488a53c1c13/pyzmq-26.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:98d948288ce893a2edc5ec3c438fe8de2daa5bbbd6e2e865ec5f966e237084ba", size = 834408 }, + { url = "https://files.pythonhosted.org/packages/e4/7f/68d8f3034a20505db7551cb2260248be28ca66d537a1ac9a257913d778e4/pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9f34f5c9e0203ece706a1003f1492a56c06c0632d86cb77bcfe77b56aacf27b", size = 569580 }, + { url = "https://files.pythonhosted.org/packages/9b/a6/2b0d6801ec33f2b2a19dd8d02e0a1e8701000fec72926e6787363567d30c/pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80c9b48aef586ff8b698359ce22f9508937c799cc1d2c9c2f7c95996f2300c94", size = 798250 }, + { url = "https://files.pythonhosted.org/packages/96/2a/0322b3437de977dcac8a755d6d7ce6ec5238de78e2e2d9353730b297cf12/pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3f2a5b74009fd50b53b26f65daff23e9853e79aa86e0aa08a53a7628d92d44a", size = 756758 }, + { url = "https://files.pythonhosted.org/packages/c2/33/43704f066369416d65549ccee366cc19153911bec0154da7c6b41fca7e78/pyzmq-26.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:61c5f93d7622d84cb3092d7f6398ffc77654c346545313a3737e266fc11a3beb", size = 555371 }, + { url = "https://files.pythonhosted.org/packages/04/52/a70fcd5592715702248306d8e1729c10742c2eac44529984413b05c68658/pyzmq-26.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4478b14cb54a805088299c25a79f27eaf530564a7a4f72bf432a040042b554eb", size = 834405 }, + { url = "https://files.pythonhosted.org/packages/25/f9/1a03f1accff16b3af1a6fa22cbf7ced074776abbf688b2e9cb4629700c62/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a28ac29c60e4ba84b5f58605ace8ad495414a724fe7aceb7cf06cd0598d04e1", size = 569578 }, + { url = "https://files.pythonhosted.org/packages/76/0c/3a633acd762aa6655fcb71fa841907eae0ab1e8582ff494b137266de341d/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43b03c1ceea27c6520124f4fb2ba9c647409b9abdf9a62388117148a90419494", size = 798248 }, + { url = "https://files.pythonhosted.org/packages/cd/cc/6c99c84aa60ac1cc56747bed6be8ce6305b9b861d7475772e7a25ce019d3/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7731abd23a782851426d4e37deb2057bf9410848a4459b5ede4fe89342e687a9", size = 756757 }, + { url = "https://files.pythonhosted.org/packages/13/9c/d8073bd898eb896e94c679abe82e47506e2b750eb261cf6010ced869797c/pyzmq-26.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a222ad02fbe80166b0526c038776e8042cd4e5f0dec1489a006a1df47e9040e0", size = 555371 }, +] + [[package]] name = "regex" version = "2024.11.6" @@ -2350,6 +3087,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 }, ] +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 }, +] + [[package]] name = "submitit" version = "1.5.2" @@ -2456,22 +3207,22 @@ dependencies = [ { name = "filelock" }, { name = "fsspec" }, { name = "jinja2" }, - { name = "mkl", marker = "platform_system == 'Windows'" }, + { name = "mkl", marker = "sys_platform == 'win32'" }, { name = "networkx", version = "3.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' and sys_platform != 'linux'" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or python_full_version >= '3.11'" }, - { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or sys_platform == 'linux'" }, + { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "sympy" }, - { name = "triton", marker = "python_full_version < '3.12' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "triton", marker = "python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "typing-extensions" }, ] wheels = [ @@ -2489,18 +3240,45 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/55/51/4bdee83e6fa9cca8e3a6cdf81a2695ede9d3fd7148e4fd4188dff142d7b0/torch-2.3.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:dca986214267b34065a79000cee54232e62b41dff1ec2cab9abc3fc8b3dee0ad", size = 60968873 }, ] +[[package]] +name = "tornado" +version = "6.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299 }, + { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253 }, + { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602 }, + { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972 }, + { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173 }, + { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892 }, + { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334 }, + { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261 }, + { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463 }, + { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 }, +] + [[package]] name = "tqdm" version = "4.67.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } wheels = [ { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, ] +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, +] + [[package]] name = "transformers" version = "4.49.0" @@ -2527,7 +3305,7 @@ name = "triton" version = "2.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock" }, + { name = "filelock", marker = "python_full_version < '3.12' and sys_platform == 'linux'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/db/ee/8d50d44ed5b63677bb387f4ee67a7dbaaded0189b320ffe82685a6827728/triton-2.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ce4b8ff70c48e47274c66f269cce8861cf1dc347ceeb7a67414ca151b1822d8", size = 168055246 }, @@ -2633,6 +3411,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b6/90/038a64abcbe5f991468f057bd21bead84a5c39d9b0409b652893263a47b4/wandb-0.19.8-py3-none-win_amd64.whl", hash = "sha256:f7da8e6fc6693014c72fb7db3ecd5e1116066198d2aca96f6eb7220cea03081c", size = 20165486 }, ] +[[package]] +name = "wcwidth" +version = "0.2.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, +] + [[package]] name = "xxhash" version = "3.5.0" From 173b3a9c9f98d399add561e79f52c36eb4166ee3 Mon Sep 17 00:00:00 2001 From: Shahrad Mohammadzadeh Date: Wed, 30 Apr 2025 16:02:32 -0400 Subject: [PATCH 4/7] validation scripts add --- jobs/validate_all_static.sh | 24 ++++--------------- jobs/validate_all_static_diversity.sh | 34 ++++++++------------------- 2 files changed, 14 insertions(+), 44 deletions(-) diff --git a/jobs/validate_all_static.sh b/jobs/validate_all_static.sh index 6f155c41..8f522a31 100644 --- a/jobs/validate_all_static.sh +++ b/jobs/validate_all_static.sh @@ -2,6 +2,7 @@ #SBATCH --job-name=validate_static_all #SBATCH --partition=unkillable-cpu #SBATCH --cpus-per-task=2 +#SBATCH --mem=16G #SBATCH --time=24:00:00 #SBATCH --output=slurm-%j.out #SBATCH --error=slurm-%j.err @@ -15,32 +16,15 @@ MAX_CONC=256 # list all sub‐tasks tasks=( - education_qna_direct - education_qna_eli5 - education_qna_expert - education_qna_hinted - education_summary_eli5 - education_summary_expert - politics_generate_formal - politics_generate_rapper - politics_generate_shakespeare - politics_qna_eli5 - politics_qna_expert - politics_summary_eli5 - politics_summary_expert - tech_healthcare_qna_eli5 - tech_healthcare_qna_expert - tech_physics_summary_eli5 - tech_physics_summary_expert - tech_physics_summary_highschool + ultra-hh-sampled ) for t in "${tasks[@]}"; do echo "Validating $t..." uv run aif validate \ --max_concurrency "$MAX_CONC" \ - "data/4omini_generation/$t/data.json" \ - "data/4omini_validation_no_diversity/$t/validate.json" \ + "data/$t.json" \ + "data/$t-validate-no-diversity.json" \ --no-validate-diversity \ --no-validate-embedding-diversity \ --model "$MODEL" \ diff --git a/jobs/validate_all_static_diversity.sh b/jobs/validate_all_static_diversity.sh index f643b966..926db04b 100644 --- a/jobs/validate_all_static_diversity.sh +++ b/jobs/validate_all_static_diversity.sh @@ -1,13 +1,14 @@ #!/bin/bash -#SBATCH --job-name=validate_static_all_diversity +#SBATCH --job-name=validate_static_all_diversity_external #SBATCH --partition=main #SBATCH --gres=gpu:a100l:1 -#SBATCH --cpus-per-task=2 +#SBATCH --mem=36G +#SBATCH --cpus-per-task=6 #SBATCH --time=24:00:00 #SBATCH --output=slurm-%j.out #SBATCH --error=slurm-%j.err #SBATCH --mail-type=ALL -#SBATCH --mail-user=shahrad_m@icloud.com +#SBATCH --mail-user= cd module load python/3.10 @@ -22,7 +23,7 @@ SERVER_PID=$! echo "Waiting for server to start..." while true; do echo "Checking if server is up..." - RESPONSE=$(curl -s http://localhost:8000/v1/models -H "Authorization: Bearer $OPENAI_API_KEY" 2>&1) + RESPONSE=$(curl -s http://localhost:8000/v1/models -H "Authorization: Bearer openai" 2>&1) if [[ "$RESPONSE" == *"data"* ]]; then echo "Server is up and running!" @@ -47,31 +48,16 @@ echo "Starting validation process..." # list all sub‐tasks tasks=( - education_qna_direct - education_qna_eli5 - education_qna_expert - education_qna_hinted - education_summary_eli5 - education_summary_expert - politics_generate_formal - politics_generate_rapper - politics_generate_shakespeare - politics_qna_eli5 - politics_qna_expert - politics_summary_eli5 - politics_summary_expert - tech_healthcare_qna_eli5 - tech_healthcare_qna_expert - tech_physics_summary_eli5 - tech_physics_summary_expert - tech_physics_summary_highschool + cppo-reward-sampled + cppo-rl-sampled + ultra-hh-sampled ) for t in "${tasks[@]}"; do echo "Validating $t..." uv run aif validate \ - "data/4omini_generation/$t/data.json" \ - "data/4omini_validation_diversity/$t/validate.json" \ + "data/$t.json" \ + "data/$t-validate-diversity.json" \ --no-validate-diversity \ --no-validate-count \ --no-validate-entropy \ From a742880cc86286d074a37840e5059757ff18a49e Mon Sep 17 00:00:00 2001 From: Shahrad Mohammadzadeh Date: Fri, 2 May 2025 22:56:15 -0400 Subject: [PATCH 5/7] embedding diversity calculation with mistral --- experiments.ipynb | 479 ++++++++++++++++++++++++++ jobs/unkillable_diversity.sh | 83 +++++ jobs/validate_all_static.sh | 4 +- jobs/validate_all_static_diversity.sh | 23 +- pyproject.toml | 1 + uv.lock | 58 ++++ 6 files changed, 635 insertions(+), 13 deletions(-) create mode 100644 experiments.ipynb create mode 100644 jobs/unkillable_diversity.sh diff --git a/experiments.ipynb b/experiments.ipynb new file mode 100644 index 00000000..ed98840a --- /dev/null +++ b/experiments.ipynb @@ -0,0 +1,479 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fe383535", + "metadata": {}, + "source": [ + "# Continuity Analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "45b95049", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/mila/s/shahrad.mohammadzadeh/projects/AIF-Gen/.venv/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\"In today's political landscape, the role of committees in shaping legislation cannot be understated. Committees serve as the backbone of governmental operations, providing thorough analysis and debate on proposed laws before they reach the wider body. One particularly notable instance is when the Majority Party in Congress leverages committee power to drive its agenda. When the Majority Party controls a committee, they often prioritize legislation that aligns with their platform, leading to significant developments in areas like healthcare, education, and infrastructure.\\n\\nThe Majority can effectively steer discussions and influence the trajectory of policy by selecting which bills to advance. For example, if a bill aimed at expanding public healthcare is brought to the Health Committee, a committee led by Majority Party members may fast-track it for a vote or, conversely, sink it in reviews. This majority dominance can result in substantial shifts in governmental priorities, potentially sidelining voices from the minority party and impacting bipartisan support.\\n\\nMoreover, the committee's role extends beyond mere legislative approval; it also significantly affects public perception of political processes. As citizens often pay attention to committee hearings and reports, the Majority's actions therein can either bolster or undermine trust in government institutions. When the committee is perceived as acting in the public's best interest, it strengthens democracy. Conversely, partisanship and perceived inequities can lead to disillusionment among the electorate.\\n\\nIt's crucial for voters to remain aware of these dynamics and understand how the committee system operates under majority rule. Advocating for transparency and equitable representation can help mitigate the risks associated with concentrated power and ensure that all voices are heard in the legislative process. As we move forward, monitoring the influence of committees in both parties will be essential to ensure a balanced approach to policy-making.\", \"The increasing focus on climate change and its impact on the environment has become a prominent political topic in recent years, particularly in the realm of federal domestic policy. As the effects of climate change continue to pose significant challenges, there is a pressing need for the federal government to respond effectively through decisive action in the formulation of domestic policy.\\n\\nOne crucial aspect that has emerged in this discourse is the aggressive targeting of carbon emissions through various means, such as incentives for renewable energy sources, stricter regulations on industrial emissions, and investment in sustainable infrastructure. The administration's commitment to re-entering the Paris Agreement highlighted the administration's intent to prioritize climate action at a national level, with various initiatives aimed at reducing emissions and promoting green technology.\\n\\nMoreover, domestic policy proposals are increasingly intertwining climate action with economic recovery efforts. The federal government is recognizing that addressing environmental issues can also create jobs and stimulate economic growth. Policies such as the Green New Deal have gained traction, proposing a profound transformation of the economy towards sustainability, with a significant public investment in renewable energy and green jobs.\\n\\nThe efficacy of such domestic policies, however, often hinges on bipartisan support in Congress. Political ideologies diverge significantly when it comes to prioritizing climate action and the federal government's role in regulating industry and the economy. Consequently, the debate over climate policy may become a critical battleground for federal priorities, illustrating the complex interplay between environmental sustainability and political maneuvering.\\n\\nAdditionally, the ongoing debates about infrastructure spending have emphasized the importance of integrating climate resilience into federal domestic policy. The recent push to modernize America’s infrastructure to withstand extreme weather events exemplifies how closely related climate initiatives are to broader economic and social policies.\\n\\nOverall, federal domestic policy concerning climate change is rapidly evolving and shaping the political landscape. As new challenges emerge, the ability of the federal government to implement effective strategies will hinge on collaborative efforts across party lines, public awareness, and grassroots activism, setting the stage for the future of both environmental protection and economic stability.\", \"In recent years, the resurgence of autocracy around the world has sparked significant debate and concern among political analysts and citizens alike. Autocracies, defined as systems of governance in which a single entity holds absolute power, can manifest in various forms, from outright dictatorships to more subtle authoritarian regimes that exist within ostensibly ic frameworks.\\n\\nOne notable example is the rise of autocratic governance in several countries that were once considered ic bellwethers. The challenges presented by these regimes have forced many to reconsider the efficacy of international responses to authoritarianism. In particular, the current administration in the United States has been scrutinized for its approach to dealing with these governments.\\n\\nCritics argue that the administration's policies reflect a lack of coherent strategy when faced with autocratic leaders, often oscillating between engagement and condemnation without a clear roadmap for promoting ic ideals. This indecisiveness can embolden autocratic regimes, as they interpret mixed signals as a weakness rather than a call for accountability. \\n\\nFurthermore, the consequences of emerging autocracies extend beyond their borders, often leading to increased geopolitical tensions and challenges to global cooperation on pressing issues such as climate change and public health. The growing power of these regimes, coupled with their propensity to stifle dissent and undermine civil liberties, raises important questions about the future of democracy around the globe. \\n\\nAs citizens and policymakers engage in this critical conversation, it becomes increasingly important to explore how best to support ic movements and reinforce the social structures that resist autocratic tendencies. In doing so, the administration must forge a consistent and principled stance against the allure of autocracy, recognizing that the fight for ic governance is as vital today as it has ever been. The stakes have never been higher for those who value freedom and equality on the world's stage.\", 'In recent years, the specter of impeachment has haunted various administrations, sparking heated debates about the integrity of ic processes and the specter of autocracy looming over our political landscape. Impeachment is often viewed as a crucial check against abuse of power, allowing legislative bodies to hold the executive accountable. Yet, as the political climate grows increasingly polarized, many worry that the impeachment process is no longer solely a remedy for corruption but has become a tool wielded by partisan factions seeking to undermine their opponents.\\n\\nThe rise of autocratic tendencies in politics has contributed significantly to this concern. Leaders in various nations have increasingly used their powers to erode checks and balances, bypassing legal frameworks that should exist to protect ic norms. In the United States, discussions surrounding impeachment have raised alarms about a potential shift toward autocracy, as the dismissal of dissenting voices and the consolidation of power can operate under the guise of national interest.\\n\\nSome critics argue that the repeated threats of impeachment, especially when unfounded, undermine the legitimacy of the institution itself. It risks normalizing a political environment where every disagreement is interpreted as an existential threat to governance, rather than an opportunity for political discourse and compromise. Moreover, the procedures surrounding impeachment can inadvertently fuel autocratic rhetoric, as leaders may claim they are targets of political witch hunts orchestrated by their adversaries.\\n\\nAs voters and citizens, it is vital to remain vigilant about these processes and understand their implications. Impeachment should not be viewed solely as a political weapon but as a fundamental aspect of maintaining a robust democracy. Keeping autocracy at bay requires a commitment to principled governance and respect for political dialogue, lest we find ourselves trapped in a cycle of power struggles that could ultimately dismantle the very systems we aim to protect.', \"The concept of representative democracy has been a cornerstone in the political landscape of many countries, offering a mechanism through which citizens can engage in governance and influence policy. In a representative system, elected officials are expected to act in the best interests of their constituents, balancing the needs of the populace with their party's ideological framework. However, as political divisions deepen, the struggle between and ideologies can lead to significant challenges in representation.\\n\\n representatives often advocate for progressive policies aimed at expanding civil rights, improving social welfare, and addressing systemic inequalities. They view their role as not just legislating but actively promoting a more equitable society. This includes pushing for reforms on issues such as healthcare access, climate change, and education—areas where representatives believe government intervention can make a substantial impact.\\n\\nThe approach emphasizes inclusivity and responsiveness to the diverse needs of different communities. It brings to light the stakes of an effective representation where elected officials not only listen to their supporters but also engage constructively with opposing viewpoints. The challenge lies in bridging the ideological divides that often lead to gridlock in legislatures, where political posturing can overshadow policy-making and stifles the very representation constituents seek.\\n\\nRepresentative democracy thrives on the premise that elected officials pledge their commitment to serve their constituents. In this context, representatives bear the responsibility to ensure that the voices of marginalized and underrepresented groups are empowered and heard. They are tasked with navigating the complexities of political discourse while prioritizing the well-being of the electorate.\\n\\nIn conclusion, the debate around what it means to be a representative in today’s political climate requires an ongoing reassessment of loyalty—not just to party lines, but to the diverse population these leaders serve. As societies grapple with emerging challenges, the role of representatives will be pivotal in shaping a future that upholds the principles of fairness and equality for all.\", 'In recent years, the influence of lobbying in American politics has sparked intense debate among citizens, legislators, and advocacy groups alike. Lobbying, the act of attempting to influence the decisions of government officials, has become a powerful tool for various organizations seeking to shape policy outcomes in their favor. With billions spent each year on lobbying efforts, questions arise regarding the ethical implications and the effectiveness of such practices.\\n\\nOne prominent area of debate centers around the role of lobbyists in the legislative process. Critics argue that when corporations, trade associations, and special interest groups exert excessive influence over lawmakers, it undermines the principles of democracy and public interest. This concern is especially relevant in issues such as healthcare, environmental regulation, and financial reform, where lobbyists actively work to protect their clients’ interests, sometimes at the expense of the wider community.\\n\\nOn the other hand, supporters of lobbying argue that it is an essential component of democracy that provides lawmakers with the necessary information they need to make informed decisions. They contend that in a complex and rapidly changing world, legislators cannot be experts on every issue. Lobbyists serve as advocates for various perspectives, helping to ensure that diverse viewpoints are represented in government decision-making. This aspect of lobbying can stimulate productive debate within the political sphere.\\n\\nAnother critical dimension of the debate is the potential for lobbying to perpetuate inequality in political influence. Wealthier corporations and organizations often have greater resources to allocate toward lobbying efforts, potentially drowning out the voices of smaller entities and average citizens. This imbalance raises significant concerns about whose interests are represented in policy decisions and underscores the need for reform\\n\\nAs the discussion around lobbying continues to evolve, there remains a pressing need for transparency and accountability in these practices. Advocates for reform argue for stricter regulations that would limit the influence of money in politics and ensure equitable representation for all citizens in the legislative process. The debate is unlikely to settle anytime soon, but it is clear that the way lobbying is conducted will have lasting implications on the health of democracy in America.', \"In recent years, the political landscape in many countries has been increasingly dominated by the rise of populism. This phenomenon is characterized by leaders and movements that appeal directly to the supposed interests and sentiments of the 'common people,' often positioning themselves against established elites and institutions. One aspect that has garnered significant attention is how populism intersects with national identity and sovereignty.\\n\\nPopulism often harnesses the power of nationalism, allowing leaders to frame their messages in ways that resonate deeply with the electorate’s fears and aspirations. For instance, in several nations, populist politicians have linked their platforms to restoring national pride, championing local industries, and resisting globalization's perceived threats. This rhetoric becomes particularly potent in times of economic uncertainty or social unrest, where individuals feel vulnerable to the forces shaping their lives and futures.\\n\\nAs countries grapple with rapid shifts in demographics, economic pressures, and cultural change, populist leaders often capitalize on sentiments that invoke a return to traditional values and national strength. They promise to put the interests of their citizens first, claiming they will reclaim national autonomy from foreign influence and interventional policies. This approach can create division within society as narratives about 'us vs. them' proliferate, fostering a milieu where nationalism becomes entwined with populist discourse.\\n\\nMoreover, the blending of populism and national consciousness raises important questions about governance and the role of ic institutions. Critics argue that while populism can energize political engagement and provide a voice for marginalized communities, it can also undermine ic norms by prioritizing the whims of the majority over the rights of minorities. The consequence can be a fragile political environment where contentious nationalism overshadows important dialogues about inclusivity and shared governance.\\n\\nAs we navigate these complexities, it is crucial to critically assess populism's impact on our political systems, understanding that while it might thrive on the idea of putting the nation first, it also has the potential to challenge the very fabric of democracy and diversity that many societies strive to uphold.\", 'In today’s political landscape, the role of third parties is often overshadowed by the two dominant political parties that typically dominate s: the s and the s. However, the emergence of third-party movements can be significant in shaping public policy and influencing major party positions, especially in a highly polarized environment.\\n\\nOne prominent example can be seen with the Green Party, which focuses on environmental issues and social justice. Despite having limited success in national s, the Green Party has been successful at local and state levels, drawing attention to critical issues like climate change that may otherwise be neglected. Their presence urges larger political parties to adopt more serious environmental policies, illustrating how even a party with fewer resources can wield substantial influence.\\n\\nSimilarly, the Libertarian Party has gained traction among those disillusioned with the two-party system. Libertarians advocate for smaller government, personal liberties, and non-interventionist foreign policies. As they promote these ideas, mainstream parties often rethink their approaches, especially on issues such as criminal justice reform and surveillance.\\n\\nAs the political landscape continues to evolve, the role of these minor political parties becomes even more crucial. Their existence challenges the notion that a two-party system is the only option for American democracy. By presenting alternative viewpoints and policies, these political parties not only enrich the ic dialogue but also highlight the importance of voter choice. Encouraging more competition among parties could lead to more responsive governance, where public policy truly reflects the diverse needs of the citizenry.', 'In recent years, nationalism has emerged as a dominant force within political landscapes across the globe, reshaping the way constituencies engage with their governments and each other. At its core, nationalism seeks to promote the interests and culture of a specific nation, often emphasizing a sense of unity and identity among its citizens. This phenomenon can be both unifying and divisive, depending on the context in which it is applied.\\n\\nFor instance, in many European countries, growing nationalist sentiments have influenced political parties that advocate for the needs and desires of their specific constituencies over a broader multicultural agenda. These parties often argue that their primary responsibility is to protect the interests of their citizens, sometimes leading to policies that prioritize native populations at the expense of immigrants and refugees. This shift has sparked significant debate about the implications of such policies on social cohesion and international relations.\\n\\nMoreover, the alignment of national identity with political action has compelled many citizens to reaffirm their allegiance to their nation-state. This rise of nationalism can be observed during national celebrations, where public focus on traditions and heritage fosters a perception of collective belonging. However, nationalist movements frequently encounter criticism for fostering xenophobia and exclusion, raising questions about how to balance national pride with the global need for cooperation and inclusivity.\\n\\nThe implications of nationalism extend beyond mere political rhetoric; they manifest in the policies that directly affect constituencies. Voter engagement is often shaped by how well political leaders resonate with the nationalist ideals. For instance, leaders who effectively tap into nationalist sentiments may mobilize their base more effectively, reshaping electoral outcomes and, consequently, public policy priorities. As these ideologies continue to gain traction, the challenge remains: how can governments ensure that they serve the interests of a diverse constituency while navigating the complexities brought about by rising nationalism?', \"In recent months, the political landscape has been abuzz with discussions surrounding the upcoming campaign, with parties vying to capture the hearts and minds of voters. One of the most notable aspects of this race is the emergence of moderate candidates, who are increasingly recognized for their ability to appeal to a broad spectrum of the electorate. \\n\\nModerate politicians often position themselves between the extremes of their party lines, advocating for policies that resonate with both the and populace. This strategy is particularly crucial in today's polarized environment where many voters are disillusioned with the extremes and instead seek pragmatic solutions to pressing issues like healthcare, immigration, and climate change. \\n\\nDuring the campaign period, it is not uncommon to see moderate candidates participating in debates where they strive to emphasize their balanced approach. By highlighting their willingness to collaborate across party lines and to listen to diverse viewpoints, they aim to convince voters that a moderate stance leads to effective governance. \\n\\nMoreover, as grassroots movements gain momentum, moderates are often seen leading initiatives that focus on community needs, directly engaging with constituents. Through town halls and listening tours, these candidates build relationships with voters that transcend political affiliations, bolstering the idea that politics can indeed be a unifying force.\\n\\nThe challenge for moderate candidates in the campaign season will be to maintain this elusive balance. They must navigate the pressures from their party's base demanding stricter adherence to traditional ideologies while also appealing to undecided voters who prioritize solutions over rhetoric. \\n\\nAs we move closer to the , it will be fascinating to observe how these moderate candidates shape their campaigns to adapt to an evolving political climate, and whether their approach will successfully translate into electoral success.\"]\n", + "[\"### The Impact of Computer-Assisted Technologies on Chronic Disease Management: A Relativity Viewpoint\\n\\nIn the contemporary landscape of healthcare, the integration of computer-assisted technologies into chronic disease management represents a fundamental transformation of patient care methodologies. This shift mirrors Albert Einstein's theory of relativity, not in the physical cosmos but in conceptual frameworks that address the relative nature of health outcomes and their dependency on patient engagement, healthcare delivery, and technological innovation.\\n\\nChronic diseases, such as diabetes, hypertension, and heart disease, are particularly significant in the United States and numerous developed nations, where they impact millions of lives and impose substantial socio-economic burdens. The emerging strategy of employing computer-assisted technologies aims to reconfigure how we understand and manage these prolonged health challenges. \\n\\nHistorically, chronic disease management has relied heavily on traditional, face-to-face medical practices that often fall short of meeting patient needs due to time constraints and provider workload limitations. The advent of telehealth, remote monitoring tools, and sophisticated health informatics represents a relative paradigm shift, placing the patient at the center of their health management while utilizing technology as a means of enhanced communication and data collection. \\n\\n**Relativity in Patient Engagement** \\n\\nOne salient aspect of this transformation relates to the reciprocal relationship between patient engagement and health outcomes. The relativity of patient commitment can be seen in various contexts, as healthcare technologies become increasingly personalized and accessible. For example, wearable devices that collect real-time biometric data empower patients to take charge of their health by monitoring key indicators such as blood glucose levels and heart rate variability. When patients understand how their behaviors influence these readings, a sense of agency emerges, leading to improved adherence to treatment protocols and lifestyle recommendations.\\n\\nMoreover, algorithms that utilize machine learning to analyze vast amounts of medical data enable clinicians to tailor interventions based on individual patient metrics. The relative effectiveness of these strategies emerges from the context of individual patient profiles, creating a more precise approach to chronic disease management nuanced by personal history, socioeconomic status, and psychological well-being.\\n\\n**Technological Integration in Healthcare Systems** \\n\\nThe integration of computer systems into healthcare delivery also emphasizes the relativity of disease management within institutional frameworks. Health systems increasingly adopt electronic health records (EHRs) and decision-support tools that facilitate the aggregation of patient data across various encounters with the healthcare system. This shift signifies a departure from silos of information—where patient data is disjointed and often inaccessible to providers—toward a more cohesive understanding of patient histories and treatment gaps. \\n\\nThe deployment of predictive analytics can lead to improved resource allocation, ensuring that interventions are offered to patients relative to their needs. This creates a feedback loop where healthcare resources can be distributed based on real-time data and disease onset patterns, influencing metrics such as hospitalization rates and patient satisfaction scores.\\n\\n**Conclusion** \\n\\nIn summary, this discourse on computer-assisted technologies and chronic disease management underlines the notion of relativity within healthcare. As we continue to explore the intersection of technology and health, it becomes increasingly important to consider how different perspectives, both from practitioners and patients, shape the landscape of care delivery. This evolving understanding fosters a collaborative environment in which technology not only serves as a tool for diagnosis and treatment but as a conduit for enhancing the fundamental relationship patients have with their health and the healthcare system. In embracing these harmonized innovations, we acknowledge that the management of chronic diseases is as much a domain of relational dynamics as it is a field of biomedical practice.\", \"### Quantum Oscillation in Healthcare: A Breakthrough in Disease Detection\\n\\n**Introduction** \\nIn recent years, the healthcare sector has accelerated its embrace of quantum technology, paving the way for innovative diagnostic tools. One of the most fascinating developments in this arena is the application of quantum oscillation principles in disease detection. This article aims to explore how quantum mechanics can revolutionize the early detection of diseases like cancer and neurodegenerative disorders through the principle of oscillation.\\n\\n**The Basic Principles of Quantum Oscillation** \\nQuantum oscillation refers to the periodic change in the state of a quantum system. This concept, steeped in the realms of quantum physics, describes how systems such as electrons can exist in multiple states simultaneously, exhibiting oscillatory behavior between these states under external influences. Harnessing these principles in a medical context opens new frontiers; particularly, the oscillations can be indicative of biochemical changes in cells as they transition from healthy to diseased states.\\n\\n**Application in Disease Detection** \\nRecent studies have demonstrated that quantum oscillation can be utilized for the rapid detection of biomarkers associated with various diseases. For instance, researchers have developed quantum sensors that can detect minuscule changes in magnetic fields produced by biomolecules, such as early-stage cancer cells. By monitoring the oscillations in these fields, it's possible to identify the presence of cancer before traditional imaging technologies can.\\n\\n**Case Study: Cancer Detection** \\nTake, for example, the groundbreaking work conducted at the Quantum Health Institute. Researchers utilized a quantum sensor that exploits the oscillatory behavior of specific proteins known to be overexpressed in tumors. By pulling real-time data from the oscillation frequency of these proteins, they are developing a diagnostic tool that achieves 95% sensitivity for early-stage cancer detection, dramatically outperforming conventional cellular assays. This remarkable leap in accuracy and speed highlights the critical intersection of quantum physics and healthcare.\\n\\n**Future Directions** \\nAs we delve deeper into the future, the intersection of quantum technology and healthcare is set for significant expansion. Potential applications extend beyond cancer detection to cardiovascular diseases, where oscillatory biomarkers may offer insights into heart rhythms and early warning signs of elevation in risk factors. The challenges ahead include not just developing reliable technology but ensuring accessibility and integration within existing healthcare systems.\\n\\n**Conclusion** \\nThe potential implications of quantum oscillation in healthcare are profoundly expansive. As technology continues its rapid evolution, the ability to leverage quantum principles presents an opportunity to develop diagnostic tools that can transform patient outcomes. Researchers, clinicians, and policy-makers must work collaboratively to bring these innovations from the laboratory into the clinic, paving the way for a new era in early disease detection and prevention.\", 'In the realm of healthcare technology, the integration of data science has revolutionized patient care and diagnostics. One significant area of growth is the application of artificial intelligence (AI) and machine learning algorithms in medical imaging. By harnessing the principles of gravitation, we can draw parallels between the intricate patterns seen in the physical universe and those found in complex medical data.\\n\\nJust as gravitation influences celestial bodies within cosmology, AI algorithms can be designed to identify specific markers and anomalies in imaging data, tugging at the strings of the vast amounts of information produced in radiology. This technology allows for quicker and more accurate diagnoses, guiding practitioners as they navigate through potential health threats much like stars are influenced by gravitational forces in their orbital paths.\\n\\nMoreover, the innovative use of AI in predictive analytics enables healthcare providers to foresee potential health crises before they escalate, similar to how cosmologists predict the behaviors of celestial systems based on observable data. By analyzing a patient’s history and real-time biometric data, AI can alert healthcare professionals to imminent issues, ensuring timely intervention and improved patient outcomes.\\n\\nUltimately, the intersection of healthcare and cutting-edge technology, particularly through AI, mimics the profound connections found in the vast expanse of the cosmos. Just as the laws of cosmology help us understand the universe, leveraging data science to unlock the potential of healthcare can lead to safer, more effective treatment regimens tailored to individual patient needs. As this field continues to evolve, we can expect to see even greater breakthroughs that illuminate the path toward a healthier future, navigating the complexities of human health with the same curiosity and precision that astrophysicists apply to the mysteries of the universe.', \"**The Interplay of Healthcare and Technology: A Paradigm Shift in Medical Cosmology** \\nBy Dr. Lydia Winchester, Professor of Health Sciences \\n\\nIn recent years, the healthcare landscape has witnessed an unprecedented momentum propelled by advances in technology and a deeper understanding of human biology. This momentum is not just reshaping patient care but also revolutionizing the complexities inherent in health sciences, akin to the unfolding mysteries of cosmology—the branch of astrophysics that studies the universe's origins, evolution, and eventual fate. Just as cosmologists strive to understand the universe through complex theories and ever-evolving data, healthcare professionals are increasingly integrating innovative technologies to demystify healthcare patterns and enhance patient outcomes. \\n\\nHistorically, healthcare has relied heavily on traditional methodologies largely rooted in analog systems. However, the advent of technologies such as artificial intelligence (AI), big data analytics, and telemedicine has initiated a crucial evolution that aligns seamlessly with the concept of cosmological inquiry. One of the most intriguing parallels is the way both fields utilize vast sets of data to draw insights—a fundamental practice in cosmology when analyzing cosmic evolution or the formation of galaxies. In healthcare, data collected from electronic health records, wearable devices, and genomic sequencers serve as the galaxies from which we extrapolate trends, identify anomalies, and personalize patient treatments. \\n\\nTake, for example, predictive analytics. Just as cosmologists use observational data to make predictions about cosmic events, healthcare professionals are employing machine learning algorithms to forecast disease outbreaks and patient deterioration. The shift toward a more predictive model in healthcare is revolutionary; it holds the power to save lives by allowing for early interventions tailored to individual risk profiles. In this context, the merging of technology and healthcare becomes a metaphorical universe where practitioners explore and test the boundaries of traditional medicine through an evidence-based approach. \\n\\nFurthermore, the technology-driven transformation of healthcare encourages a cosmological perspective on health systems. The ramifications of implementing technological solutions reach far beyond individual patients to affect the overall healthcare ecosystem. Telehealth services have disrupted geographical constraints, making specialized care accessible to rural or underrepresented populations—similarly to how advanced telescopes have expanded our view of the universe. This democratization of healthcare indicates a significant leap analogous to how cosmic discoveries have reshaped our understanding of existence and our place within the universe. \\n\\nHowever, the integration of technology must be approached with caution. Ethical considerations surrounding patient privacy, data security, and equitable access to new technological solutions are paramount. As we navigate this dynamic interface between healthcare and technology, stakeholders must ensure that advances do not disproportionally favor certain populations, perpetuating existing inequalities akin to the misalignment of celestial bodies—an important consideration in cosmology. \\n\\nAs we continue to dissect the intricate fabric of health sciences through the lens of technology, it is imperative to remember that the ultimate objective remains clear: improving patient outcomes and promoting global health. This calls for an ongoing dialogue among technologists, healthcare professionals, and policymakers to ensure that innovative solutions align with ethical practices—thereby fostering a healthcare system that resonates with the harmonious balance of forces we observe in the cosmos. \\n\\nIn conclusion, the synergy between healthcare and technology encapsulates a momentum that mirrors the exploration of the universe—a journey through which we seek to unravel the complexities of health and disease. Much like our quest into the stars, the exploration of innovative solutions in healthcare promises to yield transformative insights and breakthroughs, reshaping our understanding of health and wellbeing for generations to come.\", '### The Impact of Optical Interference in Laser-Based Healthcare Technologies\\n\\nAs we venture further into the integration of advanced technologies in health sciences, one of the pivotal developments is the application of optical interference in laser-based therapies. Optical interference, a fundamental principle related to the way light waves interact, has profound implications across various medical disciplines—from diagnostics to treatment methodologies.\\n\\n#### Understanding Optical Interference\\n\\nOptical interference occurs when two or more light waves superpose to form a resultant wave of greater or lesser amplitude. This phenomenon can be constructive, enhancing the intensity of light, or destructive, leading to reduced intensity. Harnessing this property can significantly enhance the sensitivity of imaging modalities and therapeutic techniques such as phototherapy and laser surgeries.\\n\\n#### Applications in Healthcare\\n\\n##### 1. **Diagnostic Imaging** \\nOptical coherence tomography (OCT) is a prime example of how optical interference principles are employed in diagnostic imaging. By utilizing low-coherence light waves, OCT permits the visualization of tissue microstructures in real-time with unprecedented resolution. This technology is pivotal in ophthalmology for assessing retinal diseases and has increasingly been adopted in cardiology and oncology for imaging various tissues, enhancing early diagnosis and treatment efficacy.\\n\\n##### 2. **Laser Therapies** \\nIn the realm of treatment, laser technologies exploit optical interference to selectively target diseased tissues. For instance, in dermatology, pulse dye lasers utilize the interference of light waves to destroy vascular lesions while preserving surrounding healthy tissue. Similarly, in oncological treatments, photodynamic therapy employs light-activated drugs where optical coherence relies on interference patterns to maximize therapeutic outcomes by selectively destroying cancerous cells.\\n\\n##### 3. **Optogenetics** \\nAnother cutting-edge application of optical interference lies in the field of optogenetics, which bridges neuroscience and optics. By using light to control neurons that have been genetically sensitized to respond to it, researchers are uncovering new pathways for treating neurological disorders. The precision achieved through optical interference enables targeted modulation of neuronal activity, vastly improving our understanding and treatment of conditions such as epilepsy and depression.\\n\\n#### Future Directions in Optical Healthcare Technologies\\n\\nThe future synthesis of optical interference and healthcare technologies is boundless. Ongoing research focuses on enhancing the resolution of imaging techniques while reducing the invasiveness of laser-based treatments. Innovations like adaptive optics are also crucial, aiming to correct optical aberrations in real-time during therapeutic procedures. \\n\\nMoreover, as we develop a deeper understanding of nanotechnology, the role of interference in biomedical applications is set to expand even further. Nano-sized particles can be designed to modulate light in ways that enhance imaging and drug delivery systems, creating the potential for more personalized and effective healthcare interventions.\\n\\n#### Conclusion\\n\\nIn summary, the profound principles of optical interference are at the forefront of transforming healthcare technologies. From enhanced imaging techniques to targeted laser therapies and even innovations in neuromodulation, the integration of optics into medical science holds promise for improving patient outcomes and revolutionizing treatment paradigms. As researchers continue to explore the capabilities of optical technologies, we are on the brink of discovering solutions that were once thought to be the realm of science fiction.', '**Title: Advanced Applications of Nuclear Optics in Healthcare: Revolutionizing Imaging Techniques** \\n**Author: Dr. Elena C. Reynolds, Professor of Medical Optics and Nuclear Imaging** \\n\\n**Abstract:** \\nAs we continue to unravel the mysteries of human health, the integration of innovative fields such as nuclear optics into healthcare presents groundbreaking possibilities, particularly in medical imaging. This article explores the synergistic potential of nuclear optics, predominantly derived from advancements in radiative properties and optical imaging methods, and its transformative impact on diagnosis and therapeutic procedures in modern medicine. \\n\\n**Introduction:** \\nNuclear optics, a specialized field focusing on the interaction of nuclear radiation with optical systems, has emerged as a vital area of study within medical science. It allows for the development of sophisticated imaging modalities that capture the dynamics of biological systems with unprecedented precision. The combination of nuclear techniques with advanced optical methods has incredible implications for improving diagnostic accuracy and patient outcomes. \\n\\n**Exploring Nuclear Imaging Modalities:** \\nTraditional imaging techniques such as X-rays and ultrasounds provide foundational insight into anatomical structures but often fall short in assessing functional statuses of tissues. Nuclear medicine, utilizing isotopes to visualize disease processes, offers a complementary approach, and when paired with optical technologies, we can enhance both spatial and temporal resolution. One promising innovation is the application of scintillation detectors, which utilize optical techniques to transform the gamma emissions from radiopharmaceuticals into visible light, providing real-time imaging capabilities. \\n\\n**Recent Advances in Optical Technologies:** \\nThe intersection of optics and nuclear imaging has been bolstered by developments in photon detection technologies. Advances in single-photon emission computed tomography (SPECT) and positron emission tomography (PET) now exploit high-resolution optics to analyze radiopharmaceutical distributions with improved clarity. Techniques such as time-of-flight PET leverage the speed of light to better establish the origins of gamma photons, enhancing localization accuracy in tissues where malignancies are suspected. \\n\\n**Potential in Targeted Therapeutics:** \\nCombining nuclear optics with targeted therapy further propels us into a new era of personalized medicine. Optical imaging parameters can optimize the delivery of radioactive treatments aimed specifically at tumor sites. By assessing real-time biodistribution of therapeutics, healthcare professionals can adjust dosages dynamically, tailoring treatments to the patient’s unique biological responses. This adaptability not only maximizes the likelihood of treatment success but also minimizes potential side effects associated with systemic administrations. \\n\\n**Future Directions and Challenges:** \\nDespite the promise that nuclear optics holds, there remain challenges regarding the integration of these technologies into routine clinical practice. Issues related to safety, regulatory standards, and costs must be diligently addressed to facilitate widespread adoption. Collaborative efforts among physicists, biologists, and policymakers are essential to design robust frameworks for deploying these advanced imaging techniques. \\n\\n**Conclusion:** \\nThe evolving landscape of healthcare technology increasingly points towards the convergence of nuclear imaging and optical advancements. By harnessing the strengths of nuclear optics, we stand at the cusp of a new frontier in medical diagnostics and therapies, ultimately striving for enhanced patient care and informed clinical decisions. As we forge ahead, ongoing research and innovation will be pivotal in realizing the full potential of this exciting interdisciplinary approach.', \"**Advancements in Machine Learning and Quantum Computing in Healthcare**\\n\\nAs healthcare systems around the globe continue to evolve, two interrelated strands of technology are poised to drive transformative change: machine learning (ML) and quantum computing. The convergence of these two fields stands to improve diagnostic accuracy, optimize treatment plans, and, ultimately, enhance patient outcomes.\\n\\n**Machine Learning in Medical Diagnosis** \\nMachine learning, a subfield of artificial intelligence, utilizes algorithms that can learn from and make predictions based on data. Its application in medical diagnostics is already having profound impacts. For example, ML algorithms have shown efficacy in analyzing medical imaging data, identifying patterns indicative of various diseases such as cancers or neurological disorders better than ever before. These systems are trained using large datasets, enabling them to learn nuanced patterns that may elude even experienced radiologists.\\n\\nAdditionally, ML can improve predictive analytics within healthcare systems. By analyzing historical patient data, including demographic information and clinical histories, machine learning models can predict patient risks and outcomes. This remote monitoring can facilitate early intervention strategies, reducing hospitalization rates and improving health management in chronic conditions.\\n\\n**Quantum Computing's Role** \\nWhile machine learning is reshaping data analysis within healthcare, quantum computing adds exponentially to the potential capabilities of these systems. Quantum computers operate using qubits, which can represent and process data at a speed far exceeding classical computers. This processing power is particularly advantageous for tasks involving vast datasets that are common in genomic research, drug discovery, and personalized medicine. \\n\\nQuantum algorithms, when combined with machine learning, may one day allow healthcare professionals to simulate complex biochemical interactions in real-time, leading to unique solutions for treatment planning and drug formulation. For instance, a quantum-enhanced ML model could analyze genetic data and predict individual responses to medication more efficiently, thus taking precision medicine to new heights.\\n\\n**Addressing Ethics and Equity** \\nHowever, the integration of machine learning and quantum computing into healthcare is not without its challenges. As we harness the power of these technologies, we must also remain vigilant about the ethical considerations involved. Issues of data privacy, algorithmic bias, and equitable access to technology must be prioritized to prevent the exacerbation of existing healthcare disparities. Implementing robust frameworks that govern the use of ML and quantum computing in healthcare will ensure these advancements benefit all segments of the population. \\n\\n**Conclusion** \\nIn conclusion, the fusion of machine learning and quantum computing holds transformative potential for healthcare. By harnessing the predictive power of these technologies, the medical community can improve diagnostics, treatment plans, and patient care optimization. As we move forward, a holistic approach that considers ethical implications and aims for equitable access will be vital to fulfill the promise of these technological advancements in healthcare.\", '### The Dynamics of Healthcare Innovation: Challenges and Opportunities for the 21st Century\\n\\n**By Dr. Emily Rodriguez, Professor of Health Sciences** \\n**Department of Public Health and Health Systems Management** \\n**University of Innovation and Advancement** \\n\\nIn the ever-evolving landscape of healthcare, the dynamics of innovation play a critical role in shaping the delivery of services, enhancing patient outcomes, and improving overall public health. As we navigate through the complexities of modern medicine, it is essential to understand how innovation can address some of the most pressing challenges faced by healthcare systems worldwide. \\n\\n#### The Importance of Innovation in Healthcare\\n\\nInnovation in healthcare is not merely about the development of new pharmaceuticals or medical devices; it encompasses a broad spectrum of advancements in technology, processes, and organizational management. As we embrace the digital age, the integration of technology into healthcare delivery offers unprecedented opportunities to enhance efficiency and patient care. Virtual health solutions, telemedicine, and electronic health records are prime examples of how innovation can transform traditional healthcare paradigms. These technologies facilitate better communication between patients and providers, streamline operations, and allow for more personalized care. \\n\\nHowever, with innovation comes the necessity to navigate various dynamics that influence its adoption and implementation. A significant variable within this dynamic is the engagement of patients, ensuring that they are not only recipients of healthcare but also active participants in their journey towards wellness. Healthcare providers must embrace these innovations and educate patients on how to effectively utilize these tools, removing barriers to access and understanding. \\n\\n#### Key Dynamics Affecting Healthcare Innovation\\n\\n1. **Regulatory Environment**: The regulatory landscape can significantly impact the rate at which innovation is adopted in healthcare. While regulations safeguard patient safety and wellbeing, they can also hinder the swift implementation of new technologies. Striking a balance between safety and innovation is essential for fostering an environment conducive to advancement.\\n\\n2. **Economic Factors**: There remains an ongoing struggle within healthcare financing. As systems shift towards value-based care, understanding the economic dynamics behind adopting innovative practices becomes more relevant. Innovative solutions often necessitate upfront investment, even if they lead to long-term savings and improved outcomes. \\n\\n3. **Collaboration and Interdisciplinary Approaches**: Successful innovation often arises at the intersection of various disciplines. Collaborative efforts among technologists, healthcare providers, and policymakers can lead to holistic solutions that address multifaceted issues in patient care. Academic institutions and industry partnerships are increasingly vital in this regard.\\n\\n4. **Cultural Shifts**: The cultural attitude towards healthcare also affects the dynamics of innovation. As patients become more informed and engaged through access to information and digital platforms, their appointment of authority in their care needs to be acknowledged. Healthcare systems must evolve to accommodate this shift, ensuring that innovations are patient-centered. \\n\\n#### The Future of Healthcare Innovation\\n\\nMoving forward, the path of innovation in healthcare appears bright but requires concerted effort from all stakeholders involved. As we explore avenues such as artificial intelligence, machine learning, and data analytics, we must also be conscious of the ethical implications these technologies might carry. Furthermore, as advancements occur, so too must the workforce adapt; enhancing educational resources for healthcare professionals regarding new technologies will ensure our leaders are adequately prepared to foster a culture of innovation. \\n\\nIn conclusion, by addressing the dynamics surrounding healthcare innovation, we can harness its full potential to improve the quality of care delivered to populations globally. As we stand on the brink of numerous advancements, we must ask ourselves how to navigate these changes thoughtfully, ethically, and tirelessly in pursuit of a healthier future for all.', \"**Revolutionizing Healthcare Through Machine Learning Applications** \\n*By Dr. Jane Porter, Professor of Health Informatics* \\n \\nThe integration of machine learning (ML) in healthcare represents a paradigm shift in how we approach patient care, diagnostics, and treatment planning. As modern medicine evolves, the intersection of healthcare and technology, particularly the utilization of advanced computational methods, becomes increasingly pivotal in addressing complex health challenges. \\n \\nMachine learning, a subset of artificial intelligence, empowers computers to analyze vast amounts of data, identify patterns, and make predictions with minimal human intervention. In healthcare, this capability holds transformative potential across various applications. \\n \\n**Predictive Analytics for Patient Outcomes** \\nOne of the most compelling applications of ML in healthcare is predictive analytics. By harnessing electronic health record (EHR) data, machine learning algorithms can be trained to recognize indicators that predict adverse outcomes. For example, patients with chronic conditions such as diabetes can be monitored more effectively through predictive models that assess various factors, including previous hospitalizations, medication adherence, and socio-economic status. This proactive approach can lead to timely interventions, thereby improving patient outcomes and reducing healthcare costs. \\n \\n**Enhancing Diagnostic Accuracy** \\nIn addition to predictive analytics, machine learning enhances diagnostic accuracy, particularly in radiology. Traditional methods of diagnosis heavily rely on physician expertise; however, human error and bias can sometimes lead to misdiagnoses. Algorithms that analyze radiological images can identify nuances that human eyes might miss. Studies have shown that machine learning models can outperform radiologists in detecting early-stage cancers, thereby promoting timely treatment and better prognosis. \\n \\n**Personalized Treatment Plans** \\nMoreover, ML-driven insights are paving the way for personalized medicine. Utilizing genomic data, machine learning can help tailor treatment plans to the individual’s genetic makeup. The burgeoning field of pharmacogenomics benefits significantly from this; algorithms predict how patients will respond to specific medications based on their genetic profiles, aiming to maximize efficacy while minimizing side effects. The ability to customize treatment represents a move away from the one-size-fits-all approach that has dominated medical practice for decades. \\n \\n**Operational Efficiency** \\nFinally, machine learning enhances operational efficiency within healthcare establishments. By analyzing workflow data, ML can identify bottlenecks in patient flow, optimizing scheduling and resource allocation. This streamlining of operations not only improves the patient experience by reducing wait times but also ensures the judicious use of healthcare resources. \\n \\n**Challenges and Considerations** \\nDespite the promising advances that machine learning brings, several challenges remain. Data privacy is of paramount concern; patients' sensitive health information must be safeguarded. Furthermore, there is a need for transparency in the algorithms used in clinical settings. Understanding the decision-making process of these models is crucial for gaining the trust of healthcare providers and patients alike. \\n \\nIn conclusion, the burgeoning field of machine learning offers unprecedented opportunities to enhance the efficacy and efficiency of healthcare delivery. As educators and researchers, it is our responsibility to lead this technological revolution not merely through innovation but with ethical integrity and an unwavering focus on patient welfare. Embracing technology, such as advanced computer systems for machine learning, is essential as we strive toward a more accurate, personalized, and efficient healthcare system.\", 'In recent years, the integration of technology in healthcare has transformed patient care significantly, particularly regarding the management of chronic diseases. One of the most promising areas of development is the use of computer-assisted healthcare systems, which allows for real-time monitoring and management of patient data.\\n\\nThese systems utilize advanced algorithms that can analyze a plethora of data points, enabling healthcare providers to make or recommend decisions with greater accuracy and efficiency. The interference of human error, frequently seen in manual data entry and interpretation, is drastically reduced through automated systems. Using electronic health records (EHR) linked with wearable health devices, patients can have their vital signs monitored continuously, mitigating risks related to chronic conditions such as diabetes and hypertension.\\n\\nHowever, the implementation of such technologies isn’t without challenges. Issues like data security, patient privacy, and the potential for technology-induced misunderstandings can arise. It is essential for healthcare professionals to be trained adequately on these systems to minimize any interference that could result from technological failures or misinterpretations of data. Additionally, patient education plays a vital role; they need to understand their health data and how to use the technology effectively.\\n\\nAs we advance into a more digitized medical landscape, the cooperation between technology developers, healthcare providers, and patients will be crucial. The ultimate goal is to ensure that the interference caused by outdated practices is eliminated, leading to an efficient, patient-centered approach that leverages the strengths of modern computer systems in enhancing the quality of healthcare.']\n" + ] + } + ], + "source": [ + "# data loading\n", + "from aif_gen.dataset.continual_alignment_dataset import ContinualAlignmentDataset\n", + "\n", + "lipschitz_data = ContinualAlignmentDataset.from_json(\n", + " 'data/4omini_generation/merged_tech_physics.json'\n", + ")\n", + "piecewise_data = ContinualAlignmentDataset.from_json(\n", + " 'data/4omini_generation/merged_politics_generate.json'\n", + ")\n", + "\n", + "# only get the prompts shuffled and only 10K prompts\n", + "data_lip = lipschitz_data.datasets[0].samples\n", + "data_piecewise = piecewise_data.datasets[0].samples\n", + "\n", + "prompts_lip = []\n", + "for sample in data_lip:\n", + " prompts_lip.append(sample.prompt)\n", + "\n", + "# randomly shuffle the prompts and keep only 10K\n", + "import random\n", + "\n", + "random.shuffle(prompts_lip)\n", + "prompts_lip = prompts_lip[:10000]\n", + "\n", + "prompts_piecewise = []\n", + "for sample in data_piecewise:\n", + " prompts_piecewise.append(sample.prompt)\n", + "# randomly shuffle the prompts and keep only 10K\n", + "random.shuffle(prompts_piecewise)\n", + "prompts_piecewise = prompts_piecewise[:10000]\n", + "print(prompts_piecewise[:10])\n", + "print(prompts_lip[:10])" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f04d8316", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "||T12|| = 0.86, ||T23|| = 0.83\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Interp T12: 100%|██████████| 11/11 [13:07<00:00, 71.56s/it]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAd29JREFUeJzt3XlYVNX/B/D3zAAzgKwiqyibioiKYiDuCypaLtnivlCpaX5/FZVli6RZLpmZ5ZZmau6VmaWiiJIbikq444IgqKwurAIDc39/EFPIOgjcgXm/nmeepzn33DOfyxnywz3nniMRBEEAERERkQ6Rih0AERERUX1jAkREREQ6hwkQERER6RwmQERERKRzmAARERGRzmECRERERDqHCRARERHpHCZAREREpHOYABEREZHOYQJERA3O5MmT4eTkVKpMIpHg008/FSWehmDIkCGYMmWK2GE0GCEhIWjSpAnS0tLEDoXqCBMgatA2bNgAiUSifunp6cHBwQGTJ0/G3bt3y9Tv06cPJBIJWrVqVW57oaGh6rZ++eUXdXl2djaCg4MREBAAS0tLSCQSbNiwoVavxcnJqdS1GBsbw8fHB5s2bSpTNzw8XF1v8+bN5bbXvXt3SCQSeHp6qstyc3OxYsUKDBw4EHZ2djAxMUGnTp2watUqFBUV1SjuyMhISCQSfP3112WODR8+HBKJBD/++GOZY7169YKDg0ONPrO2bN26FcuWLRM1hvpw4sQJHDx4EO+//766rOQ79N/vOQAUFBTgueeeg1Qqxfr165/qc5/8/fzvKzk5ucrzJ0+eXO657u7uZeomJSVh6tSpcHZ2hqGhIVxdXREUFIT79++XqatSqbBq1Sp4eXnB0NAQTZs2Rb9+/XD+/Hl1nYCAALi5uWHBggVP9TMg7aUndgBEtWHevHlwdnZGXl4eTp06hQ0bNuD48eO4dOkSFApFqboKhQI3b95EZGQkfHx8Sh3bsmULFAoF8vLySpWnp6dj3rx5aNGiBTp27Ijw8PA6uQ4vLy+88847AIr/h75u3TpMmjQJ+fn55f71rlAosHXrVowfP75UeXx8PE6ePFnm2m/duoX//e9/6N+/P4KCgmBqaooDBw5gxowZOHXqFDZu3KhxzJ07d4aRkRGOHz+Ot99+u9SxkydPQk9PDydOnEBgYKC6vKCgAGfOnMHQoUM1/ryKPH78GHp6mv0vbevWrbh06RLeeuutWotDG3355Zfo378/3NzcKq2nVCrx4osvYt++fVi7di1eeeWVWvn8kt/P/zI3N6/WuXK5HOvWrStVZmZmVup9dnY2/Pz8kJOTgxkzZsDR0RHnz5/Hd999hyNHjuDcuXOQSv/9e/+VV17Bli1bMHHiRMycORM5OTn4+++/kZqaWqrdadOm4d1338XcuXNhYmKiwRVTgyAQNWA//vijAEA4c+ZMqfL3339fACDs2LGjVHnv3r2Fdu3aCW3atBHeeuutUsceP34smJqaCi+88IIAQPj555/Vx/Ly8oSkpCRBEAThzJkzAgDhxx9/rNVradmypfDss8+WKktNTRWaNGkitG3btlT5kSNHBADCyJEjBT09PSEtLa3U8c8//1ywsbERevToIbRr105dnpaWJly6dKnMZwcGBgoAhBs3btQo9r59+wo2NjalymJiYgQAwtixY4U2bdqUOnby5EkBgPDNN9/U6PMmTZoktGzZskbn/tezzz5bK+1os5SUFEFPT09Yt25dqfKS71DJ97ygoEAYMWKEIJFIhO+//75WPrui38/qmjRpkmBsbFxlvS1btggAhD///LNU+Zw5cwQAQlRUlLpsx44dAgBh165dVbabkpIiyGQy4YcfftA8eNJ6HAKjRqlnz54AgNjY2HKPjxkzBjt27IBKpVKX/fHHH8jNzcXLL79cpr5cLoetrW3dBFuJZs2awd3dvcLrGD58OORyOX7++edS5Vu3bsXLL78MmUxWqtzKygrt2rUr087zzz8PALh69Wqp8tjY2Ao/+7969OiBlJQU3Lx5U1124sQJmJqaYurUqbh27RrS09NLHSs5ryq7d++Gp6cnFAoFPD098dtvv5Vb78k5QFlZWXjrrbfg5OQEuVwOa2trDBgwAFFRUQCKh0P37t2L27dvq4dWnpxX9F+enp7o27dvmXKVSgUHBwe8+OKL6rLt27fD29sbJiYmMDU1Rfv27fHNN99Uea0PHjzAK6+8AgsLC1hYWGDMmDF4+PAhdu/eDYVCgezs7CrbeNLevXtRWFgIf3//CusUFhZi9OjR+P3337Fq1ao6mSuUlZVV42HWoqIiZGZmVni85JiNjU2pcjs7OwCAoaGhumzp0qXw8fHB888/D5VKhZycnArbtba2RocOHfD777/XKG7SbkyAqFGKj48HAFhY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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Interp T23: 100%|██████████| 11/11 [13:05<00:00, 71.39s/it]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAghdJREFUeJzt3Xlc1NX6B/DPzAAzgKwiOwjiiogoBmqaS7iWaVm5VC63ss17S9t+tmja4pKZLaZl1zYzLevaZiSilAtKLrjvoiCyI7vAwJzfHzCjyCKDM3xn+bxfL+6N75z5zjMclsdznnOOTAghQERERGRF5FIHQERERNTamAARERGR1WECRERERFaHCRARERFZHSZAREREZHWYABEREZHVYQJEREREVocJEBEREVkdJkBERERkdZgAEZHZmTZtGoKCgupck8lkeOONNySJx1AqKyvx/PPPw8fHBw4ODujZsye++eabW75vSUkJPD098e233xogSuuwatUqBAYGoqKiQupQyEiYAJFZ+/LLLyGTyXQfNjY28PPzw7Rp05Cenl6v/eDBgyGTydCpU6cG7xcXF6e718aNG3XX//nnH8ycORPdu3eHo6MjAgMD8eCDD+L06dMGey9BQUF13oujoyOioqLw9ddf12ubkJCga7d27doG73f77bdDJpMhLCyszvV33nkHffv2Rbt27aBSqdCpUyc899xzyMnJaVHcSUlJkMlkeP/99+s9NnbsWMhkMnzxxRf1Hrvjjjvg5+fXotc0lHXr1mH58uWSxnC9V199FcuWLcPtt9+OZcuWoVu3bpgyZQp+//33W7rvBx98ACcnJ0ycOFF37Y033oBMJkNubm6dtmlpaQgJCYG7uzsOHDhwS6+7evVqDBo0CF5eXlAqlQgODsb06dNx4cIFve9VUFAAT0/Pej+bWmfOnMHEiRPh7+8PBwcHdO3aFQsWLEBZWVmddtrfATd+jBw5sk67adOmobKyEp9++qnesZJ5sJE6ACJDWLBgAYKDg1FeXo49e/bgyy+/xM6dO3H06FGoVKo6bVUqFc6ePYukpCRERUXVeezbb7+FSqVCeXl5neuLFy/Grl278MADDyA8PByZmZn4+OOP0bt3b+zZs6dektFSEREReP755wEAGRkZ+PzzzzF16lRUVFTg8ccfr9depVJh3bp1ePjhh+tcv3DhAnbv3l3v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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Empirical Lipschitz constants: K12=5.5859, K23=3.4846\n" + ] + } + ], + "source": [ + "import copy\n", + "import torch\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from scipy.stats import wasserstein_distance\n", + "from tqdm import tqdm\n", + "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n", + "\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Utilities for state‐dict arithmetic & norms\n", + "# -----------------------------------------------------------------------------\n", + "def subtract_state_dicts(sd_a, sd_b):\n", + " return {k: sd_a[k] - sd_b[k] for k in sd_a}\n", + "\n", + "\n", + "def add_scaled(sd_base, sd_delta, alpha):\n", + " return {k: sd_base[k] + alpha * sd_delta[k] for k in sd_base}\n", + "\n", + "\n", + "def state_dict_norm(sd):\n", + " total = torch.stack([v.flatten().dot(v.flatten()) for v in sd.values()]).sum()\n", + " return torch.sqrt(total).item()\n", + "\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Load your 3 reward models & tokenizer\n", + "# -----------------------------------------------------------------------------\n", + "paths = [\n", + " 'LifelongAlignment/aifgen-lipschitz-0-reward-model',\n", + " 'LifelongAlignment/aifgen-lipschitz-1-reward-model',\n", + " 'LifelongAlignment/aifgen-lipschitz-2-reward-model',\n", + "]\n", + "\n", + "models = [\n", + " AutoModelForSequenceClassification.from_pretrained(\n", + " p,\n", + " torch_dtype=torch.bfloat16,\n", + " cache_dir='//network/scratch/s/shahrad.mohammadzadeh/.cache',\n", + " ).cuda()\n", + " for p in paths\n", + "]\n", + "tokenizer = AutoTokenizer.from_pretrained(paths[0])\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Compute task vectors & their norms\n", + "# -----------------------------------------------------------------------------\n", + "sd1, sd2, sd3 = [m.state_dict() for m in models]\n", + "T12 = subtract_state_dicts(sd2, sd1)\n", + "T23 = subtract_state_dicts(sd3, sd2)\n", + "norm12 = state_dict_norm(T12)\n", + "norm23 = state_dict_norm(T23)\n", + "print(f'||T12|| = {norm12:.2f}, ||T23|| = {norm23:.2f}')\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Load your prompts\n", + "# -----------------------------------------------------------------------------\n", + "prompts = prompts_lip\n", + "\n", + "# In experiments.ipynb, add a new cell before your interpolation\n", + "\n", + "from torch.utils.data import DataLoader, Dataset\n", + "\n", + "\n", + "class PromptDataset(Dataset):\n", + " def __init__(self, prompts):\n", + " self.prompts = prompts\n", + "\n", + " def __len__(self):\n", + " return len(self.prompts)\n", + "\n", + " def __getitem__(self, i):\n", + " return self.prompts[i]\n", + "\n", + "\n", + "def compute_rewards(model, prompts, batch_size=64, num_workers=4):\n", + " \"\"\"Compute reward scores in batches.\"\"\"\n", + " model.eval()\n", + " ds = PromptDataset(prompts)\n", + " loader = DataLoader(\n", + " ds,\n", + " batch_size=batch_size,\n", + " shuffle=False,\n", + " num_workers=num_workers,\n", + " collate_fn=lambda batch: tokenizer(\n", + " batch,\n", + " return_tensors='pt',\n", + " padding=True,\n", + " truncation=True,\n", + " ),\n", + " )\n", + " rewards = []\n", + " with torch.no_grad():\n", + " for batch in loader:\n", + " batch = {k: v.cuda(non_blocking=True) for k, v in batch.items()}\n", + " logits = model(**batch).logits\n", + " # if binary head, pick class 1; else regression head\n", + " if logits.shape[-1] > 1:\n", + " vals = logits[:, 1]\n", + " else:\n", + " vals = logits[:, 0]\n", + " rewards.extend(vals.cpu().tolist())\n", + " return rewards\n", + "\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Interpolate along T12 (RM1 → RM2)\n", + "# -----------------------------------------------------------------------------\n", + "alphas = np.linspace(0, 1, 11)\n", + "all_rewards_12 = []\n", + "for α in tqdm(alphas, desc='Interp T12'):\n", + " sd_interp = add_scaled(sd1, T12, α)\n", + " m = copy.deepcopy(models[0])\n", + " m.load_state_dict(sd_interp)\n", + " all_rewards_12.append(compute_rewards(m, prompts, batch_size=1024))\n", + "\n", + "# Wasserstein distances & Lipschitz estimate\n", + "dists12 = [\n", + " wasserstein_distance(all_rewards_12[i], all_rewards_12[i + 1])\n", + " for i in range(len(alphas) - 1)\n", + "]\n", + "rates12 = [d / ((alphas[i + 1] - alphas[i]) * norm12) for i, d in enumerate(dists12)]\n", + "K12 = max(rates12)\n", + "\n", + "plt.figure()\n", + "plt.plot(alphas[:-1], dists12, marker='o')\n", + "plt.title(f'RM1→RM2: W-dist vs α (K≈{K12:.3f})')\n", + "plt.xlabel('α')\n", + "plt.ylabel('Wasserstein')\n", + "plt.grid(True)\n", + "plt.show()\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Interpolate along T23 (RM2 → RM3)\n", + "# -----------------------------------------------------------------------------\n", + "betas = np.linspace(0, 1, 11)\n", + "all_rewards_23 = []\n", + "for β in tqdm(betas, desc='Interp T23'):\n", + " sd_interp = add_scaled(sd2, T23, β)\n", + " m = copy.deepcopy(models[1])\n", + " m.load_state_dict(sd_interp)\n", + " all_rewards_23.append(compute_rewards(m, prompts, batch_size=1024))\n", + "\n", + "dists23 = [\n", + " wasserstein_distance(all_rewards_23[i], all_rewards_23[i + 1])\n", + " for i in range(len(betas) - 1)\n", + "]\n", + "rates23 = [d / ((betas[i + 1] - betas[i]) * norm23) for i, d in enumerate(dists23)]\n", + "K23 = max(rates23)\n", + "\n", + "plt.figure()\n", + "plt.plot(betas[:-1], dists23, marker='o')\n", + "plt.title(f'RM2→RM3: W-dist vs β (K≈{K23:.3f})')\n", + "plt.xlabel('β')\n", + "plt.ylabel('Wasserstein')\n", + "plt.grid(True)\n", + "plt.show()\n", + "\n", + "print(f'Empirical Lipschitz constants: K12={K12:.4f}, K23={K23:.4f}')" + ] + }, + { + "cell_type": "markdown", + "id": "b127c047", + "metadata": {}, + "source": [ + "\n", + "This notebook tests whether the mapping from model parameters → reward distributions is (empirically) Lipschitz‐continuous along the “task vectors” between successive reward models. In practice, we:\n", + "\n", + "Compute task vectors between three successive reward models\n", + "Linearly interpolate model weights along each task vector\n", + "For each interpolation step, compute the Wasserstein distance between reward distributions on a fixed set of prompts\n", + "Normalize those distances by the interpolation step size and the task‐vector norm to get an empirical Lipschitz constant\n", + "1. Theory\n", + "1.1 Task Vectors\n", + "Given two models (M_A) and (M_B) with state‐dicts (\\theta_A) and (\\theta_B), we define the task vector\n", + "[ T_{AB} = \\theta_B - \\theta_A ]\n", + "Its norm (|T_{AB}|) measures how “far apart” the models are in parameter space.\n", + "\n", + "1.2 Lipschitz Continuity\n", + "A function (f) is Lipschitz continuous with constant (K) if for all (x,y):\n", + "[ |f(x) - f(y)| \\le K ,|x - y|. ]\n", + "Here (f) maps model parameters (\\theta) to the distribution of reward scores on a fixed prompt set.\n", + "\n", + "2. Method\n", + "Load 3 reward models:\n", + "(M_1, M_2, M_3) from paths\n", + "Compute task vectors & norms:\n", + "(T_{12} = \\theta_2 - \\theta_1), (|T_{12}|)\n", + "(T_{23} = \\theta_3 - \\theta_2), (|T_{23}|)\n", + "Sample a fixed set of prompts (e.g.\\ 10 K).\n", + "Interpolation: for (\\alpha\\in[0,1]), set\n", + "[ \\theta(\\alpha) = \\theta_1 + \\alpha,T_{12}. ]\n", + "Load these weights into a copy of (M_1).\n", + "Compute reward scores over the prompt set at each (\\alpha).\n", + "Measure adjacent‐step distance via the 1D Wasserstein distance between two reward‐score histograms.\n", + "Estimate rate\n", + "[ r_i = \\frac{W\\bigl(R(\\alpha_{i+1}),,R(\\alpha_i)\\bigr)}{(\\alpha_{i+1}-\\alpha_i),|T_{12}|}. ]\n", + "The maximum (r_i) is our empirical Lipschitz constant (K_{12}).\n", + "Repeat for (T_{23}) → get (K_{23}).\n", + "3. Interpreting Results\n", + "Plots\n", + "Wasserstein vs. α (resp. β) with markers at each interpolation step\n", + "A straight‐line (linear) growth indicates a stable Lipschitz behavior.\n", + "Empirical (K) values\n", + "If (K) is small (and roughly constant), the reward mapping is smooth along that path.\n", + "Spikes in the normalized rate → local non‐smoothness\n", + "Conclusion\n", + "Compare (K_{12}) and (K_{23}).\n", + "If both are bounded by some moderate constant, you have evidence that your data + model family exhibits Lipschitz continuity along these training transitions." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c834752b", + "metadata": {}, + "outputs": [], + "source": [ + "import copy\n", + "import torch\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from scipy.stats import wasserstein_distance\n", + "from sklearn.cluster import KMeans\n", + "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n", + "\n", + "# Load models and compute task vectors (same as before)\n", + "models = [\n", + " AutoModelForSequenceClassification.from_pretrained(f'path/to/rm{i}').cuda()\n", + " for i in range(1, 4)\n", + "]\n", + "sd1, sd2, sd3 = [m.state_dict() for m in models]\n", + "T12 = {k: sd2[k] - sd1[k] for k in sd1}\n", + "T23 = {k: sd3[k] - sd2[k] for k in sd1}\n", + "\n", + "# Create a much finer interpolation grid to capture discontinuities\n", + "alphas = np.linspace(0, 1, 100) # 100 points instead of 11\n", + "reward_trajectories = np.zeros(\n", + " (len(prompts), len(alphas) * 2)\n", + ") # Store rewards for ALL prompts\n", + "\n", + "# First trajectory: RM1 → RM2\n", + "for i, α in enumerate(alphas):\n", + " sd_interp = {k: sd1[k] + α * T12[k] for k in sd1}\n", + " m = copy.deepcopy(models[0])\n", + " m.load_state_dict(sd_interp)\n", + " rewards = compute_rewards(m, prompts)\n", + "\n", + " # Store rewards for each prompt separately to track prompt-specific behavior\n", + " for p_idx, r in enumerate(rewards):\n", + " reward_trajectories[p_idx, i] = r\n", + "\n", + "# Second trajectory: RM2 → RM3\n", + "for i, β in enumerate(alphas):\n", + " sd_interp = {k: sd2[k] + β * T23[k] for k in sd2}\n", + " m = copy.deepcopy(models[1])\n", + " m.load_state_dict(sd_interp)\n", + " rewards = compute_rewards(m, prompts)\n", + "\n", + " for p_idx, r in enumerate(rewards):\n", + " reward_trajectories[p_idx, i + len(alphas)] = r\n", + "\n", + "\n", + "# Analysis specific to piecewise continuity\n", + "# 1. Detect discontinuities\n", + "def detect_discontinuities(reward_trajectory, threshold=2.0):\n", + " # Compute first differences\n", + " diffs = np.abs(np.diff(reward_trajectory))\n", + " # Find points with jump exceeding threshold * median change\n", + " median_change = np.median(diffs)\n", + " discontinuities = np.where(diffs > threshold * median_change)[0]\n", + " return discontinuities\n", + "\n", + "\n", + "# 2. Analyze prompt clustering based on reward trajectories\n", + "def cluster_prompts_by_trajectory(reward_trajectories, n_clusters=3):\n", + " kmeans = KMeans(n_clusters=n_clusters, random_state=0).fit(reward_trajectories)\n", + " return kmeans.labels_\n", + "\n", + "\n", + "# Detect discontinuities for each prompt across the entire trajectory\n", + "all_discontinuities = []\n", + "for p_idx in range(len(prompts)):\n", + " discs = detect_discontinuities(reward_trajectories[p_idx])\n", + " all_discontinuities.append(discs)\n", + "\n", + "# Cluster prompts by their reward trajectories\n", + "prompt_clusters = cluster_prompts_by_trajectory(reward_trajectories)\n", + "\n", + "# Visualize prompt-specific trajectories colored by cluster\n", + "plt.figure(figsize=(15, 10))\n", + "full_trajectory = np.concatenate(\n", + " [alphas, alphas + 1]\n", + ") # x-axis spanning both interpolations\n", + "for p_idx in range(len(prompts)):\n", + " plt.plot(\n", + " full_trajectory,\n", + " reward_trajectories[p_idx],\n", + " alpha=0.5,\n", + " color=f'C{prompt_clusters[p_idx]}',\n", + " )\n", + "\n", + " # Mark discontinuities if any\n", + " for disc in all_discontinuities[p_idx]:\n", + " plt.axvline(\n", + " x=full_trajectory[disc],\n", + " color=f'C{prompt_clusters[p_idx]}',\n", + " linestyle='--',\n", + " alpha=0.3,\n", + " )\n", + "\n", + "# Add vertical line at task boundary\n", + "plt.axvline(x=1.0, color='red', linestyle='-', linewidth=2)\n", + "plt.title('Reward Trajectories Across Task Transitions')\n", + "plt.xlabel('Interpolation Parameter (0-1: RM1→RM2, 1-2: RM2→RM3)')\n", + "plt.ylabel('Reward Value')\n", + "plt.show()\n", + "\n", + "# Create a heatmap of reward changes to visualize the piecewise structure\n", + "plt.figure(figsize=(12, 8))\n", + "# Compute absolute differences between adjacent points\n", + "reward_changes = np.abs(np.diff(reward_trajectories, axis=1))\n", + "plt.imshow(reward_changes, aspect='auto', cmap='viridis')\n", + "plt.colorbar(label='|Δ Reward|')\n", + "plt.axvline(x=len(alphas) - 1, color='red', linestyle='-', linewidth=2) # Task boundary\n", + "plt.title('Heatmap of Reward Changes')\n", + "plt.xlabel('Interpolation Step')\n", + "plt.ylabel('Prompt Index')\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jobs/unkillable_diversity.sh b/jobs/unkillable_diversity.sh new file mode 100644 index 00000000..fa22f663 --- /dev/null +++ b/jobs/unkillable_diversity.sh @@ -0,0 +1,83 @@ +#!/bin/bash +#SBATCH --job-name=validate_static_diversity +#SBATCH --tasks=1 +#SBATCH --cpus-per-task=6 +#SBATCH --gres=gpu:a100l:4 +#SBATCH --mem=128G +#SBATCH --time=24:00:00 +#SBATCH --output=slurm-%j.out +#SBATCH --error=slurm-%j.err +#SBATCH --mail-type=ALL +#SBATCH --mail-user= + +cd +module load python/3.9 +module load cuda/12.6.0 +source .venv/bin/activate +echo "Starting vLLM server..." +uv run vllm serve Salesforce/SFR-Embedding-Mistral \ + --load-format bitsandbytes \ + --quantization bitsandbytes \ + --dtype half \ + --api-key openai \ + --kv-cache-dtype fp8 \ + --task embed \ + --trust-remote-code \ + --tensor_parallel_size 4 \ + --max-model-len 4096 & + +# Save server process ID +SERVER_PID=$! + +echo "Waiting for server to start..." +while true; do + echo "Checking if server is up..." + RESPONSE=$(curl -s http://localhost:8000/v1/models -H "Authorization: Bearer openai" 2>&1) + + if [[ "$RESPONSE" == *"data"* ]]; then + echo "Server is up and running!" + break + fi + + # Check if server is still running + if ! kill -0 $SERVER_PID 2>/dev/null; then + echo "Server process died unexpectedly" + exit 1 + fi + + echo "Server not ready yet. Waiting 5 seconds..." + sleep 5 +done + +deactivate +cd projects/AIF-Gen +source .env + +echo "Starting validation process..." + +# list all sub‐tasks +tasks=( + merged_qna + merged_qna_summary + hh + ultra + cppo-rl-sampled + cppo-reward-sampled +) + +for t in "${tasks[@]}"; do + echo "Validating $t..." + uv run aif validate \ + "data/$t.json" \ + "data/$t-validate-diversity-nvidia.json" \ + --no-validate-diversity \ + --no-validate-count \ + --no-validate-entropy \ + --no-validate-llm-judge \ + --embedding-model "Salesforce/SFR-Embedding-Mistral" \ + --embedding-batch-size 128 \ + --max_concurrency 16 \ + || { echo "Validation failed on $t"; exit 1; } +done + +echo "All validations completed successfully." diff --git a/jobs/validate_all_static.sh b/jobs/validate_all_static.sh index 8f522a31..08d34672 100644 --- a/jobs/validate_all_static.sh +++ b/jobs/validate_all_static.sh @@ -16,7 +16,7 @@ MAX_CONC=256 # list all sub‐tasks tasks=( - ultra-hh-sampled + internal_subsampled_merged ) for t in "${tasks[@]}"; do @@ -27,7 +27,7 @@ for t in "${tasks[@]}"; do "data/$t-validate-no-diversity.json" \ --no-validate-diversity \ --no-validate-embedding-diversity \ - --model "$MODEL" \ + --no-validate-llm-judge \ || { echo "Validation failed on $t"; exit 1; } done diff --git a/jobs/validate_all_static_diversity.sh b/jobs/validate_all_static_diversity.sh index 926db04b..64e849d5 100644 --- a/jobs/validate_all_static_diversity.sh +++ b/jobs/validate_all_static_diversity.sh @@ -2,8 +2,8 @@ #SBATCH --job-name=validate_static_all_diversity_external #SBATCH --partition=main #SBATCH --gres=gpu:a100l:1 -#SBATCH --mem=36G -#SBATCH --cpus-per-task=6 +#SBATCH --mem=48G +#SBATCH --cpus-per-task=8 #SBATCH --time=24:00:00 #SBATCH --output=slurm-%j.out #SBATCH --error=slurm-%j.err @@ -15,7 +15,7 @@ module load python/3.10 module load cuda/12.6.0 source .venv/bin/activate echo "Starting vLLM server..." -uv run vllm serve BAAI/bge-m3 --dtype float16 --api-key openai --task embed & +uv run vllm serve intfloat/e5-mistral-7b-instruct --quantization int8 --api-key openai --task embed --trust-remote-code --max-model-len 4096 & # Save server process ID SERVER_PID=$! @@ -48,24 +48,25 @@ echo "Starting validation process..." # list all sub‐tasks tasks=( - cppo-reward-sampled - cppo-rl-sampled - ultra-hh-sampled + merged_qna + merged_qna_summary + hh + ultra ) for t in "${tasks[@]}"; do echo "Validating $t..." uv run aif validate \ "data/$t.json" \ - "data/$t-validate-diversity.json" \ + "data/$t-validate-diversity-nvidia.json" \ --no-validate-diversity \ --no-validate-count \ --no-validate-entropy \ --no-validate-llm-judge \ - --embedding-model "BAAI/bge-m3" \ - --embedding-batch-size 256 \ - --max_concurrency 16 \ - || { echo "Validation failed on $t"; exit 1; } + --embedding-model "intfloat/e5-mistral-7b-instruct" \ + --embedding-batch-size 64 \ + --max_concurrency 8 \ + # || { echo "Validation failed on $t"; exit 1; } done echo "All validations completed successfully." diff --git a/pyproject.toml b/pyproject.toml index e696354d..a317f1d4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,6 +43,7 @@ dev = [ "sphinx-rtd-theme>=3.0.2", "ipykernel>=6.29.5", "matplotlib>=3.10.1", + "scipy>=1.15.2", ] benchmarks-dpo = [ "datasets>=3.2.0", diff --git a/uv.lock b/uv.lock index 74080991..b1fded56 100644 --- a/uv.lock +++ b/uv.lock @@ -81,6 +81,7 @@ dev = [ { name = "pytest" }, { name = "pytest-cov" }, { name = "ruff" }, + { name = "scipy" }, { name = "sphinx" }, { name = "sphinx-rtd-theme" }, ] @@ -136,6 +137,7 @@ dev = [ { name = "pytest", specifier = ">=8.3.3" }, { name = "pytest-cov", specifier = ">=6.0.0" }, { name = "ruff", specifier = ">=0.7.3" }, + { name = "scipy", specifier = ">=1.15.2" }, { name = "sphinx", specifier = ">=7.4.7" }, { name = "sphinx-rtd-theme", specifier = ">=3.0.2" }, ] @@ -2861,6 +2863,62 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/69/e2/b011c38e5394c4c18fb5500778a55ec43ad6106126e74723ffaee246f56e/safetensors-0.5.3-cp38-abi3-win_amd64.whl", hash = "sha256:836cbbc320b47e80acd40e44c8682db0e8ad7123209f69b093def21ec7cafd11", size = 308878 }, ] +[[package]] +name = "scipy" +version = "1.15.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/b9/31ba9cd990e626574baf93fbc1ac61cf9ed54faafd04c479117517661637/scipy-1.15.2.tar.gz", hash = "sha256:cd58a314d92838f7e6f755c8a2167ead4f27e1fd5c1251fd54289569ef3495ec", size = 59417316 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/df/ef233fff6838fe6f7840d69b5ef9f20d2b5c912a8727b21ebf876cb15d54/scipy-1.15.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a2ec871edaa863e8213ea5df811cd600734f6400b4af272e1c011e69401218e9", size = 38692502 }, + { url = "https://files.pythonhosted.org/packages/5c/20/acdd4efb8a68b842968f7bc5611b1aeb819794508771ad104de418701422/scipy-1.15.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6f223753c6ea76983af380787611ae1291e3ceb23917393079dcc746ba60cfb5", size = 30085508 }, + { url = "https://files.pythonhosted.org/packages/42/55/39cf96ca7126f1e78ee72a6344ebdc6702fc47d037319ad93221063e6cf4/scipy-1.15.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:ecf797d2d798cf7c838c6d98321061eb3e72a74710e6c40540f0e8087e3b499e", size = 22359166 }, + { url = "https://files.pythonhosted.org/packages/51/48/708d26a4ab8a1441536bf2dfcad1df0ca14a69f010fba3ccbdfc02df7185/scipy-1.15.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:9b18aa747da280664642997e65aab1dd19d0c3d17068a04b3fe34e2559196cb9", size = 25112047 }, + { url = "https://files.pythonhosted.org/packages/dd/65/f9c5755b995ad892020381b8ae11f16d18616208e388621dfacc11df6de6/scipy-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87994da02e73549dfecaed9e09a4f9d58a045a053865679aeb8d6d43747d4df3", size = 35536214 }, + { url = "https://files.pythonhosted.org/packages/de/3c/c96d904b9892beec978562f64d8cc43f9cca0842e65bd3cd1b7f7389b0ba/scipy-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69ea6e56d00977f355c0f84eba69877b6df084516c602d93a33812aa04d90a3d", size = 37646981 }, + { url = "https://files.pythonhosted.org/packages/3d/74/c2d8a24d18acdeae69ed02e132b9bc1bb67b7bee90feee1afe05a68f9d67/scipy-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:888307125ea0c4466287191e5606a2c910963405ce9671448ff9c81c53f85f58", size = 37230048 }, + { url = "https://files.pythonhosted.org/packages/42/19/0aa4ce80eca82d487987eff0bc754f014dec10d20de2f66754fa4ea70204/scipy-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9412f5e408b397ff5641080ed1e798623dbe1ec0d78e72c9eca8992976fa65aa", size = 40010322 }, + { url = "https://files.pythonhosted.org/packages/d0/d2/f0683b7e992be44d1475cc144d1f1eeae63c73a14f862974b4db64af635e/scipy-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:b5e025e903b4f166ea03b109bb241355b9c42c279ea694d8864d033727205e65", size = 41233385 }, + { url = "https://files.pythonhosted.org/packages/40/1f/bf0a5f338bda7c35c08b4ed0df797e7bafe8a78a97275e9f439aceb46193/scipy-1.15.2-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:92233b2df6938147be6fa8824b8136f29a18f016ecde986666be5f4d686a91a4", size = 38703651 }, + { url = "https://files.pythonhosted.org/packages/de/54/db126aad3874601048c2c20ae3d8a433dbfd7ba8381551e6f62606d9bd8e/scipy-1.15.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:62ca1ff3eb513e09ed17a5736929429189adf16d2d740f44e53270cc800ecff1", size = 30102038 }, + { url = "https://files.pythonhosted.org/packages/61/d8/84da3fffefb6c7d5a16968fe5b9f24c98606b165bb801bb0b8bc3985200f/scipy-1.15.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4c6676490ad76d1c2894d77f976144b41bd1a4052107902238047fb6a473e971", size = 22375518 }, + { url = "https://files.pythonhosted.org/packages/44/78/25535a6e63d3b9c4c90147371aedb5d04c72f3aee3a34451f2dc27c0c07f/scipy-1.15.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8bf5cb4a25046ac61d38f8d3c3426ec11ebc350246a4642f2f315fe95bda655", size = 25142523 }, + { url = "https://files.pythonhosted.org/packages/e0/22/4b4a26fe1cd9ed0bc2b2cb87b17d57e32ab72c346949eaf9288001f8aa8e/scipy-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a8e34cf4c188b6dd004654f88586d78f95639e48a25dfae9c5e34a6dc34547e", size = 35491547 }, + { url = "https://files.pythonhosted.org/packages/32/ea/564bacc26b676c06a00266a3f25fdfe91a9d9a2532ccea7ce6dd394541bc/scipy-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28a0d2c2075946346e4408b211240764759e0fabaeb08d871639b5f3b1aca8a0", size = 37634077 }, + { url = "https://files.pythonhosted.org/packages/43/c2/bfd4e60668897a303b0ffb7191e965a5da4056f0d98acfb6ba529678f0fb/scipy-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:42dabaaa798e987c425ed76062794e93a243be8f0f20fff6e7a89f4d61cb3d40", size = 37231657 }, + { url = "https://files.pythonhosted.org/packages/4a/75/5f13050bf4f84c931bcab4f4e83c212a36876c3c2244475db34e4b5fe1a6/scipy-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f5e296ec63c5da6ba6fa0343ea73fd51b8b3e1a300b0a8cae3ed4b1122c7462", size = 40035857 }, + { url = "https://files.pythonhosted.org/packages/b9/8b/7ec1832b09dbc88f3db411f8cdd47db04505c4b72c99b11c920a8f0479c3/scipy-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:597a0c7008b21c035831c39927406c6181bcf8f60a73f36219b69d010aa04737", size = 41217654 }, + { url = "https://files.pythonhosted.org/packages/4b/5d/3c78815cbab499610f26b5bae6aed33e227225a9fa5290008a733a64f6fc/scipy-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c4697a10da8f8765bb7c83e24a470da5797e37041edfd77fd95ba3811a47c4fd", size = 38756184 }, + { url = "https://files.pythonhosted.org/packages/37/20/3d04eb066b471b6e171827548b9ddb3c21c6bbea72a4d84fc5989933910b/scipy-1.15.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:869269b767d5ee7ea6991ed7e22b3ca1f22de73ab9a49c44bad338b725603301", size = 30163558 }, + { url = "https://files.pythonhosted.org/packages/a4/98/e5c964526c929ef1f795d4c343b2ff98634ad2051bd2bbadfef9e772e413/scipy-1.15.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bad78d580270a4d32470563ea86c6590b465cb98f83d760ff5b0990cb5518a93", size = 22437211 }, + { url = "https://files.pythonhosted.org/packages/1d/cd/1dc7371e29195ecbf5222f9afeedb210e0a75057d8afbd942aa6cf8c8eca/scipy-1.15.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b09ae80010f52efddb15551025f9016c910296cf70adbf03ce2a8704f3a5ad20", size = 25232260 }, + { url = "https://files.pythonhosted.org/packages/f0/24/1a181a9e5050090e0b5138c5f496fee33293c342b788d02586bc410c6477/scipy-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a6fd6eac1ce74a9f77a7fc724080d507c5812d61e72bd5e4c489b042455865e", size = 35198095 }, + { url = "https://files.pythonhosted.org/packages/c0/53/eaada1a414c026673eb983f8b4a55fe5eb172725d33d62c1b21f63ff6ca4/scipy-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b871df1fe1a3ba85d90e22742b93584f8d2b8e6124f8372ab15c71b73e428b8", size = 37297371 }, + { url = "https://files.pythonhosted.org/packages/e9/06/0449b744892ed22b7e7b9a1994a866e64895363572677a316a9042af1fe5/scipy-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:03205d57a28e18dfd39f0377d5002725bf1f19a46f444108c29bdb246b6c8a11", size = 36872390 }, + { url = "https://files.pythonhosted.org/packages/6a/6f/a8ac3cfd9505ec695c1bc35edc034d13afbd2fc1882a7c6b473e280397bb/scipy-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:601881dfb761311045b03114c5fe718a12634e5608c3b403737ae463c9885d53", size = 39700276 }, + { url = "https://files.pythonhosted.org/packages/f5/6f/e6e5aff77ea2a48dd96808bb51d7450875af154ee7cbe72188afb0b37929/scipy-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:e7c68b6a43259ba0aab737237876e5c2c549a031ddb7abc28c7b47f22e202ded", size = 40942317 }, + { url = "https://files.pythonhosted.org/packages/53/40/09319f6e0f276ea2754196185f95cd191cb852288440ce035d5c3a931ea2/scipy-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01edfac9f0798ad6b46d9c4c9ca0e0ad23dbf0b1eb70e96adb9fa7f525eff0bf", size = 38717587 }, + { url = "https://files.pythonhosted.org/packages/fe/c3/2854f40ecd19585d65afaef601e5e1f8dbf6758b2f95b5ea93d38655a2c6/scipy-1.15.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:08b57a9336b8e79b305a143c3655cc5bdbe6d5ece3378578888d2afbb51c4e37", size = 30100266 }, + { url = "https://files.pythonhosted.org/packages/dd/b1/f9fe6e3c828cb5930b5fe74cb479de5f3d66d682fa8adb77249acaf545b8/scipy-1.15.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:54c462098484e7466362a9f1672d20888f724911a74c22ae35b61f9c5919183d", size = 22373768 }, + { url = "https://files.pythonhosted.org/packages/15/9d/a60db8c795700414c3f681908a2b911e031e024d93214f2d23c6dae174ab/scipy-1.15.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:cf72ff559a53a6a6d77bd8eefd12a17995ffa44ad86c77a5df96f533d4e6c6bb", size = 25154719 }, + { url = "https://files.pythonhosted.org/packages/37/3b/9bda92a85cd93f19f9ed90ade84aa1e51657e29988317fabdd44544f1dd4/scipy-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9de9d1416b3d9e7df9923ab23cd2fe714244af10b763975bea9e4f2e81cebd27", size = 35163195 }, + { url = "https://files.pythonhosted.org/packages/03/5a/fc34bf1aa14dc7c0e701691fa8685f3faec80e57d816615e3625f28feb43/scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb530e4794fc8ea76a4a21ccb67dea33e5e0e60f07fc38a49e821e1eae3b71a0", size = 37255404 }, + { url = "https://files.pythonhosted.org/packages/4a/71/472eac45440cee134c8a180dbe4c01b3ec247e0338b7c759e6cd71f199a7/scipy-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5ea7ed46d437fc52350b028b1d44e002646e28f3e8ddc714011aaf87330f2f32", size = 36860011 }, + { url = "https://files.pythonhosted.org/packages/01/b3/21f890f4f42daf20e4d3aaa18182dddb9192771cd47445aaae2e318f6738/scipy-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11e7ad32cf184b74380f43d3c0a706f49358b904fa7d5345f16ddf993609184d", size = 39657406 }, + { url = "https://files.pythonhosted.org/packages/0d/76/77cf2ac1f2a9cc00c073d49e1e16244e389dd88e2490c91d84e1e3e4d126/scipy-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:a5080a79dfb9b78b768cebf3c9dcbc7b665c5875793569f48bf0e2b1d7f68f6f", size = 40961243 }, + { url = "https://files.pythonhosted.org/packages/4c/4b/a57f8ddcf48e129e6054fa9899a2a86d1fc6b07a0e15c7eebff7ca94533f/scipy-1.15.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:447ce30cee6a9d5d1379087c9e474628dab3db4a67484be1b7dc3196bfb2fac9", size = 38870286 }, + { url = "https://files.pythonhosted.org/packages/0c/43/c304d69a56c91ad5f188c0714f6a97b9c1fed93128c691148621274a3a68/scipy-1.15.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c90ebe8aaa4397eaefa8455a8182b164a6cc1d59ad53f79943f266d99f68687f", size = 30141634 }, + { url = "https://files.pythonhosted.org/packages/44/1a/6c21b45d2548eb73be9b9bff421aaaa7e85e22c1f9b3bc44b23485dfce0a/scipy-1.15.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:def751dd08243934c884a3221156d63e15234a3155cf25978b0a668409d45eb6", size = 22415179 }, + { url = "https://files.pythonhosted.org/packages/74/4b/aefac4bba80ef815b64f55da06f62f92be5d03b467f2ce3668071799429a/scipy-1.15.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:302093e7dfb120e55515936cb55618ee0b895f8bcaf18ff81eca086c17bd80af", size = 25126412 }, + { url = "https://files.pythonhosted.org/packages/b1/53/1cbb148e6e8f1660aacd9f0a9dfa2b05e9ff1cb54b4386fe868477972ac2/scipy-1.15.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd5b77413e1855351cdde594eca99c1f4a588c2d63711388b6a1f1c01f62274", size = 34952867 }, + { url = "https://files.pythonhosted.org/packages/2c/23/e0eb7f31a9c13cf2dca083828b97992dd22f8184c6ce4fec5deec0c81fcf/scipy-1.15.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d0194c37037707b2afa7a2f2a924cf7bac3dc292d51b6a925e5fcb89bc5c776", size = 36890009 }, + { url = "https://files.pythonhosted.org/packages/03/f3/e699e19cabe96bbac5189c04aaa970718f0105cff03d458dc5e2b6bd1e8c/scipy-1.15.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:bae43364d600fdc3ac327db99659dcb79e6e7ecd279a75fe1266669d9a652828", size = 36545159 }, + { url = "https://files.pythonhosted.org/packages/af/f5/ab3838e56fe5cc22383d6fcf2336e48c8fe33e944b9037fbf6cbdf5a11f8/scipy-1.15.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f031846580d9acccd0044efd1a90e6f4df3a6e12b4b6bd694a7bc03a89892b28", size = 39136566 }, + { url = "https://files.pythonhosted.org/packages/0a/c8/b3f566db71461cabd4b2d5b39bcc24a7e1c119535c8361f81426be39bb47/scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db", size = 40477705 }, +] + [[package]] name = "sentry-sdk" version = "2.22.0" From 8d4bf9c66ac77ec47e0492cc663c0f449dae5e10 Mon Sep 17 00:00:00 2001 From: EMZEDI Date: Sat, 3 May 2025 11:45:22 -0400 Subject: [PATCH 6/7] unkillable diversity for CC --- jobs/unkillable_diversity.sh | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/jobs/unkillable_diversity.sh b/jobs/unkillable_diversity.sh index fa22f663..336daade 100644 --- a/jobs/unkillable_diversity.sh +++ b/jobs/unkillable_diversity.sh @@ -2,7 +2,8 @@ #SBATCH --job-name=validate_static_diversity #SBATCH --tasks=1 #SBATCH --cpus-per-task=6 -#SBATCH --gres=gpu:a100l:4 +#SBATCH --account= +#SBATCH --gres=gpu:a100:2 #SBATCH --mem=128G #SBATCH --time=24:00:00 #SBATCH --output=slurm-%j.out @@ -11,19 +12,17 @@ #SBATCH --mail-user= cd -module load python/3.9 -module load cuda/12.6.0 +module load python/3.10 +module load cuda/12.6 source .venv/bin/activate echo "Starting vLLM server..." uv run vllm serve Salesforce/SFR-Embedding-Mistral \ - --load-format bitsandbytes \ - --quantization bitsandbytes \ - --dtype half \ + --dtype bfloat16 \ --api-key openai \ --kv-cache-dtype fp8 \ --task embed \ --trust-remote-code \ - --tensor_parallel_size 4 \ + --tensor_parallel_size 2 \ --max-model-len 4096 & # Save server process ID @@ -76,7 +75,7 @@ for t in "${tasks[@]}"; do --no-validate-llm-judge \ --embedding-model "Salesforce/SFR-Embedding-Mistral" \ --embedding-batch-size 128 \ - --max_concurrency 16 \ + --max_concurrency 8 \ || { echo "Validation failed on $t"; exit 1; } done From d398e86f517ea4a9e6fd987e158fa8c1cc650f65 Mon Sep 17 00:00:00 2001 From: Shahrad Mohammadzadeh Date: Sat, 3 May 2025 12:31:04 -0400 Subject: [PATCH 7/7] addition of notebooks --- experiments.ipynb | 479 -------------------------------- notebooks/continuity.ipynb | 541 +++++++++++++++++++++++++++++++++++++ 2 files changed, 541 insertions(+), 479 deletions(-) delete mode 100644 experiments.ipynb create mode 100644 notebooks/continuity.ipynb diff --git a/experiments.ipynb b/experiments.ipynb deleted file mode 100644 index ed98840a..00000000 --- a/experiments.ipynb +++ /dev/null @@ -1,479 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "fe383535", - "metadata": {}, - "source": [ - "# Continuity Analysis" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "45b95049", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/mila/s/shahrad.mohammadzadeh/projects/AIF-Gen/.venv/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[\"In today's political landscape, the role of committees in shaping legislation cannot be understated. Committees serve as the backbone of governmental operations, providing thorough analysis and debate on proposed laws before they reach the wider body. One particularly notable instance is when the Majority Party in Congress leverages committee power to drive its agenda. When the Majority Party controls a committee, they often prioritize legislation that aligns with their platform, leading to significant developments in areas like healthcare, education, and infrastructure.\\n\\nThe Majority can effectively steer discussions and influence the trajectory of policy by selecting which bills to advance. For example, if a bill aimed at expanding public healthcare is brought to the Health Committee, a committee led by Majority Party members may fast-track it for a vote or, conversely, sink it in reviews. This majority dominance can result in substantial shifts in governmental priorities, potentially sidelining voices from the minority party and impacting bipartisan support.\\n\\nMoreover, the committee's role extends beyond mere legislative approval; it also significantly affects public perception of political processes. As citizens often pay attention to committee hearings and reports, the Majority's actions therein can either bolster or undermine trust in government institutions. When the committee is perceived as acting in the public's best interest, it strengthens democracy. Conversely, partisanship and perceived inequities can lead to disillusionment among the electorate.\\n\\nIt's crucial for voters to remain aware of these dynamics and understand how the committee system operates under majority rule. Advocating for transparency and equitable representation can help mitigate the risks associated with concentrated power and ensure that all voices are heard in the legislative process. As we move forward, monitoring the influence of committees in both parties will be essential to ensure a balanced approach to policy-making.\", \"The increasing focus on climate change and its impact on the environment has become a prominent political topic in recent years, particularly in the realm of federal domestic policy. As the effects of climate change continue to pose significant challenges, there is a pressing need for the federal government to respond effectively through decisive action in the formulation of domestic policy.\\n\\nOne crucial aspect that has emerged in this discourse is the aggressive targeting of carbon emissions through various means, such as incentives for renewable energy sources, stricter regulations on industrial emissions, and investment in sustainable infrastructure. The administration's commitment to re-entering the Paris Agreement highlighted the administration's intent to prioritize climate action at a national level, with various initiatives aimed at reducing emissions and promoting green technology.\\n\\nMoreover, domestic policy proposals are increasingly intertwining climate action with economic recovery efforts. The federal government is recognizing that addressing environmental issues can also create jobs and stimulate economic growth. Policies such as the Green New Deal have gained traction, proposing a profound transformation of the economy towards sustainability, with a significant public investment in renewable energy and green jobs.\\n\\nThe efficacy of such domestic policies, however, often hinges on bipartisan support in Congress. Political ideologies diverge significantly when it comes to prioritizing climate action and the federal government's role in regulating industry and the economy. Consequently, the debate over climate policy may become a critical battleground for federal priorities, illustrating the complex interplay between environmental sustainability and political maneuvering.\\n\\nAdditionally, the ongoing debates about infrastructure spending have emphasized the importance of integrating climate resilience into federal domestic policy. The recent push to modernize America’s infrastructure to withstand extreme weather events exemplifies how closely related climate initiatives are to broader economic and social policies.\\n\\nOverall, federal domestic policy concerning climate change is rapidly evolving and shaping the political landscape. As new challenges emerge, the ability of the federal government to implement effective strategies will hinge on collaborative efforts across party lines, public awareness, and grassroots activism, setting the stage for the future of both environmental protection and economic stability.\", \"In recent years, the resurgence of autocracy around the world has sparked significant debate and concern among political analysts and citizens alike. Autocracies, defined as systems of governance in which a single entity holds absolute power, can manifest in various forms, from outright dictatorships to more subtle authoritarian regimes that exist within ostensibly ic frameworks.\\n\\nOne notable example is the rise of autocratic governance in several countries that were once considered ic bellwethers. The challenges presented by these regimes have forced many to reconsider the efficacy of international responses to authoritarianism. In particular, the current administration in the United States has been scrutinized for its approach to dealing with these governments.\\n\\nCritics argue that the administration's policies reflect a lack of coherent strategy when faced with autocratic leaders, often oscillating between engagement and condemnation without a clear roadmap for promoting ic ideals. This indecisiveness can embolden autocratic regimes, as they interpret mixed signals as a weakness rather than a call for accountability. \\n\\nFurthermore, the consequences of emerging autocracies extend beyond their borders, often leading to increased geopolitical tensions and challenges to global cooperation on pressing issues such as climate change and public health. The growing power of these regimes, coupled with their propensity to stifle dissent and undermine civil liberties, raises important questions about the future of democracy around the globe. \\n\\nAs citizens and policymakers engage in this critical conversation, it becomes increasingly important to explore how best to support ic movements and reinforce the social structures that resist autocratic tendencies. In doing so, the administration must forge a consistent and principled stance against the allure of autocracy, recognizing that the fight for ic governance is as vital today as it has ever been. The stakes have never been higher for those who value freedom and equality on the world's stage.\", 'In recent years, the specter of impeachment has haunted various administrations, sparking heated debates about the integrity of ic processes and the specter of autocracy looming over our political landscape. Impeachment is often viewed as a crucial check against abuse of power, allowing legislative bodies to hold the executive accountable. Yet, as the political climate grows increasingly polarized, many worry that the impeachment process is no longer solely a remedy for corruption but has become a tool wielded by partisan factions seeking to undermine their opponents.\\n\\nThe rise of autocratic tendencies in politics has contributed significantly to this concern. Leaders in various nations have increasingly used their powers to erode checks and balances, bypassing legal frameworks that should exist to protect ic norms. In the United States, discussions surrounding impeachment have raised alarms about a potential shift toward autocracy, as the dismissal of dissenting voices and the consolidation of power can operate under the guise of national interest.\\n\\nSome critics argue that the repeated threats of impeachment, especially when unfounded, undermine the legitimacy of the institution itself. It risks normalizing a political environment where every disagreement is interpreted as an existential threat to governance, rather than an opportunity for political discourse and compromise. Moreover, the procedures surrounding impeachment can inadvertently fuel autocratic rhetoric, as leaders may claim they are targets of political witch hunts orchestrated by their adversaries.\\n\\nAs voters and citizens, it is vital to remain vigilant about these processes and understand their implications. Impeachment should not be viewed solely as a political weapon but as a fundamental aspect of maintaining a robust democracy. Keeping autocracy at bay requires a commitment to principled governance and respect for political dialogue, lest we find ourselves trapped in a cycle of power struggles that could ultimately dismantle the very systems we aim to protect.', \"The concept of representative democracy has been a cornerstone in the political landscape of many countries, offering a mechanism through which citizens can engage in governance and influence policy. In a representative system, elected officials are expected to act in the best interests of their constituents, balancing the needs of the populace with their party's ideological framework. However, as political divisions deepen, the struggle between and ideologies can lead to significant challenges in representation.\\n\\n representatives often advocate for progressive policies aimed at expanding civil rights, improving social welfare, and addressing systemic inequalities. They view their role as not just legislating but actively promoting a more equitable society. This includes pushing for reforms on issues such as healthcare access, climate change, and education—areas where representatives believe government intervention can make a substantial impact.\\n\\nThe approach emphasizes inclusivity and responsiveness to the diverse needs of different communities. It brings to light the stakes of an effective representation where elected officials not only listen to their supporters but also engage constructively with opposing viewpoints. The challenge lies in bridging the ideological divides that often lead to gridlock in legislatures, where political posturing can overshadow policy-making and stifles the very representation constituents seek.\\n\\nRepresentative democracy thrives on the premise that elected officials pledge their commitment to serve their constituents. In this context, representatives bear the responsibility to ensure that the voices of marginalized and underrepresented groups are empowered and heard. They are tasked with navigating the complexities of political discourse while prioritizing the well-being of the electorate.\\n\\nIn conclusion, the debate around what it means to be a representative in today’s political climate requires an ongoing reassessment of loyalty—not just to party lines, but to the diverse population these leaders serve. As societies grapple with emerging challenges, the role of representatives will be pivotal in shaping a future that upholds the principles of fairness and equality for all.\", 'In recent years, the influence of lobbying in American politics has sparked intense debate among citizens, legislators, and advocacy groups alike. Lobbying, the act of attempting to influence the decisions of government officials, has become a powerful tool for various organizations seeking to shape policy outcomes in their favor. With billions spent each year on lobbying efforts, questions arise regarding the ethical implications and the effectiveness of such practices.\\n\\nOne prominent area of debate centers around the role of lobbyists in the legislative process. Critics argue that when corporations, trade associations, and special interest groups exert excessive influence over lawmakers, it undermines the principles of democracy and public interest. This concern is especially relevant in issues such as healthcare, environmental regulation, and financial reform, where lobbyists actively work to protect their clients’ interests, sometimes at the expense of the wider community.\\n\\nOn the other hand, supporters of lobbying argue that it is an essential component of democracy that provides lawmakers with the necessary information they need to make informed decisions. They contend that in a complex and rapidly changing world, legislators cannot be experts on every issue. Lobbyists serve as advocates for various perspectives, helping to ensure that diverse viewpoints are represented in government decision-making. This aspect of lobbying can stimulate productive debate within the political sphere.\\n\\nAnother critical dimension of the debate is the potential for lobbying to perpetuate inequality in political influence. Wealthier corporations and organizations often have greater resources to allocate toward lobbying efforts, potentially drowning out the voices of smaller entities and average citizens. This imbalance raises significant concerns about whose interests are represented in policy decisions and underscores the need for reform\\n\\nAs the discussion around lobbying continues to evolve, there remains a pressing need for transparency and accountability in these practices. Advocates for reform argue for stricter regulations that would limit the influence of money in politics and ensure equitable representation for all citizens in the legislative process. The debate is unlikely to settle anytime soon, but it is clear that the way lobbying is conducted will have lasting implications on the health of democracy in America.', \"In recent years, the political landscape in many countries has been increasingly dominated by the rise of populism. This phenomenon is characterized by leaders and movements that appeal directly to the supposed interests and sentiments of the 'common people,' often positioning themselves against established elites and institutions. One aspect that has garnered significant attention is how populism intersects with national identity and sovereignty.\\n\\nPopulism often harnesses the power of nationalism, allowing leaders to frame their messages in ways that resonate deeply with the electorate’s fears and aspirations. For instance, in several nations, populist politicians have linked their platforms to restoring national pride, championing local industries, and resisting globalization's perceived threats. This rhetoric becomes particularly potent in times of economic uncertainty or social unrest, where individuals feel vulnerable to the forces shaping their lives and futures.\\n\\nAs countries grapple with rapid shifts in demographics, economic pressures, and cultural change, populist leaders often capitalize on sentiments that invoke a return to traditional values and national strength. They promise to put the interests of their citizens first, claiming they will reclaim national autonomy from foreign influence and interventional policies. This approach can create division within society as narratives about 'us vs. them' proliferate, fostering a milieu where nationalism becomes entwined with populist discourse.\\n\\nMoreover, the blending of populism and national consciousness raises important questions about governance and the role of ic institutions. Critics argue that while populism can energize political engagement and provide a voice for marginalized communities, it can also undermine ic norms by prioritizing the whims of the majority over the rights of minorities. The consequence can be a fragile political environment where contentious nationalism overshadows important dialogues about inclusivity and shared governance.\\n\\nAs we navigate these complexities, it is crucial to critically assess populism's impact on our political systems, understanding that while it might thrive on the idea of putting the nation first, it also has the potential to challenge the very fabric of democracy and diversity that many societies strive to uphold.\", 'In today’s political landscape, the role of third parties is often overshadowed by the two dominant political parties that typically dominate s: the s and the s. However, the emergence of third-party movements can be significant in shaping public policy and influencing major party positions, especially in a highly polarized environment.\\n\\nOne prominent example can be seen with the Green Party, which focuses on environmental issues and social justice. Despite having limited success in national s, the Green Party has been successful at local and state levels, drawing attention to critical issues like climate change that may otherwise be neglected. Their presence urges larger political parties to adopt more serious environmental policies, illustrating how even a party with fewer resources can wield substantial influence.\\n\\nSimilarly, the Libertarian Party has gained traction among those disillusioned with the two-party system. Libertarians advocate for smaller government, personal liberties, and non-interventionist foreign policies. As they promote these ideas, mainstream parties often rethink their approaches, especially on issues such as criminal justice reform and surveillance.\\n\\nAs the political landscape continues to evolve, the role of these minor political parties becomes even more crucial. Their existence challenges the notion that a two-party system is the only option for American democracy. By presenting alternative viewpoints and policies, these political parties not only enrich the ic dialogue but also highlight the importance of voter choice. Encouraging more competition among parties could lead to more responsive governance, where public policy truly reflects the diverse needs of the citizenry.', 'In recent years, nationalism has emerged as a dominant force within political landscapes across the globe, reshaping the way constituencies engage with their governments and each other. At its core, nationalism seeks to promote the interests and culture of a specific nation, often emphasizing a sense of unity and identity among its citizens. This phenomenon can be both unifying and divisive, depending on the context in which it is applied.\\n\\nFor instance, in many European countries, growing nationalist sentiments have influenced political parties that advocate for the needs and desires of their specific constituencies over a broader multicultural agenda. These parties often argue that their primary responsibility is to protect the interests of their citizens, sometimes leading to policies that prioritize native populations at the expense of immigrants and refugees. This shift has sparked significant debate about the implications of such policies on social cohesion and international relations.\\n\\nMoreover, the alignment of national identity with political action has compelled many citizens to reaffirm their allegiance to their nation-state. This rise of nationalism can be observed during national celebrations, where public focus on traditions and heritage fosters a perception of collective belonging. However, nationalist movements frequently encounter criticism for fostering xenophobia and exclusion, raising questions about how to balance national pride with the global need for cooperation and inclusivity.\\n\\nThe implications of nationalism extend beyond mere political rhetoric; they manifest in the policies that directly affect constituencies. Voter engagement is often shaped by how well political leaders resonate with the nationalist ideals. For instance, leaders who effectively tap into nationalist sentiments may mobilize their base more effectively, reshaping electoral outcomes and, consequently, public policy priorities. As these ideologies continue to gain traction, the challenge remains: how can governments ensure that they serve the interests of a diverse constituency while navigating the complexities brought about by rising nationalism?', \"In recent months, the political landscape has been abuzz with discussions surrounding the upcoming campaign, with parties vying to capture the hearts and minds of voters. One of the most notable aspects of this race is the emergence of moderate candidates, who are increasingly recognized for their ability to appeal to a broad spectrum of the electorate. \\n\\nModerate politicians often position themselves between the extremes of their party lines, advocating for policies that resonate with both the and populace. This strategy is particularly crucial in today's polarized environment where many voters are disillusioned with the extremes and instead seek pragmatic solutions to pressing issues like healthcare, immigration, and climate change. \\n\\nDuring the campaign period, it is not uncommon to see moderate candidates participating in debates where they strive to emphasize their balanced approach. By highlighting their willingness to collaborate across party lines and to listen to diverse viewpoints, they aim to convince voters that a moderate stance leads to effective governance. \\n\\nMoreover, as grassroots movements gain momentum, moderates are often seen leading initiatives that focus on community needs, directly engaging with constituents. Through town halls and listening tours, these candidates build relationships with voters that transcend political affiliations, bolstering the idea that politics can indeed be a unifying force.\\n\\nThe challenge for moderate candidates in the campaign season will be to maintain this elusive balance. They must navigate the pressures from their party's base demanding stricter adherence to traditional ideologies while also appealing to undecided voters who prioritize solutions over rhetoric. \\n\\nAs we move closer to the , it will be fascinating to observe how these moderate candidates shape their campaigns to adapt to an evolving political climate, and whether their approach will successfully translate into electoral success.\"]\n", - "[\"### The Impact of Computer-Assisted Technologies on Chronic Disease Management: A Relativity Viewpoint\\n\\nIn the contemporary landscape of healthcare, the integration of computer-assisted technologies into chronic disease management represents a fundamental transformation of patient care methodologies. This shift mirrors Albert Einstein's theory of relativity, not in the physical cosmos but in conceptual frameworks that address the relative nature of health outcomes and their dependency on patient engagement, healthcare delivery, and technological innovation.\\n\\nChronic diseases, such as diabetes, hypertension, and heart disease, are particularly significant in the United States and numerous developed nations, where they impact millions of lives and impose substantial socio-economic burdens. The emerging strategy of employing computer-assisted technologies aims to reconfigure how we understand and manage these prolonged health challenges. \\n\\nHistorically, chronic disease management has relied heavily on traditional, face-to-face medical practices that often fall short of meeting patient needs due to time constraints and provider workload limitations. The advent of telehealth, remote monitoring tools, and sophisticated health informatics represents a relative paradigm shift, placing the patient at the center of their health management while utilizing technology as a means of enhanced communication and data collection. \\n\\n**Relativity in Patient Engagement** \\n\\nOne salient aspect of this transformation relates to the reciprocal relationship between patient engagement and health outcomes. The relativity of patient commitment can be seen in various contexts, as healthcare technologies become increasingly personalized and accessible. For example, wearable devices that collect real-time biometric data empower patients to take charge of their health by monitoring key indicators such as blood glucose levels and heart rate variability. When patients understand how their behaviors influence these readings, a sense of agency emerges, leading to improved adherence to treatment protocols and lifestyle recommendations.\\n\\nMoreover, algorithms that utilize machine learning to analyze vast amounts of medical data enable clinicians to tailor interventions based on individual patient metrics. The relative effectiveness of these strategies emerges from the context of individual patient profiles, creating a more precise approach to chronic disease management nuanced by personal history, socioeconomic status, and psychological well-being.\\n\\n**Technological Integration in Healthcare Systems** \\n\\nThe integration of computer systems into healthcare delivery also emphasizes the relativity of disease management within institutional frameworks. Health systems increasingly adopt electronic health records (EHRs) and decision-support tools that facilitate the aggregation of patient data across various encounters with the healthcare system. This shift signifies a departure from silos of information—where patient data is disjointed and often inaccessible to providers—toward a more cohesive understanding of patient histories and treatment gaps. \\n\\nThe deployment of predictive analytics can lead to improved resource allocation, ensuring that interventions are offered to patients relative to their needs. This creates a feedback loop where healthcare resources can be distributed based on real-time data and disease onset patterns, influencing metrics such as hospitalization rates and patient satisfaction scores.\\n\\n**Conclusion** \\n\\nIn summary, this discourse on computer-assisted technologies and chronic disease management underlines the notion of relativity within healthcare. As we continue to explore the intersection of technology and health, it becomes increasingly important to consider how different perspectives, both from practitioners and patients, shape the landscape of care delivery. This evolving understanding fosters a collaborative environment in which technology not only serves as a tool for diagnosis and treatment but as a conduit for enhancing the fundamental relationship patients have with their health and the healthcare system. In embracing these harmonized innovations, we acknowledge that the management of chronic diseases is as much a domain of relational dynamics as it is a field of biomedical practice.\", \"### Quantum Oscillation in Healthcare: A Breakthrough in Disease Detection\\n\\n**Introduction** \\nIn recent years, the healthcare sector has accelerated its embrace of quantum technology, paving the way for innovative diagnostic tools. One of the most fascinating developments in this arena is the application of quantum oscillation principles in disease detection. This article aims to explore how quantum mechanics can revolutionize the early detection of diseases like cancer and neurodegenerative disorders through the principle of oscillation.\\n\\n**The Basic Principles of Quantum Oscillation** \\nQuantum oscillation refers to the periodic change in the state of a quantum system. This concept, steeped in the realms of quantum physics, describes how systems such as electrons can exist in multiple states simultaneously, exhibiting oscillatory behavior between these states under external influences. Harnessing these principles in a medical context opens new frontiers; particularly, the oscillations can be indicative of biochemical changes in cells as they transition from healthy to diseased states.\\n\\n**Application in Disease Detection** \\nRecent studies have demonstrated that quantum oscillation can be utilized for the rapid detection of biomarkers associated with various diseases. For instance, researchers have developed quantum sensors that can detect minuscule changes in magnetic fields produced by biomolecules, such as early-stage cancer cells. By monitoring the oscillations in these fields, it's possible to identify the presence of cancer before traditional imaging technologies can.\\n\\n**Case Study: Cancer Detection** \\nTake, for example, the groundbreaking work conducted at the Quantum Health Institute. Researchers utilized a quantum sensor that exploits the oscillatory behavior of specific proteins known to be overexpressed in tumors. By pulling real-time data from the oscillation frequency of these proteins, they are developing a diagnostic tool that achieves 95% sensitivity for early-stage cancer detection, dramatically outperforming conventional cellular assays. This remarkable leap in accuracy and speed highlights the critical intersection of quantum physics and healthcare.\\n\\n**Future Directions** \\nAs we delve deeper into the future, the intersection of quantum technology and healthcare is set for significant expansion. Potential applications extend beyond cancer detection to cardiovascular diseases, where oscillatory biomarkers may offer insights into heart rhythms and early warning signs of elevation in risk factors. The challenges ahead include not just developing reliable technology but ensuring accessibility and integration within existing healthcare systems.\\n\\n**Conclusion** \\nThe potential implications of quantum oscillation in healthcare are profoundly expansive. As technology continues its rapid evolution, the ability to leverage quantum principles presents an opportunity to develop diagnostic tools that can transform patient outcomes. Researchers, clinicians, and policy-makers must work collaboratively to bring these innovations from the laboratory into the clinic, paving the way for a new era in early disease detection and prevention.\", 'In the realm of healthcare technology, the integration of data science has revolutionized patient care and diagnostics. One significant area of growth is the application of artificial intelligence (AI) and machine learning algorithms in medical imaging. By harnessing the principles of gravitation, we can draw parallels between the intricate patterns seen in the physical universe and those found in complex medical data.\\n\\nJust as gravitation influences celestial bodies within cosmology, AI algorithms can be designed to identify specific markers and anomalies in imaging data, tugging at the strings of the vast amounts of information produced in radiology. This technology allows for quicker and more accurate diagnoses, guiding practitioners as they navigate through potential health threats much like stars are influenced by gravitational forces in their orbital paths.\\n\\nMoreover, the innovative use of AI in predictive analytics enables healthcare providers to foresee potential health crises before they escalate, similar to how cosmologists predict the behaviors of celestial systems based on observable data. By analyzing a patient’s history and real-time biometric data, AI can alert healthcare professionals to imminent issues, ensuring timely intervention and improved patient outcomes.\\n\\nUltimately, the intersection of healthcare and cutting-edge technology, particularly through AI, mimics the profound connections found in the vast expanse of the cosmos. Just as the laws of cosmology help us understand the universe, leveraging data science to unlock the potential of healthcare can lead to safer, more effective treatment regimens tailored to individual patient needs. As this field continues to evolve, we can expect to see even greater breakthroughs that illuminate the path toward a healthier future, navigating the complexities of human health with the same curiosity and precision that astrophysicists apply to the mysteries of the universe.', \"**The Interplay of Healthcare and Technology: A Paradigm Shift in Medical Cosmology** \\nBy Dr. Lydia Winchester, Professor of Health Sciences \\n\\nIn recent years, the healthcare landscape has witnessed an unprecedented momentum propelled by advances in technology and a deeper understanding of human biology. This momentum is not just reshaping patient care but also revolutionizing the complexities inherent in health sciences, akin to the unfolding mysteries of cosmology—the branch of astrophysics that studies the universe's origins, evolution, and eventual fate. Just as cosmologists strive to understand the universe through complex theories and ever-evolving data, healthcare professionals are increasingly integrating innovative technologies to demystify healthcare patterns and enhance patient outcomes. \\n\\nHistorically, healthcare has relied heavily on traditional methodologies largely rooted in analog systems. However, the advent of technologies such as artificial intelligence (AI), big data analytics, and telemedicine has initiated a crucial evolution that aligns seamlessly with the concept of cosmological inquiry. One of the most intriguing parallels is the way both fields utilize vast sets of data to draw insights—a fundamental practice in cosmology when analyzing cosmic evolution or the formation of galaxies. In healthcare, data collected from electronic health records, wearable devices, and genomic sequencers serve as the galaxies from which we extrapolate trends, identify anomalies, and personalize patient treatments. \\n\\nTake, for example, predictive analytics. Just as cosmologists use observational data to make predictions about cosmic events, healthcare professionals are employing machine learning algorithms to forecast disease outbreaks and patient deterioration. The shift toward a more predictive model in healthcare is revolutionary; it holds the power to save lives by allowing for early interventions tailored to individual risk profiles. In this context, the merging of technology and healthcare becomes a metaphorical universe where practitioners explore and test the boundaries of traditional medicine through an evidence-based approach. \\n\\nFurthermore, the technology-driven transformation of healthcare encourages a cosmological perspective on health systems. The ramifications of implementing technological solutions reach far beyond individual patients to affect the overall healthcare ecosystem. Telehealth services have disrupted geographical constraints, making specialized care accessible to rural or underrepresented populations—similarly to how advanced telescopes have expanded our view of the universe. This democratization of healthcare indicates a significant leap analogous to how cosmic discoveries have reshaped our understanding of existence and our place within the universe. \\n\\nHowever, the integration of technology must be approached with caution. Ethical considerations surrounding patient privacy, data security, and equitable access to new technological solutions are paramount. As we navigate this dynamic interface between healthcare and technology, stakeholders must ensure that advances do not disproportionally favor certain populations, perpetuating existing inequalities akin to the misalignment of celestial bodies—an important consideration in cosmology. \\n\\nAs we continue to dissect the intricate fabric of health sciences through the lens of technology, it is imperative to remember that the ultimate objective remains clear: improving patient outcomes and promoting global health. This calls for an ongoing dialogue among technologists, healthcare professionals, and policymakers to ensure that innovative solutions align with ethical practices—thereby fostering a healthcare system that resonates with the harmonious balance of forces we observe in the cosmos. \\n\\nIn conclusion, the synergy between healthcare and technology encapsulates a momentum that mirrors the exploration of the universe—a journey through which we seek to unravel the complexities of health and disease. Much like our quest into the stars, the exploration of innovative solutions in healthcare promises to yield transformative insights and breakthroughs, reshaping our understanding of health and wellbeing for generations to come.\", '### The Impact of Optical Interference in Laser-Based Healthcare Technologies\\n\\nAs we venture further into the integration of advanced technologies in health sciences, one of the pivotal developments is the application of optical interference in laser-based therapies. Optical interference, a fundamental principle related to the way light waves interact, has profound implications across various medical disciplines—from diagnostics to treatment methodologies.\\n\\n#### Understanding Optical Interference\\n\\nOptical interference occurs when two or more light waves superpose to form a resultant wave of greater or lesser amplitude. This phenomenon can be constructive, enhancing the intensity of light, or destructive, leading to reduced intensity. Harnessing this property can significantly enhance the sensitivity of imaging modalities and therapeutic techniques such as phototherapy and laser surgeries.\\n\\n#### Applications in Healthcare\\n\\n##### 1. **Diagnostic Imaging** \\nOptical coherence tomography (OCT) is a prime example of how optical interference principles are employed in diagnostic imaging. By utilizing low-coherence light waves, OCT permits the visualization of tissue microstructures in real-time with unprecedented resolution. This technology is pivotal in ophthalmology for assessing retinal diseases and has increasingly been adopted in cardiology and oncology for imaging various tissues, enhancing early diagnosis and treatment efficacy.\\n\\n##### 2. **Laser Therapies** \\nIn the realm of treatment, laser technologies exploit optical interference to selectively target diseased tissues. For instance, in dermatology, pulse dye lasers utilize the interference of light waves to destroy vascular lesions while preserving surrounding healthy tissue. Similarly, in oncological treatments, photodynamic therapy employs light-activated drugs where optical coherence relies on interference patterns to maximize therapeutic outcomes by selectively destroying cancerous cells.\\n\\n##### 3. **Optogenetics** \\nAnother cutting-edge application of optical interference lies in the field of optogenetics, which bridges neuroscience and optics. By using light to control neurons that have been genetically sensitized to respond to it, researchers are uncovering new pathways for treating neurological disorders. The precision achieved through optical interference enables targeted modulation of neuronal activity, vastly improving our understanding and treatment of conditions such as epilepsy and depression.\\n\\n#### Future Directions in Optical Healthcare Technologies\\n\\nThe future synthesis of optical interference and healthcare technologies is boundless. Ongoing research focuses on enhancing the resolution of imaging techniques while reducing the invasiveness of laser-based treatments. Innovations like adaptive optics are also crucial, aiming to correct optical aberrations in real-time during therapeutic procedures. \\n\\nMoreover, as we develop a deeper understanding of nanotechnology, the role of interference in biomedical applications is set to expand even further. Nano-sized particles can be designed to modulate light in ways that enhance imaging and drug delivery systems, creating the potential for more personalized and effective healthcare interventions.\\n\\n#### Conclusion\\n\\nIn summary, the profound principles of optical interference are at the forefront of transforming healthcare technologies. From enhanced imaging techniques to targeted laser therapies and even innovations in neuromodulation, the integration of optics into medical science holds promise for improving patient outcomes and revolutionizing treatment paradigms. As researchers continue to explore the capabilities of optical technologies, we are on the brink of discovering solutions that were once thought to be the realm of science fiction.', '**Title: Advanced Applications of Nuclear Optics in Healthcare: Revolutionizing Imaging Techniques** \\n**Author: Dr. Elena C. Reynolds, Professor of Medical Optics and Nuclear Imaging** \\n\\n**Abstract:** \\nAs we continue to unravel the mysteries of human health, the integration of innovative fields such as nuclear optics into healthcare presents groundbreaking possibilities, particularly in medical imaging. This article explores the synergistic potential of nuclear optics, predominantly derived from advancements in radiative properties and optical imaging methods, and its transformative impact on diagnosis and therapeutic procedures in modern medicine. \\n\\n**Introduction:** \\nNuclear optics, a specialized field focusing on the interaction of nuclear radiation with optical systems, has emerged as a vital area of study within medical science. It allows for the development of sophisticated imaging modalities that capture the dynamics of biological systems with unprecedented precision. The combination of nuclear techniques with advanced optical methods has incredible implications for improving diagnostic accuracy and patient outcomes. \\n\\n**Exploring Nuclear Imaging Modalities:** \\nTraditional imaging techniques such as X-rays and ultrasounds provide foundational insight into anatomical structures but often fall short in assessing functional statuses of tissues. Nuclear medicine, utilizing isotopes to visualize disease processes, offers a complementary approach, and when paired with optical technologies, we can enhance both spatial and temporal resolution. One promising innovation is the application of scintillation detectors, which utilize optical techniques to transform the gamma emissions from radiopharmaceuticals into visible light, providing real-time imaging capabilities. \\n\\n**Recent Advances in Optical Technologies:** \\nThe intersection of optics and nuclear imaging has been bolstered by developments in photon detection technologies. Advances in single-photon emission computed tomography (SPECT) and positron emission tomography (PET) now exploit high-resolution optics to analyze radiopharmaceutical distributions with improved clarity. Techniques such as time-of-flight PET leverage the speed of light to better establish the origins of gamma photons, enhancing localization accuracy in tissues where malignancies are suspected. \\n\\n**Potential in Targeted Therapeutics:** \\nCombining nuclear optics with targeted therapy further propels us into a new era of personalized medicine. Optical imaging parameters can optimize the delivery of radioactive treatments aimed specifically at tumor sites. By assessing real-time biodistribution of therapeutics, healthcare professionals can adjust dosages dynamically, tailoring treatments to the patient’s unique biological responses. This adaptability not only maximizes the likelihood of treatment success but also minimizes potential side effects associated with systemic administrations. \\n\\n**Future Directions and Challenges:** \\nDespite the promise that nuclear optics holds, there remain challenges regarding the integration of these technologies into routine clinical practice. Issues related to safety, regulatory standards, and costs must be diligently addressed to facilitate widespread adoption. Collaborative efforts among physicists, biologists, and policymakers are essential to design robust frameworks for deploying these advanced imaging techniques. \\n\\n**Conclusion:** \\nThe evolving landscape of healthcare technology increasingly points towards the convergence of nuclear imaging and optical advancements. By harnessing the strengths of nuclear optics, we stand at the cusp of a new frontier in medical diagnostics and therapies, ultimately striving for enhanced patient care and informed clinical decisions. As we forge ahead, ongoing research and innovation will be pivotal in realizing the full potential of this exciting interdisciplinary approach.', \"**Advancements in Machine Learning and Quantum Computing in Healthcare**\\n\\nAs healthcare systems around the globe continue to evolve, two interrelated strands of technology are poised to drive transformative change: machine learning (ML) and quantum computing. The convergence of these two fields stands to improve diagnostic accuracy, optimize treatment plans, and, ultimately, enhance patient outcomes.\\n\\n**Machine Learning in Medical Diagnosis** \\nMachine learning, a subfield of artificial intelligence, utilizes algorithms that can learn from and make predictions based on data. Its application in medical diagnostics is already having profound impacts. For example, ML algorithms have shown efficacy in analyzing medical imaging data, identifying patterns indicative of various diseases such as cancers or neurological disorders better than ever before. These systems are trained using large datasets, enabling them to learn nuanced patterns that may elude even experienced radiologists.\\n\\nAdditionally, ML can improve predictive analytics within healthcare systems. By analyzing historical patient data, including demographic information and clinical histories, machine learning models can predict patient risks and outcomes. This remote monitoring can facilitate early intervention strategies, reducing hospitalization rates and improving health management in chronic conditions.\\n\\n**Quantum Computing's Role** \\nWhile machine learning is reshaping data analysis within healthcare, quantum computing adds exponentially to the potential capabilities of these systems. Quantum computers operate using qubits, which can represent and process data at a speed far exceeding classical computers. This processing power is particularly advantageous for tasks involving vast datasets that are common in genomic research, drug discovery, and personalized medicine. \\n\\nQuantum algorithms, when combined with machine learning, may one day allow healthcare professionals to simulate complex biochemical interactions in real-time, leading to unique solutions for treatment planning and drug formulation. For instance, a quantum-enhanced ML model could analyze genetic data and predict individual responses to medication more efficiently, thus taking precision medicine to new heights.\\n\\n**Addressing Ethics and Equity** \\nHowever, the integration of machine learning and quantum computing into healthcare is not without its challenges. As we harness the power of these technologies, we must also remain vigilant about the ethical considerations involved. Issues of data privacy, algorithmic bias, and equitable access to technology must be prioritized to prevent the exacerbation of existing healthcare disparities. Implementing robust frameworks that govern the use of ML and quantum computing in healthcare will ensure these advancements benefit all segments of the population. \\n\\n**Conclusion** \\nIn conclusion, the fusion of machine learning and quantum computing holds transformative potential for healthcare. By harnessing the predictive power of these technologies, the medical community can improve diagnostics, treatment plans, and patient care optimization. As we move forward, a holistic approach that considers ethical implications and aims for equitable access will be vital to fulfill the promise of these technological advancements in healthcare.\", '### The Dynamics of Healthcare Innovation: Challenges and Opportunities for the 21st Century\\n\\n**By Dr. Emily Rodriguez, Professor of Health Sciences** \\n**Department of Public Health and Health Systems Management** \\n**University of Innovation and Advancement** \\n\\nIn the ever-evolving landscape of healthcare, the dynamics of innovation play a critical role in shaping the delivery of services, enhancing patient outcomes, and improving overall public health. As we navigate through the complexities of modern medicine, it is essential to understand how innovation can address some of the most pressing challenges faced by healthcare systems worldwide. \\n\\n#### The Importance of Innovation in Healthcare\\n\\nInnovation in healthcare is not merely about the development of new pharmaceuticals or medical devices; it encompasses a broad spectrum of advancements in technology, processes, and organizational management. As we embrace the digital age, the integration of technology into healthcare delivery offers unprecedented opportunities to enhance efficiency and patient care. Virtual health solutions, telemedicine, and electronic health records are prime examples of how innovation can transform traditional healthcare paradigms. These technologies facilitate better communication between patients and providers, streamline operations, and allow for more personalized care. \\n\\nHowever, with innovation comes the necessity to navigate various dynamics that influence its adoption and implementation. A significant variable within this dynamic is the engagement of patients, ensuring that they are not only recipients of healthcare but also active participants in their journey towards wellness. Healthcare providers must embrace these innovations and educate patients on how to effectively utilize these tools, removing barriers to access and understanding. \\n\\n#### Key Dynamics Affecting Healthcare Innovation\\n\\n1. **Regulatory Environment**: The regulatory landscape can significantly impact the rate at which innovation is adopted in healthcare. While regulations safeguard patient safety and wellbeing, they can also hinder the swift implementation of new technologies. Striking a balance between safety and innovation is essential for fostering an environment conducive to advancement.\\n\\n2. **Economic Factors**: There remains an ongoing struggle within healthcare financing. As systems shift towards value-based care, understanding the economic dynamics behind adopting innovative practices becomes more relevant. Innovative solutions often necessitate upfront investment, even if they lead to long-term savings and improved outcomes. \\n\\n3. **Collaboration and Interdisciplinary Approaches**: Successful innovation often arises at the intersection of various disciplines. Collaborative efforts among technologists, healthcare providers, and policymakers can lead to holistic solutions that address multifaceted issues in patient care. Academic institutions and industry partnerships are increasingly vital in this regard.\\n\\n4. **Cultural Shifts**: The cultural attitude towards healthcare also affects the dynamics of innovation. As patients become more informed and engaged through access to information and digital platforms, their appointment of authority in their care needs to be acknowledged. Healthcare systems must evolve to accommodate this shift, ensuring that innovations are patient-centered. \\n\\n#### The Future of Healthcare Innovation\\n\\nMoving forward, the path of innovation in healthcare appears bright but requires concerted effort from all stakeholders involved. As we explore avenues such as artificial intelligence, machine learning, and data analytics, we must also be conscious of the ethical implications these technologies might carry. Furthermore, as advancements occur, so too must the workforce adapt; enhancing educational resources for healthcare professionals regarding new technologies will ensure our leaders are adequately prepared to foster a culture of innovation. \\n\\nIn conclusion, by addressing the dynamics surrounding healthcare innovation, we can harness its full potential to improve the quality of care delivered to populations globally. As we stand on the brink of numerous advancements, we must ask ourselves how to navigate these changes thoughtfully, ethically, and tirelessly in pursuit of a healthier future for all.', \"**Revolutionizing Healthcare Through Machine Learning Applications** \\n*By Dr. Jane Porter, Professor of Health Informatics* \\n \\nThe integration of machine learning (ML) in healthcare represents a paradigm shift in how we approach patient care, diagnostics, and treatment planning. As modern medicine evolves, the intersection of healthcare and technology, particularly the utilization of advanced computational methods, becomes increasingly pivotal in addressing complex health challenges. \\n \\nMachine learning, a subset of artificial intelligence, empowers computers to analyze vast amounts of data, identify patterns, and make predictions with minimal human intervention. In healthcare, this capability holds transformative potential across various applications. \\n \\n**Predictive Analytics for Patient Outcomes** \\nOne of the most compelling applications of ML in healthcare is predictive analytics. By harnessing electronic health record (EHR) data, machine learning algorithms can be trained to recognize indicators that predict adverse outcomes. For example, patients with chronic conditions such as diabetes can be monitored more effectively through predictive models that assess various factors, including previous hospitalizations, medication adherence, and socio-economic status. This proactive approach can lead to timely interventions, thereby improving patient outcomes and reducing healthcare costs. \\n \\n**Enhancing Diagnostic Accuracy** \\nIn addition to predictive analytics, machine learning enhances diagnostic accuracy, particularly in radiology. Traditional methods of diagnosis heavily rely on physician expertise; however, human error and bias can sometimes lead to misdiagnoses. Algorithms that analyze radiological images can identify nuances that human eyes might miss. Studies have shown that machine learning models can outperform radiologists in detecting early-stage cancers, thereby promoting timely treatment and better prognosis. \\n \\n**Personalized Treatment Plans** \\nMoreover, ML-driven insights are paving the way for personalized medicine. Utilizing genomic data, machine learning can help tailor treatment plans to the individual’s genetic makeup. The burgeoning field of pharmacogenomics benefits significantly from this; algorithms predict how patients will respond to specific medications based on their genetic profiles, aiming to maximize efficacy while minimizing side effects. The ability to customize treatment represents a move away from the one-size-fits-all approach that has dominated medical practice for decades. \\n \\n**Operational Efficiency** \\nFinally, machine learning enhances operational efficiency within healthcare establishments. By analyzing workflow data, ML can identify bottlenecks in patient flow, optimizing scheduling and resource allocation. This streamlining of operations not only improves the patient experience by reducing wait times but also ensures the judicious use of healthcare resources. \\n \\n**Challenges and Considerations** \\nDespite the promising advances that machine learning brings, several challenges remain. Data privacy is of paramount concern; patients' sensitive health information must be safeguarded. Furthermore, there is a need for transparency in the algorithms used in clinical settings. Understanding the decision-making process of these models is crucial for gaining the trust of healthcare providers and patients alike. \\n \\nIn conclusion, the burgeoning field of machine learning offers unprecedented opportunities to enhance the efficacy and efficiency of healthcare delivery. As educators and researchers, it is our responsibility to lead this technological revolution not merely through innovation but with ethical integrity and an unwavering focus on patient welfare. Embracing technology, such as advanced computer systems for machine learning, is essential as we strive toward a more accurate, personalized, and efficient healthcare system.\", 'In recent years, the integration of technology in healthcare has transformed patient care significantly, particularly regarding the management of chronic diseases. One of the most promising areas of development is the use of computer-assisted healthcare systems, which allows for real-time monitoring and management of patient data.\\n\\nThese systems utilize advanced algorithms that can analyze a plethora of data points, enabling healthcare providers to make or recommend decisions with greater accuracy and efficiency. The interference of human error, frequently seen in manual data entry and interpretation, is drastically reduced through automated systems. Using electronic health records (EHR) linked with wearable health devices, patients can have their vital signs monitored continuously, mitigating risks related to chronic conditions such as diabetes and hypertension.\\n\\nHowever, the implementation of such technologies isn’t without challenges. Issues like data security, patient privacy, and the potential for technology-induced misunderstandings can arise. It is essential for healthcare professionals to be trained adequately on these systems to minimize any interference that could result from technological failures or misinterpretations of data. Additionally, patient education plays a vital role; they need to understand their health data and how to use the technology effectively.\\n\\nAs we advance into a more digitized medical landscape, the cooperation between technology developers, healthcare providers, and patients will be crucial. The ultimate goal is to ensure that the interference caused by outdated practices is eliminated, leading to an efficient, patient-centered approach that leverages the strengths of modern computer systems in enhancing the quality of healthcare.']\n" - ] - } - ], - "source": [ - "# data loading\n", - "from aif_gen.dataset.continual_alignment_dataset import ContinualAlignmentDataset\n", - "\n", - "lipschitz_data = ContinualAlignmentDataset.from_json(\n", - " 'data/4omini_generation/merged_tech_physics.json'\n", - ")\n", - "piecewise_data = ContinualAlignmentDataset.from_json(\n", - " 'data/4omini_generation/merged_politics_generate.json'\n", - ")\n", - "\n", - "# only get the prompts shuffled and only 10K prompts\n", - "data_lip = lipschitz_data.datasets[0].samples\n", - "data_piecewise = piecewise_data.datasets[0].samples\n", - "\n", - "prompts_lip = []\n", - "for sample in data_lip:\n", - " prompts_lip.append(sample.prompt)\n", - "\n", - "# randomly shuffle the prompts and keep only 10K\n", - "import random\n", - "\n", - "random.shuffle(prompts_lip)\n", - "prompts_lip = prompts_lip[:10000]\n", - "\n", - "prompts_piecewise = []\n", - "for sample in data_piecewise:\n", - " prompts_piecewise.append(sample.prompt)\n", - "# randomly shuffle the prompts and keep only 10K\n", - "random.shuffle(prompts_piecewise)\n", - "prompts_piecewise = prompts_piecewise[:10000]\n", - "print(prompts_piecewise[:10])\n", - "print(prompts_lip[:10])" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "f04d8316", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "||T12|| = 0.86, ||T23|| = 0.83\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Interp T12: 100%|██████████| 11/11 [13:07<00:00, 71.56s/it]\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAd29JREFUeJzt3XlYVNX/B/D3zAAzgKwiqyibioiKYiDuCypaLtnivlCpaX5/FZVli6RZLpmZ5ZZmau6VmaWiiJIbikq444IgqKwurAIDc39/EFPIOgjcgXm/nmeepzn33DOfyxnywz3nniMRBEEAERERkQ6Rih0AERERUX1jAkREREQ6hwkQERER6RwmQERERKRzmAARERGRzmECRERERDqHCRARERHpHCZAREREpHOYABEREZHOYQJERA3O5MmT4eTkVKpMIpHg008/FSWehmDIkCGYMmWK2GE0GCEhIWjSpAnS0tLEDoXqCBMgatA2bNgAiUSifunp6cHBwQGTJ0/G3bt3y9Tv06cPJBIJWrVqVW57oaGh6rZ++eUXdXl2djaCg4MREBAAS0tLSCQSbNiwoVavxcnJqdS1GBsbw8fHB5s2bSpTNzw8XF1v8+bN5bbXvXt3SCQSeHp6qstyc3OxYsUKDBw4EHZ2djAxMUGnTp2watUqFBUV1SjuyMhISCQSfP3112WODR8+HBKJBD/++GOZY7169YKDg0ONPrO2bN26FcuWLRM1hvpw4sQJHDx4EO+//766rOQ79N/vOQAUFBTgueeeg1Qqxfr165/qc5/8/fzvKzk5ucrzJ0+eXO657u7uZeomJSVh6tSpcHZ2hqGhIVxdXREUFIT79++XqatSqbBq1Sp4eXnB0NAQTZs2Rb9+/XD+/Hl1nYCAALi5uWHBggVP9TMg7aUndgBEtWHevHlwdnZGXl4eTp06hQ0bNuD48eO4dOkSFApFqboKhQI3b95EZGQkfHx8Sh3bsmULFAoF8vLySpWnp6dj3rx5aNGiBTp27Ijw8PA6uQ4vLy+88847AIr/h75u3TpMmjQJ+fn55f71rlAosHXrVowfP75UeXx8PE6ePFnm2m/duoX//e9/6N+/P4KCgmBqaooDBw5gxowZOHXqFDZu3KhxzJ07d4aRkRGOHz+Ot99+u9SxkydPQk9PDydOnEBgYKC6vKCgAGfOnMHQoUM1/ryKPH78GHp6mv0vbevWrbh06RLeeuutWotDG3355Zfo378/3NzcKq2nVCrx4osvYt++fVi7di1eeeWVWvn8kt/P/zI3N6/WuXK5HOvWrStVZmZmVup9dnY2/Pz8kJOTgxkzZsDR0RHnz5/Hd999hyNHjuDcuXOQSv/9e/+VV17Bli1bMHHiRMycORM5OTn4+++/kZqaWqrdadOm4d1338XcuXNhYmKiwRVTgyAQNWA//vijAEA4c+ZMqfL3339fACDs2LGjVHnv3r2Fdu3aCW3atBHeeuutUsceP34smJqaCi+88IIAQPj555/Vx/Ly8oSkpCRBEAThzJkzAgDhxx9/rNVradmypfDss8+WKktNTRWaNGkitG3btlT5kSNHBADCyJEjBT09PSEtLa3U8c8//1ywsbERevToIbRr105dnpaWJly6dKnMZwcGBgoAhBs3btQo9r59+wo2NjalymJiYgQAwtixY4U2bdqUOnby5EkBgPDNN9/U6PMmTZoktGzZskbn/tezzz5bK+1os5SUFEFPT09Yt25dqfKS71DJ97ygoEAYMWKEIJFIhO+//75WPrui38/qmjRpkmBsbFxlvS1btggAhD///LNU+Zw5cwQAQlRUlLpsx44dAgBh165dVbabkpIiyGQy4YcfftA8eNJ6HAKjRqlnz54AgNjY2HKPjxkzBjt27IBKpVKX/fHHH8jNzcXLL79cpr5cLoetrW3dBFuJZs2awd3dvcLrGD58OORyOX7++edS5Vu3bsXLL78MmUxWqtzKygrt2rUr087zzz8PALh69Wqp8tjY2Ao/+7969OiBlJQU3Lx5U1124sQJmJqaYurUqbh27RrS09NLHSs5ryq7d++Gp6cnFAoFPD098dtvv5Vb78k5QFlZWXjrrbfg5OQEuVwOa2trDBgwAFFRUQCKh0P37t2L27dvq4dWnpxX9F+enp7o27dvmXKVSgUHBwe8+OKL6rLt27fD29sbJiYmMDU1Rfv27fHNN99Uea0PHjzAK6+8AgsLC1hYWGDMmDF4+PAhdu/eDYVCgezs7CrbeNLevXtRWFgIf3//CusUFhZi9OjR+P3337Fq1ao6mSuUlZVV42HWoqIiZGZmVni85JiNjU2pcjs7OwCAoaGhumzp0qXw8fHB888/D5VKhZycnArbtba2RocOHfD777/XKG7SbkyAqFGKj48HAFhY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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Interp T23: 100%|██████████| 11/11 [13:05<00:00, 71.39s/it]\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAghdJREFUeJzt3Xlc1NX6B/DPzAAzgKwiOwjiiogoBmqaS7iWaVm5VC63ss17S9t+tmja4pKZLaZl1zYzLevaZiSilAtKLrjvoiCyI7vAwJzfHzCjyCKDM3xn+bxfL+6N75z5zjMclsdznnOOTAghQERERGRF5FIHQERERNTamAARERGR1WECRERERFaHCRARERFZHSZAREREZHWYABEREZHVYQJEREREVocJEBEREVkdJkBERERkdZgAEZHZmTZtGoKCgupck8lkeOONNySJx1AqKyvx/PPPw8fHBw4ODujZsye++eabW75vSUkJPD098e233xogSuuwatUqBAYGoqKiQupQyEiYAJFZ+/LLLyGTyXQfNjY28PPzw7Rp05Cenl6v/eDBgyGTydCpU6cG7xcXF6e718aNG3XX//nnH8ycORPdu3eHo6MjAgMD8eCDD+L06dMGey9BQUF13oujoyOioqLw9ddf12ubkJCga7d27doG73f77bdDJpMhLCyszvV33nkHffv2Rbt27aBSqdCpUyc899xzyMnJaVHcSUlJkMlkeP/99+s9NnbsWMhkMnzxxRf1Hrvjjjvg5+fXotc0lHXr1mH58uWSxnC9V199FcuWLcPtt9+OZcuWoVu3bpgyZQp+//33W7rvBx98ACcnJ0ycOFF37Y033oBMJkNubm6dtmlpaQgJCYG7uzsOHDhwS6+7evVqDBo0CF5eXlAqlQgODsb06dNx4cIFve9VUFAAT0/Pej+bWmfOnMHEiRPh7+8PBwcHdO3aFQsWLEBZWVmddtrfATd+jBw5sk67adOmobKyEp9++qnesZJ5sJE6ACJDWLBgAYKDg1FeXo49e/bgyy+/xM6dO3H06FGoVKo6bVUqFc6ePYukpCRERUXVeezbb7+FSqVCeXl5neuLFy/Grl278MADDyA8PByZmZn4+OOP0bt3b+zZs6dektFSEREReP755wEAGRkZ+PzzzzF16lRUVFTg8ccfr9depVJh3bp1ePjhh+tcv3DhAnbv3l3v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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Empirical Lipschitz constants: K12=5.5859, K23=3.4846\n" - ] - } - ], - "source": [ - "import copy\n", - "import torch\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "from scipy.stats import wasserstein_distance\n", - "from tqdm import tqdm\n", - "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n", - "\n", - "\n", - "# -----------------------------------------------------------------------------\n", - "# Utilities for state‐dict arithmetic & norms\n", - "# -----------------------------------------------------------------------------\n", - "def subtract_state_dicts(sd_a, sd_b):\n", - " return {k: sd_a[k] - sd_b[k] for k in sd_a}\n", - "\n", - "\n", - "def add_scaled(sd_base, sd_delta, alpha):\n", - " return {k: sd_base[k] + alpha * sd_delta[k] for k in sd_base}\n", - "\n", - "\n", - "def state_dict_norm(sd):\n", - " total = torch.stack([v.flatten().dot(v.flatten()) for v in sd.values()]).sum()\n", - " return torch.sqrt(total).item()\n", - "\n", - "\n", - "# -----------------------------------------------------------------------------\n", - "# Load your 3 reward models & tokenizer\n", - "# -----------------------------------------------------------------------------\n", - "paths = [\n", - " 'LifelongAlignment/aifgen-lipschitz-0-reward-model',\n", - " 'LifelongAlignment/aifgen-lipschitz-1-reward-model',\n", - " 'LifelongAlignment/aifgen-lipschitz-2-reward-model',\n", - "]\n", - "\n", - "models = [\n", - " AutoModelForSequenceClassification.from_pretrained(\n", - " p,\n", - " torch_dtype=torch.bfloat16,\n", - " cache_dir='//network/scratch/s/shahrad.mohammadzadeh/.cache',\n", - " ).cuda()\n", - " for p in paths\n", - "]\n", - "tokenizer = AutoTokenizer.from_pretrained(paths[0])\n", - "\n", - "# -----------------------------------------------------------------------------\n", - "# Compute task vectors & their norms\n", - "# -----------------------------------------------------------------------------\n", - "sd1, sd2, sd3 = [m.state_dict() for m in models]\n", - "T12 = subtract_state_dicts(sd2, sd1)\n", - "T23 = subtract_state_dicts(sd3, sd2)\n", - "norm12 = state_dict_norm(T12)\n", - "norm23 = state_dict_norm(T23)\n", - "print(f'||T12|| = {norm12:.2f}, ||T23|| = {norm23:.2f}')\n", - "\n", - "# -----------------------------------------------------------------------------\n", - "# Load your prompts\n", - "# -----------------------------------------------------------------------------\n", - "prompts = prompts_lip\n", - "\n", - "# In experiments.ipynb, add a new cell before your interpolation\n", - "\n", - "from torch.utils.data import DataLoader, Dataset\n", - "\n", - "\n", - "class PromptDataset(Dataset):\n", - " def __init__(self, prompts):\n", - " self.prompts = prompts\n", - "\n", - " def __len__(self):\n", - " return len(self.prompts)\n", - "\n", - " def __getitem__(self, i):\n", - " return self.prompts[i]\n", - "\n", - "\n", - "def compute_rewards(model, prompts, batch_size=64, num_workers=4):\n", - " \"\"\"Compute reward scores in batches.\"\"\"\n", - " model.eval()\n", - " ds = PromptDataset(prompts)\n", - " loader = DataLoader(\n", - " ds,\n", - " batch_size=batch_size,\n", - " shuffle=False,\n", - " num_workers=num_workers,\n", - " collate_fn=lambda batch: tokenizer(\n", - " batch,\n", - " return_tensors='pt',\n", - " padding=True,\n", - " truncation=True,\n", - " ),\n", - " )\n", - " rewards = []\n", - " with torch.no_grad():\n", - " for batch in loader:\n", - " batch = {k: v.cuda(non_blocking=True) for k, v in batch.items()}\n", - " logits = model(**batch).logits\n", - " # if binary head, pick class 1; else regression head\n", - " if logits.shape[-1] > 1:\n", - " vals = logits[:, 1]\n", - " else:\n", - " vals = logits[:, 0]\n", - " rewards.extend(vals.cpu().tolist())\n", - " return rewards\n", - "\n", - "\n", - "# -----------------------------------------------------------------------------\n", - "# Interpolate along T12 (RM1 → RM2)\n", - "# -----------------------------------------------------------------------------\n", - "alphas = np.linspace(0, 1, 11)\n", - "all_rewards_12 = []\n", - "for α in tqdm(alphas, desc='Interp T12'):\n", - " sd_interp = add_scaled(sd1, T12, α)\n", - " m = copy.deepcopy(models[0])\n", - " m.load_state_dict(sd_interp)\n", - " all_rewards_12.append(compute_rewards(m, prompts, batch_size=1024))\n", - "\n", - "# Wasserstein distances & Lipschitz estimate\n", - "dists12 = [\n", - " wasserstein_distance(all_rewards_12[i], all_rewards_12[i + 1])\n", - " for i in range(len(alphas) - 1)\n", - "]\n", - "rates12 = [d / ((alphas[i + 1] - alphas[i]) * norm12) for i, d in enumerate(dists12)]\n", - "K12 = max(rates12)\n", - "\n", - "plt.figure()\n", - "plt.plot(alphas[:-1], dists12, marker='o')\n", - "plt.title(f'RM1→RM2: W-dist vs α (K≈{K12:.3f})')\n", - "plt.xlabel('α')\n", - "plt.ylabel('Wasserstein')\n", - "plt.grid(True)\n", - "plt.show()\n", - "\n", - "# -----------------------------------------------------------------------------\n", - "# Interpolate along T23 (RM2 → RM3)\n", - "# -----------------------------------------------------------------------------\n", - "betas = np.linspace(0, 1, 11)\n", - "all_rewards_23 = []\n", - "for β in tqdm(betas, desc='Interp T23'):\n", - " sd_interp = add_scaled(sd2, T23, β)\n", - " m = copy.deepcopy(models[1])\n", - " m.load_state_dict(sd_interp)\n", - " all_rewards_23.append(compute_rewards(m, prompts, batch_size=1024))\n", - "\n", - "dists23 = [\n", - " wasserstein_distance(all_rewards_23[i], all_rewards_23[i + 1])\n", - " for i in range(len(betas) - 1)\n", - "]\n", - "rates23 = [d / ((betas[i + 1] - betas[i]) * norm23) for i, d in enumerate(dists23)]\n", - "K23 = max(rates23)\n", - "\n", - "plt.figure()\n", - "plt.plot(betas[:-1], dists23, marker='o')\n", - "plt.title(f'RM2→RM3: W-dist vs β (K≈{K23:.3f})')\n", - "plt.xlabel('β')\n", - "plt.ylabel('Wasserstein')\n", - "plt.grid(True)\n", - "plt.show()\n", - "\n", - "print(f'Empirical Lipschitz constants: K12={K12:.4f}, K23={K23:.4f}')" - ] - }, - { - "cell_type": "markdown", - "id": "b127c047", - "metadata": {}, - "source": [ - "\n", - "This notebook tests whether the mapping from model parameters → reward distributions is (empirically) Lipschitz‐continuous along the “task vectors” between successive reward models. In practice, we:\n", - "\n", - "Compute task vectors between three successive reward models\n", - "Linearly interpolate model weights along each task vector\n", - "For each interpolation step, compute the Wasserstein distance between reward distributions on a fixed set of prompts\n", - "Normalize those distances by the interpolation step size and the task‐vector norm to get an empirical Lipschitz constant\n", - "1. Theory\n", - "1.1 Task Vectors\n", - "Given two models (M_A) and (M_B) with state‐dicts (\\theta_A) and (\\theta_B), we define the task vector\n", - "[ T_{AB} = \\theta_B - \\theta_A ]\n", - "Its norm (|T_{AB}|) measures how “far apart” the models are in parameter space.\n", - "\n", - "1.2 Lipschitz Continuity\n", - "A function (f) is Lipschitz continuous with constant (K) if for all (x,y):\n", - "[ |f(x) - f(y)| \\le K ,|x - y|. ]\n", - "Here (f) maps model parameters (\\theta) to the distribution of reward scores on a fixed prompt set.\n", - "\n", - "2. Method\n", - "Load 3 reward models:\n", - "(M_1, M_2, M_3) from paths\n", - "Compute task vectors & norms:\n", - "(T_{12} = \\theta_2 - \\theta_1), (|T_{12}|)\n", - "(T_{23} = \\theta_3 - \\theta_2), (|T_{23}|)\n", - "Sample a fixed set of prompts (e.g.\\ 10 K).\n", - "Interpolation: for (\\alpha\\in[0,1]), set\n", - "[ \\theta(\\alpha) = \\theta_1 + \\alpha,T_{12}. ]\n", - "Load these weights into a copy of (M_1).\n", - "Compute reward scores over the prompt set at each (\\alpha).\n", - "Measure adjacent‐step distance via the 1D Wasserstein distance between two reward‐score histograms.\n", - "Estimate rate\n", - "[ r_i = \\frac{W\\bigl(R(\\alpha_{i+1}),,R(\\alpha_i)\\bigr)}{(\\alpha_{i+1}-\\alpha_i),|T_{12}|}. ]\n", - "The maximum (r_i) is our empirical Lipschitz constant (K_{12}).\n", - "Repeat for (T_{23}) → get (K_{23}).\n", - "3. Interpreting Results\n", - "Plots\n", - "Wasserstein vs. α (resp. β) with markers at each interpolation step\n", - "A straight‐line (linear) growth indicates a stable Lipschitz behavior.\n", - "Empirical (K) values\n", - "If (K) is small (and roughly constant), the reward mapping is smooth along that path.\n", - "Spikes in the normalized rate → local non‐smoothness\n", - "Conclusion\n", - "Compare (K_{12}) and (K_{23}).\n", - "If both are bounded by some moderate constant, you have evidence that your data + model family exhibits Lipschitz continuity along these training transitions." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c834752b", - "metadata": {}, - "outputs": [], - "source": [ - "import copy\n", - "import torch\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "from scipy.stats import wasserstein_distance\n", - "from sklearn.cluster import KMeans\n", - "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n", - "\n", - "# Load models and compute task vectors (same as before)\n", - "models = [\n", - " AutoModelForSequenceClassification.from_pretrained(f'path/to/rm{i}').cuda()\n", - " for i in range(1, 4)\n", - "]\n", - "sd1, sd2, sd3 = [m.state_dict() for m in models]\n", - "T12 = {k: sd2[k] - sd1[k] for k in sd1}\n", - "T23 = {k: sd3[k] - sd2[k] for k in sd1}\n", - "\n", - "# Create a much finer interpolation grid to capture discontinuities\n", - "alphas = np.linspace(0, 1, 100) # 100 points instead of 11\n", - "reward_trajectories = np.zeros(\n", - " (len(prompts), len(alphas) * 2)\n", - ") # Store rewards for ALL prompts\n", - "\n", - "# First trajectory: RM1 → RM2\n", - "for i, α in enumerate(alphas):\n", - " sd_interp = {k: sd1[k] + α * T12[k] for k in sd1}\n", - " m = copy.deepcopy(models[0])\n", - " m.load_state_dict(sd_interp)\n", - " rewards = compute_rewards(m, prompts)\n", - "\n", - " # Store rewards for each prompt separately to track prompt-specific behavior\n", - " for p_idx, r in enumerate(rewards):\n", - " reward_trajectories[p_idx, i] = r\n", - "\n", - "# Second trajectory: RM2 → RM3\n", - "for i, β in enumerate(alphas):\n", - " sd_interp = {k: sd2[k] + β * T23[k] for k in sd2}\n", - " m = copy.deepcopy(models[1])\n", - " m.load_state_dict(sd_interp)\n", - " rewards = compute_rewards(m, prompts)\n", - "\n", - " for p_idx, r in enumerate(rewards):\n", - " reward_trajectories[p_idx, i + len(alphas)] = r\n", - "\n", - "\n", - "# Analysis specific to piecewise continuity\n", - "# 1. Detect discontinuities\n", - "def detect_discontinuities(reward_trajectory, threshold=2.0):\n", - " # Compute first differences\n", - " diffs = np.abs(np.diff(reward_trajectory))\n", - " # Find points with jump exceeding threshold * median change\n", - " median_change = np.median(diffs)\n", - " discontinuities = np.where(diffs > threshold * median_change)[0]\n", - " return discontinuities\n", - "\n", - "\n", - "# 2. Analyze prompt clustering based on reward trajectories\n", - "def cluster_prompts_by_trajectory(reward_trajectories, n_clusters=3):\n", - " kmeans = KMeans(n_clusters=n_clusters, random_state=0).fit(reward_trajectories)\n", - " return kmeans.labels_\n", - "\n", - "\n", - "# Detect discontinuities for each prompt across the entire trajectory\n", - "all_discontinuities = []\n", - "for p_idx in range(len(prompts)):\n", - " discs = detect_discontinuities(reward_trajectories[p_idx])\n", - " all_discontinuities.append(discs)\n", - "\n", - "# Cluster prompts by their reward trajectories\n", - "prompt_clusters = cluster_prompts_by_trajectory(reward_trajectories)\n", - "\n", - "# Visualize prompt-specific trajectories colored by cluster\n", - "plt.figure(figsize=(15, 10))\n", - "full_trajectory = np.concatenate(\n", - " [alphas, alphas + 1]\n", - ") # x-axis spanning both interpolations\n", - "for p_idx in range(len(prompts)):\n", - " plt.plot(\n", - " full_trajectory,\n", - " reward_trajectories[p_idx],\n", - " alpha=0.5,\n", - " color=f'C{prompt_clusters[p_idx]}',\n", - " )\n", - "\n", - " # Mark discontinuities if any\n", - " for disc in all_discontinuities[p_idx]:\n", - " plt.axvline(\n", - " x=full_trajectory[disc],\n", - " color=f'C{prompt_clusters[p_idx]}',\n", - " linestyle='--',\n", - " alpha=0.3,\n", - " )\n", - "\n", - "# Add vertical line at task boundary\n", - "plt.axvline(x=1.0, color='red', linestyle='-', linewidth=2)\n", - "plt.title('Reward Trajectories Across Task Transitions')\n", - "plt.xlabel('Interpolation Parameter (0-1: RM1→RM2, 1-2: RM2→RM3)')\n", - "plt.ylabel('Reward Value')\n", - "plt.show()\n", - "\n", - "# Create a heatmap of reward changes to visualize the piecewise structure\n", - "plt.figure(figsize=(12, 8))\n", - "# Compute absolute differences between adjacent points\n", - "reward_changes = np.abs(np.diff(reward_trajectories, axis=1))\n", - "plt.imshow(reward_changes, aspect='auto', cmap='viridis')\n", - "plt.colorbar(label='|Δ Reward|')\n", - "plt.axvline(x=len(alphas) - 1, color='red', linestyle='-', linewidth=2) # Task boundary\n", - "plt.title('Heatmap of Reward Changes')\n", - "plt.xlabel('Interpolation Step')\n", - "plt.ylabel('Prompt Index')\n", - "plt.show()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.11" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/continuity.ipynb b/notebooks/continuity.ipynb new file mode 100644 index 00000000..d260da6c --- /dev/null +++ b/notebooks/continuity.ipynb @@ -0,0 +1,541 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fe383535", + "metadata": {}, + "source": [ + "# Continuity Analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "45b95049", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/mila/s/shahrad.mohammadzadeh/projects/AIF-Gen/.venv/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\"As the political landscape continues to shift, the looming prospect of impeachment hearings has captured the attention of the American public. In recent weeks, officials from both sides of the aisle have been weighing in on the implications of such an unprecedented move. \\n\\nIn the latest developments, congressional leaders have announced plans to convene hearings that will address multiple allegations against the president, ranging from misuse of power to obstruction of justice. These hearings mark a pivotal moment in American politics, as they are not just a mechanism for accountability but also a reflection of the current partisan divide. s, who largely support the push for impeachment, argue that it is crucial to uphold the integrity of the office. Meanwhile, s have positioned themselves against what they perceive as a political witch hunt, claiming these efforts aim to weaken the presidency rather than serve justice.\\n\\nThe hearings are expected to spotlight testimony from key witnesses and experts, shedding light on the administration's actions over the past few years. Proponents of impeachment argue that the evidence will establish a pattern of behavior that calls into question the president’s respect for constitutional boundaries. Conversely, opponents are preparing to shape the narrative of these hearings to focus on what they see as politically motivated allegations lacking substantial evidence.\\n\\nUltimately, the outcome of the hearings may not only determine the fate of the presidency but also resonate through future s, influencing how campaigns are run and how power is wielded in Washington. As the date approaches, public interest continues to ignite debates across social media platforms and within community discussions, reminding us how this political theater remains a vital aspect of ic engagement.\", \"The political landscape often hinges on the interplay between rhetoric and policy, shaping how issues are perceived and addressed by both the electorate and lawmakers. In recent years, the sharp contrasts in political discourse have become increasingly apparent, with leaders utilizing emotionally charged language to rally support or to demonize opponents.\\n\\nTake, for example, the debate surrounding climate change. Proponents of aggressive environmental policies often employ rhetoric that emphasizes the urgent and existential threat posed by rising temperatures and natural disasters. This strategy aims to evoke a strong emotional response, prompting citizens to back immediate action. However, detractors of climate policy utilize contrasting rhetoric, framing environmental regulations as harmful to jobs and economic growth, appealing to a different set of values rooted in stability and prosperity.\\n\\nThese rhetorical strategies play a crucial role in influencing public opinion, which, in turn, impacts policy decisions made by elected officials. When politicians speak about issues like healthcare reform or educational funding, their choice of words can either facilitate a collective understanding of the proposed policy or create division amongst constituents. Politeness, while ideal, often takes a back seat to the more vigorous exchanges that help maintain party loyalty and attract votes.\\n\\nAs such, it's essential for voters to scrutinize not only the policies being proposed but also the rhetoric surrounding them. Understanding the motivations and implications behind specific phrases can illuminate the broader political strategies at work. In a climate where sound bites often overshadow substantial discussions, fostering a critical approach to rhetoric can empower citizens to better engage with policy-making processes, ultimately leading to more informed and civic participation.\", \"In recent months, the political landscape has witnessed intensifying debates surrounding the need for effective compromise within the cabinet. As one of the central governing bodies, the cabinet is crucial for developing policies that reflect the diverse opinions of both ruling and opposition parties. However, the current divide has raised concerns about the ability of political leaders to reach common ground on key issues affecting citizens.\\n\\nThe significance of compromise cannot be overstated, especially during periods of heightened partisanship. Fostering dialogue among cabinet members from different political backgrounds is essential for meaningful progress. Instances of collaboration can be seen in past legislative achievements, where diverse ideas were synthesized to form comprehensive policies. However, recent impasses suggest that such interactions have become less frequent, raising questions about the efficacy of the cabinet.\\n\\nAs political tensions rise, many citizens are calling for their representatives to prioritize negotiation over confrontation, emphasizing compromise as a pathway to solutions that benefit everyone. Whether it’s addressing the economy, healthcare, or climate change, the call is clear: effective governance requires leaders who are willing to set aside differences in favor of collective progress. \\n\\nMoving forward, the ability of the cabinet to adapt and embrace a culture of compromise will be critical. Leaders must recognize that unity, even when opinions differ, ultimately serves the best interests of the people they represent. In this increasingly polarized age, the cabinet's commitment to collaborative governance could determine the success of current initiatives and uphold the ic ideals that underpin our society.\", \"In today's political landscape, the relationship between elected officials and their constituencies is more crucial than ever. Recently, a local congressperson held a public hearing to address pressing issues that have been troubling their district. The hearing aimed to bring together community members, stakeholders, and local organizations to discuss vital topics such as housing affordability, healthcare accessibility, and public safety initiatives. \\n\\nThe participation of constituents during these hearings is paramount as it not only shows that the elected official values the opinions of their community but also helps to inform policy decisions that directly affect the lives of the residents. Many people in attendance expressed their concerns passionately, sharing personal stories and experiences that highlighted the urgent need for reform. \\n\\nThis particular hearing became a platform for transparent dialogue, where community voices echoed the message of accountability and responsiveness. The congressperson listened intently, taking notes and urging community members to follow up on their specific concerns in subsequent gatherings. This engagement illustrates how elected officials can effectively bridge the gap between government decisions and the everyday realities faced by their constituency. \\n\\nUltimately, these public hearings foster a sense of community ownership over local governance and empower constituents to hold their leaders accountable. As we move forward in this political climate, it's evident that genuine engagement between officials and their constituencies is essential for creating effective policies that genuinely reflect and serve the interests of the people.\", \"In recent years, the resurgence of nationalism has shaken the foundations of many ic societies, prompting leaders and policymakers to navigate a complex political landscape. This evolution of national identity and pride, often seen as a reaction to globalization, has frequently pitted traditional political structures against grassroots movements demanding change. Within this context, a range of political actors, including the ministerial class, has had to adapt their strategies to engage with an increasingly vocal electorate that champions national interests.\\n\\nNationalism, in its various forms, can unify people around a shared cultural background, history, and language, fostering a sense of belonging. However, it also risks alienating minority groups and fostering divisive attitudes. This duality poses significant challenges for government ministers tasked with balancing national pride with the principles of inclusion and solidarity. Recent speeches by several ministers reflect a palpable shift towards rhetoric that both acknowledges the benefits of national identity and warns against the dangers of extreme nationalist sentiments.\\n\\nA prominent example is the discussion surrounding immigration policies, where nationalists argue for tighter controls to preserve cultural identity, while ministers advocate for maintaining open channels that also promote diversity. This push-and-pull illustrates the complicated dance political leaders must perform, responding to calls for sovereignty while recognizing the globalized world's interconnectedness.\\n\\nAs s loom, many ministers find themselves reassessing their messages, realizing that they must resonate with nationalist sentiments without resorting to xenophobia or exclusivity. It's a delicate balancing act, one that could define the political landscape for years to come. The evolution we are witnessing hints at a fundamental rethinking of how nationalism can coexist with modern governance—a question that will continue to shape political discourse in the years ahead.\", \"As the political landscape rapidly evolves, the significance of grassroots campaigns continues to gain recognition among political parties. In recent years, we've seen how smaller, less established political parties have harnessed the power of community engagement and social media to connect with voters. These entities often emphasize localized issues and solutions, tapping into sentiments that larger parties might overlook.\\n\\nOne of the most effective strategies these campaigns utilize is mobilizing volunteers. Unlike traditional campaigning, where resources might be concentrated on high-profile advertising, grassroots organizations rely on the dedication of volunteers to spread their message and engage directly with constituents. This not only helps to build a loyal base but also fosters a sense of ownership among voters in the political process.\\n\\nMoreover, modern technology plays a pivotal role in these campaigns. Social media platforms allow smaller political parties to amplify their message, reach target demographics, and organize events at a fraction of the cost of print advertising and television spots. As s draw nearer, many of these parties are focusing on creating compelling narratives that resonate with voters' daily lives, often using personal stories to highlight their policy positions.\\n\\nThe trend toward more community-focused campaigning also signifies a shift in political strategies. Established parties are beginning to recognize that voters are looking for authenticity and relatability, particularly from candidates who represent their values and aspirations. Consequently, adapting campaigns to prioritize voter concerns rather than strictly party agendas can enhance electoral outcomes.\\n\\nIn the current political climate, it's becoming increasingly clear that the landscape dominated by traditional political campaigns is expanding. The rise of grassroots initiatives not only izes participation but can also lead to innovative solutions to the challenges facing communities today. Engaging with voters at the ground level is proving to be a powerful tool for political parties seeking to reshape the future.\", \"The role of monarchy in shaping political candidates varies dramatically across nations, influencing not just political campaigns, but also the fundamental nature of governance itself. In countries where monarchies exist, such as the United Kingdom, Spain, or Thailand, candidates often have to navigate a complex relationship with the royal family, as public sentiment regarding the monarchy can sway electoral outcomes.\\n\\nIn constitutional monarchies, candidates running for office are expected to support and reflect the values of their nation’s traditions, often in ways that honor the historical significance of the monarchy. For example, a candidate in the UK may leverage royal events or national celebrations to curry favor with voters, aligning themselves with the monarchy's legacy of stability and continuity. This relationship can position the monarchy as a unifying force during cycles, providing candidates an avenue to foster national pride and solidarity.\\n\\nOn the other hand, not all candidates embrace the system of monarchy. In some contexts, especially where there is growing sentiment, candidates actively campaign against the monarchy, marking a stark contrast in their political platforms. This was evident in recent political movements within several countries where candidates underscored issues of equality and ic reform as counter-narratives to the alleged elitism of monarchical systems.\\n\\nMoreover, the presence of a monarchy can influence campaign strategies where candidates vie for public approval through initiatives that resonate with traditional values upheld by the royal family. During contentious s, this often leads to debates surrounding the relevance of monarchy in contemporary politics, causing candidates to take measured stances that account for their constituency’s diverse perspectives on royal influence.\\n\\nAs the global political landscape keeps evolving, it remains essential to understand the intricate dance between monarchy and political candidates. The aspirations and decisions of leaders not only shape their immediate political environments but also reflect broader societal attitudes toward established traditions and the ongoing conversations about what governance should look like in the 21st century.\", 'In contemporary politics, the role of a cabinet in decision-making is often underestimated. A cabinet is generally expected to provide counsel to the head of government, formulate policies, and make administrative decisions. However, an effective cabinet must also cultivate a culture of consensus among its members to create a stable political environment. \\n\\nThe pursuit of consensus within a cabinet is not always straightforward, especially in times of polarization when party lines can be rigidly drawn. Recent events have underscored the need for cabinets to navigate these divisions, bringing diverse viewpoints to the table while still working towards common objectives. In the current landscape, political leaders must prioritize open communication and collaboration within their cabinets, thereby allowing for varied perspectives to contribute to a comprehensive policy framework. \\n\\nFor instance, recent discussions surrounding climate policy highlight how contentious the process can be. Different cabinet members might represent diametrically opposed interests—such as economic growth versus environmental sustainability—yet their ability to reach a consensus on actionable solutions is pivotal. Fostering an environment in which ideas can be exchanged freely is crucial for achieving this goal. \\n\\nUltimately, a cabinet operates best not when it is merely a collection of like-minded individuals, but when it becomes a dynamic forum for debate, negotiation, and collective decision-making. The emphasis on achieving consensus can transform the cabinet into a powerhouse of innovation, driving effective governance and evolving policies that address the pressing issues of our time.', \"As the season heats up, the role of diplomats in shaping international perception and policy becomes increasingly critical. With candidates presenting their platforms, clear communication to foreign allies and competitors is essential. Voters often overlook the impact that these diplomatic relations have on domestic affairs, yet their influence can be profound—affecting trade agreements, security alliances, and environmental considerations, all of which hinge on the interpersonal skills of those representing our nation abroad.\\n\\nDuring an , each candidate's proposed foreign policy can promote different narratives in international forums. A strong stance may position a candidate as a robust leader, but as history shows, this bravado can also lead to increased tensions if not carefully managed. Diplomats act as vital conduits, translating these political ambitions into actionable foreign engagements, helping to maintain stability and ensure that countries remain on a diplomatic course.\\n\\nCandidates often tout their experience with foreign relations during their campaigns, positioning themselves as the diplomat the country needs. They promise to strengthen relationships with allies while asserting their influence over competitors. Voters need to scrutinize these claims carefully; understanding not just the rhetoric but the practical consequences of potential foreign policies proposed on the campaign trail.\\n\\nAs we navigate through this cycle, it's essential to recognize the intertwined nature of domestic politics and international diplomacy. The choices made at the ballot box will resonate through embassies, trade negotiations, and global issues far beyond borders, prompting the next generation of diplomats to address challenges that will shape the future for all.\", \"In today's increasingly interconnected world, the role of diplomats and political representatives has never been more crucial. One of the most pressing issues faced by international communities is climate change, and how nations choose to work together, or fail to do so, will have lasting implications for the health of our planet. \\n\\nDiplomatic efforts in the realm of environmental policy have surged, with representatives from various countries gathering for summits and conferences aimed at addressing this global crisis. The Paris Agreement, which aims to limit global warming to well below 2 degrees Celsius, is a prime example of how diplomacy can bridge gaps between disparate national interests. \\n\\nHowever, the effectiveness of these initiatives can often be hindered by differing economic priorities among nations. For instance, developing countries may prioritize economic growth over environmental protections, leading to tensions in negotiations where wealthier nations demand stringent measures. Here, the skill of a diplomatic representative becomes essential; they must mediate between competing interests while striving for a collective goal. \\n\\nMoreover, the impact of local politics cannot be overlooked. Representatives must thread the needle of global diplomacy with domestic pressures, often facing criticism from constituents who either support or oppose international agreements. Balancing these pressures while maintaining a focus on long-term solutions is a testament to the complex nature of representation in political spheres. \\n\\nAs voters become more aware of global issues like climate change, they demand that their representatives engage more actively on the world stage. A representative who can successfully navigate the intricacies of diplomatic relations stands out as a leader who not only advocates for their nation's interests but also embodies a commitment to global cooperation. \\n\\nThe future of international climate policy depends on the ability of diplomats and representatives to find common ground, facilitate negotiations, and promote sustainable solutions. Only through effective collaboration can we hope to address the challenges posed by climate change and forge a path toward a more sustainable future.\"]\n", + "['In the realm of healthcare technology, the intersection of gravitation and mechanics plays a crucial role in the design and function of medical devices. One of the most intriguing advancements in this area is the development of wearable health monitoring devices, which rely heavily on principles of biomechanics and the gravitational forces acting on the human body.\\n\\nWearable devices like smartwatches and fitness trackers utilize accelerometers and gyroscopes to monitor various health metrics, such as heart rate, physical activity, and even sleep patterns. These devices function by detecting motion through the mechanics of gravitational pull: when a person moves, sensors measure the acceleration and deceleration of movement, providing valuable data on health and fitness levels.\\n\\nOn a physiological level, understanding the mechanics of how the body interacts with gravitational forces can enhance the design of prosthetics and orthopedic devices. Innovations such as high-tech prosthetic limbs are engineered to enable users to regain mobility effectively by simulating natural movement patterns, which are inherently influenced by gravity. Engineers incorporate dynamic adjustments that respond to the weight and movement of the user, ensuring balance and stability. \\n\\nMoreover, in surgical settings, technology that aids in robotic surgery uses principles of mechanics to support precision in procedures. By manipulating gravitational effects, surgeons can perform complex operations with minimal invasiveness, reducing recovery times significantly.\\n\\nAs we delve deeper into the merge of engineering and medicine, it becomes evident that a thorough understanding of gravitation and mechanics is essential for creating innovative health technologies. These advancements not only improve patient outcomes but also pave the way for a future where personalized medicine and technology can work hand in hand, ensuring better quality of care and enhanced patient monitoring.', '**Title: The Internet as a Catalyst for Evolving Healthcare Dynamics** \\n\\n**Author: Dr. Samuel Hargrave, PhD in Health Informatics** \\n\\n**Abstract:** \\nThe integration of the internet in healthcare has transformed traditional practices, enabling unprecedented dynamics in service delivery, patient engagement, and data management. This article explores the current state of internet technologies in healthcare, emphasizing the impact on patient outcomes, information accessibility, and the ongoing evolution of medical practices. \\n\\n**Introduction:** \\nThe advent of the internet has catalyzed transformative changes across various sectors, none more so than in healthcare. Where information was once siloed within healthcare institutions, the internet has democratized access to medical knowledge, shifting the dynamics between patients, providers, and payers. This article delves into these dynamics, looking specifically at telehealth, patient-generated health data (PGHD), and the role of artificial intelligence in enhancing healthcare delivery through internet-enabled solutions.\\n \\n**Telehealth and Accessibility:** \\nTelehealth has emerged as a cornerstone of modern healthcare, utilizing the internet to bridge geographical barriers. By enabling real-time consultations via video conferencing, telehealth significantly expands access to healthcare services, particularly in rural or underserved areas. The dynamics of patient-provider interactions are fundamentally altered; patients can seek advice without the constraints of travel or waiting times, promoting a more proactive approach to health management. \\nMoreover, the continuity of care is enhanced: healthcare providers can follow up on patient progress through online platforms, allowing for adjustments to treatment plans based on immediate data received.\\n \\n**Patient-generated Health Data (PGHD):** \\nAnother revolutionary aspect of internet utilization is the emergence of PGHD. Patients, equipped with wearables and mobile health applications, are now capable of generating a wealth of health information that can inform clinical decisions. This dynamic shifts the traditional provider-dominated model to a democratized one, where patients actively contribute to their health narratives.\\n \\nThe increase in accessible health data has implications for personalized medicine. By analyzing PGHD alongside historical clinical data, healthcare providers can refine treatment protocols to suit individual patient needs, ultimately leading to better health outcomes and increasing engagement and compliance among patients.\\n \\n**Artificial Intelligence and Internet Integration:** \\nAs AI technologies advance, their integration with internet platforms marks another significant turning point in healthcare delivery. AI algorithms can now analyze vast datasets, glean insights from PGHD, and even predict patient risks based on real-time health data. This capability enhances decision-making processes and optimizes clinical workflows, contributing to improved patient safety and operational efficiency.\\n \\nThe dynamics of healthcare are further complicated by ethical considerations surrounding the use of personal data, necessitating robust frameworks that protect patient privacy while enabling the innovation of healthcare services.\\n \\n**Conclusion:** \\nThe internet has undeniably reshaped the dynamics of healthcare delivery, offering tools that foster connectivity, engagement, and data-driven decision-making. As we continue to navigate this digital landscape, the challenge will lie in leveraging these innovations responsibly, maintaining ethical standards, and ensuring that enhancements in accessibility and quality of care benefit all stakeholders within the healthcare ecosystem.\\n \\n**Keywords:** internet, healthcare, telehealth, patient-generated health data, artificial intelligence, health informatics, dynamics.', \"**The Impact of Relativity on Current Advances in Medical Imaging Technology** \\nBy Professor Alice Whitcomb, PhD, Einstein Institute for Medical Technology\\n\\nIn the interconnected worlds of healthcare and technology, one cannot underestimate the influence of core scientific principles, such as Albert Einstein's theory of relativity, on the advancement of diagnostic tools and medical imaging. This article aims to explore how concepts derived from relativity have paved the way for innovative improvements in medical imaging technologies, particularly in the fields of magnetic resonance imaging (MRI) and computed tomography (CT) scans.\\n\\nThe theory of relativity, fundamentally concerned with the interaction between matter and energy, has transcended its origins in cosmology to influence numerous applications in healthcare. At the heart of MRI technology is the magnetic resonance phenomenon, which relies significantly on principles related to the behavior of atoms in a magnetic field—a concept deeply rooted in the relativistic understanding of atomic structure influenced by Einstein's work.\\n\\nModern imaging techniques take advantage of radiofrequency waves and magnetic fields to create detailed images of biological tissues, essential for the diagnosis and monitoring of various medical conditions. As relativity suggests, the way particles behave in different frames of reference is crucial. For example, the precision in rotational speeds needed for MRI machines is a direct application of relativistic physics, allowing for enhanced image clarity and reduced scan times, which benefits patients by expediting diagnosis.\\n\\nFurthermore, in the realm of CT scans, the evolution from traditional imaging to advanced 3D visuals showcases the utilization of algorithms that echo ideas explored in cosmological settings. The ability to visualize the human body in three dimensions, similarly to mapping a cosmic structure, heavily integrates with computational models that simulate relativity and energy distributions. The swift processing capabilities of contemporary computers, enhanced by advances in technology—specifically quantum computing—further advance these imaging methods by allowing more complex calculations previously hindered by slower, classical computing methods.\\n\\nAs we evolve in our understanding and application of physics within biomedical contexts, it becomes clear that merging relativity with medical imaging not only enhances technological capabilities but also raises fundamental questions about how we understand the human body in both physical and metaphysical dimensions. The principles guiding celestial bodies in their interactions find parallels in our own biological processes, as we consider the gravitational influences on cellular activity and the propagation of signals through tissue.\\n\\nLooking ahead, the continued application of relativistic principles holds incredible promise for the development of new imaging modalities. Investigating how these theories can enhance our understanding of diseases at a subatomic level is critical. We may well find that future breakthroughs in medical imaging will not only provide clearer visualizations but transform our comprehension of health and disease through innovations that intertwine health sciences, quantum physics, and the vast landscapes of cosmological phenomena.\\n\\nIn conclusion, the relationship between relativity, cosmology, and healthcare technology, especially medical imaging, exemplifies the interdisciplinary nature of scientific advancement. Recognizing and harnessing the fundamental links between these fields is key to unlocking future innovations that could enhance diagnosis and treatment methods, ensuring that healthcare continues to progress in step with leading-edge technology.\", '**The Role of Machine Learning in Transforming Healthcare Administration** \\n \\nAs innovations in technology continue to reshape numerous sectors, one of the most significant advancements has emerged at the intersection of healthcare and machine learning (ML). This article strives to elucidate how ML algorithms are revolutionizing healthcare administration, thereby facilitating improved patient outcomes, reducing operational costs, and optimizing resource allocation across institutions. \\n \\nIn the realm of healthcare, the administrative processes often become complex due to the voluminous amount of data generated every day. From patient records to billing information, managing this data efficiently is paramount for ensuring seamless healthcare delivery. Machine learning, a subset of artificial intelligence, has shown tremendous potential in processing vast datasets, identifying patterns, and providing actionable insights. \\n \\nOne pivotal application of ML in healthcare administration is in predictive analytics. Hospitals utilize ML models to predict patient admissions by analyzing historical data and seasonal trends. For instance, those facilities that have implemented predictive data analytics witnessed a 15% decline in last-minute hospital admissions. This foresight allows healthcare administrators to allocate staffing and resources more effectively, thus enhancing operational efficiency and improving the patient experience. \\n \\nMoreover, machine learning algorithms have been adept at streamlining the billing process within healthcare institutions. Traditional billing systems can be labor-intensive and prone to errors, often resulting in delayed payments or lost revenue. ML-driven systems employ natural language processing to automate coding and billing procedures, significantly reducing human error. Studies have demonstrated that these automated systems can analyze claims and ensure that all services rendered are accurately billed, leading to a reduction in claim denials by up to 30%. \\n \\nAdditionally, ML can support regulatory compliance by continuously monitoring health records and financial transactions. With ever-evolving regulatory standards, healthcare institutions face the challenge of ensuring adherence while avoiding heavy penalties. Advanced ML algorithms can analyze transaction patterns to flag anomalies, ensuring compliance in real-time without the need for exhaustive manual audits. \\n \\nOne cannot disregard the emphasis on patient and provider engagement facilitated by technology, especially through machine learning algorithms. Chatbots and virtual assistants, powered by ML, have greatly improved patient interactions by providing timely information and triaging patients based on their symptoms. By deploying these tools, healthcare providers can not only enhance patient satisfaction but also allocate their time and resources to more critical tasks requiring human intervention. \\n \\nWhile the benefits of machine learning in healthcare administration are profound, it is crucial to address some challenges it presents. Data privacy, bias in algorithm training due to non-representative datasets, and the need for continuous updating of AI systems are significant considerations that stakeholders must heed. Legal frameworks that safeguard patient data while promoting innovation in AI technology will be paramount to harnessing these benefits in a way that is ethical and equitable. \\n \\nIn conclusion, the integration of machine learning within healthcare administration undoubtedly signals a new era of efficiency, reliability, and enhanced patient care. As technology continues to evolve, the synergy between machine learning and healthcare will expand, offering endless possibilities for innovative solutions that adapt to the dynamic nature of health services. \\n \\nIt is imperative for administrators, healthcare providers, and policymakers to embrace these advancements prudently, ensuring that as we venture into this new frontier, the focus remains on improving healthcare delivery for all.', '### The Integration of Internet of Things (IoT) in Respiratory Healthcare: A Mechanistic Perspective\\n\\nThe advent of the Internet of Things (IoT) has begun to revolutionize numerous fields, with the healthcare sector standing out as a prime beneficiary of this technological transformation. As a professor specializing in respiratory medicine and biomedical engineering, I aim to elucidate the mechanics behind the application of IoT technologies in improving respiratory health outcomes.\\n\\n#### Understanding IoT in Healthcare\\n\\nThe Internet of Things refers to the interconnected network of physical devices that communicate and exchange data via the internet. In healthcare specifically, IoT devices can range from wearable health monitors and smart inhalers to comprehensive remote monitoring systems that collect real-time health data from patients.\\n\\n#### Mechanistic View on Respiratory Healthcare\\n\\nIn respiratory healthcare, the mechanics involved in blending IoT devices with traditional medical practices can enhance early diagnosis, monitoring, and management of respiratory diseases like asthma, COPD (Chronic Obstructive Pulmonary Disease), and pulmonary fibrosis. The following components illustrate how the mechanics of IoT-based interventions work:\\n\\n1. **Data Collection**: IoT-equipped devices facilitate seamless data capture, such as lung function, oxygen saturation levels, and personal inhaler usage patterns. For instance, a smart inhaler can track usage frequency and circumstances under which it is utilized, offering clinicians critical real-time insights into patient behavior.\\n\\n2. **Data Transmission**: Utilizing wireless internet connections, these devices transmit collected data to cloud-based systems where it can be readily accessed by healthcare providers. This process reduces the reliance on manual reporting by patients, which is often hampered by forgetfulness or lack of awareness about their condition.\\n\\n3. **Data Analysis**: Advanced algorithms and machine learning models analyze incoming data to identify patterns and anomalies in patient health trajectories. By employing predictive analytics, healthcare practitioners are better equipped to foresee potential exacerbations in respiratory conditions before they necessitate emergency intervention.\\n\\n4. **Personalized Interventions**: Armed with comprehensive analytics, doctors can tailor treatment plans for individual patients, adjusting medications or recommending lifestyle changes based on empirical data. For example, utilization patterns of inhalers can prompt providers to discuss adherence strategies or transition patients to long-term control medications if necessary.\\n\\n5. **Patient Engagement and Education**: One of the cardinal mechanics of IoT is that it not only aids healthcare professionals but also empowers patients. With access to their health metrics through mobile applications linked to IoT devices, patients are encouraged to be active participants in their health management. Educational tools integrated within these applications can also bolster patient understanding of their conditions and enhance compliance with treatment regimens.\\n\\n#### Challenges and Considerations\\n\\nWhile the integration of IoT in respiratory healthcare presents a compelling future, several challenges persist. Issues regarding patient data privacy, the variability of internet connectivity, device interoperability, and the need for continuous engagement from both patients and providers must be addressed. \\n\\nRegulatory frameworks must evolve to keep pace with these technologies, ensuring that safety standards are met while allowing for innovation in patient care.\\n\\n#### Conclusion\\n\\nIn summary, the fusion of IoT technologies with the mechanics of respiratory healthcare holds unprecedented potential. As we navigate this new frontier, a collaborative approach between healthcare professionals, engineers, and policymakers is pivotal to fully harnessing the benefits of the Internet of Things in the pursuit of better respiratory health outcomes.', 'The integration of radiation therapy in treating cancer has seen significant advancements, particularly with the evolving dynamics of technology that enhance treatment precision and patient safety. Radiation therapy is a cornerstone in oncological treatment, utilizing controlled doses of radiation to target and eradicate cancer cells. Understanding the dynamics of how radiation interacts with various tissues is essential for optimizing treatment outcomes, minimizing damage to surrounding healthy cells, and managing side effects effectively.\\n\\nRecent developments in radiotherapy include image-guided techniques, which allow clinicians to visualize tumors more accurately before and during treatment. This approach significantly improves the targeting of radiation beams, thus enhancing the overall effectiveness of the therapy. Moreover, the introduction of advanced linear accelerators has revolutionized the delivery of radiation. These machines are capable of adjusting the radiation dose in real-time, based on patients’ movements, thereby ensuring that the tumor receives the maximum dose while sparing adjacent healthy tissues.\\n\\nAdditionally, advancements in treatment planning software utilize sophisticated algorithms to simulate radiation dose distributions intricately. The dynamics of tumor shape, size, and location can now be modeled more accurately, allowing personalized treatment plans tailored to individual patient anatomy. By incorporating three-dimensional imaging technologies like CT and MRI, oncologists can assess tumor dynamics and monitor responses to treatments over time, leading to more adaptive treatment strategies.\\n\\nHowever, along with these advancements comes the need for stringent safety protocols. The field of radiation oncology must emphasize patient education and communication to alleviate fears associated with radiation exposure. Furthermore, ongoing research into the biological impact of radiation at cellular and molecular levels is essential to further enhance the safety and effectiveness of treatments.\\n\\nIn conclusion, the interplay between advancements in radiation technology and the understanding of the dynamics within the human body continues to shape the future of cancer treatment. Enhanced precision in radiation delivery not only promises improved patient outcomes but also addresses the crucial challenge of minimizing adverse effects, making cancer therapy more effective and patient-centric.', 'In recent years, the intersection of electromagnetism and healthcare technology has opened up exciting new avenues for diagnosis and treatment. One particularly promising area is the use of electromagnetic fields for therapeutic purposes, known as pulsed electromagnetic field therapy (PEMF). This technique employs oscillation of electromagnetic waves to promote healing in tissues by improving cellular function and circulation.\\n\\nThe principles of electromagnetism suggest that every cell in our body operates on certain frequencies, and the application of specific electromagnetic frequencies can lead to beneficial outcomes. For instance, oscillating fields can stimulate the production of ATP (adenosine triphosphate), enhancing energy levels in cells. As a result, PEMF therapy can aid in reducing inflammation, accelerating healing from injuries, and alleviating pain. \\n\\nHealth practitioners are increasingly integrating these technologies into treatment plans, especially for chronic pain conditions, arthritis, and even post-operative recovery. Other applications include the use of electromagnetic resonances in diagnostics, where fluctuations in specific energy fields around the body provide insight into underlying health conditions.\\n\\nMoreover, advancements in wearable technology have made it feasible to harness the principles of electromagnetism for continuous health monitoring. Devices that incorporate oscillatory electromagnetic sensors allow for the real-time collection of physiological data, enabling the early detection of anomalies and improving preventive health measures.\\n\\nAs research continues to unfold, the integration of electromagnetism into healthcare not only showcases how technology can complement traditional medical practices but also highlights a shift toward more holistic and individualized approaches to health management. Therefore, the future of healthcare may be increasingly defined by our understanding and application of electromagnetic principles, leading to enhanced patient outcomes and innovative therapeutic modalities.', '**Title: The Convergence of AI and Healthcare: A Gravitation Towards Precision Medicine**\\n\\nIn the rapidly evolving field of healthcare, the intersection of artificial intelligence (AI) technologies and medical practices presents unprecedented opportunities for enhancement and innovation. With the integration of AI systems, healthcare professionals can harness vast amounts of data to inform decision-making, optimize patient outcomes, and propel us toward a new paradigm of precision medicine.\\n\\nGravitation toward such advanced technologies can be comprehensively understood when we consider how AI systems analyze patterns within complex datasets. For instance, in genomics, machine learning algorithms can process genetic sequences to predict health risks and develop tailored treatment plans, ensuring that interventions are finely tuned to each patient’s unique biological profile. This not only enhances the efficacy of treatments but also minimizes adverse effects, marking a significant shift from the traditional one-size-fits-all approach.\\n\\nMoreover, AI can revolutionize diagnostics, an area where timely and accurate data interpretation is paramount. Deep learning models, capable of examining radiological images, surpass human accuracy in identifying early-stage malignancies and other diseases, thereby fostering earlier interventions and improving survival rates. As these technologies gravitate into everyday practice, we witness a transformation in the roles of healthcare professionals, who increasingly become facilitators of advanced diagnostic tools rather than sole decision-makers.\\n\\nThe integration of AI is not limited to diagnostics; it transforms operational efficiencies within health systems. Predictive analytics can foresee patient volume trends, optimize staff allocation, and enhance inventory management for medical supplies. When AI is employed to analyze hospital data, services can be aligned more closely with patient needs, thus raising the standard of care while also reducing costs.\\n\\nHowever, the adoption of AI technologies in healthcare comes with imperative ethical considerations. With significant concerns over data privacy, bias in algorithms, and accountability, it becomes essential to approach the implementation of these systems with a robust ethical framework. Ensuring that AI systems are transparent and reliable will be critical in building trust with patients and healthcare providers alike.\\n\\nAs we explore these dimensions, it is clear that AI holds a potent promise in advancing healthcare. The gravitation towards incorporating intelligent systems in various applications within the medical field can lead to a future characterized by improved outcomes, more personalized care, and a streamlined healthcare experience. For professionals currently engaged in health sciences, staying informed and adaptable in the wake of these technological advancements is vital.\\n\\nWithin this landscape, the role of academia is pivotal, guiding research and policy development while driving innovation. As a professor in the field, I advocate for interdisciplinary collaboration among computer scientists, clinicians, and ethicists to ensure a holistic approach to integrating AI in healthcare. The future assures a landscape where AI does not merely support but enhances the very core of healthcare — emphasizing precise, effective, and ethically sound care for all individuals.', \"**Harnessing Machine Learning for Enhanced Healthcare Outcomes: A Focus on Predictive Analytics**\\n\\nIn the ever-evolving landscape of healthcare, the integration of technology has paved the way for transformative solutions that optimize patient care and promote better health outcomes. One of the most promising advancements in this arena is the deployment of machine learning (ML) algorithms to analyze healthcare data, improving both clinical workflows and patient interactions. As a professor and a researcher in health informatics, I find it crucial to explore how machine learning can serve as a catalyst for momentum in healthcare improvement.\\n\\nMachine learning, a subset of artificial intelligence, encompasses a range of techniques that allow systems to learn from data patterns and make informed predictions or decisions without explicit programming. In healthcare, these techniques offer innovative solutions in various domains, from early diagnosis to treatment optimization and operational efficiency.\\n\\nOne pivotal application of machine learning in healthcare is predictive analytics. By leveraging vast amounts of patient data, ML models can identify individuals at high risk for diseases, allowing for timely interventions. For instance, algorithms can analyze electronic health records (EHRs), genetic information, and lifestyle factors, enabling physicians to foresee potential health issues and personalize treatment plans. The momentum gained from these predictive capabilities not only aids in improving individual patient outcomes but also streamlines healthcare resources, enhancing overall system efficiency.\\n\\nConsider the impact of predictive analytics in diabetes management. Machine learning algorithms can recognize patterns in glucose levels and accompanying variables, predicting fluctuations before they occur. Such insights allow healthcare providers to tailor patient management protocols better. Consequently, diabetic patients can achieve tighter control over their condition with fewer complications, illustrating how machine learning fortifies both individual care and larger public health outcomes.\\n\\nMoreover, the functionality of ML extends to operational management within healthcare institutions. Healthcare providers can analyze scheduling data, staffing levels, and even patients' admission patterns to optimize resource allocation. This reduces costs while enhancing patient satisfaction and care delivery times. By harnessing the momentum of ML, hospitals and clinics can become more responsive and better equipped to manage day-to-day operations and unexpected surges in patient volumes.\\n\\nHowever, the journey toward integrating machine learning into healthcare is not without challenges. Ensuring data privacy, managing algorithmic biases, and providing transparent, interpretable outputs are paramount for the ethical deployment of these technologies. As experts in this field, we must navigate these complexities responsibly to foster trust among patients and healthcare providers alike.\\n\\nIn conclusion, the intersection of machine learning and healthcare represents an evolving frontier that has the potential to significantly enhance patient outcomes and operational efficiencies. By continuing to leverage the momentum generated by these technological advancements, we can create a healthcare system that is not only reactive but also proactive and personalized. The future, driven by the power of machine learning, holds promising prospects for comprehensive healthcare delivery and improved quality of life across diverse populations.\", \"### The Intersection of Electromagnetism and Healthcare: Innovations in Medical Imaging\\n\\nAs a professor at a leading medical technology institution, I have long been fascinated by the convergence of physical sciences and clinical applications in healthcare. This article seeks to explore the innovative applications of electromagnetism within the realm of medical imaging, specifically focusing on how advancements in this field are reshaping diagnostic practices and improving patient outcomes.\\n\\n#### Understanding the Basics of Electromagnetism in Medical Imaging\\nElectromagnetism, a branch of physics that deals with electric and magnetic fields and their interactions, plays a pivotal role in several medical imaging modalities, including Magnetic Resonance Imaging (MRI) and Positron Emission Tomography (PET). These technologies leverage the principles of electromagnetism to create detailed images of biological structures and processes, aiding in disease diagnosis and management.\\n\\n#### The Mechanics of MRI Technology\\nMagnetic Resonance Imaging (MRI) is a quintessential application of electromagnetism in healthcare. The core mechanism involves the manipulation of hydrogen nuclei in the body's water molecules using strong magnetic fields and radiofrequency pulses. This process generates signals that are converted into images by complex algorithms and advanced computing techniques.\\n\\nAdvancements in MRI technologies, particularly in the development of higher field strengths, have enabled unprecedented resolution in imaging. Researchers have been exploring the use of ultra-high field MRIs operating at 7T (Tesla) and beyond, which enhances the signal-to-noise ratio and offers clearer delineation of anatomical structures. Such innovations empower radiologists to detect subtle changes in tissues that may signify early disease onset, facilitating timely and effective interventions.\\n\\n#### The Role of Electromagnetic Technologies in PET Imaging\\nSimilarly, Positron Emission Tomography (PET) utilizes principles of electromagnetism for visualization of metabolic processes in real-time. This technique relies on the detection of gamma rays emitted from radiotracers injected into the patient. The intricate mechanics behind this involves the annihilation of positrons and electrons, producing high-energy photons that are subsequently mapped to construct comprehensive images of metabolic activity, providing invaluable insights into conditions such as cancer, neurological disorders, and cardiac diseases.\\n\\n#### Innovative Developments on the Horizon\\nThe future of medical imaging is poised for further transformation through the integration of artificial intelligence (AI) and machine learning. By employing electromagnetic data processing, these technologies can enhance image reconstruction algorithms, reducing noise and improving detection rates of pathologies. Implementing real-time tracking of vital signs through wearable electromagnetic sensors, for instance, may revolutionize patient monitoring and offer proactive rather than reactive healthcare management.\\n\\nMoreover, miniature electromagnetic devices are being researched for their potential use in point-of-care diagnostics. Portable MRI machines or handheld ultrasound devices could expand access to quality imaging in remote and underserved areas, democratizing healthcare without compromising quality.\\n\\n#### Conclusion\\nThe dynamics between electricity, magnetism, and healthcare continue to generate groundbreaking advances in medical imaging technologies. The mechanics of electromagnetism serve not only as the cornerstone of existing modalities like MRI and PET but also as the foundation for future innovations that promise to enhance diagnostic accuracy and accessibility. As researchers, clinicians, and technologists work collaboratively at this intersection of disciplines, we stand on the cusp of a new era in healthcare where electromagnetism boldly illustrates the unseen pathways of health and illness.\"]\n" + ] + } + ], + "source": [ + "# data loading\n", + "from aif_gen.dataset.continual_alignment_dataset import ContinualAlignmentDataset\n", + "\n", + "lipschitz_data = ContinualAlignmentDataset.from_json(\n", + " 'data/4omini_generation/merged_tech_physics.json'\n", + ")\n", + "piecewise_data = ContinualAlignmentDataset.from_json(\n", + " 'data/4omini_generation/merged_politics_generate.json'\n", + ")\n", + "\n", + "# only get the prompts shuffled and only 10K prompts\n", + "data_lip = lipschitz_data.datasets[0].samples\n", + "data_piecewise = piecewise_data.datasets[0].samples\n", + "\n", + "prompts_lip = []\n", + "for sample in data_lip:\n", + " prompts_lip.append(sample.prompt)\n", + "\n", + "# randomly shuffle the prompts and keep only 10K\n", + "import random\n", + "\n", + "random.shuffle(prompts_lip)\n", + "prompts_lip = prompts_lip[:10000]\n", + "\n", + "prompts_piecewise = []\n", + "for sample in data_piecewise:\n", + " prompts_piecewise.append(sample.prompt)\n", + "# randomly shuffle the prompts and keep only 10K\n", + "random.shuffle(prompts_piecewise)\n", + "prompts_piecewise = prompts_piecewise[:10000]\n", + "print(prompts_piecewise[:10])\n", + "print(prompts_lip[:10])" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f04d8316", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "||T12|| = 0.86, ||T23|| = 0.83\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Interp T12: 100%|██████████| 11/11 [13:07<00:00, 71.56s/it]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAd29JREFUeJzt3XlYVNX/B/D3zAAzgKwiqyibioiKYiDuCypaLtnivlCpaX5/FZVli6RZLpmZ5ZZmau6VmaWiiJIbikq444IgqKwurAIDc39/EFPIOgjcgXm/nmeepzn33DOfyxnywz3nniMRBEEAERERkQ6Rih0AERERUX1jAkREREQ6hwkQERER6RwmQERERKRzmAARERGRzmECRERERDqHCRARERHpHCZAREREpHOYABEREZHOYQJERA3O5MmT4eTkVKpMIpHg008/FSWehmDIkCGYMmWK2GE0GCEhIWjSpAnS0tLEDoXqCBMgatA2bNgAiUSifunp6cHBwQGTJ0/G3bt3y9Tv06cPJBIJWrVqVW57oaGh6rZ++eUXdXl2djaCg4MREBAAS0tLSCQSbNiwoVavxcnJqdS1GBsbw8fHB5s2bSpTNzw8XF1v8+bN5bbXvXt3SCQSeHp6qstyc3OxYsUKDBw4EHZ2djAxMUGnTp2watUqFBUV1SjuyMhISCQSfP3112WODR8+HBKJBD/++GOZY7169YKDg0ONPrO2bN26FcuWLRM1hvpw4sQJHDx4EO+//766rOQ79N/vOQAUFBTgueeeg1Qqxfr165/qc5/8/fzvKzk5ucrzJ0+eXO657u7uZeomJSVh6tSpcHZ2hqGhIVxdXREUFIT79++XqatSqbBq1Sp4eXnB0NAQTZs2Rb9+/XD+/Hl1nYCAALi5uWHBggVP9TMg7aUndgBEtWHevHlwdnZGXl4eTp06hQ0bNuD48eO4dOkSFApFqboKhQI3b95EZGQkfHx8Sh3bsmULFAoF8vLySpWnp6dj3rx5aNGiBTp27Ijw8PA6uQ4vLy+88847AIr/h75u3TpMmjQJ+fn55f71rlAosHXrVowfP75UeXx8PE6ePFnm2m/duoX//e9/6N+/P4KCgmBqaooDBw5gxowZOHXqFDZu3KhxzJ07d4aRkRGOHz+Ot99+u9SxkydPQk9PDydOnEBgYKC6vKCgAGfOnMHQoUM1/ryKPH78GHp6mv0vbevWrbh06RLeeuutWotDG3355Zfo378/3NzcKq2nVCrx4osvYt++fVi7di1eeeWVWvn8kt/P/zI3N6/WuXK5HOvWrStVZmZmVup9dnY2/Pz8kJOTgxkzZsDR0RHnz5/Hd999hyNHjuDcuXOQSv/9e/+VV17Bli1bMHHiRMycORM5OTn4+++/kZqaWqrdadOm4d1338XcuXNhYmKiwRVTgyAQNWA//vijAEA4c+ZMqfL3339fACDs2LGjVHnv3r2Fdu3aCW3atBHeeuutUsceP34smJqaCi+88IIAQPj555/Vx/Ly8oSkpCRBEAThzJkzAgDhxx9/rNVradmypfDss8+WKktNTRWaNGkitG3btlT5kSNHBADCyJEjBT09PSEtLa3U8c8//1ywsbERevToIbRr105dnpaWJly6dKnMZwcGBgoAhBs3btQo9r59+wo2NjalymJiYgQAwtixY4U2bdqUOnby5EkBgPDNN9/U6PMmTZoktGzZskbn/tezzz5bK+1os5SUFEFPT09Yt25dqfKS71DJ97ygoEAYMWKEIJFIhO+//75WPrui38/qmjRpkmBsbFxlvS1btggAhD///LNU+Zw5cwQAQlRUlLpsx44dAgBh165dVbabkpIiyGQy4YcfftA8eNJ6HAKjRqlnz54AgNjY2HKPjxkzBjt27IBKpVKX/fHHH8jNzcXLL79cpr5cLoetrW3dBFuJZs2awd3dvcLrGD58OORyOX7++edS5Vu3bsXLL78MmUxWqtzKygrt2rUr087zzz8PALh69Wqp8tjY2Ao/+7969OiBlJQU3Lx5U1124sQJmJqaYurUqbh27RrS09NLHSs5ryq7d++Gp6cnFAoFPD098dtvv5Vb78k5QFlZWXjrrbfg5OQEuVwOa2trDBgwAFFRUQCKh0P37t2L27dvq4dWnpxX9F+enp7o27dvmXKVSgUHBwe8+OKL6rLt27fD29sbJiYmMDU1Rfv27fHNN99Uea0PHjzAK6+8AgsLC1hYWGDMmDF4+PAhdu/eDYVCgezs7CrbeNLevXtRWFgIf3//CusUFhZi9OjR+P3337Fq1ao6mSuUlZVV42HWoqIiZGZmVni85JiNjU2pcjs7OwCAoaGhumzp0qXw8fHB888/D5VKhZycnArbtba2RocOHfD777/XKG7SbkyAqFGKj48HAFhY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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Interp T23: 100%|██████████| 11/11 [13:05<00:00, 71.39s/it]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAghdJREFUeJzt3Xlc1NX6B/DPzAAzgKwiOwjiiogoBmqaS7iWaVm5VC63ss17S9t+tmja4pKZLaZl1zYzLevaZiSilAtKLrjvoiCyI7vAwJzfHzCjyCKDM3xn+bxfL+6N75z5zjMclsdznnOOTAghQERERGRF5FIHQERERNTamAARERGR1WECRERERFaHCRARERFZHSZAREREZHWYABEREZHVYQJEREREVocJEBEREVkdJkBERERkdZgAEZHZmTZtGoKCgupck8lkeOONNySJx1AqKyvx/PPPw8fHBw4ODujZsye++eabW75vSUkJPD098e233xogSuuwatUqBAYGoqKiQupQyEiYAJFZ+/LLLyGTyXQfNjY28PPzw7Rp05Cenl6v/eDBgyGTydCpU6cG7xcXF6e718aNG3XX//nnH8ycORPdu3eHo6MjAgMD8eCDD+L06dMGey9BQUF13oujoyOioqLw9ddf12ubkJCga7d27doG73f77bdDJpMhLCyszvV33nkHffv2Rbt27aBSqdCpUyc899xzyMnJaVHcSUlJkMlkeP/99+s9NnbsWMhkMnzxxRf1Hrvjjjvg5+fXotc0lHXr1mH58uWSxnC9V199FcuWLcPtt9+OZcuWoVu3bpgyZQp+//33W7rvBx98ACcnJ0ycOFF37Y033oBMJkNubm6dtmlpaQgJCYG7uzsOHDhwS6+7evVqDBo0CF5eXlAqlQgODsb06dNx4cIFve9VUFAAT0/Pej+bWmfOnMHEiRPh7+8PBwcHdO3aFQsWLEBZWVmddtrfATd+jBw5sk67adOmobKyEp9++qnesZJ5sJE6ACJDWLBgAYKDg1FeXo49e/bgyy+/xM6dO3H06FGoVKo6bVUqFc6ePYukpCRERUXVeezbb7+FSqVCeXl5neuLFy/Grl278MADDyA8PByZmZn4+OOP0bt3b+zZs6dektFSEREReP755wEAGRkZ+PzzzzF16lRUVFTg8ccfr9depVJh3bp1ePjhh+tcv3DhAnbv3l3v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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Empirical Lipschitz constants: K12=5.5859, K23=3.4846\n" + ] + } + ], + "source": [ + "import copy\n", + "import torch\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from scipy.stats import wasserstein_distance\n", + "from tqdm import tqdm\n", + "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n", + "\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Utilities for state‐dict arithmetic & norms\n", + "# -----------------------------------------------------------------------------\n", + "def subtract_state_dicts(sd_a, sd_b):\n", + " return {k: sd_a[k] - sd_b[k] for k in sd_a}\n", + "\n", + "\n", + "def add_scaled(sd_base, sd_delta, alpha):\n", + " return {k: sd_base[k] + alpha * sd_delta[k] for k in sd_base}\n", + "\n", + "\n", + "def state_dict_norm(sd):\n", + " total = torch.stack([v.flatten().dot(v.flatten()) for v in sd.values()]).sum()\n", + " return torch.sqrt(total).item()\n", + "\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Load your 3 reward models & tokenizer\n", + "# -----------------------------------------------------------------------------\n", + "paths = [\n", + " 'LifelongAlignment/aifgen-lipschitz-0-reward-model',\n", + " 'LifelongAlignment/aifgen-lipschitz-1-reward-model',\n", + " 'LifelongAlignment/aifgen-lipschitz-2-reward-model',\n", + "]\n", + "\n", + "models = [\n", + " AutoModelForSequenceClassification.from_pretrained(\n", + " p,\n", + " torch_dtype=torch.bfloat16,\n", + " cache_dir='//network/scratch/s/shahrad.mohammadzadeh/.cache',\n", + " ).cuda()\n", + " for p in paths\n", + "]\n", + "tokenizer = AutoTokenizer.from_pretrained(paths[0])\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Compute task vectors & their norms\n", + "# -----------------------------------------------------------------------------\n", + "sd1, sd2, sd3 = [m.state_dict() for m in models]\n", + "T12 = subtract_state_dicts(sd2, sd1)\n", + "T23 = subtract_state_dicts(sd3, sd2)\n", + "norm12 = state_dict_norm(T12)\n", + "norm23 = state_dict_norm(T23)\n", + "print(f'||T12|| = {norm12:.2f}, ||T23|| = {norm23:.2f}')\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Load your prompts\n", + "# -----------------------------------------------------------------------------\n", + "prompts = prompts_lip\n", + "\n", + "# In experiments.ipynb, add a new cell before your interpolation\n", + "\n", + "from torch.utils.data import DataLoader, Dataset\n", + "\n", + "\n", + "class PromptDataset(Dataset):\n", + " def __init__(self, prompts):\n", + " self.prompts = prompts\n", + "\n", + " def __len__(self):\n", + " return len(self.prompts)\n", + "\n", + " def __getitem__(self, i):\n", + " return self.prompts[i]\n", + "\n", + "\n", + "def compute_rewards(model, prompts, batch_size=64, num_workers=4):\n", + " \"\"\"Compute reward scores in batches.\"\"\"\n", + " model.eval()\n", + " ds = PromptDataset(prompts)\n", + " loader = DataLoader(\n", + " ds,\n", + " batch_size=batch_size,\n", + " shuffle=False,\n", + " num_workers=num_workers,\n", + " collate_fn=lambda batch: tokenizer(\n", + " batch,\n", + " return_tensors='pt',\n", + " padding=True,\n", + " truncation=True,\n", + " ),\n", + " )\n", + " rewards = []\n", + " with torch.no_grad():\n", + " for batch in loader:\n", + " batch = {k: v.cuda(non_blocking=True) for k, v in batch.items()}\n", + " logits = model(**batch).logits\n", + " # if binary head, pick class 1; else regression head\n", + " if logits.shape[-1] > 1:\n", + " vals = logits[:, 1]\n", + " else:\n", + " vals = logits[:, 0]\n", + " rewards.extend(vals.cpu().tolist())\n", + " return rewards\n", + "\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Interpolate along T12 (RM1 → RM2)\n", + "# -----------------------------------------------------------------------------\n", + "alphas = np.linspace(0, 1, 11)\n", + "all_rewards_12 = []\n", + "for α in tqdm(alphas, desc='Interp T12'):\n", + " sd_interp = add_scaled(sd1, T12, α)\n", + " m = copy.deepcopy(models[0])\n", + " m.load_state_dict(sd_interp)\n", + " all_rewards_12.append(compute_rewards(m, prompts, batch_size=1024))\n", + "\n", + "# Wasserstein distances & Lipschitz estimate\n", + "dists12 = [\n", + " wasserstein_distance(all_rewards_12[i], all_rewards_12[i + 1])\n", + " for i in range(len(alphas) - 1)\n", + "]\n", + "rates12 = [d / ((alphas[i + 1] - alphas[i]) * norm12) for i, d in enumerate(dists12)]\n", + "K12 = max(rates12)\n", + "\n", + "plt.figure()\n", + "plt.plot(alphas[:-1], dists12, marker='o')\n", + "plt.title(f'RM1→RM2: W-dist vs α (K≈{K12:.3f})')\n", + "plt.xlabel('α')\n", + "plt.ylabel('Wasserstein')\n", + "plt.grid(True)\n", + "plt.show()\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Interpolate along T23 (RM2 → RM3)\n", + "# -----------------------------------------------------------------------------\n", + "betas = np.linspace(0, 1, 11)\n", + "all_rewards_23 = []\n", + "for β in tqdm(betas, desc='Interp T23'):\n", + " sd_interp = add_scaled(sd2, T23, β)\n", + " m = copy.deepcopy(models[1])\n", + " m.load_state_dict(sd_interp)\n", + " all_rewards_23.append(compute_rewards(m, prompts, batch_size=1024))\n", + "\n", + "dists23 = [\n", + " wasserstein_distance(all_rewards_23[i], all_rewards_23[i + 1])\n", + " for i in range(len(betas) - 1)\n", + "]\n", + "rates23 = [d / ((betas[i + 1] - betas[i]) * norm23) for i, d in enumerate(dists23)]\n", + "K23 = max(rates23)\n", + "\n", + "plt.figure()\n", + "plt.plot(betas[:-1], dists23, marker='o')\n", + "plt.title(f'RM2→RM3: W-dist vs β (K≈{K23:.3f})')\n", + "plt.xlabel('β')\n", + "plt.ylabel('Wasserstein')\n", + "plt.grid(True)\n", + "plt.show()\n", + "\n", + "print(f'Empirical Lipschitz constants: K12={K12:.4f}, K23={K23:.4f}')" + ] + }, + { + "cell_type": "markdown", + "id": "b127c047", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c834752b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "||T12|| = 0.83, ||T23|| = 0.88\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Interp T12: 0%| | 0/11 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Interp T23: 100%|██████████| 11/11 [08:16<00:00, 45.12s/it]\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Empirical Lipschitz constants: K12=9.3892, K23=1.6530\n" + ] + } + ], + "source": [ + "import copy\n", + "import torch\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from scipy.stats import wasserstein\n", + "from tqdm import tqdm\n", + "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n", + "\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Utilities for state‐dict arithmetic & norms\n", + "# -----------------------------------------------------------------------------\n", + "def subtract_state_dicts(sd_a, sd_b):\n", + " return {k: sd_a[k] - sd_b[k] for k in sd_a}\n", + "\n", + "\n", + "def add_scaled(sd_base, sd_delta, alpha):\n", + " return {k: sd_base[k] + alpha * sd_delta[k] for k in sd_base}\n", + "\n", + "\n", + "def state_dict_norm(sd):\n", + " total = torch.stack([v.flatten().dot(v.flatten()) for v in sd.values()]).sum()\n", + " return torch.sqrt(total).item()\n", + "\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Load your 3 reward models & tokenizer\n", + "# -----------------------------------------------------------------------------\n", + "paths = [\n", + " 'LifelongAlignment/aifgen-piecewise-preference-shift-0-reward-model',\n", + " 'LifelongAlignment/aifgen-piecewise-preference-shift-1-reward-model',\n", + " 'LifelongAlignment/aifgen-piecewise-preference-shift-2-reward-model',\n", + "]\n", + "\n", + "models = [\n", + " AutoModelForSequenceClassification.from_pretrained(\n", + " p,\n", + " torch_dtype=torch.bfloat16,\n", + " cache_dir='//network/scratch/s/shahrad.mohammadzadeh/.cache',\n", + " ).cuda()\n", + " for p in paths\n", + "]\n", + "tokenizer = AutoTokenizer.from_pretrained(paths[0])\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Compute task vectors & their norms\n", + "# -----------------------------------------------------------------------------\n", + "sd1, sd2, sd3 = [m.state_dict() for m in models]\n", + "T12 = subtract_state_dicts(sd2, sd1)\n", + "T23 = subtract_state_dicts(sd3, sd2)\n", + "norm12 = state_dict_norm(T12)\n", + "norm23 = state_dict_norm(T23)\n", + "print(f'||T12|| = {norm12:.2f}, ||T23|| = {norm23:.2f}')\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Load your prompts\n", + "# -----------------------------------------------------------------------------\n", + "prompts = prompts_piecewise\n", + "\n", + "# In experiments.ipynb, add a new cell before your interpolation\n", + "\n", + "from torch.utils.data import DataLoader, Dataset\n", + "\n", + "\n", + "class PromptDataset(Dataset):\n", + " def __init__(self, prompts):\n", + " self.prompts = prompts\n", + "\n", + " def __len__(self):\n", + " return len(self.prompts)\n", + "\n", + " def __getitem__(self, i):\n", + " return self.prompts[i]\n", + "\n", + "\n", + "def compute_rewards(model, prompts, batch_size=64, num_workers=4):\n", + " \"\"\"Compute reward scores in batches.\"\"\"\n", + " model.eval()\n", + " ds = PromptDataset(prompts)\n", + " loader = DataLoader(\n", + " ds,\n", + " batch_size=batch_size,\n", + " shuffle=False,\n", + " num_workers=num_workers,\n", + " collate_fn=lambda batch: tokenizer(\n", + " batch,\n", + " return_tensors='pt',\n", + " padding=True,\n", + " truncation=True,\n", + " ),\n", + " )\n", + " rewards = []\n", + " with torch.no_grad():\n", + " for batch in loader:\n", + " batch = {k: v.cuda(non_blocking=True) for k, v in batch.items()}\n", + " logits = model(**batch).logits\n", + " # if binary head, pick class 1; else regression head\n", + " if logits.shape[-1] > 1:\n", + " vals = logits[:, 1]\n", + " else:\n", + " vals = logits[:, 0]\n", + " rewards.extend(vals.cpu().tolist())\n", + " return rewards\n", + "\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Interpolate along T12 (RM1 → RM2)\n", + "# -----------------------------------------------------------------------------\n", + "alphas = np.linspace(0, 1, 11)\n", + "all_rewards_12 = []\n", + "for α in tqdm(alphas, desc='Interp T12'):\n", + " sd_interp = add_scaled(sd1, T12, α)\n", + " m = copy.deepcopy(models[0])\n", + " m.load_state_dict(sd_interp)\n", + " all_rewards_12.append(compute_rewards(m, prompts, batch_size=1024))\n", + "\n", + "# Wasserstein distances & Lipschitz estimate\n", + "dists12 = [\n", + " wasserstein_distance(all_rewards_12[i], all_rewards_12[i + 1])\n", + " for i in range(len(alphas) - 1)\n", + "]\n", + "rates12 = [d / ((alphas[i + 1] - alphas[i]) * norm12) for i, d in enumerate(dists12)]\n", + "K12 = max(rates12)\n", + "\n", + "plt.figure()\n", + "plt.plot(alphas[:-1], dists12, marker='o')\n", + "plt.title(f'RM1→RM2: W-dist vs α (K≈{K12:.3f})')\n", + "plt.xlabel('α')\n", + "plt.ylabel('Wasserstein')\n", + "plt.grid(True)\n", + "plt.show()\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Interpolate along T23 (RM2 → RM3)\n", + "# -----------------------------------------------------------------------------\n", + "betas = np.linspace(0, 1, 11)\n", + "all_rewards_23 = []\n", + "for β in tqdm(betas, desc='Interp T23'):\n", + " sd_interp = add_scaled(sd2, T23, β)\n", + " m = copy.deepcopy(models[1])\n", + " m.load_state_dict(sd_interp)\n", + " all_rewards_23.append(compute_rewards(m, prompts, batch_size=1024))\n", + "\n", + "dists23 = [\n", + " wasserstein_distance(all_rewards_23[i], all_rewards_23[i + 1])\n", + " for i in range(len(betas) - 1)\n", + "]\n", + "rates23 = [d / ((betas[i + 1] - betas[i]) * norm23) for i, d in enumerate(dists23)]\n", + "K23 = max(rates23)\n", + "\n", + "plt.figure()\n", + "plt.plot(betas[:-1], dists23, marker='o')\n", + "plt.title(f'RM2→RM3: W-dist vs β (K≈{K23:.3f})')\n", + "plt.xlabel('β')\n", + "plt.ylabel('Wasserstein')\n", + "plt.grid(True)\n", + "plt.show()\n", + "\n", + "print(f'Empirical Lipschitz constants: K12={K12:.4f}, K23={K23:.4f}')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e4057dfe", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}