From ee3943b5b12c28deeb77b1c2184c407a17f376d7 Mon Sep 17 00:00:00 2001 From: wehub-resource-sync Date: Mon, 13 Jul 2026 13:24:32 +0800 Subject: [PATCH] chore: import upstream snapshot with attribution --- .dvc/.gitignore | 3 + .dvc/config | 0 .dvc/plots/confusion.json | 30 + .dvc/plots/default.json | 29 + .dvc/plots/scatter.json | 27 + .dvc/plots/smooth.json | 39 + .dvcignore | 3 + .github/ISSUE_TEMPLATE/bug-report.yml | 45 + .github/ISSUE_TEMPLATE/config.yml | 7 + .github/ISSUE_TEMPLATE/feature-request.yml | 29 + .github/conda/build.sh | 1 + .github/conda/meta.yaml | 55 + .github/workflows/build_documentation.yml | 20 + .github/workflows/build_pr_documentation.yml | 16 + .github/workflows/ci.yml | 176 + .github/workflows/release-conda.yml | 47 + .github/workflows/self-assign.yaml | 16 + .github/workflows/trufflehog.yml | 20 + .github/workflows/upload_pr_documentation.yml | 16 + .gitignore | 60 + .pre-commit-config.yaml | 9 + .zenodo.json | 130 + ADD_NEW_DATASET.md | 8 + AUTHORS | 8 + CITATION.cff | 150 + CODE_OF_CONDUCT.md | 132 + CONTRIBUTING.md | 130 + LICENSE | 202 + Makefile | 20 + README.md | 299 + README.wehub.md | 7 + SECURITY.md | 33 + benchmarks/benchmark_array_xd.py | 142 + benchmarks/benchmark_getitem_100B.py | 78 + benchmarks/benchmark_indices_mapping.py | 60 + benchmarks/benchmark_iterating.py | 98 + benchmarks/benchmark_map_filter.py | 71 + benchmarks/format.py | 49 + benchmarks/results/.gitkeep | 0 benchmarks/results/benchmark_array_xd.json | 1 + .../results/benchmark_getitem_100B.json | 1 + .../results/benchmark_indices_mapping.json | 1 + benchmarks/results/benchmark_iterating.json | 1 + benchmarks/results/benchmark_map_filter.json | 1 + benchmarks/utils.py | 64 + docs/README.md | 260 + docs/source/_config.py | 11 + docs/source/_redirects.yml | 13 + docs/source/_toctree.yml | 148 + docs/source/about_arrow.md | 50 + docs/source/about_cache.mdx | 49 + docs/source/about_dataset_features.mdx | 230 + docs/source/about_dataset_load.mdx | 104 + docs/source/about_map_batch.mdx | 59 + docs/source/about_mapstyle_vs_iterable.mdx | 250 + docs/source/access.mdx | 163 + docs/source/audio_dataset.mdx | 192 + docs/source/audio_load.mdx | 115 + docs/source/audio_process.mdx | 81 + docs/source/cache.mdx | 110 + docs/source/cli.mdx | 48 + docs/source/create_dataset.mdx | 125 + docs/source/dataset_card.mdx | 27 + docs/source/depth_estimation.mdx | 231 + docs/source/document_dataset.mdx | 132 + docs/source/document_load.mdx | 204 + docs/source/faiss_es.mdx | 133 + docs/source/filesystems.mdx | 124 + docs/source/how_to.md | 19 + docs/source/image_classification.mdx | 86 + docs/source/image_dataset.mdx | 297 + docs/source/image_load.mdx | 188 + docs/source/image_process.mdx | 72 + docs/source/imgs/course_banner.png | Bin 0 -> 80305 bytes docs/source/imgs/datasets_logo_name.jpg | Bin 0 -> 46530 bytes docs/source/index.mdx | 30 + docs/source/installation.md | 103 + docs/source/load_hub.mdx | 101 + docs/source/loading.mdx | 469 + docs/source/mesh_dataset.mdx | 164 + docs/source/mesh_load.mdx | 123 + docs/source/nifti_dataset.mdx | 130 + docs/source/nlp_load.mdx | 46 + docs/source/nlp_process.mdx | 63 + docs/source/object_detection.mdx | 161 + .../package_reference/builder_classes.mdx | 43 + .../package_reference/loading_methods.mdx | 120 + .../source/package_reference/main_classes.mdx | 302 + .../package_reference/table_classes.mdx | 138 + docs/source/package_reference/utilities.mdx | 58 + docs/source/process.mdx | 856 ++ docs/source/quickstart.mdx | 380 + docs/source/repository_structure.mdx | 273 + docs/source/semantic_segmentation.mdx | 174 + docs/source/share.mdx | 211 + docs/source/stream.mdx | 628 ++ docs/source/tabular_load.mdx | 151 + docs/source/troubleshoot.mdx | 118 + docs/source/tsfile_load.mdx | 172 + docs/source/tutorial.md | 12 + docs/source/upload_dataset.mdx | 134 + docs/source/use_dataset.mdx | 234 + docs/source/use_with_jax.mdx | 221 + docs/source/use_with_numpy.mdx | 182 + docs/source/use_with_pandas.mdx | 83 + docs/source/use_with_polars.mdx | 139 + docs/source/use_with_pyarrow.mdx | 108 + docs/source/use_with_pytorch.mdx | 260 + docs/source/use_with_spark.mdx | 67 + docs/source/use_with_tensorflow.mdx | 256 + docs/source/video_dataset.mdx | 292 + docs/source/video_load.mdx | 218 + notebooks/README.md | 33 + pyproject.toml | 27 + setup.py | 283 + src/datasets/__init__.py | 47 + src/datasets/arrow_dataset.py | 7391 +++++++++++++++ src/datasets/arrow_reader.py | 620 ++ src/datasets/arrow_writer.py | 828 ++ src/datasets/builder.py | 1916 ++++ src/datasets/combine.py | 232 + src/datasets/commands/__init__.py | 13 + src/datasets/commands/datasets_cli.py | 39 + src/datasets/commands/delete_from_hub.py | 42 + src/datasets/commands/env.py | 41 + src/datasets/commands/test.py | 180 + src/datasets/config.py | 277 + src/datasets/data_files.py | 829 ++ src/datasets/dataset_dict.py | 2774 ++++++ src/datasets/distributed.py | 43 + src/datasets/download/__init__.py | 10 + src/datasets/download/download_config.py | 85 + src/datasets/download/download_manager.py | 340 + .../download/streaming_download_manager.py | 219 + src/datasets/exceptions.py | 119 + src/datasets/features/__init__.py | 29 + src/datasets/features/_torchcodec.py | 15 + src/datasets/features/audio.py | 365 + src/datasets/features/features.py | 2449 +++++ src/datasets/features/image.py | 441 + src/datasets/features/mesh.py | 295 + src/datasets/features/nifti.py | 351 + src/datasets/features/pdf.py | 309 + src/datasets/features/translation.py | 129 + src/datasets/features/video.py | 415 + src/datasets/filesystems/__init__.py | 47 + src/datasets/filesystems/compression.py | 127 + src/datasets/fingerprint.py | 480 + src/datasets/formatting/__init__.py | 136 + src/datasets/formatting/formatting.py | 678 ++ src/datasets/formatting/jax_formatter.py | 174 + src/datasets/formatting/np_formatter.py | 120 + src/datasets/formatting/polars_formatter.py | 124 + src/datasets/formatting/tf_formatter.py | 129 + src/datasets/formatting/torch_formatter.py | 130 + src/datasets/hub.py | 135 + src/datasets/info.py | 440 + src/datasets/inspect.py | 350 + src/datasets/io/__init__.py | 0 src/datasets/io/abc.py | 53 + src/datasets/io/csv.py | 143 + src/datasets/io/generator.py | 62 + src/datasets/io/json.py | 178 + src/datasets/io/parquet.py | 159 + src/datasets/io/spark.py | 57 + src/datasets/io/sql.py | 122 + src/datasets/io/text.py | 58 + src/datasets/iterable_dataset.py | 5400 +++++++++++ src/datasets/load.py | 1782 ++++ src/datasets/naming.py | 84 + src/datasets/packaged_modules/__init__.py | 148 + .../packaged_modules/arrow/__init__.py | 0 src/datasets/packaged_modules/arrow/arrow.py | 77 + .../packaged_modules/audiofolder/__init__.py | 0 .../audiofolder/audiofolder.py | 86 + .../packaged_modules/cache/__init__.py | 0 src/datasets/packaged_modules/cache/cache.py | 195 + .../packaged_modules/conll/__init__.py | 0 src/datasets/packaged_modules/conll/conll.py | 155 + src/datasets/packaged_modules/csv/__init__.py | 0 src/datasets/packaged_modules/csv/csv.py | 206 + .../packaged_modules/eval/__init__.py | 0 src/datasets/packaged_modules/eval/eval.py | 77 + .../folder_based_builder/__init__.py | 0 .../folder_based_builder.py | 444 + .../packaged_modules/generator/__init__.py | 0 .../packaged_modules/generator/generator.py | 38 + .../packaged_modules/hdf5/__init__.py | 0 src/datasets/packaged_modules/hdf5/hdf5.py | 389 + .../packaged_modules/iceberg/__init__.py | 0 .../packaged_modules/iceberg/iceberg.py | 173 + .../packaged_modules/imagefolder/__init__.py | 0 .../imagefolder/imagefolder.py | 103 + .../packaged_modules/json/__init__.py | 0 src/datasets/packaged_modules/json/json.py | 536 ++ .../packaged_modules/lance/__init__.py | 0 src/datasets/packaged_modules/lance/lance.py | 240 + .../packaged_modules/meshfolder/__init__.py | 0 .../packaged_modules/meshfolder/meshfolder.py | 31 + .../packaged_modules/niftifolder/__init__.py | 0 .../niftifolder/niftifolder.py | 23 + .../packaged_modules/pandas/__init__.py | 0 .../packaged_modules/pandas/pandas.py | 57 + .../packaged_modules/parquet/__init__.py | 0 .../packaged_modules/parquet/parquet.py | 234 + .../packaged_modules/pdffolder/__init__.py | 0 .../packaged_modules/pdffolder/pdffolder.py | 23 + .../packaged_modules/spark/__init__.py | 0 src/datasets/packaged_modules/spark/spark.py | 367 + src/datasets/packaged_modules/sql/__init__.py | 0 src/datasets/packaged_modules/sql/sql.py | 120 + .../packaged_modules/text/__init__.py | 0 src/datasets/packaged_modules/text/text.py | 137 + .../packaged_modules/tsfile/__init__.py | 0 .../packaged_modules/tsfile/tsfile.py | 773 ++ .../packaged_modules/videofolder/__init__.py | 0 .../videofolder/videofolder.py | 34 + .../packaged_modules/webdataset/__init__.py | 0 .../packaged_modules/webdataset/_tenbin.py | 285 + .../packaged_modules/webdataset/webdataset.py | 367 + src/datasets/packaged_modules/xml/__init__.py | 0 src/datasets/packaged_modules/xml/xml.py | 70 + src/datasets/parallel/__init__.py | 1 + src/datasets/parallel/parallel.py | 120 + src/datasets/search.py | 785 ++ src/datasets/splits.py | 647 ++ src/datasets/streaming.py | 131 + src/datasets/table.py | 2482 +++++ src/datasets/utils/__init__.py | 25 + src/datasets/utils/_dataset_viewer.py | 95 + src/datasets/utils/_dill.py | 505 ++ src/datasets/utils/_filelock.py | 58 + src/datasets/utils/deprecation_utils.py | 105 + src/datasets/utils/doc_utils.py | 15 + src/datasets/utils/experimental.py | 43 + src/datasets/utils/extract.py | 446 + src/datasets/utils/file_utils.py | 1449 +++ src/datasets/utils/filelock.py | 11 + src/datasets/utils/hub.py | 6 + src/datasets/utils/info_utils.py | 105 + src/datasets/utils/json.py | 139 + src/datasets/utils/logging.py | 175 + src/datasets/utils/metadata.py | 233 + src/datasets/utils/patching.py | 119 + src/datasets/utils/py_utils.py | 640 ++ src/datasets/utils/resources/__init__.py | 0 src/datasets/utils/resources/creators.json | 17 + src/datasets/utils/resources/languages.json | 8026 +++++++++++++++++ .../utils/resources/multilingualities.json | 6 + .../utils/resources/readme_structure.yaml | 116 + .../utils/resources/size_categories.json | 14 + src/datasets/utils/sharding.py | 92 + src/datasets/utils/stratify.py | 107 + src/datasets/utils/tf_utils.py | 564 ++ src/datasets/utils/tqdm.py | 135 + src/datasets/utils/track.py | 61 + src/datasets/utils/typing.py | 9 + src/datasets/utils/version.py | 106 + templates/README.md | 126 + templates/README_guide.md | 200 + tests/__init__.py | 0 tests/_test_patching.py | 11 + tests/commands/__init__.py | 0 tests/commands/conftest.py | 9 + tests/commands/test_test.py | 83 + tests/conftest.py | 62 + .../run_torch_distributed.py | 55 + tests/features/__init__.py | 0 tests/features/data/test_audio_16000.mp3 | Bin 0 -> 15336 bytes tests/features/data/test_audio_16000.pcm | Bin 0 -> 32416 bytes tests/features/data/test_audio_44100.mp3 | Bin 0 -> 40124 bytes tests/features/data/test_audio_44100.wav | Bin 0 -> 809358 bytes tests/features/data/test_audio_48000.opus | Bin 0 -> 8145 bytes tests/features/data/test_image_rgb.jpg | Bin 0 -> 173131 bytes tests/features/data/test_image_rgba.png | Bin 0 -> 51083 bytes tests/features/data/test_mesh_glb.glb | Bin 0 -> 2609984 bytes tests/features/data/test_mesh_ply.ply | Bin 0 -> 16923229 bytes tests/features/data/test_mesh_stl.stl | Bin 0 -> 41275384 bytes tests/features/data/test_nifti.nii | Bin 0 -> 128352 bytes tests/features/data/test_nifti.nii.gz | Bin 0 -> 33209 bytes tests/features/data/test_pdf.pdf | Bin 0 -> 13264 bytes tests/features/data/test_video_66x50.mov | Bin 0 -> 44391 bytes tests/features/test_array_xd.py | 465 + tests/features/test_audio.py | 819 ++ tests/features/test_features.py | 1049 +++ tests/features/test_image.py | 714 ++ tests/features/test_mesh.py | 159 + tests/features/test_nifti.py | 149 + tests/features/test_pdf.py | 62 + tests/features/test_video.py | 155 + tests/fixtures/__init__.py | 0 tests/fixtures/files.py | 665 ++ tests/fixtures/fsspec.py | 113 + tests/fixtures/hub.py | 229 + tests/io/__init__.py | 0 tests/io/data/test_file.json.bz2 | Bin 0 -> 182 bytes tests/io/data/test_file.json.gz | Bin 0 -> 155 bytes tests/io/data/test_file.json.xz | Bin 0 -> 172 bytes tests/io/data/test_image_rgb.jpg | Bin 0 -> 173131 bytes tests/io/test_csv.py | 175 + tests/io/test_json.py | 307 + tests/io/test_parquet.py | 311 + tests/io/test_sql.py | 102 + tests/io/test_text.py | 120 + tests/packaged_modules/__init__.py | 0 tests/packaged_modules/test_arrow.py | 61 + tests/packaged_modules/test_audiofolder.py | 394 + tests/packaged_modules/test_cache.py | 158 + tests/packaged_modules/test_conll.py | 213 + tests/packaged_modules/test_csv.py | 153 + .../test_folder_based_builder.py | 500 + tests/packaged_modules/test_hdf5.py | 829 ++ tests/packaged_modules/test_iceberg.py | 190 + tests/packaged_modules/test_imagefolder.py | 444 + tests/packaged_modules/test_json.py | 809 ++ tests/packaged_modules/test_lance.py | 106 + tests/packaged_modules/test_meshfolder.py | 86 + tests/packaged_modules/test_pandas.py | 16 + tests/packaged_modules/test_parquet.py | 41 + tests/packaged_modules/test_spark.py | 170 + tests/packaged_modules/test_sql.py | 16 + tests/packaged_modules/test_text.py | 90 + tests/packaged_modules/test_tsfile.py | 748 ++ tests/packaged_modules/test_videofolder.py | 132 + tests/packaged_modules/test_webdataset.py | 365 + tests/test_arrow_dataset.py | 5122 +++++++++++ tests/test_arrow_reader.py | 269 + tests/test_arrow_writer.py | 411 + tests/test_builder.py | 935 ++ tests/test_data_files.py | 692 ++ tests/test_dataset_dict.py | 912 ++ tests/test_dataset_list.py | 47 + tests/test_distributed.py | 139 + tests/test_download_manager.py | 174 + tests/test_exceptions.py | 35 + tests/test_experimental.py | 17 + tests/test_extract.py | 202 + tests/test_file_utils.py | 942 ++ tests/test_filelock.py | 11 + tests/test_filesystem.py | 60 + tests/test_fingerprint.py | 575 ++ tests/test_fingerprint_tokenizer_stability.py | 45 + tests/test_formatting.py | 1046 +++ tests/test_hub.py | 92 + tests/test_info.py | 178 + tests/test_info_utils.py | 22 + tests/test_inspect.py | 135 + tests/test_iterable_dataset.py | 3184 +++++++ tests/test_load.py | 1364 +++ tests/test_metadata_util.py | 358 + tests/test_offline_util.py | 52 + tests/test_parallel.py | 51 + tests/test_patching.py | 151 + tests/test_py_utils.py | 290 + tests/test_search.py | 244 + tests/test_sharding_utils.py | 54 + tests/test_splits.py | 43 + tests/test_streaming_download_manager.py | 216 + tests/test_table.py | 1450 +++ tests/test_tqdm.py | 116 + tests/test_upstream_hub.py | 1173 +++ tests/test_version.py | 23 + tests/utils.py | 661 ++ utils/release.py | 104 + 364 files changed, 101661 insertions(+) create mode 100644 .dvc/.gitignore create mode 100644 .dvc/config create mode 100644 .dvc/plots/confusion.json create mode 100644 .dvc/plots/default.json create mode 100644 .dvc/plots/scatter.json create mode 100644 .dvc/plots/smooth.json create mode 100644 .dvcignore create mode 100644 .github/ISSUE_TEMPLATE/bug-report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature-request.yml create mode 100644 .github/conda/build.sh create mode 100644 .github/conda/meta.yaml create mode 100644 .github/workflows/build_documentation.yml create mode 100644 .github/workflows/build_pr_documentation.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release-conda.yml create mode 100644 .github/workflows/self-assign.yaml create mode 100644 .github/workflows/trufflehog.yml create mode 100644 .github/workflows/upload_pr_documentation.yml create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 .zenodo.json create mode 100644 ADD_NEW_DATASET.md create mode 100644 AUTHORS create mode 100644 CITATION.cff create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 README.wehub.md create mode 100644 SECURITY.md create mode 100644 benchmarks/benchmark_array_xd.py create mode 100644 benchmarks/benchmark_getitem_100B.py create mode 100644 benchmarks/benchmark_indices_mapping.py create mode 100644 benchmarks/benchmark_iterating.py create mode 100644 benchmarks/benchmark_map_filter.py create mode 100644 benchmarks/format.py create mode 100644 benchmarks/results/.gitkeep create mode 100644 benchmarks/results/benchmark_array_xd.json create mode 100644 benchmarks/results/benchmark_getitem_100B.json create mode 100644 benchmarks/results/benchmark_indices_mapping.json create mode 100644 benchmarks/results/benchmark_iterating.json create mode 100644 benchmarks/results/benchmark_map_filter.json create mode 100644 benchmarks/utils.py create mode 100644 docs/README.md create mode 100644 docs/source/_config.py create mode 100644 docs/source/_redirects.yml create mode 100644 docs/source/_toctree.yml create mode 100644 docs/source/about_arrow.md create mode 100644 docs/source/about_cache.mdx create mode 100644 docs/source/about_dataset_features.mdx create mode 100644 docs/source/about_dataset_load.mdx create mode 100644 docs/source/about_map_batch.mdx create mode 100644 docs/source/about_mapstyle_vs_iterable.mdx create mode 100644 docs/source/access.mdx create mode 100644 docs/source/audio_dataset.mdx create mode 100644 docs/source/audio_load.mdx create mode 100644 docs/source/audio_process.mdx create mode 100644 docs/source/cache.mdx create mode 100644 docs/source/cli.mdx create mode 100644 docs/source/create_dataset.mdx create mode 100644 docs/source/dataset_card.mdx create mode 100644 docs/source/depth_estimation.mdx create mode 100644 docs/source/document_dataset.mdx create mode 100644 docs/source/document_load.mdx create mode 100644 docs/source/faiss_es.mdx create mode 100644 docs/source/filesystems.mdx create mode 100644 docs/source/how_to.md create mode 100644 docs/source/image_classification.mdx create mode 100644 docs/source/image_dataset.mdx create mode 100644 docs/source/image_load.mdx create mode 100644 docs/source/image_process.mdx create mode 100644 docs/source/imgs/course_banner.png create mode 100644 docs/source/imgs/datasets_logo_name.jpg create mode 100644 docs/source/index.mdx create mode 100644 docs/source/installation.md create mode 100644 docs/source/load_hub.mdx create mode 100644 docs/source/loading.mdx create mode 100644 docs/source/mesh_dataset.mdx create mode 100644 docs/source/mesh_load.mdx create mode 100644 docs/source/nifti_dataset.mdx create mode 100644 docs/source/nlp_load.mdx create mode 100644 docs/source/nlp_process.mdx create mode 100644 docs/source/object_detection.mdx create mode 100644 docs/source/package_reference/builder_classes.mdx create mode 100644 docs/source/package_reference/loading_methods.mdx create mode 100644 docs/source/package_reference/main_classes.mdx create mode 100644 docs/source/package_reference/table_classes.mdx create mode 100644 docs/source/package_reference/utilities.mdx create mode 100644 docs/source/process.mdx create mode 100644 docs/source/quickstart.mdx create mode 100644 docs/source/repository_structure.mdx create mode 100644 docs/source/semantic_segmentation.mdx create mode 100644 docs/source/share.mdx create mode 100644 docs/source/stream.mdx create mode 100644 docs/source/tabular_load.mdx create mode 100644 docs/source/troubleshoot.mdx create mode 100644 docs/source/tsfile_load.mdx create mode 100644 docs/source/tutorial.md create mode 100644 docs/source/upload_dataset.mdx create mode 100644 docs/source/use_dataset.mdx create mode 100644 docs/source/use_with_jax.mdx create mode 100644 docs/source/use_with_numpy.mdx create mode 100644 docs/source/use_with_pandas.mdx create mode 100644 docs/source/use_with_polars.mdx create mode 100644 docs/source/use_with_pyarrow.mdx create mode 100644 docs/source/use_with_pytorch.mdx create mode 100644 docs/source/use_with_spark.mdx create mode 100644 docs/source/use_with_tensorflow.mdx create mode 100644 docs/source/video_dataset.mdx create mode 100644 docs/source/video_load.mdx create mode 100644 notebooks/README.md create mode 100644 pyproject.toml create mode 100644 setup.py create mode 100644 src/datasets/__init__.py create mode 100644 src/datasets/arrow_dataset.py create mode 100644 src/datasets/arrow_reader.py create mode 100644 src/datasets/arrow_writer.py create mode 100644 src/datasets/builder.py create mode 100644 src/datasets/combine.py create mode 100644 src/datasets/commands/__init__.py create mode 100644 src/datasets/commands/datasets_cli.py create mode 100644 src/datasets/commands/delete_from_hub.py create mode 100644 src/datasets/commands/env.py create mode 100644 src/datasets/commands/test.py create mode 100644 src/datasets/config.py create mode 100644 src/datasets/data_files.py create mode 100644 src/datasets/dataset_dict.py create mode 100644 src/datasets/distributed.py create mode 100644 src/datasets/download/__init__.py create mode 100644 src/datasets/download/download_config.py create mode 100644 src/datasets/download/download_manager.py create mode 100644 src/datasets/download/streaming_download_manager.py create mode 100644 src/datasets/exceptions.py create mode 100644 src/datasets/features/__init__.py create mode 100644 src/datasets/features/_torchcodec.py create mode 100644 src/datasets/features/audio.py create mode 100644 src/datasets/features/features.py create mode 100644 src/datasets/features/image.py create mode 100644 src/datasets/features/mesh.py create mode 100644 src/datasets/features/nifti.py create mode 100644 src/datasets/features/pdf.py create mode 100644 src/datasets/features/translation.py create mode 100644 src/datasets/features/video.py create mode 100644 src/datasets/filesystems/__init__.py create mode 100644 src/datasets/filesystems/compression.py create mode 100644 src/datasets/fingerprint.py create mode 100644 src/datasets/formatting/__init__.py create mode 100644 src/datasets/formatting/formatting.py create mode 100644 src/datasets/formatting/jax_formatter.py create mode 100644 src/datasets/formatting/np_formatter.py create mode 100644 src/datasets/formatting/polars_formatter.py create mode 100644 src/datasets/formatting/tf_formatter.py create mode 100644 src/datasets/formatting/torch_formatter.py create mode 100644 src/datasets/hub.py create mode 100644 src/datasets/info.py create mode 100644 src/datasets/inspect.py create mode 100644 src/datasets/io/__init__.py create mode 100644 src/datasets/io/abc.py create mode 100644 src/datasets/io/csv.py create mode 100644 src/datasets/io/generator.py create mode 100644 src/datasets/io/json.py create mode 100644 src/datasets/io/parquet.py create mode 100644 src/datasets/io/spark.py create mode 100644 src/datasets/io/sql.py create mode 100644 src/datasets/io/text.py create mode 100644 src/datasets/iterable_dataset.py create mode 100644 src/datasets/load.py create mode 100644 src/datasets/naming.py create mode 100644 src/datasets/packaged_modules/__init__.py create mode 100644 src/datasets/packaged_modules/arrow/__init__.py create mode 100644 src/datasets/packaged_modules/arrow/arrow.py create mode 100644 src/datasets/packaged_modules/audiofolder/__init__.py create mode 100644 src/datasets/packaged_modules/audiofolder/audiofolder.py create mode 100644 src/datasets/packaged_modules/cache/__init__.py create mode 100644 src/datasets/packaged_modules/cache/cache.py create mode 100644 src/datasets/packaged_modules/conll/__init__.py create mode 100644 src/datasets/packaged_modules/conll/conll.py create mode 100644 src/datasets/packaged_modules/csv/__init__.py create mode 100644 src/datasets/packaged_modules/csv/csv.py create mode 100644 src/datasets/packaged_modules/eval/__init__.py create mode 100644 src/datasets/packaged_modules/eval/eval.py create mode 100644 src/datasets/packaged_modules/folder_based_builder/__init__.py create mode 100644 src/datasets/packaged_modules/folder_based_builder/folder_based_builder.py create mode 100644 src/datasets/packaged_modules/generator/__init__.py create mode 100644 src/datasets/packaged_modules/generator/generator.py create mode 100644 src/datasets/packaged_modules/hdf5/__init__.py create mode 100644 src/datasets/packaged_modules/hdf5/hdf5.py create mode 100644 src/datasets/packaged_modules/iceberg/__init__.py create mode 100644 src/datasets/packaged_modules/iceberg/iceberg.py create mode 100644 src/datasets/packaged_modules/imagefolder/__init__.py create mode 100644 src/datasets/packaged_modules/imagefolder/imagefolder.py create mode 100644 src/datasets/packaged_modules/json/__init__.py create mode 100644 src/datasets/packaged_modules/json/json.py create mode 100644 src/datasets/packaged_modules/lance/__init__.py create mode 100644 src/datasets/packaged_modules/lance/lance.py create mode 100644 src/datasets/packaged_modules/meshfolder/__init__.py create mode 100644 src/datasets/packaged_modules/meshfolder/meshfolder.py create mode 100644 src/datasets/packaged_modules/niftifolder/__init__.py create mode 100644 src/datasets/packaged_modules/niftifolder/niftifolder.py create mode 100644 src/datasets/packaged_modules/pandas/__init__.py create mode 100644 src/datasets/packaged_modules/pandas/pandas.py create mode 100644 src/datasets/packaged_modules/parquet/__init__.py create mode 100644 src/datasets/packaged_modules/parquet/parquet.py create mode 100644 src/datasets/packaged_modules/pdffolder/__init__.py create mode 100644 src/datasets/packaged_modules/pdffolder/pdffolder.py create mode 100644 src/datasets/packaged_modules/spark/__init__.py create mode 100644 src/datasets/packaged_modules/spark/spark.py create mode 100644 src/datasets/packaged_modules/sql/__init__.py create mode 100644 src/datasets/packaged_modules/sql/sql.py create mode 100644 src/datasets/packaged_modules/text/__init__.py create mode 100644 src/datasets/packaged_modules/text/text.py create mode 100644 src/datasets/packaged_modules/tsfile/__init__.py create mode 100644 src/datasets/packaged_modules/tsfile/tsfile.py create mode 100644 src/datasets/packaged_modules/videofolder/__init__.py create mode 100644 src/datasets/packaged_modules/videofolder/videofolder.py create mode 100644 src/datasets/packaged_modules/webdataset/__init__.py create mode 100644 src/datasets/packaged_modules/webdataset/_tenbin.py create mode 100644 src/datasets/packaged_modules/webdataset/webdataset.py create mode 100644 src/datasets/packaged_modules/xml/__init__.py create mode 100644 src/datasets/packaged_modules/xml/xml.py create mode 100644 src/datasets/parallel/__init__.py create mode 100644 src/datasets/parallel/parallel.py create mode 100644 src/datasets/search.py create mode 100644 src/datasets/splits.py create mode 100644 src/datasets/streaming.py create mode 100644 src/datasets/table.py create mode 100644 src/datasets/utils/__init__.py create mode 100644 src/datasets/utils/_dataset_viewer.py create mode 100644 src/datasets/utils/_dill.py create mode 100644 src/datasets/utils/_filelock.py create mode 100644 src/datasets/utils/deprecation_utils.py create mode 100644 src/datasets/utils/doc_utils.py create mode 100644 src/datasets/utils/experimental.py create mode 100644 src/datasets/utils/extract.py create mode 100644 src/datasets/utils/file_utils.py create mode 100644 src/datasets/utils/filelock.py create mode 100644 src/datasets/utils/hub.py create mode 100644 src/datasets/utils/info_utils.py create mode 100644 src/datasets/utils/json.py create mode 100644 src/datasets/utils/logging.py create mode 100644 src/datasets/utils/metadata.py create mode 100644 src/datasets/utils/patching.py create mode 100644 src/datasets/utils/py_utils.py create mode 100644 src/datasets/utils/resources/__init__.py create mode 100644 src/datasets/utils/resources/creators.json create mode 100644 src/datasets/utils/resources/languages.json create mode 100644 src/datasets/utils/resources/multilingualities.json create mode 100644 src/datasets/utils/resources/readme_structure.yaml create mode 100644 src/datasets/utils/resources/size_categories.json create mode 100644 src/datasets/utils/sharding.py create mode 100644 src/datasets/utils/stratify.py create mode 100644 src/datasets/utils/tf_utils.py create mode 100644 src/datasets/utils/tqdm.py create mode 100644 src/datasets/utils/track.py create mode 100644 src/datasets/utils/typing.py create mode 100644 src/datasets/utils/version.py create mode 100644 templates/README.md create mode 100644 templates/README_guide.md create mode 100644 tests/__init__.py create mode 100644 tests/_test_patching.py create mode 100644 tests/commands/__init__.py create mode 100644 tests/commands/conftest.py create mode 100644 tests/commands/test_test.py create mode 100644 tests/conftest.py create mode 100644 tests/distributed_scripts/run_torch_distributed.py create mode 100644 tests/features/__init__.py create mode 100644 tests/features/data/test_audio_16000.mp3 create mode 100644 tests/features/data/test_audio_16000.pcm create mode 100644 tests/features/data/test_audio_44100.mp3 create mode 100644 tests/features/data/test_audio_44100.wav create mode 100644 tests/features/data/test_audio_48000.opus create mode 100644 tests/features/data/test_image_rgb.jpg create mode 100644 tests/features/data/test_image_rgba.png create mode 100644 tests/features/data/test_mesh_glb.glb create mode 100644 tests/features/data/test_mesh_ply.ply create mode 100644 tests/features/data/test_mesh_stl.stl create mode 100644 tests/features/data/test_nifti.nii create mode 100644 tests/features/data/test_nifti.nii.gz create mode 100644 tests/features/data/test_pdf.pdf create mode 100644 tests/features/data/test_video_66x50.mov create mode 100644 tests/features/test_array_xd.py create mode 100644 tests/features/test_audio.py create mode 100644 tests/features/test_features.py create mode 100644 tests/features/test_image.py create mode 100644 tests/features/test_mesh.py create mode 100644 tests/features/test_nifti.py create mode 100644 tests/features/test_pdf.py create mode 100644 tests/features/test_video.py create mode 100644 tests/fixtures/__init__.py create mode 100644 tests/fixtures/files.py create mode 100644 tests/fixtures/fsspec.py create mode 100644 tests/fixtures/hub.py create mode 100644 tests/io/__init__.py create mode 100644 tests/io/data/test_file.json.bz2 create mode 100644 tests/io/data/test_file.json.gz create mode 100644 tests/io/data/test_file.json.xz create mode 100644 tests/io/data/test_image_rgb.jpg create mode 100644 tests/io/test_csv.py create mode 100644 tests/io/test_json.py create mode 100644 tests/io/test_parquet.py create mode 100644 tests/io/test_sql.py create mode 100644 tests/io/test_text.py create mode 100644 tests/packaged_modules/__init__.py create mode 100644 tests/packaged_modules/test_arrow.py create mode 100644 tests/packaged_modules/test_audiofolder.py create mode 100644 tests/packaged_modules/test_cache.py create mode 100644 tests/packaged_modules/test_conll.py create mode 100644 tests/packaged_modules/test_csv.py create mode 100644 tests/packaged_modules/test_folder_based_builder.py create mode 100644 tests/packaged_modules/test_hdf5.py create mode 100644 tests/packaged_modules/test_iceberg.py create mode 100644 tests/packaged_modules/test_imagefolder.py create mode 100644 tests/packaged_modules/test_json.py create mode 100644 tests/packaged_modules/test_lance.py create mode 100644 tests/packaged_modules/test_meshfolder.py create mode 100644 tests/packaged_modules/test_pandas.py create mode 100644 tests/packaged_modules/test_parquet.py create mode 100644 tests/packaged_modules/test_spark.py create mode 100644 tests/packaged_modules/test_sql.py create mode 100644 tests/packaged_modules/test_text.py create mode 100644 tests/packaged_modules/test_tsfile.py create mode 100644 tests/packaged_modules/test_videofolder.py create mode 100644 tests/packaged_modules/test_webdataset.py create mode 100644 tests/test_arrow_dataset.py create mode 100644 tests/test_arrow_reader.py create mode 100644 tests/test_arrow_writer.py create mode 100644 tests/test_builder.py create mode 100644 tests/test_data_files.py create mode 100644 tests/test_dataset_dict.py create mode 100644 tests/test_dataset_list.py create mode 100644 tests/test_distributed.py create mode 100644 tests/test_download_manager.py create mode 100644 tests/test_exceptions.py create mode 100644 tests/test_experimental.py create mode 100644 tests/test_extract.py create mode 100644 tests/test_file_utils.py create mode 100644 tests/test_filelock.py create mode 100644 tests/test_filesystem.py create mode 100644 tests/test_fingerprint.py create mode 100644 tests/test_fingerprint_tokenizer_stability.py create mode 100644 tests/test_formatting.py create mode 100644 tests/test_hub.py create mode 100644 tests/test_info.py create mode 100644 tests/test_info_utils.py create mode 100644 tests/test_inspect.py create mode 100644 tests/test_iterable_dataset.py create mode 100644 tests/test_load.py create mode 100644 tests/test_metadata_util.py create mode 100644 tests/test_offline_util.py create mode 100644 tests/test_parallel.py create mode 100644 tests/test_patching.py create mode 100644 tests/test_py_utils.py create mode 100644 tests/test_search.py create mode 100644 tests/test_sharding_utils.py create mode 100644 tests/test_splits.py create mode 100644 tests/test_streaming_download_manager.py create mode 100644 tests/test_table.py create mode 100644 tests/test_tqdm.py create mode 100644 tests/test_upstream_hub.py create mode 100644 tests/test_version.py create mode 100644 tests/utils.py create mode 100644 utils/release.py diff --git a/.dvc/.gitignore b/.dvc/.gitignore new file mode 100644 index 0000000..528f30c --- /dev/null +++ b/.dvc/.gitignore @@ -0,0 +1,3 @@ +/config.local +/tmp +/cache diff --git a/.dvc/config b/.dvc/config new file mode 100644 index 0000000..e69de29 diff --git a/.dvc/plots/confusion.json b/.dvc/plots/confusion.json new file mode 100644 index 0000000..0d9a333 --- /dev/null +++ b/.dvc/plots/confusion.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v4.json", + "data": { + "values": "" + }, + "title": "", + "mark": "rect", + "encoding": { + "x": { + "field": "", + "type": "nominal", + "sort": "ascending", + "title": "" + }, + "y": { + "field": "", + "type": "nominal", + "sort": "ascending", + "title": "" + }, + "color": { + "aggregate": "count", + "type": "quantitative" + }, + "facet": { + "field": "rev", + "type": "nominal" + } + } +} diff --git a/.dvc/plots/default.json b/.dvc/plots/default.json new file mode 100644 index 0000000..d00782a --- /dev/null +++ b/.dvc/plots/default.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v4.json", + "data": { + "values": "" + }, + "title": "", + "mark": { + "type": "line" + }, + "encoding": { + "x": { + "field": "", + "type": "quantitative", + "title": "" + }, + "y": { + "field": "", + "type": "quantitative", + "title": "", + "scale": { + "zero": false + } + }, + "color": { + "field": "rev", + "type": "nominal" + } + } +} diff --git a/.dvc/plots/scatter.json b/.dvc/plots/scatter.json new file mode 100644 index 0000000..90165d4 --- /dev/null +++ b/.dvc/plots/scatter.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v4.json", + "data": { + "values": "" + }, + "title": "", + "mark": "point", + "encoding": { + "x": { + "field": "", + "type": "quantitative", + "title": "" + }, + "y": { + "field": "", + "type": "quantitative", + "title": "", + "scale": { + "zero": false + } + }, + "color": { + "field": "rev", + "type": "nominal" + } + } +} diff --git a/.dvc/plots/smooth.json b/.dvc/plots/smooth.json new file mode 100644 index 0000000..d497ce7 --- /dev/null +++ b/.dvc/plots/smooth.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v4.json", + "data": { + "values": "" + }, + "title": "", + "mark": { + "type": "line" + }, + "encoding": { + "x": { + "field": "", + "type": "quantitative", + "title": "" + }, + "y": { + "field": "", + "type": "quantitative", + "title": "", + "scale": { + "zero": false + } + }, + "color": { + "field": "rev", + "type": "nominal" + } + }, + "transform": [ + { + "loess": "", + "on": "", + "groupby": [ + "rev" + ], + "bandwidth": 0.3 + } + ] +} diff --git a/.dvcignore b/.dvcignore new file mode 100644 index 0000000..5197305 --- /dev/null +++ b/.dvcignore @@ -0,0 +1,3 @@ +# Add patterns of files dvc should ignore, which could improve +# the performance. Learn more at +# https://dvc.org/doc/user-guide/dvcignore diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 0000000..85590fd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,45 @@ +name: Bug report +description: Create a report to help reproduce and fix the bug +body: + - type: textarea + id: description + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is + validations: + required: true + + - type: textarea + id: reproduction + attributes: + label: Steps to reproduce the bug + description: | + Please provide a code sample that reproduces the problem you ran into. It can be a Colab link or just a code snippet. + If you have code snippets, error messages, stack traces please provide them here as well. + Important! Use code tags to correctly format your code. See https://help.github.com/en/github/writing-on-github/creating-and-highlighting-code-blocks#syntax-highlighting + Do not use screenshots, as they are hard to read and (more importantly) don't allow others to copy-and-paste your code. + placeholder: | + Steps to reproduce the behavior: + + 1. + 2. + 3. + validations: + required: true + + - type: textarea + id: expected-behavior + validations: + required: true + attributes: + label: Expected behavior + description: A clear and concise description of the expected results. + + - type: textarea + id: environment-info + attributes: + label: Environment info + description: Please share your environemnt info with us. You can run the command `datasets-cli env` and copy-paste its output below. + placeholder: datasets version, platform, python version, ... + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..2d3ae9f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,7 @@ +contact_links: + - name: Datasets on the Hugging Face Hub + url: https://huggingface.co/datasets + about: Please use the "Community" tab of the dataset on the Hugging Face Hub to open a discussion or a pull request + - name: Forum + url: https://discuss.huggingface.co/c/datasets/10 + about: Please ask and answer questions here, and engage with other community members diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 0000000..83e8714 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,29 @@ +name: Feature request +description: Suggest an idea for this project +labels: ["enhancement"] +body: + - type: textarea + id: feature-request + attributes: + label: Feature request + description: A clear and concise description of the feature proposal. + validations: + required: true + + - type: textarea + id: motivation + validations: + required: true + attributes: + label: Motivation + description: | + Please outline the motivation for the proposal. Is your feature request related to a problem? e.g., I'm always frustrated when [...]. If this is related to another GitHub issue, please link here too. + + - type: textarea + id: contribution + validations: + required: true + attributes: + label: Your contribution + description: | + Is there any way that you could help, e.g. by submitting a PR? Make sure to read the CONTRIBUTING.MD [readme](https://github.com/huggingface/datasets/blob/main/CONTRIBUTING.md). diff --git a/.github/conda/build.sh b/.github/conda/build.sh new file mode 100644 index 0000000..a660906 --- /dev/null +++ b/.github/conda/build.sh @@ -0,0 +1 @@ +$PYTHON setup.py install --single-version-externally-managed --record=record.txt diff --git a/.github/conda/meta.yaml b/.github/conda/meta.yaml new file mode 100644 index 0000000..7263b10 --- /dev/null +++ b/.github/conda/meta.yaml @@ -0,0 +1,55 @@ +{% set name = "datasets" %} + +package: + name: "{{ name|lower }}" + version: "{{ DATASETS_VERSION }}" + +source: + path: ../../ + +build: + noarch: python + +requirements: + host: + - python + - pip + - numpy >=1.17 + - pyarrow >=16.0.0 + - python-xxhash + - dill + - pandas + - requests >=2.19.0 + - httpx <1.0.0 + - tqdm >=4.66.3 + - dataclasses + - multiprocess + - fsspec + - huggingface_hub >=0.25.0,<2.0.0 + - packaging + run: + - python + - pip + - numpy >=1.17 + - pyarrow >=16.0.0 + - python-xxhash + - dill + - pandas + - requests >=2.19.0 + - httpx <1.0.0 + - tqdm >=4.66.3 + - dataclasses + - multiprocess + - fsspec + - huggingface_hub >=0.25.0,<2.0.0 + - packaging + +test: + imports: + - datasets + +about: + home: https://huggingface.co + license: Apache License 2.0 + license_file: LICENSE + summary: "🤗 The largest hub of ready-to-use NLP datasets for ML models with fast, easy-to-use and efficient data manipulation tools" diff --git a/.github/workflows/build_documentation.yml b/.github/workflows/build_documentation.yml new file mode 100644 index 0000000..77e2b17 --- /dev/null +++ b/.github/workflows/build_documentation.yml @@ -0,0 +1,20 @@ +name: Build documentation + +on: + push: + branches: + - main + - doc-builder* + - v*-release + - v*-patch + +jobs: + build: + uses: huggingface/doc-builder/.github/workflows/build_main_documentation.yml@90b4ee2c10b81b5c1a6367c4e6fc9e2fb510a7e3 # main + with: + commit_sha: ${{ github.sha }} + package: datasets + notebook_folder: datasets_doc + secrets: + token: ${{ secrets.HUGGINGFACE_PUSH }} + hf_token: ${{ secrets.HF_DOC_BUILD_PUSH }} diff --git a/.github/workflows/build_pr_documentation.yml b/.github/workflows/build_pr_documentation.yml new file mode 100644 index 0000000..92d60e1 --- /dev/null +++ b/.github/workflows/build_pr_documentation.yml @@ -0,0 +1,16 @@ +name: Build PR Documentation + +on: + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + build: + uses: huggingface/doc-builder/.github/workflows/build_pr_documentation.yml@90b4ee2c10b81b5c1a6367c4e6fc9e2fb510a7e3 # main + with: + commit_sha: ${{ github.event.pull_request.head.sha }} + pr_number: ${{ github.event.number }} + package: datasets diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..4db04d0 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,176 @@ +name: CI + +on: + pull_request: + branches: + - main + push: + branches: + - main + - ci-* + +env: + CI_HEADERS: ${{ secrets.CI_HEADERS }} + +jobs: + + check_code_quality: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + with: + python-version: "3.10" + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install .[quality] + - name: Check quality + run: | + ruff check tests src benchmarks utils setup.py # linter + ruff format --check tests src benchmarks utils setup.py # formatter + + test: + needs: check_code_quality + strategy: + matrix: + test: ['unit', 'integration'] + os: [ubuntu-latest, windows-latest] + deps_versions: [deps-latest, deps-minimum] + continue-on-error: ${{ matrix.test == 'integration' }} + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + fetch-depth: 0 + - name: Setup FFmpeg + if: ${{ matrix.os == 'ubuntu-latest' }} + run: | + sudo apt update + sudo apt install -y ffmpeg + - name: Set up Python 3.10 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + with: + python-version: "3.10" + - name: Setup conda env (windows) + if: ${{ matrix.os == 'windows-latest' }} + uses: conda-incubator/setup-miniconda@9f54435e0e72c53962ee863144e47a4b094bfd35 # v2 + with: + auto-update-conda: true + miniconda-version: "latest" + activate-environment: test + python-version: "3.10" + - name: Setup FFmpeg (windows) + if: ${{ matrix.os == 'windows-latest' }} + run: conda install "ffmpeg=7.0.1" -c conda-forge + - name: Upgrade pip + run: python -m pip install --upgrade pip + - name: Install uv + run: pip install --upgrade uv + - name: Install dependencies + run: uv pip install --system "datasets[tests] @ ." + - name: Install dependencies (latest versions) + if: ${{ matrix.deps_versions == 'deps-latest' }} + run: uv pip install --system --upgrade pyarrow huggingface-hub "dill<0.3.9" + - name: Install dependencies (minimum versions) + if: ${{ matrix.deps_versions != 'deps-latest' }} + run: uv pip install --system pyarrow==21.0.0 huggingface-hub==0.25.0 transformers dill==0.3.1.1 + - name: Print dependencies + run: uv pip list + - name: Test with pytest + run: | + python -m pytest -rfExX -m ${{ matrix.test }} -n 2 --dist loadfile -sv ./tests/ + + test_py314: + needs: check_code_quality + strategy: + matrix: + test: ['unit'] + os: [ubuntu-latest, windows-latest] + deps_versions: [deps-latest] + continue-on-error: false + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + fetch-depth: 0 + - name: Setup FFmpeg + if: ${{ matrix.os == 'ubuntu-latest' }} + run: | + sudo apt update + sudo apt install -y ffmpeg + - name: Set up Python 3.14 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + with: + python-version: "3.14" + - name: Setup conda env (windows) + if: ${{ matrix.os == 'windows-latest' }} + uses: conda-incubator/setup-miniconda@9f54435e0e72c53962ee863144e47a4b094bfd35 # v2 + with: + auto-update-conda: true + miniconda-version: "latest" + activate-environment: test + python-version: "3.14" + - name: Setup FFmpeg (windows) + if: ${{ matrix.os == 'windows-latest' }} + run: conda install "ffmpeg=7.0.1" -c conda-forge + - name: Upgrade pip + run: python -m pip install --upgrade pip + - name: Install uv + run: pip install --upgrade uv + - name: Install dependencies + run: uv pip install --system "datasets[tests] @ ." + - name: Install tsfile (py3.14 only) + run: uv pip install --system "tsfile>=2.3.0" + - name: Print dependencies + run: uv pip list + - name: Test with pytest + run: | + python -m pytest -rfExX -m ${{ matrix.test }} -n 2 --dist loadfile -sv ./tests/ + + test_py314_future: + needs: check_code_quality + strategy: + matrix: + test: ['unit'] + os: [ubuntu-latest, windows-latest] + deps_versions: [deps-latest] + continue-on-error: false + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + fetch-depth: 0 + - name: Setup FFmpeg + if: ${{ matrix.os == 'ubuntu-latest' }} + run: | + sudo apt update + sudo apt install -y ffmpeg + - name: Set up Python 3.14 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + with: + python-version: "3.14" + - name: Setup conda env (windows) + if: ${{ matrix.os == 'windows-latest' }} + uses: conda-incubator/setup-miniconda@9f54435e0e72c53962ee863144e47a4b094bfd35 # v2 + with: + auto-update-conda: true + miniconda-version: "latest" + activate-environment: test + python-version: "3.14" + - name: Setup FFmpeg (windows) + if: ${{ matrix.os == 'windows-latest' }} + run: conda install "ffmpeg=7.0.1" -c conda-forge + - name: Upgrade pip + run: python -m pip install --upgrade pip + - name: Install uv + run: pip install --upgrade uv + - name: Install dependencies + run: uv pip install --system "datasets[tests_numpy2] @ ." + - name: Print dependencies + run: pip list + + - name: Test with pytest + run: | + python -m pytest -rfExX -m ${{ matrix.test }} -n 2 --dist loadfile -sv ./tests/ diff --git a/.github/workflows/release-conda.yml b/.github/workflows/release-conda.yml new file mode 100644 index 0000000..3345a10 --- /dev/null +++ b/.github/workflows/release-conda.yml @@ -0,0 +1,47 @@ +name: Release - Conda + +on: + push: + tags: + - "[0-9]+.[0-9]+.[0-9]+*" + +env: + ANACONDA_API_TOKEN: ${{ secrets.ANACONDA_API_TOKEN }} + +jobs: + build_and_package: + runs-on: ubuntu-22.04 + defaults: + run: + shell: bash -l {0} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install miniconda + uses: conda-incubator/setup-miniconda@8ee1f361103df19b6f8c8655fd3967a8ecb162d5 # v4.0.1 + with: + auto-update-conda: true + auto-activate-base: false + python-version: "3.10" + channels: huggingface + + - name: Setup conda env + run: | + # Install conda-build into base so the command is available + conda install -y -c defaults -c conda-forge anaconda-client conda-build + # Create the build environment + conda create -y -n build-datasets python=3.10 + conda activate build-datasets + + - name: Extract version + run: echo "DATASETS_VERSION=`python setup.py --version`" >> $GITHUB_ENV + + - name: Build conda packages + run: | + conda-build --override-channels -c conda-forge -c huggingface .github/conda + + - name: Upload to Anaconda + run: | + anaconda upload `conda-build .github/conda --output -c conda-forge` --force diff --git a/.github/workflows/self-assign.yaml b/.github/workflows/self-assign.yaml new file mode 100644 index 0000000..4c1f423 --- /dev/null +++ b/.github/workflows/self-assign.yaml @@ -0,0 +1,16 @@ +name: Self-assign +on: + issue_comment: + types: created +jobs: + one: + runs-on: ubuntu-latest + if: >- + (github.event.comment.body == '#take' || + github.event.comment.body == '#self-assign') + && !github.event.issue.assignee + steps: + - run: | + echo "Assigning issue ${{ github.event.issue.number }} to ${{ github.event.comment.user.login }}" + curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" -d '{"assignees": ["${{ github.event.comment.user.login }}"]}' https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/assignees + curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" -X "DELETE" https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/labels/help%20wanted diff --git a/.github/workflows/trufflehog.yml b/.github/workflows/trufflehog.yml new file mode 100644 index 0000000..4b23d89 --- /dev/null +++ b/.github/workflows/trufflehog.yml @@ -0,0 +1,20 @@ +on: + push: + +name: Secret Leaks + +permissions: + contents: read + +jobs: + trufflehog: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + fetch-depth: 0 + - name: Secret Scanning + uses: trufflesecurity/trufflehog@6bd2d14f7a4bc1e569fa3550efa7ec632a4fa67b # main + with: + extra_args: --results=verified diff --git a/.github/workflows/upload_pr_documentation.yml b/.github/workflows/upload_pr_documentation.yml new file mode 100644 index 0000000..181f547 --- /dev/null +++ b/.github/workflows/upload_pr_documentation.yml @@ -0,0 +1,16 @@ +name: Upload PR Documentation + +on: + workflow_run: + workflows: ["Build PR Documentation"] + types: + - completed + +jobs: + build: + uses: huggingface/doc-builder/.github/workflows/upload_pr_documentation.yml@9ad2de8582b56c017cb530c1165116d40433f1c6 # main + with: + package_name: datasets + secrets: + hf_token: ${{ secrets.HF_DOC_BUILD_PUSH }} + comment_bot_token: ${{ secrets.COMMENT_BOT_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7cb91d8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,60 @@ +# Locked files +*.lock +!dvc.lock + +# Extracted dummy data +datasets/**/dummy_data-zip-extracted/ + +# Compiled python modules. +*.pyc + +# Byte-compiled +_pycache__/ +.cache/ + +# Python egg metadata, regenerated from source files by setuptools. +*.egg-info +.eggs/ + +# PyPI distribution artifacts. +build/ +dist/ + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# pyenv +.python-version + +# Tests +.pytest_cache/ + +# Other +*.DS_Store + +# PyCharm/vscode +.idea +.vscode + +# Vim +.*.swp + +# playground +/playground + +# Sphinx documentation +docs/_build/ +docs/source/_build/ + +# Benchmark results +report.json +report.md + +# Ruff +.ruff_cache diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..0af55f5 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,9 @@ +repos: + - repo: https://github.com/charliermarsh/ruff-pre-commit # https://github.com/charliermarsh/ruff#usage + rev: 'v0.11.8' + hooks: + # Run the linter. + - id: ruff + args: [ --fix ] + # Run the formatter. + - id: ruff-format diff --git a/.zenodo.json b/.zenodo.json new file mode 100644 index 0000000..e2d5eaa --- /dev/null +++ b/.zenodo.json @@ -0,0 +1,130 @@ +{ + "license": "Apache-2.0", + "creators": [ + { + "affiliation": "Hugging Face", + "name": "Quentin Lhoest" + }, + { + "orcid": "0000-0003-1727-1045", + "affiliation": "Hugging Face", + "name": "Albert Villanova del Moral" + }, + { + "affiliation": "Hugging Face", + "name": "Patrick von Platen" + }, + { + "affiliation": "Hugging Face", + "name": "Thomas Wolf" + }, + { + "affiliation": "Hugging Face", + "name": "Mario Šaško" + }, + { + "affiliation": "Hugging Face", + "name": "Yacine Jernite" + }, + { + "affiliation": "Hugging Face", + "name": "Abhishek Thakur" + }, + { + "affiliation": "Hugging Face", + "name": "Lewis Tunstall" + }, + { + "affiliation": "Hugging Face", + "name": "Suraj Patil" + }, + { + "affiliation": "Hugging Face", + "name": "Mariama Drame" + }, + { + "affiliation": "Hugging Face", + "name": "Julien Chaumond" + }, + { + "affiliation": "Hugging Face", + "name": "Julien Plu" + }, + { + "affiliation": "Hugging Face", + "name": "Joe Davison" + }, + { + "affiliation": "Hugging Face", + "name": "Simon Brandeis" + }, + { + "affiliation": "Hugging Face", + "name": "Victor Sanh" + }, + { + "affiliation": "Hugging Face", + "name": "Teven Le Scao" + }, + { + "affiliation": "Hugging Face", + "name": "Kevin Canwen Xu" + }, + { + "affiliation": "Hugging Face", + "name": "Nicolas Patry" + }, + { + "affiliation": "Hugging Face", + "name": "Steven Liu" + }, + { + "affiliation": "Hugging Face", + "name": "Angelina McMillan-Major" + }, + { + "affiliation": "Hugging Face", + "name": "Philipp Schmid" + }, + { + "affiliation": "Hugging Face", + "name": "Sylvain Gugger" + }, + { + "affiliation": "Hugging Face", + "name": "Nathan Raw" + }, + { + "affiliation": "Hugging Face", + "name": "Sylvain Lesage" + }, + { + "affiliation": "Hugging Face", + "name": "Anton Lozhkov" + }, + { + "affiliation": "Hugging Face", + "name": "Matthew Carrigan" + }, + { + "affiliation": "Hugging Face", + "name": "Th\u00e9o Matussi\u00e8re" + }, + { + "affiliation": "Hugging Face", + "name": "Leandro von Werra" + }, + { + "affiliation": "Hugging Face", + "name": "Lysandre Debut" + }, + { + "affiliation": "Hugging Face", + "name": "Stas Bekman" + }, + { + "affiliation": "Hugging Face", + "name": "Cl\u00e9ment Delangue" + } + ] +} \ No newline at end of file diff --git a/ADD_NEW_DATASET.md b/ADD_NEW_DATASET.md new file mode 100644 index 0000000..0e22815 --- /dev/null +++ b/ADD_NEW_DATASET.md @@ -0,0 +1,8 @@ +# How to add one new datasets + +Add datasets directly to the 🤗 Hugging Face Hub! + +You can share your dataset on https://huggingface.co/datasets directly using your account, see the documentation: + +* [Create a dataset and upload files on the website](https://huggingface.co/docs/datasets/upload_dataset) +* [Advanced guide using the CLI](https://huggingface.co/docs/datasets/share) diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..7092efd --- /dev/null +++ b/AUTHORS @@ -0,0 +1,8 @@ +# This is the list of HuggingFace Datasets authors for copyright purposes. +# +# This does not necessarily list everyone who has contributed code, since in +# some cases, their employer may be the copyright holder. To see the full list +# of contributors, see the revision history in source control. + +Google Inc. +HuggingFace Inc. diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..ab0ff1f --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,150 @@ +cff-version: 1.2.0 +message: "If you use this software, please cite it as below." +title: "huggingface/datasets" +authors: +- family-names: Lhoest + given-names: Quentin +- family-names: Villanova del Moral + given-names: Albert + orcid: "https://orcid.org/0000-0003-1727-1045" +- family-names: von Platen + given-names: Patrick +- family-names: Wolf + given-names: Thomas +- family-names: Šaško + given-names: Mario +- family-names: Jernite + given-names: Yacine +- family-names: Thakur + given-names: Abhishek +- family-names: Tunstall + given-names: Lewis +- family-names: Patil + given-names: Suraj +- family-names: Drame + given-names: Mariama +- family-names: Chaumond + given-names: Julien +- family-names: Plu + given-names: Julien +- family-names: Davison + given-names: Joe +- family-names: Brandeis + given-names: Simon +- family-names: Sanh + given-names: Victor +- family-names: Le Scao + given-names: Teven +- family-names: Canwen Xu + given-names: Kevin +- family-names: Patry + given-names: Nicolas +- family-names: Liu + given-names: Steven +- family-names: McMillan-Major + given-names: Angelina +- family-names: Schmid + given-names: Philipp +- family-names: Gugger + given-names: Sylvain +- family-names: Raw + given-names: Nathan +- family-names: Lesage + given-names: Sylvain +- family-names: Lozhkov + given-names: Anton +- family-names: Carrigan + given-names: Matthew +- family-names: Matussière + given-names: Théo +- family-names: von Werra + given-names: Leandro +- family-names: Debut + given-names: Lysandre +- family-names: Bekman + given-names: Stas +- family-names: Delangue + given-names: Clément +doi: 10.5281/zenodo.4817768 +repository-code: "https://github.com/huggingface/datasets" +license: Apache-2.0 +preferred-citation: + type: conference-paper + title: "Datasets: A Community Library for Natural Language Processing" + authors: + - family-names: Lhoest + given-names: Quentin + - family-names: Villanova del Moral + given-names: Albert + orcid: "https://orcid.org/0000-0003-1727-1045" + - family-names: von Platen + given-names: Patrick + - family-names: Wolf + given-names: Thomas + - family-names: Šaško + given-names: Mario + - family-names: Jernite + given-names: Yacine + - family-names: Thakur + given-names: Abhishek + - family-names: Tunstall + given-names: Lewis + - family-names: Patil + given-names: Suraj + - family-names: Drame + given-names: Mariama + - family-names: Chaumond + given-names: Julien + - family-names: Plu + given-names: Julien + - family-names: Davison + given-names: Joe + - family-names: Brandeis + given-names: Simon + - family-names: Sanh + given-names: Victor + - family-names: Le Scao + given-names: Teven + - family-names: Canwen Xu + given-names: Kevin + - family-names: Patry + given-names: Nicolas + - family-names: Liu + given-names: Steven + - family-names: McMillan-Major + given-names: Angelina + - family-names: Schmid + given-names: Philipp + - family-names: Gugger + given-names: Sylvain + - family-names: Raw + given-names: Nathan + - family-names: Lesage + given-names: Sylvain + - family-names: Lozhkov + given-names: Anton + - family-names: Carrigan + given-names: Matthew + - family-names: Matussière + given-names: Théo + - family-names: von Werra + given-names: Leandro + - family-names: Debut + given-names: Lysandre + - family-names: Bekman + given-names: Stas + - family-names: Delangue + given-names: Clément + collection-title: "Proceedings of the 2021 Conference on Empirical Methods in Natural Language Processing: System Demonstrations" + collection-type: proceedings + month: 11 + year: 2021 + publisher: + name: "Association for Computational Linguistics" + url: "https://aclanthology.org/2021.emnlp-demo.21" + start: 175 + end: 184 + identifiers: + - type: other + value: "arXiv:2109.02846" + description: "The arXiv preprint of the paper" diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..450a63c --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,132 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +feedback@huggingface.co. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available +at [https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..3ae44bd --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,130 @@ +# How to contribute to Datasets? +[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.0-4baaaa.svg)](CODE_OF_CONDUCT.md) + +Datasets is an open source project, so all contributions and suggestions are welcome. + +You can contribute in many different ways: giving ideas, answering questions, reporting bugs, proposing enhancements, +improving the documentation, fixing bugs,... + +Many thanks in advance to every contributor. + +In order to facilitate healthy, constructive behavior in an open and inclusive community, we all respect and abide by +our [code of conduct](CODE_OF_CONDUCT.md). + +## How to work on an open Issue? +You have the list of open Issues at: https://github.com/huggingface/datasets/issues + +Some of them may have the label `help wanted`: that means that any contributor is welcomed! + +If you would like to work on any of the open Issues: + +1. Make sure it is not already assigned to someone else. You have the assignee (if any) on the top of the right column of the Issue page. + +2. You can self-assign it by commenting on the Issue page with the keyword: `#self-assign`. + +3. Work on your self-assigned issue and eventually create a Pull Request. + +## How to create a Pull Request? +If you want to add a dataset see specific instructions in the section [*How to add a dataset*](#how-to-add-a-dataset). + +1. Fork the [repository](https://github.com/huggingface/datasets) by clicking on the 'Fork' button on the repository's page. This creates a copy of the code under your GitHub user account. + +2. Clone your fork to your local disk, and add the base repository as a remote: + + ```bash + git clone git@github.com:/datasets.git + cd datasets + git remote add upstream https://github.com/huggingface/datasets.git + ``` + +3. Create a new branch to hold your development changes: + + ```bash + git checkout -b a-descriptive-name-for-my-changes + ``` + + **do not** work on the `main` branch. + +4. Set up a development environment by running the following command in a virtual environment: + + Simple setup with code formatting only (recommended) + ```bash + pip install -e ".[quality]" + ``` + + Advanced setup with all the optional dependencies + ```bash + pip install -e ".[dev]" + ``` + + (If datasets was already installed in the virtual environment, remove + it with `pip uninstall datasets` before reinstalling it in editable + mode with the `-e` flag.) + +5. Develop the features on your branch. + +6. Format your code. Run `black` and `ruff` so that your newly added files look nice with the following command: + + ```bash + make style + ``` + +7. _(Optional)_ You can also use [`pre-commit`](https://pre-commit.com/) to format your code automatically each time run `git commit`, instead of running `make style` manually. +To do this, install `pre-commit` via `pip install pre-commit` and then run `pre-commit install` in the project's root directory to set up the hooks. +Note that if any files were formatted by `pre-commit` hooks during committing, you have to run `git commit` again . + + +8. Once you're happy with your contribution, add your changed files and make a commit to record your changes locally: + + ```bash + git add -u + git commit + ``` + + It is a good idea to sync your copy of the code with the original + repository regularly. This way you can quickly account for changes: + + ```bash + git fetch upstream + git rebase upstream/main + ``` + +9. Once you are satisfied, push the changes to your fork repo using: + + ```bash + git push -u origin a-descriptive-name-for-my-changes + ``` + + Go the webpage of your fork on GitHub. Click on "Pull request" to send your changes to the project maintainers for review. + +## Datasets on Hugging Face + +### How to add a dataset on Hugging Face + +You can share your dataset on https://huggingface.co/datasets directly using your account (no need to open a PR on GitHub), see the documentation: + +* [Create a dataset and upload files on the website](https://huggingface.co/docs/datasets/upload_dataset) +* [Advanced guide using the CLI](https://huggingface.co/docs/datasets/share) + +### How to contribute to the dataset cards + +Improving the documentation of datasets is an ever-increasing effort, and we invite users to contribute by sharing their insights with the community in the `README.md` dataset cards provided for each dataset. + +If you see that a dataset card is missing information that you are in a position to provide (as an author of the dataset or as an experienced user), the best thing you can do is to open a Pull Request on the Hugging Face Hub. To do, go to the "Files and versions" tab of the dataset page and edit the `README.md` file. We provide: + +* a [template](https://github.com/huggingface/datasets/blob/main/templates/README.md) +* a [guide](https://github.com/huggingface/datasets/blob/main/templates/README_guide.md) describing what information should go into each of the paragraphs +* and if you need inspiration, we recommend looking through a [completed example](https://huggingface.co/datasets/eli5/blob/main/README.md) + +If you are a **dataset author**... you know what to do, it is your dataset after all ;) ! We would especially appreciate if you could help us fill in information about the process of creating the dataset, and take a moment to reflect on its social impact and possible limitations if you haven't already done so in the dataset paper or in another data statement. + +If you are a **user of a dataset**, the main source of information should be the dataset paper if it is available: we recommend pulling information from there into the relevant paragraphs of the template. We also eagerly welcome discussions on the [Considerations for Using the Data](https://github.com/huggingface/datasets/blob/main/templates/README_guide.md#considerations-for-using-the-data) based on existing scholarship or personal experience that would benefit the whole community. + +Finally, if you want more information on the how and why of dataset cards, we strongly recommend reading the foundational works [Datasheets for Datasets](https://huggingface.co/papers/1803.09010) and [Data Statements for NLP](https://www.aclweb.org/anthology/Q18-1041/). + +Thank you for your contribution! + +## Code of conduct + +This project adheres to the HuggingFace [code of conduct](CODE_OF_CONDUCT.md). +By participating, you are expected to abide by this code. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..61fa1f8 --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +.PHONY: quality style test + +check_dirs := tests src benchmarks utils + +# Check that source code meets quality standards + +quality: + ruff check $(check_dirs) setup.py # linter + ruff format --check $(check_dirs) setup.py # formatter + +# Format source code automatically + +style: + ruff check --fix $(check_dirs) setup.py # linter + ruff format $(check_dirs) setup.py # formatter + +# Run tests for the library + +test: + python -m pytest -n auto --dist=loadfile -s -v ./tests/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..d96cbda --- /dev/null +++ b/README.md @@ -0,0 +1,299 @@ +

+ + + + Hugging Face Datasets Library + +
+
+

+ +

+ Build + GitHub + Documentation + GitHub release + Number of datasets + Contributor Covenant + DOI +

+ +🤗 Datasets is a lightweight library providing **two** main features: + +- **one-line dataloaders for many public datasets**: one-liners to download and pre-process any of the ![number of datasets](https://img.shields.io/endpoint?url=https://huggingface.co/api/shields/datasets&color=brightgreen) major public datasets (image datasets, audio datasets, text datasets in 467 languages and dialects, 3D medical images, video datasets, agent traces, etc.) provided on the [HuggingFace Datasets Hub](https://huggingface.co/datasets). With a simple command like `squad_dataset = load_dataset("rajpurkar/squad")`, get any of these datasets ready to use in a dataloader for training/evaluating a ML model (Numpy/Pandas/PyTorch/TensorFlow/JAX/Polars), +- **efficient data pre-processing**: simple, fast and reproducible data pre-processing for the public datasets as well as your own local datasets in CSV, JSON, JSONL, Parquet, HDF5, XML, text, PNG, JPEG, WAV, MP3, PDF, NIfTI, and more. With simple commands like `processed_dataset = dataset.map(process_example)`, efficiently prepare the dataset for inspection and ML model evaluation and training. + +[🎓 **Documentation**](https://huggingface.co/docs/datasets/) [🔎 **Find a dataset in the Hub**](https://huggingface.co/datasets) [🌟 **Share a dataset on the Hub**](https://huggingface.co/docs/datasets/share) + +

+ +

+ +# 🚀 Key Features + +🤗 Datasets is designed to let the community easily add and share new datasets, and provides powerful capabilities for data manipulation: + +| Feature | Description | +|---------|-------------| +| 📦 **One-line dataset loading** | Load AI-ready datasets from the [Hugging Face Hub](https://huggingface.co/datasets) or local files with `load_dataset()` | +| 🔍 **Multiple formats** | Native support for CSV, JSON, JSONL, Parquet, Arrow, XML, Text, Webdataset, and more | +| 🖼️ **Multi-modal data** | Built-in support for text, audio, image, video, PDF, and NIfTI (3D medical) data | +| 🚀 **Streaming mode** | Stream datasets without downloading — iterate over data on-the-fly with `streaming=True` (now up to **100x faster** with Xet backend) | +| 💾 **HF Storage Buckets** | Read and write directly from/to [Hugging Face Storage Buckets](https://huggingface.co/docs/hub/storage-buckets) for mutable, large-scale raw data | +| 🧠 **AI Agent Traces** | Load and process AI agent traces (prompts, tool calls, responses) from the Hub | +| ⚡ **Apache Arrow backend** | Zero-copy memory-mapped storage — datasets naturally free you from RAM limitations | +| 🔄 **Smart caching** | Never wait for your data to process twice — cached results are automatically reused | +| 📊 **Multi-framework interoperability** | Native conversion to/from NumPy, Pandas, Polars, Arrow, PyTorch, TensorFlow, JAX, and Spark | +| 🏎️ **Multi-processing** | Fast parallel data processing with `map(num_proc=N)` | +| 🔎 **Search & index** | Built-in FAISS and Elasticsearch index support for similarity search | +| 📦 **JSON type** | Flexible JSON/structured data support with `Json()` feature type | + +# Installation + +## With pip + +🤗 Datasets can be installed from PyPi and should be installed in a virtual environment (venv or conda for instance): + +```bash +pip install datasets +``` + +For the latest development version: + +```bash +pip install "datasets @ git+https://github.com/huggingface/datasets.git" +``` + +## With conda + +```bash +conda install -c huggingface -c conda-forge datasets +``` + +## Optional dependencies + +🤗 Datasets supports various optional features via extras: + +```bash +# For audio (torchcodec) +pip install datasets[audio] + +# For image/video (Pillow, torchcodec) +pip install datasets[vision] + +# For PDFs/NIfTI (pdfplumber, nibabel) +pip install datasets[pdfs,nibabel] + +# For PyTorch/TensorFlow/JAX integration +pip install datasets[torch,tensorflow,jax] + +``` + +For more details on installation, check the [installation page](https://huggingface.co/docs/datasets/installation). + +# Quick Start + +🤗 Datasets is made to be very simple to use — the API is centered around a single function, `datasets.load_dataset(dataset_name, **kwargs)`, that instantiates a dataset. + +Here is a quick example: + +```python +from datasets import load_dataset + +# Load a dataset and print the first example in the training set +squad_dataset = load_dataset('rajpurkar/squad') +print(squad_dataset['train'][0]) + +# Process the dataset - add a column with the length of the context texts +dataset_with_length = squad_dataset.map(lambda x: {"length": len(x["context"])}) + +# Tokenize the context texts (using a tokenizer from the 🤗 Transformers library) +from transformers import AutoTokenizer +tokenizer = AutoTokenizer.from_pretrained('bert-base-cased') + +tokenized_dataset = squad_dataset.map(lambda x: tokenizer(x['context']), batched=True) + +# Tokenize chat conversations with a chat template (using a model that supports chat templates) +# This is useful for fine-tuning instruction/chat models + +# Load a popular chat dataset (ultrachat_200k contains ~200k AI assistant conversations) +chat_dataset = load_dataset('HuggingFaceH4/ultrachat_200k', split='train_sft') + +chat_tokenizer = AutoTokenizer.from_pretrained('Qwen/Qwen2.5-7B-Instruct') + +def tokenize_chat(examples): + # Apply the chat template and tokenize in one step + return chat_tokenizer.apply_chat_template(examples["messages"]) + +tokenized_chat_dataset = chat_dataset.map(tokenize_chat, batched=True) +``` + +## Streaming mode + +If your dataset is bigger than your disk or if you don't want to wait to download the data, you can use streaming: + +```python +# Stream the dataset without downloading anything +image_dataset = load_dataset('timm/imagenet-1k-wds', streaming=True) +for example in image_dataset["train"]: + print(example["image"]) + break +``` + +## Multi-modal data + +🤗 Datasets supports a wide variety of data types out of the box: + +```python +# Audio dataset +dataset = load_dataset("openslr/librispeech_asr", "clean") + +# Image dataset +dataset = load_dataset("ILSVRC/imagenet-1k") + +# Video dataset +dataset = load_dataset("Shofo/shofo-tiktok-general-small") + +# PDF documents +dataset = load_dataset("pixparse/pdfa-eng-wds") + +# NIfTI (3D medical imaging) +dataset = load_dataset("dartbrains/localizer", "betas") +``` + +## From local files + +```python +# Load from local CSV +dataset = load_dataset('csv', data_files='my_data.csv') + +# Load from local Parquet +dataset = load_dataset('parquet', data_files='data/*.parquet') + +# Load from a local directory (auto-detect format) +dataset = load_dataset('./path/to/data') +``` + +## From Python objects + +```python +from datasets import Dataset + +# From a dictionary +dataset = Dataset.from_dict({"text": ["Hello world", "How are you?"]}) + +# From a list +dataset = Dataset.from_list([{"text": "Hello world"}, {"text": "How are you?"}]) + +# From Pandas +import pandas as pd +df = pd.DataFrame({"col1": [1, 2, 3], "col2": ["a", "b", "c"]}) +dataset = Dataset.from_pandas(df) + +# From a generator +def gen(): + for i in range(10): + yield {"value": i} +dataset = Dataset.from_generator(gen) +``` + +For more details on using the library, check the [quick start guide](https://huggingface.co/docs/datasets/quickstart) and the specific pages on: + +- [Loading a dataset](https://huggingface.co/docs/datasets/loading) +- [What's in a Dataset](https://huggingface.co/docs/datasets/access) +- [Processing data with 🤗 Datasets](https://huggingface.co/docs/datasets/process) + - [Processing audio data](https://huggingface.co/docs/datasets/audio_process) + - [Processing image data](https://huggingface.co/docs/datasets/image_process) + - [Processing text data](https://huggingface.co/docs/datasets/nlp_process) + - [Processing PDF data](https://huggingface.co/docs/datasets/pdf_process) + - [Processing video data](https://huggingface.co/docs/datasets/video_process) +- [Streaming a dataset](https://huggingface.co/docs/datasets/stream) + +# Core Classes + +The library provides two main dataset classes: + +| Class | Description | +|-------|-------------| +| `Dataset` | In-memory / memory-mapped dataset backed by Apache Arrow. Supports indexing, slicing, random access and caching. | +| `IterableDataset` | Lazy, streamable dataset for large-scale / out-of-core processing. Supports streaming and infinite iteration. | + +Both are wrapped in `DatasetDict` / `IterableDatasetDict` for multi-split datasets (e.g., train/test/val). + +# Add a new dataset to the Hub + +We have a very detailed step-by-step guide to add a new dataset to the ![number of datasets](https://img.shields.io/endpoint?url=https://huggingface.co/api/shields/datasets&color=brightgreen) datasets already provided on the [HuggingFace Datasets Hub](https://huggingface.co/datasets). + +You can find: +- [how to upload a dataset to the Hub using your web browser or Python](https://huggingface.co/docs/datasets/upload_dataset) and also +- [how to upload it using Git](https://huggingface.co/docs/datasets/share). + +# Disclaimers + +You can use 🤗 Datasets to load datasets based on versioned git repositories maintained by the dataset authors. For reproducibility reasons, we ask users to pin the `revision` of the repositories they use. + +If you're a dataset owner and wish to update any part of it (description, citation, license, etc.), or do not want your dataset to be included in the Hugging Face Hub, please get in touch by opening a discussion or a pull request in the Community tab of the dataset page. Thanks for your contribution to the ML community! + +# Contributing + +We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details on: + +- How to submit issues and pull requests +- Code style guidelines (we use [Ruff](https://docs.astral.sh/ruff/)) +- Testing requirements +- Documentation standards + +# BibTeX + +If you want to cite our 🤗 Datasets library, you can use our [paper](https://huggingface.co/papers/2109.02846): + +```bibtex +@inproceedings{lhoest-etal-2021-datasets, + title = "Datasets: A Community Library for Natural Language Processing", + author = "Lhoest, Quentin and + Villanova del Moral, Albert and + Jernite, Yacine and + Thakur, Abhishek and + von Platen, Patrick and + Patil, Suraj and + Chaumond, Julien and + Drame, Mariama and + Plu, Julien and + Tunstall, Lewis and + Davison, Joe and + {\v{S}}a{\v{s}}ko, Mario and + Chhablani, Gunjan and + Malik, Bhavitvya and + Brandeis, Simon and + Le Scao, Teven and + Sanh, Victor and + Xu, Canwen and + Patry, Nicolas and + McMillan-Major, Angelina and + Schmid, Philipp and + Gugger, Sylvain and + Delangue, Cl{\'e}ment and + Matussi{\`e}re, Th{\'e}o and + Debut, Lysandre and + Bekman, Stas and + Cistac, Pierric and + Goehringer, Thibault and + Mustar, Victor and + Lagunas, Fran{\c{c}}ois and + Rush, Alexander and + Wolf, Thomas", + booktitle = "Proceedings of the 2021 Conference on Empirical Methods in Natural Language Processing: System Demonstrations", + month = nov, + year = "2021", + address = "Online and Punta Cana, Dominican Republic", + publisher = "Association for Computational Linguistics", + url = "https://aclanthology.org/2021.emnlp-demo.21", + pages = "175--184", + abstract = "The scale, variety, and quantity of publicly-available NLP datasets has grown rapidly as researchers propose new tasks, larger models, and novel benchmarks. Datasets is a community library for contemporary NLP designed to support this ecosystem. Datasets aims to standardize end-user interfaces, versioning, and documentation, while providing a lightweight front-end that behaves similarly for small datasets as for internet-scale corpora. The design of the library incorporates a distributed, community-driven approach to adding datasets and documenting usage. After a year of development, the library now includes more than 650 unique datasets, has more than 250 contributors, and has helped support a variety of novel cross-dataset research projects and shared tasks. The library is available at https://github.com/huggingface/datasets.", + eprint={2109.02846}, + archivePrefix={arXiv}, + primaryClass={cs.CL}, +} +``` + +If you need to cite a specific version of our 🤗 Datasets library for reproducibility, you can use the corresponding version Zenodo DOI from this [list](https://zenodo.org/search?q=conceptrecid:%224817768%22&sort=-version&all_versions=True). diff --git a/README.wehub.md b/README.wehub.md new file mode 100644 index 0000000..acfc5c2 --- /dev/null +++ b/README.wehub.md @@ -0,0 +1,7 @@ +# WeHub 来源说明 + +- 原始项目:`huggingface/datasets` +- 原始仓库:https://github.com/huggingface/datasets +- 导入方式:上游默认分支的最新快照 +- 原作者、版权和许可证信息以原始仓库及本仓库 LICENSE 为准 +- 本文件仅用于记录来源,不代表 WeHub 是原项目作者 diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..90c1b5e --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,33 @@ +# Security Policy + +## Supported Versions + + +Each major version is currently being supported with security updates. + +| Version | Supported | +|---------|--------------------| +| 1.x.x | :white_check_mark: | +| 2.x.x | :white_check_mark: | + + +## Reporting a Vulnerability + + +To report a security vulnerability, please contact: security@huggingface.co diff --git a/benchmarks/benchmark_array_xd.py b/benchmarks/benchmark_array_xd.py new file mode 100644 index 0000000..49da3cb --- /dev/null +++ b/benchmarks/benchmark_array_xd.py @@ -0,0 +1,142 @@ +import json +import os +import tempfile + +import datasets +from datasets.arrow_writer import ArrowWriter +from datasets.features import Array2D +from utils import generate_examples, get_duration + + +SHAPE_TEST_1 = (30, 487) +SHAPE_TEST_2 = (36, 1024) +SPEED_TEST_SHAPE = (100, 100) +SPEED_TEST_N_EXAMPLES = 100 + +DEFAULT_FEATURES = datasets.Features( + {"text": Array2D(SHAPE_TEST_1, dtype="float32"), "image": Array2D(SHAPE_TEST_2, dtype="float32")} +) + +RESULTS_BASEPATH, RESULTS_FILENAME = os.path.split(__file__) +RESULTS_FILE_PATH = os.path.join(RESULTS_BASEPATH, "results", RESULTS_FILENAME.replace(".py", ".json")) + + +@get_duration +def write(my_features, dummy_data, tmp_dir): + with ArrowWriter(features=my_features, path=os.path.join(tmp_dir, "beta.arrow")) as writer: + for key, record in dummy_data: + example = my_features.encode_example(record) + writer.write(example) + num_examples, num_bytes = writer.finalize() + + +@get_duration +def read_unformated(feats, tmp_dir): + dataset = datasets.Dataset.from_file( + filename=os.path.join(tmp_dir, "beta.arrow"), info=datasets.DatasetInfo(features=feats) + ) + for _ in dataset: + pass + + +@get_duration +def read_formatted_as_numpy(feats, tmp_dir): + dataset = datasets.Dataset.from_file( + filename=os.path.join(tmp_dir, "beta.arrow"), info=datasets.DatasetInfo(features=feats) + ) + dataset.set_format("numpy") + for _ in dataset: + pass + + +@get_duration +def read_batch_unformated(feats, tmp_dir): + batch_size = 10 + dataset = datasets.Dataset.from_file( + filename=os.path.join(tmp_dir, "beta.arrow"), info=datasets.DatasetInfo(features=feats) + ) + for i in range(0, len(dataset), batch_size): + _ = dataset[i : i + batch_size] + + +@get_duration +def read_batch_formatted_as_numpy(feats, tmp_dir): + batch_size = 10 + dataset = datasets.Dataset.from_file( + filename=os.path.join(tmp_dir, "beta.arrow"), info=datasets.DatasetInfo(features=feats) + ) + dataset.set_format("numpy") + for i in range(0, len(dataset), batch_size): + _ = dataset[i : i + batch_size] + + +@get_duration +def read_col_unformated(feats, tmp_dir): + dataset = datasets.Dataset.from_file( + filename=os.path.join(tmp_dir, "beta.arrow"), info=datasets.DatasetInfo(features=feats) + ) + for col in feats: + _ = dataset[col] + + +@get_duration +def read_col_formatted_as_numpy(feats, tmp_dir): + dataset = datasets.Dataset.from_file( + filename=os.path.join(tmp_dir, "beta.arrow"), info=datasets.DatasetInfo(features=feats) + ) + dataset.set_format("numpy") + for col in feats: + _ = dataset[col] + + +def benchmark_array_xd(): + times = {} + read_functions = ( + read_unformated, + read_formatted_as_numpy, + read_batch_unformated, + read_batch_formatted_as_numpy, + read_col_unformated, + read_col_formatted_as_numpy, + ) + with tempfile.TemporaryDirectory() as tmp_dir: + feats = datasets.Features({"image": Array2D(SPEED_TEST_SHAPE, dtype="float32")}) + data = generate_examples(features=feats, num_examples=SPEED_TEST_N_EXAMPLES) + times["write_array2d"] = write(feats, data, tmp_dir) + for read_func in read_functions: + times[read_func.__name__ + " after write_array2d"] = read_func(feats, tmp_dir) + + with tempfile.TemporaryDirectory() as tmp_dir: + # don't use fixed length for fair comparison + # feats = datasets.Features( + # {"image": datasets.Sequence(datasets.Sequence(datasets.Value("float32"), SPEED_TEST_SHAPE[1]), SPEED_TEST_SHAPE[0])} + # ) + feats = datasets.Features({"image": datasets.Sequence(datasets.Sequence(datasets.Value("float32")))}) + data = generate_examples( + features=feats, num_examples=SPEED_TEST_N_EXAMPLES, seq_shapes={"image": SPEED_TEST_SHAPE} + ) + times["write_nested_sequence"] = write(feats, data, tmp_dir) + for read_func in read_functions: + times[read_func.__name__ + " after write_nested_sequence"] = read_func(feats, tmp_dir) + + with tempfile.TemporaryDirectory() as tmp_dir: + # don't use fixed length for fair comparison + # feats = datasets.Features( + # {"image": datasets.Sequence(datasets.Value("float32"), SPEED_TEST_SHAPE[0] * SPEED_TEST_SHAPE[1])} + # ) + feats = datasets.Features({"image": datasets.Sequence(datasets.Value("float32"))}) + data = generate_examples( + features=feats, + num_examples=SPEED_TEST_N_EXAMPLES, + seq_shapes={"image": [SPEED_TEST_SHAPE[0] * SPEED_TEST_SHAPE[1]]}, + ) + times["write_flattened_sequence"] = write(feats, data, tmp_dir) + for read_func in read_functions: + times[read_func.__name__ + " after write_flattened_sequence"] = read_func(feats, tmp_dir) + + with open(RESULTS_FILE_PATH, "wb") as f: + f.write(json.dumps(times).encode("utf-8")) + + +if __name__ == "__main__": # useful to run the profiler + benchmark_array_xd() diff --git a/benchmarks/benchmark_getitem_100B.py b/benchmarks/benchmark_getitem_100B.py new file mode 100644 index 0000000..a8e4f0d --- /dev/null +++ b/benchmarks/benchmark_getitem_100B.py @@ -0,0 +1,78 @@ +import json +import os +from dataclasses import dataclass + +import numpy as np +import pyarrow as pa + +import datasets +from utils import get_duration + + +SPEED_TEST_N_EXAMPLES = 100_000_000_000 +SPEED_TEST_CHUNK_SIZE = 10_000 + +RESULTS_BASEPATH, RESULTS_FILENAME = os.path.split(__file__) +RESULTS_FILE_PATH = os.path.join(RESULTS_BASEPATH, "results", RESULTS_FILENAME.replace(".py", ".json")) + + +def generate_100B_dataset(num_examples: int, chunk_size: int) -> datasets.Dataset: + table = pa.Table.from_pydict({"col": [0] * chunk_size}) + table = pa.concat_tables([table] * (num_examples // chunk_size)) + return datasets.Dataset(table, fingerprint="table_100B") + + +@dataclass +class RandIter: + low: int + high: int + size: int + seed: int + + def __post_init__(self): + rng = np.random.default_rng(self.seed) + self._sampled_values = rng.integers(low=self.low, high=self.high, size=self.size).tolist() + + def __iter__(self): + return iter(self._sampled_values) + + def __len__(self): + return self.size + + +@get_duration +def get_first_row(dataset: datasets.Dataset): + _ = dataset[0] + + +@get_duration +def get_last_row(dataset: datasets.Dataset): + _ = dataset[-1] + + +@get_duration +def get_batch_of_1024_rows(dataset: datasets.Dataset): + _ = dataset[range(len(dataset) // 2, len(dataset) // 2 + 1024)] + + +@get_duration +def get_batch_of_1024_random_rows(dataset: datasets.Dataset): + _ = dataset[RandIter(0, len(dataset), 1024, seed=42)] + + +def benchmark_table_100B(): + times = {"num examples": SPEED_TEST_N_EXAMPLES} + functions = (get_first_row, get_last_row, get_batch_of_1024_rows, get_batch_of_1024_random_rows) + print("generating dataset") + dataset = generate_100B_dataset(num_examples=SPEED_TEST_N_EXAMPLES, chunk_size=SPEED_TEST_CHUNK_SIZE) + print("Functions") + for func in functions: + print(func.__name__) + times[func.__name__] = func(dataset) + + with open(RESULTS_FILE_PATH, "wb") as f: + f.write(json.dumps(times).encode("utf-8")) + + +if __name__ == "__main__": # useful to run the profiler + benchmark_table_100B() diff --git a/benchmarks/benchmark_indices_mapping.py b/benchmarks/benchmark_indices_mapping.py new file mode 100644 index 0000000..d35d9fb --- /dev/null +++ b/benchmarks/benchmark_indices_mapping.py @@ -0,0 +1,60 @@ +import json +import os +import tempfile + +import datasets +from utils import generate_example_dataset, get_duration + + +SPEED_TEST_N_EXAMPLES = 500_000 + +RESULTS_BASEPATH, RESULTS_FILENAME = os.path.split(__file__) +RESULTS_FILE_PATH = os.path.join(RESULTS_BASEPATH, "results", RESULTS_FILENAME.replace(".py", ".json")) + + +@get_duration +def select(dataset: datasets.Dataset): + _ = dataset.select(range(0, len(dataset), 2)) + + +@get_duration +def sort(dataset: datasets.Dataset): + _ = dataset.sort("numbers") + + +@get_duration +def shuffle(dataset: datasets.Dataset): + _ = dataset.shuffle() + + +@get_duration +def train_test_split(dataset: datasets.Dataset): + _ = dataset.train_test_split(0.1) + + +@get_duration +def shard(dataset: datasets.Dataset, num_shards=10): + for shard_id in range(num_shards): + _ = dataset.shard(num_shards, shard_id) + + +def benchmark_indices_mapping(): + times = {"num examples": SPEED_TEST_N_EXAMPLES} + functions = (select, sort, shuffle, train_test_split, shard) + with tempfile.TemporaryDirectory() as tmp_dir: + print("generating dataset") + features = datasets.Features({"text": datasets.Value("string"), "numbers": datasets.Value("float32")}) + dataset = generate_example_dataset( + os.path.join(tmp_dir, "dataset.arrow"), features, num_examples=SPEED_TEST_N_EXAMPLES + ) + print("Functions") + for func in functions: + print(func.__name__) + times[func.__name__] = func(dataset) + + with open(RESULTS_FILE_PATH, "wb") as f: + f.write(json.dumps(times).encode("utf-8")) + + +if __name__ == "__main__": # useful to run the profiler + benchmark_indices_mapping() diff --git a/benchmarks/benchmark_iterating.py b/benchmarks/benchmark_iterating.py new file mode 100644 index 0000000..a0b0d4f --- /dev/null +++ b/benchmarks/benchmark_iterating.py @@ -0,0 +1,98 @@ +import json +import os +import tempfile + +import datasets +from utils import generate_example_dataset, get_duration + + +SPEED_TEST_N_EXAMPLES = 50_000 +SMALL_TEST = 5_000 + +RESULTS_BASEPATH, RESULTS_FILENAME = os.path.split(__file__) +RESULTS_FILE_PATH = os.path.join(RESULTS_BASEPATH, "results", RESULTS_FILENAME.replace(".py", ".json")) + + +@get_duration +def read(dataset: datasets.Dataset, length): + for i in range(length): + _ = dataset[i] + + +@get_duration +def read_batch(dataset: datasets.Dataset, length, batch_size): + for i in range(0, len(dataset), batch_size): + _ = dataset[i : i + batch_size] + + +@get_duration +def read_formatted(dataset: datasets.Dataset, length, type): + with dataset.formatted_as(type=type): + for i in range(length): + _ = dataset[i] + + +@get_duration +def read_formatted_batch(dataset: datasets.Dataset, length, batch_size, type): + with dataset.formatted_as(type=type): + for i in range(0, length, batch_size): + _ = dataset[i : i + batch_size] + + +def benchmark_iterating(): + times = {"num examples": SPEED_TEST_N_EXAMPLES} + functions = [ + (read, {"length": SMALL_TEST}), + (read, {"length": SPEED_TEST_N_EXAMPLES}), + (read_batch, {"length": SPEED_TEST_N_EXAMPLES, "batch_size": 10}), + (read_batch, {"length": SPEED_TEST_N_EXAMPLES, "batch_size": 100}), + (read_batch, {"length": SPEED_TEST_N_EXAMPLES, "batch_size": 1_000}), + (read_formatted, {"type": "numpy", "length": SMALL_TEST}), + (read_formatted, {"type": "pandas", "length": SMALL_TEST}), + (read_formatted, {"type": "torch", "length": SMALL_TEST}), + (read_formatted, {"type": "tensorflow", "length": SMALL_TEST}), + (read_formatted_batch, {"type": "numpy", "length": SMALL_TEST, "batch_size": 10}), + (read_formatted_batch, {"type": "numpy", "length": SMALL_TEST, "batch_size": 1_000}), + ] + + functions_shuffled = [ + (read, {"length": SMALL_TEST}), + (read, {"length": SPEED_TEST_N_EXAMPLES}), + (read_batch, {"length": SPEED_TEST_N_EXAMPLES, "batch_size": 10}), + (read_batch, {"length": SPEED_TEST_N_EXAMPLES, "batch_size": 100}), + (read_batch, {"length": SPEED_TEST_N_EXAMPLES, "batch_size": 1_000}), + (read_formatted, {"type": "numpy", "length": SMALL_TEST}), + (read_formatted_batch, {"type": "numpy", "length": SMALL_TEST, "batch_size": 10}), + (read_formatted_batch, {"type": "numpy", "length": SMALL_TEST, "batch_size": 1_000}), + ] + with tempfile.TemporaryDirectory() as tmp_dir: + print("generating dataset") + features = datasets.Features( + {"list": datasets.Sequence(datasets.Value("float32")), "numbers": datasets.Value("float32")} + ) + dataset = generate_example_dataset( + os.path.join(tmp_dir, "dataset.arrow"), + features, + num_examples=SPEED_TEST_N_EXAMPLES, + seq_shapes={"list": (100,)}, + ) + print("first set of iterations") + for func, kwargs in functions: + print(func.__name__, str(kwargs)) + times[func.__name__ + " " + " ".join(str(v) for v in kwargs.values())] = func(dataset, **kwargs) + + print("shuffling dataset") + dataset = dataset.shuffle() + print("Second set of iterations (after shuffling") + for func, kwargs in functions_shuffled: + print("shuffled ", func.__name__, str(kwargs)) + times["shuffled " + func.__name__ + " " + " ".join(str(v) for v in kwargs.values())] = func( + dataset, **kwargs + ) + + with open(RESULTS_FILE_PATH, "wb") as f: + f.write(json.dumps(times).encode("utf-8")) + + +if __name__ == "__main__": # useful to run the profiler + benchmark_iterating() diff --git a/benchmarks/benchmark_map_filter.py b/benchmarks/benchmark_map_filter.py new file mode 100644 index 0000000..8490cae --- /dev/null +++ b/benchmarks/benchmark_map_filter.py @@ -0,0 +1,71 @@ +import json +import os +import tempfile + +import transformers + +import datasets +from utils import generate_example_dataset, get_duration + + +SPEED_TEST_N_EXAMPLES = 500_000 + +RESULTS_BASEPATH, RESULTS_FILENAME = os.path.split(__file__) +RESULTS_FILE_PATH = os.path.join(RESULTS_BASEPATH, "results", RESULTS_FILENAME.replace(".py", ".json")) + + +@get_duration +def map(dataset: datasets.Dataset, **kwargs): + _ = dataset.map(**kwargs) + + +@get_duration +def filter(dataset: datasets.Dataset, **kwargs): + _ = dataset.filter(**kwargs) + + +def benchmark_map_filter(): + times = {"num examples": SPEED_TEST_N_EXAMPLES} + with tempfile.TemporaryDirectory() as tmp_dir: + features = datasets.Features({"text": datasets.Value("string"), "numbers": datasets.Value("float32")}) + dataset = generate_example_dataset( + os.path.join(tmp_dir, "dataset.arrow"), features, num_examples=SPEED_TEST_N_EXAMPLES + ) + + tokenizer = transformers.AutoTokenizer.from_pretrained("bert-base-cased", use_fast=True) + + def tokenize(examples): + return tokenizer(examples["text"]) + + times["map identity"] = map(dataset) + + times["map identity batched"] = map(dataset, batched=True) + + times["map no-op batched"] = map(dataset, function=lambda x: None, batched=True) + + with dataset.formatted_as(type="numpy"): + times["map no-op batched numpy"] = map(dataset, function=lambda x: None, batched=True) + + with dataset.formatted_as(type="pandas"): + times["map no-op batched pandas"] = map(dataset, function=lambda x: None, batched=True) + + with dataset.formatted_as(type="torch", columns="numbers"): + times["map no-op batched pytorch"] = map(dataset, function=lambda x: None, batched=True) + + with dataset.formatted_as(type="tensorflow", columns="numbers"): + times["map no-op batched tensorflow"] = map(dataset, function=lambda x: None, batched=True) + + times["map fast-tokenizer batched"] = map(dataset, function=tokenize, batched=True) + + times["filter"] = filter(dataset) + + # Activate later when tokenizer support batched inputs + # with dataset.formatted_as(type='numpy'): + # times[func.__name__ + " fast-tokenizer batched numpy"] = func(dataset, function=tokenize, batched=True) + + with open(RESULTS_FILE_PATH, "wb") as f: + f.write(json.dumps(times).encode("utf-8")) + + +if __name__ == "__main__": # useful to run the profiler + benchmark_map_filter() diff --git a/benchmarks/format.py b/benchmarks/format.py new file mode 100644 index 0000000..f37043b --- /dev/null +++ b/benchmarks/format.py @@ -0,0 +1,49 @@ +import json +import sys + + +def format_json_to_md(input_json_file, output_md_file): + with open(input_json_file, encoding="utf-8") as f: + results = json.load(f) + + output_md = ["
", "Show updated benchmarks!", " "] + + for benchmark_name in sorted(results): + benchmark_res = results[benchmark_name] + + benchmark_file_name = benchmark_name.split("/")[-1] + output_md.append(f"### Benchmark: {benchmark_file_name}") + + title = "| metric |" + lines = "|--------|" + value = "| new / old (diff) |" + for metric_name in sorted(benchmark_res): + metric_vals = benchmark_res[metric_name] + new_val = metric_vals["new"] + old_val = metric_vals.get("old", None) + dif_val = metric_vals.get("diff", None) + + val_str = f" {new_val:f}" if isinstance(new_val, (int, float)) else "None" + + if old_val is not None: + val_str += f" / {old_val:f}" if isinstance(old_val, (int, float)) else "None" + if dif_val is not None: + val_str += f" ({dif_val:f})" if isinstance(dif_val, (int, float)) else "None" + + title += " " + metric_name + " |" + lines += "---|" + value += val_str + " |" + + output_md += [title, lines, value, " "] + + output_md.append("
") + + with open(output_md_file, "w", encoding="utf-8") as f: + f.writelines("\n".join(output_md)) + + +if __name__ == "__main__": + input_json_file = sys.argv[1] + output_md_file = sys.argv[2] + + format_json_to_md(input_json_file, output_md_file) diff --git a/benchmarks/results/.gitkeep b/benchmarks/results/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/benchmarks/results/benchmark_array_xd.json b/benchmarks/results/benchmark_array_xd.json new file mode 100644 index 0000000..cc94b8d --- /dev/null +++ b/benchmarks/results/benchmark_array_xd.json @@ -0,0 +1 @@ +{"write_array2d": 0.14168284999323077, "read_unformated after write_array2d": 0.04353281999647152, "read_formatted_as_numpy after write_array2d": 0.1285462469968479, "read_batch_unformated after write_array2d": 0.023109222995117307, "read_batch_formatted_as_numpy after write_array2d": 0.011352884990628809, "read_col_unformated after write_array2d": 0.037052362007671036, "read_col_formatted_as_numpy after write_array2d": 0.007985618998645805, "write_nested_sequence": 1.4927163410029607, "read_unformated after write_nested_sequence": 0.28319963401008863, "read_formatted_as_numpy after write_nested_sequence": 0.419271487990045, "read_batch_unformated after write_nested_sequence": 0.3234798710036557, "read_batch_formatted_as_numpy after write_nested_sequence": 0.03850809299910907, "read_col_unformated after write_nested_sequence": 0.29384092400141526, "read_col_formatted_as_numpy after write_nested_sequence": 0.004250421989127062, "write_flattened_sequence": 1.4521546780015342, "read_unformated after write_flattened_sequence": 0.25513897799828555, "read_formatted_as_numpy after write_flattened_sequence": 0.07564631900459062, "read_batch_unformated after write_flattened_sequence": 0.2758980469952803, "read_batch_formatted_as_numpy after write_flattened_sequence": 0.011008214991306886, "read_col_unformated after write_flattened_sequence": 0.25848906899045687, "read_col_formatted_as_numpy after write_flattened_sequence": 0.004328447001171298} \ No newline at end of file diff --git a/benchmarks/results/benchmark_getitem_100B.json b/benchmarks/results/benchmark_getitem_100B.json new file mode 100644 index 0000000..b0bb398 --- /dev/null +++ b/benchmarks/results/benchmark_getitem_100B.json @@ -0,0 +1 @@ +{"num examples": 100000000000, "get_first_row": 0.00019991099999927542, "get_last_row": 5.4411000000698095e-05, "get_batch_of_1024_rows": 0.0004897069999998394, "get_batch_of_1024_random_rows": 0.01800621099999944} \ No newline at end of file diff --git a/benchmarks/results/benchmark_indices_mapping.json b/benchmarks/results/benchmark_indices_mapping.json new file mode 100644 index 0000000..0af6c0f --- /dev/null +++ b/benchmarks/results/benchmark_indices_mapping.json @@ -0,0 +1 @@ +{"num examples": 500000, "select": 0.03741131999413483, "sort": 0.7371353159978753, "shuffle": 0.17655655200360343, "train_test_split": 0.29633847798686475, "shard": 0.01452581599005498} \ No newline at end of file diff --git a/benchmarks/results/benchmark_iterating.json b/benchmarks/results/benchmark_iterating.json new file mode 100644 index 0000000..3756a9f --- /dev/null +++ b/benchmarks/results/benchmark_iterating.json @@ -0,0 +1 @@ +{"num examples": 50000, "read 5000": 0.2152090710005723, "read 50000": 2.077654693988734, "read_batch 50000 10": 1.5041199039987987, "read_batch 50000 100": 1.5411947140091797, "read_batch 50000 1000": 1.4684901159926085, "read_formatted numpy 5000": 4.584776938994764, "read_formatted pandas 5000": 3.7457121399929747, "read_formatted torch 5000": 4.565676491998602, "read_formatted tensorflow 5000": 5.269861594992108, "read_formatted_batch numpy 5000 10": 0.4242750950070331, "read_formatted_batch numpy 5000 1000": 0.007607111998368055, "shuffled read 5000": 0.22604441999283154, "shuffled read 50000": 2.268928524994408, "shuffled read_batch 50000 10": 55.44462437101174, "shuffled read_batch 50000 100": 6.876476717996411, "shuffled read_batch 50000 1000": 2.1420724369963864, "shuffled read_formatted numpy 5000": 4.8052272600034485, "shuffled read_formatted_batch numpy 5000 10": 6.500664097999106, "shuffled read_formatted_batch numpy 5000 1000": 0.0754691059992183} \ No newline at end of file diff --git a/benchmarks/results/benchmark_map_filter.json b/benchmarks/results/benchmark_map_filter.json new file mode 100644 index 0000000..0b9efbd --- /dev/null +++ b/benchmarks/results/benchmark_map_filter.json @@ -0,0 +1 @@ +{"num examples": 500000, "map identity": 10.19139202599763, "map identity batched": 0.6804238399927272, "map no-op batched": 0.5342009569867514, "map no-op batched numpy": 0.5792830920108827, "map no-op batched pandas": 0.4343639040016569, "map no-op batched pytorch": 0.5403374370071106, "map no-op batched tensorflow": 1.3869360350072384, "map fast-tokenizer batched": 8.074308118986664, "filter": 1.841787679004483} \ No newline at end of file diff --git a/benchmarks/utils.py b/benchmarks/utils.py new file mode 100644 index 0000000..feb13d9 --- /dev/null +++ b/benchmarks/utils.py @@ -0,0 +1,64 @@ +import timeit + +import numpy as np + +import datasets +from datasets.arrow_writer import ArrowWriter +from datasets.features.features import _ArrayXD + + +def get_duration(func): + def wrapper(*args, **kwargs): + starttime = timeit.default_timer() + _ = func(*args, **kwargs) + delta = timeit.default_timer() - starttime + return delta + + wrapper.__name__ = func.__name__ + + return wrapper + + +def generate_examples(features: dict, num_examples=100, seq_shapes=None): + dummy_data = [] + seq_shapes = seq_shapes or {} + for i in range(num_examples): + example = {} + for col_id, (k, v) in enumerate(features.items()): + if isinstance(v, _ArrayXD): + data = np.random.rand(*v.shape).astype(v.dtype) + elif isinstance(v, datasets.Value): + if v.dtype == "string": + data = "The small grey turtle was surprisingly fast when challenged." + else: + data = np.random.randint(10, size=1).astype(v.dtype).item() + elif isinstance(v, datasets.Sequence): + while isinstance(v, datasets.Sequence): + v = v.feature + shape = seq_shapes[k] + data = np.random.rand(*shape).astype(v.dtype) + example[k] = data + + dummy_data.append((i, example)) + + return dummy_data + + +def generate_example_dataset(dataset_path, features, num_examples=100, seq_shapes=None): + dummy_data = generate_examples(features, num_examples=num_examples, seq_shapes=seq_shapes) + + with ArrowWriter(features=features, path=dataset_path) as writer: + for key, record in dummy_data: + example = features.encode_example(record) + writer.write(example) + + num_final_examples, num_bytes = writer.finalize() + + if not num_final_examples == num_examples: + raise ValueError( + f"Error writing the dataset, wrote {num_final_examples} examples but should have written {num_examples}." + ) + + dataset = datasets.Dataset.from_file(filename=dataset_path, info=datasets.DatasetInfo(features=features)) + + return dataset diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..abcec63 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,260 @@ + + +# Generating the documentation + +To generate the documentation, you first have to build it. Several packages are necessary to build the doc, +you can install them with the following command, at the root of the code repository: + +```bash +pip install -e ".[docs]" +``` + +Then you need to install our special tool that builds the documentation: + +```bash +pip install git+https://github.com/huggingface/doc-builder +``` + +--- +**NOTE** + +You only need to generate the documentation to inspect it locally (if you're planning changes and want to +check how they look before committing for instance). You don't have to `git commit` the built documentation. + +--- + +## Building the documentation + +Once you have setup the `doc-builder` and additional packages, you can generate the documentation by typing +the following command: + +```bash +doc-builder build datasets docs/source/ --build_dir ~/tmp/test-build +``` + +You can adapt the `--build_dir` to set any temporary folder that you prefer. This command will create it and generate +the MDX files that will be rendered as the documentation on the main website. You can inspect them in your favorite +Markdown editor. + +## Previewing the documentation + +To preview the docs, first install the `watchdog` module with: + +```bash +pip install watchdog +``` + +Then run the following command: + +```bash +doc-builder preview datasets docs/source/ +``` + +The docs will be viewable at [http://localhost:3000](http://localhost:3000). You can also preview the docs once you have opened a PR. You will see a bot add a comment to a link where the documentation with your changes lives. + +--- +**NOTE** + +The `preview` command only works with existing doc files. When you add a completely new file, you need to update `_toctree.yml` & restart `preview` command (`ctrl-c` to stop it & call `doc-builder preview ...` again). + +## Adding a new element to the navigation bar + +Accepted files are Markdown (.md or .mdx). + +Create a file with its extension and put it in the source directory. You can then link it to the toc-tree by putting +the filename without the extension in the [`_toctree.yml`](https://github.com/huggingface/datasets/blob/main/docs/source/_toctree.yml) file. + +## Renaming section headers and moving sections + +It helps to keep the old links working when renaming the section header and/or moving sections from one document to another. This is because the old links are likely to be used in Issues, Forums and Social media and it'd make for a much more superior user experience if users reading those months later could still easily navigate to the originally intended information. + +Therefore we simply keep a little map of moved sections at the end of the document where the original section was. The key is to preserve the original anchor. + +So if you renamed a section from: "Section A" to "Section B", then you can add at the end of the file: + +``` +Sections that were moved: + +[ Section A ] +``` +and of course if you moved it to another file, then: + +``` +Sections that were moved: + +[ Section A ] +``` + +Use the relative style to link to the new file so that the versioned docs continue to work. + +For an example of a rich moved sections set please see the very end of [the transformers Trainer doc](https://github.com/huggingface/transformers/blob/main/docs/source/en/main_classes/trainer.md). + + +## Writing Documentation - Specification + +The `huggingface/datasets` documentation follows the +[Google documentation](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html) style for docstrings, +although we can write them directly in Markdown. + +### Adding a new tutorial + +Adding a new tutorial or section is done in two steps: + +- Add a new file under `./source`. This file can either be ReStructuredText (.rst) or Markdown (.md). +- Link that file in `./source/_toctree.yml` on the correct toc-tree. + +Make sure to put your new file under the proper section. If you have a doubt, feel free to ask in a Github Issue or PR. + +### Writing source documentation + +Values that should be put in `code` should either be surrounded by backticks: \`like so\`. Note that argument names +and objects like True, None or any strings should usually be put in `code`. + +When mentioning a class, function or method, it is recommended to use our syntax for internal links so that our tool +adds a link to its documentation with this syntax: \[\`XXXClass\`\] or \[\`function\`\]. This requires the class or +function to be in the main package. + +If you want to create a link to some internal class or function, you need to +provide its path. For instance: \[\`table.InMemoryTable\`\]. This will be converted into a link with +`table.InMemoryTable` in the description. To get rid of the path and only keep the name of the object you are +linking to in the description, add a ~: \[\`~table.InMemoryTable\`\] will generate a link with `InMemoryTable` in the description. + +The same works for methods so you can either use \[\`XXXClass.method\`\] or \[~\`XXXClass.method\`\]. + +#### Defining arguments in a method + +Arguments should be defined with the `Args:` (or `Arguments:` or `Parameters:`) prefix, followed by a line return and +an indentation. The argument should be followed by its type, with its shape if it is a tensor, a colon and its +description: + +``` + Args: + n_layers (`int`): The number of layers of the model. +``` + +If the description is too long to fit in one line, another indentation is necessary before writing the description +after the argument. + +Here's an example showcasing everything so far: + +``` + Args: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + Indices of input sequence tokens in the vocabulary. + + Indices can be obtained using [`AlbertTokenizer`]. See [`~PreTrainedTokenizer.encode`] and + [`~PreTrainedTokenizer.__call__`] for details. + + [What are input IDs?](../glossary#input-ids) +``` + +For optional arguments or arguments with defaults we follow the following syntax: imagine we have a function with the +following signature: + +``` +def my_function(x: str = None, a: float = 1): +``` + +then its documentation should look like this: + +``` + Args: + x (`str`, *optional*): + This argument controls ... + a (`float`, *optional*, defaults to 1): + This argument is used to ... +``` + +Note that we always omit the "defaults to \`None\`" when None is the default for any argument. Also note that even +if the first line describing your argument type and its default gets long, you can't break it into several lines. You can +however write as many lines as you want in the indented description (see the example above with `input_ids`). + +#### Writing a multi-line code block + +Multi-line code blocks can be useful for displaying examples. They are done between two lines of three backticks as usual in Markdown: + + +```` +``` +# first line of code +# second line +# etc +``` +```` + +#### Writing a return block + +The return block should be introduced with the `Returns:` prefix, followed by a line return and an indentation. +The first line should be the type of the return, followed by a line return. No need to indent further for the elements +building the return. + +Here's an example of a single value return: + +``` + Returns: + `List[int]`: A list of integers in the range [0, 1] --- 1 for a special token, 0 for a sequence token. +``` + +Here's an example of tuple return, comprising several objects: + +``` + Returns: + `tuple(torch.FloatTensor)` comprising various elements depending on the configuration ([`BertConfig`]) and inputs: + - ** loss** (*optional*, returned when `masked_lm_labels` is provided) `torch.FloatTensor` of shape `(1,)` -- + Total loss as the sum of the masked language modeling loss and the next sequence prediction (classification) loss. + - **prediction_scores** (`torch.FloatTensor` of shape `(batch_size, sequence_length, config.vocab_size)`) -- + Prediction scores of the language modeling head (scores for each vocabulary token before SoftMax). +``` + +#### Adding an image + +Due to the rapidly growing repository, it is important to make sure that no files that would significantly weigh down the repository are added. This includes images, videos and other non-text files. We prefer to leverage a hf.co hosted `dataset` like +the ones hosted on [`hf-internal-testing`](https://huggingface.co/hf-internal-testing) in which to place these files and reference +them by URL. We recommend putting them in the following dataset: [huggingface/documentation-images](https://huggingface.co/datasets/huggingface/documentation-images). +If an external contribution, feel free to add the images to your PR and ask a Hugging Face member to migrate your images +to this dataset. + +## Writing documentation examples + +The syntax for Example docstrings can look as follows: + +``` + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> def add_prefix(example): + ... example["text"] = "Review: " + example["text"] + ... return example + >>> ds = ds.map(add_prefix) + >>> ds[0:3]["text"] + ['Review: compassionately explores the seemingly irreconcilable situation between conservative christian parents and their estranged gay and lesbian children .', + 'Review: the soundtrack alone is worth the price of admission .', + 'Review: rodriguez does a splendid job of racial profiling hollywood style--casting excellent latin actors of all ages--a trend long overdue .'] + + # process a batch of examples + >>> ds = ds.map(lambda example: tokenizer(example["text"]), batched=True) + # set number of processors + >>> ds = ds.map(add_prefix, num_proc=4) + ``` +``` + +The docstring should give a minimal, clear example of how the respective class or function is to be used in practice and also include the expected (ideally sensible) output. +Often, readers will try out the example before even going through the function +or class definitions. Therefore, it is of utmost importance that the example +works as expected. diff --git a/docs/source/_config.py b/docs/source/_config.py new file mode 100644 index 0000000..f8a135c --- /dev/null +++ b/docs/source/_config.py @@ -0,0 +1,11 @@ +# docstyle-ignore +INSTALL_CONTENT = """ +# Datasets installation +! pip install datasets transformers +# To install from source instead of the last release, comment the command above and uncomment the following one. +# ! pip install git+https://github.com/huggingface/datasets.git +""" + +notebook_first_cells = [{"type": "code", "content": INSTALL_CONTENT}] +default_branch_name = "main" +version_prefix = "" diff --git a/docs/source/_redirects.yml b/docs/source/_redirects.yml new file mode 100644 index 0000000..606a00e --- /dev/null +++ b/docs/source/_redirects.yml @@ -0,0 +1,13 @@ +# This first_section was backported from nginx +loading_datasets: loading +share_dataset: share +quicktour: quickstart +dataset_streaming: stream +torch_tensorflow: use_dataset +splits: loading#slice-splits +processing: process +faiss_and_ea: faiss_es +features: about_dataset_features +exploring: access +package_reference/logging_methods: package_reference/utilities +# end of first_section diff --git a/docs/source/_toctree.yml b/docs/source/_toctree.yml new file mode 100644 index 0000000..276fe36 --- /dev/null +++ b/docs/source/_toctree.yml @@ -0,0 +1,148 @@ +- sections: + - local: index + title: 🤗 Datasets + - local: quickstart + title: Quickstart + - local: installation + title: Installation + title: Get started +- sections: + - local: tutorial + title: Overview + - local: load_hub + title: Load a dataset from the Hub + - local: access + title: Know your dataset + - local: use_dataset + title: Preprocess + - local: create_dataset + title: Create a dataset + - local: upload_dataset + title: Share a dataset to the Hub + title: "Tutorials" +- sections: + - local: how_to + title: Overview + - sections: + - local: loading + title: Load + - local: process + title: Process + - local: stream + title: Stream + - local: use_with_pytorch + title: Use with PyTorch + - local: use_with_tensorflow + title: Use with TensorFlow + - local: use_with_numpy + title: Use with NumPy + - local: use_with_jax + title: Use with JAX + - local: use_with_pandas + title: Use with Pandas + - local: use_with_polars + title: Use with Polars + - local: use_with_pyarrow + title: Use with PyArrow + - local: use_with_spark + title: Use with Spark + - local: cache + title: Cache management + - local: filesystems + title: Cloud storage + - local: faiss_es + title: Search index + - local: cli + title: CLI + - local: troubleshoot + title: Troubleshooting + title: "General usage" + - sections: + - local: audio_load + title: Load audio data + - local: audio_process + title: Process audio data + - local: audio_dataset + title: Create an audio dataset + title: "Audio" + - sections: + - local: image_load + title: Load image data + - local: image_process + title: Process image data + - local: image_dataset + title: Create an image dataset + - local: depth_estimation + title: Depth estimation + - local: image_classification + title: Image classification + - local: semantic_segmentation + title: Semantic segmentation + - local: object_detection + title: Object detection + - local: video_load + title: Load video data + - local: video_dataset + title: Create a video dataset + - local: document_load + title: Load document data + - local: document_dataset + title: Create a document dataset + - local: nifti_dataset + title: Create a medical imaging dataset + title: "Vision" + - sections: + - local: mesh_load + title: Load mesh data + - local: mesh_dataset + title: Create a mesh dataset + title: "3D" + - sections: + - local: nlp_load + title: Load text data + - local: nlp_process + title: Process text data + title: "Text" + - sections: + - local: tabular_load + title: Load tabular data + title: "Tabular" + - sections: + - local: tsfile_load + title: Load TsFile data + title: "Time-series" + - sections: + - local: share + title: Share + - local: dataset_card + title: Create a dataset card + - local: repository_structure + title: Structure your repository + title: "Dataset repository" + title: "How-to guides" +- sections: + - local: about_arrow + title: Datasets 🤝 Arrow + - local: about_cache + title: The cache + - local: about_mapstyle_vs_iterable + title: Dataset or IterableDataset + - local: about_dataset_features + title: Dataset features + - local: about_dataset_load + title: Build and load + - local: about_map_batch + title: Batch mapping + title: "Conceptual guides" +- sections: + - local: package_reference/main_classes + title: Main classes + - local: package_reference/builder_classes + title: Builder classes + - local: package_reference/loading_methods + title: Loading methods + - local: package_reference/table_classes + title: Table Classes + - local: package_reference/utilities + title: Utilities + title: "Reference" diff --git a/docs/source/about_arrow.md b/docs/source/about_arrow.md new file mode 100644 index 0000000..8587260 --- /dev/null +++ b/docs/source/about_arrow.md @@ -0,0 +1,50 @@ +# Datasets 🤝 Arrow + +## What is Arrow? + +[Arrow](https://arrow.apache.org/) enables large amounts of data to be processed and moved quickly. It is a specific data format that stores data in a columnar memory layout. This provides several significant advantages: + +* Arrow's standard format allows [zero-copy reads](https://en.wikipedia.org/wiki/Zero-copy) which removes virtually all serialization overhead. +* Arrow is language-agnostic so it supports different programming languages. +* Arrow is column-oriented so it is faster at querying and processing slices or columns of data. +* Arrow allows for copy-free hand-offs to standard machine learning tools such as NumPy, Pandas, PyTorch, and TensorFlow. +* Arrow supports many, possibly nested, column types. + +## Memory-mapping + +🤗 Datasets uses Arrow for its local caching system. It allows datasets to be backed by an on-disk cache, which is memory-mapped for fast lookup. +This architecture allows for large datasets to be used on machines with relatively small device memory. + +For example, loading the full English Wikipedia dataset only takes a few MB of RAM: + +```python +>>> import os; import psutil; import timeit +>>> from datasets import load_dataset + +# Process.memory_info is expressed in bytes, so convert to megabytes +>>> mem_before = psutil.Process(os.getpid()).memory_info().rss / (1024 * 1024) +>>> wiki = load_dataset("wikimedia/wikipedia", "20220301.en", split="train") +>>> mem_after = psutil.Process(os.getpid()).memory_info().rss / (1024 * 1024) + +>>> print(f"RAM memory used: {(mem_after - mem_before)} MB") +RAM memory used: 50 MB +``` + +This is possible because the Arrow data is actually memory-mapped from disk, and not loaded in memory. +Memory-mapping allows access to data on disk, and leverages virtual memory capabilities for fast lookups. + +## Performance + +Iterating over a memory-mapped dataset using Arrow is fast. Iterating over Wikipedia on a laptop gives you speeds of 1-3 Gbit/s: + +```python +>>> s = """batch_size = 1000 +... for batch in wiki.iter(batch_size): +... ... +... """ + +>>> elapsed_time = timeit.timeit(stmt=s, number=1, globals=globals()) +>>> print(f"Time to iterate over the {wiki.dataset_size >> 30} GB dataset: {elapsed_time:.1f} sec, " +... f"ie. {float(wiki.dataset_size >> 27)/elapsed_time:.1f} Gb/s") +Time to iterate over the 18 GB dataset: 31.8 sec, ie. 4.8 Gb/s +``` diff --git a/docs/source/about_cache.mdx b/docs/source/about_cache.mdx new file mode 100644 index 0000000..9e8a561 --- /dev/null +++ b/docs/source/about_cache.mdx @@ -0,0 +1,49 @@ +# The cache + +The cache is one of the reasons why 🤗 Datasets is so efficient. It stores previously downloaded and processed datasets so when you need to use them again, they are reloaded directly from the cache. This avoids having to download a dataset all over again, or reapplying processing functions. Even after you close and start another Python session, 🤗 Datasets will reload your dataset directly from the cache! + +## Fingerprint + +How does the cache keeps track of what transforms are applied to a dataset? Well, 🤗 Datasets assigns a fingerprint to the cache file. A fingerprint keeps track of the current state of a dataset. The initial fingerprint is computed using a hash from the Arrow table, or a hash of the Arrow files if the dataset is on disk. Subsequent fingerprints are computed by combining the fingerprint of the previous state, and a hash of the latest transform applied. + +> [!TIP] +> Transforms are any of the processing methods from the [How-to Process](./process) guides such as [`Dataset.map`] or [`Dataset.shuffle`]. + +Here are what the actual fingerprints look like: + +```py +>>> from datasets import Dataset +>>> dataset1 = Dataset.from_dict({"a": [0, 1, 2]}) +>>> dataset2 = dataset1.map(lambda x: {"a": x["a"] + 1}) +>>> print(dataset1._fingerprint, dataset2._fingerprint) +d19493523d95e2dc 5b86abacd4b42434 +``` + +In order for a transform to be hashable, it needs to be picklable by [dill](https://dill.readthedocs.io/en/latest/) or [pickle](https://docs.python.org/3/library/pickle). + +When you use a non-hashable transform, 🤗 Datasets uses a random fingerprint instead and raises a warning. The non-hashable transform is considered different from the previous transforms. As a result, 🤗 Datasets will recompute all the transforms. Make sure your transforms are serializable with pickle or dill to avoid this! + +An example of when 🤗 Datasets recomputes everything is when caching is disabled. When this happens, the cache files are generated every time and they get written to a temporary directory. Once your Python session ends, the cache files in the temporary directory are deleted. A random hash is assigned to these cache files, instead of a fingerprint. + +> [!TIP] +> When caching is disabled, use [`Dataset.save_to_disk`] to save your transformed dataset or it will be deleted once the session ends. + +## Hashing + +The fingerprint of a dataset is updated by hashing the function passed to `map` as well as the `map` parameters (`batch_size`, `remove_columns`, etc.). + +You can check the hash of any Python object using the [`fingerprint.Hasher`]: + +```py +>>> from datasets.fingerprint import Hasher +>>> my_func = lambda example: {"length": len(example["text"])} +>>> print(Hasher.hash(my_func)) +'3d35e2b3e94c81d6' +``` + +The hash is computed by dumping the object using a `dill` pickler and hashing the dumped bytes. +The pickler recursively dumps all the variables used in your function, so any change you do to an object that is used in your function, will cause the hash to change. + +If one of your functions doesn't seem to have the same hash across sessions, it means at least one of its variables contains a Python object that is not deterministic. +When this happens, feel free to hash any object you find suspicious to try to find the object that caused the hash to change. +For example, if you use a list for which the order of its elements is not deterministic across sessions, then the hash won't be the same across sessions either. diff --git a/docs/source/about_dataset_features.mdx b/docs/source/about_dataset_features.mdx new file mode 100644 index 0000000..e884109 --- /dev/null +++ b/docs/source/about_dataset_features.mdx @@ -0,0 +1,230 @@ +# Dataset features + +[`Features`] defines the internal structure of a dataset. It is used to specify the underlying serialization format. What's more interesting to you though is that [`Features`] contains high-level information about everything from the column names and types, to the [`ClassLabel`]. You can think of [`Features`] as the backbone of a dataset. + +The [`Features`] format is simple: `dict[column_name, column_type]`. It is a dictionary of column name and column type pairs. The column type provides a wide range of options for describing the type of data you have. + +Let's have a look at the features of the MRPC dataset from the GLUE benchmark: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('nyu-mll/glue', 'mrpc', split='train') +>>> dataset.features +{'idx': Value('int32'), + 'label': ClassLabel(names=['not_equivalent', 'equivalent']), + 'sentence1': Value('string'), + 'sentence2': Value('string'), +} +``` + +The [`Value`] feature tells 🤗 Datasets: + +- The `idx` data type is `int32`. +- The `sentence1` and `sentence2` data types are `string`. + +🤗 Datasets supports many other data types such as `bool`, `float32` and `binary` to name just a few. + +> [!TIP] +> Refer to [`Value`] for a full list of supported data types. + +The [`ClassLabel`] feature informs 🤗 Datasets the `label` column contains two classes. The classes are labeled `not_equivalent` and `equivalent`. Labels are stored as integers in the dataset. When you retrieve the labels, [`ClassLabel.int2str`] and [`ClassLabel.str2int`] carries out the conversion from integer value to label name, and vice versa. + +If your data type contains a list of objects, then you want to use the [`List`] feature. Remember the SQuAD dataset? + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('rajpurkar/squad', split='train') +>>> dataset.features +{'id': Value('string'), + 'title': Value('string'), + 'context': Value('string'), + 'question': Value('string'), + 'answers': {'text': List(Value('string')), + 'answer_start': List(Value('int32'))}} +``` + +The `answers` field is constructed using the dict of features because and contains two subfields, `text` and `answer_start`, which are lists of `string` and `int32`, respectively. + +> [!TIP] +> See the [flatten](./process#flatten) section to learn how you can extract the nested subfields as their own independent columns. + +The array feature type is useful for creating arrays of various sizes. You can create arrays with two dimensions using [`Array2D`], and even arrays with five dimensions using [`Array5D`]. + +```py +>>> features = Features({'a': Array2D(shape=(1, 3), dtype='int32')}) +``` + +The array type also allows the first dimension of the array to be dynamic. This is useful for handling sequences with variable lengths such as sentences, without having to pad or truncate the input to a uniform shape. + +```py +>>> features = Features({'a': Array3D(shape=(None, 5, 2), dtype='int32')}) +``` + +## Audio feature + +Audio datasets have a column with type [`Audio`], which contains three important fields: + +- `array`: the decoded audio data represented as a 1-dimensional array. +- `path`: the path to the downloaded audio file. +- `sampling_rate`: the sampling rate of the audio data. + +When you load an audio dataset and call the audio column, the [`Audio`] feature automatically decodes and resamples the audio file: + +```py +>>> from datasets import load_dataset, Audio + +>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train") +>>> dataset[0]["audio"] + +``` + +> [!WARNING] +> Index into an audio dataset using the row index first and then the `audio` column - `dataset[0]["audio"]` - to avoid decoding and resampling all the audio files in the dataset. Otherwise, this can be a slow and time-consuming process if you have a large dataset. + +With `decode=False`, the [`Audio`] type simply gives you the path or the bytes of the audio file, without decoding it into an torchcodec `AudioDecoder` object, + +```py +>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train").cast_column("audio", Audio(decode=False)) +>>> dataset[0] +{'audio': {'bytes': None, + 'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav'}, + 'english_transcription': 'I would like to set up a joint account with my partner', + 'intent_class': 11, + 'lang_id': 4, + 'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav', + 'transcription': 'I would like to set up a joint account with my partner'} +``` + +## Image feature + +Image datasets have a column with type [`Image`], which loads `PIL.Image` objects from images stored as bytes: + +When you load an image dataset and call the image column, the [`Image`] feature automatically decodes the image file: + +```py +>>> from datasets import load_dataset, Image + +>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train") +>>> dataset[0]["image"] + +``` + +> [!WARNING] +> Index into an image dataset using the row index first and then the `image` column - `dataset[0]["image"]` - to avoid decoding all the image files in the dataset. Otherwise, this can be a slow and time-consuming process if you have a large dataset. + +With `decode=False`, the [`Image`] type simply gives you the path or the bytes of the image file, without decoding it into an `PIL.Image`, + +```py +>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train").cast_column("image", Image(decode=False)) +>>> dataset[0]["image"] +{'bytes': None, + 'path': '/Users/username/.cache/huggingface/datasets/downloads/extracted/772e7c1fba622cff102b85dd74bcce46e8168634df4eaade7bedd3b8d91d3cd7/train/healthy/healthy_train.265.jpg'} +``` + +Depending on the dataset, you may get the path to the local downloaded image, or the content of the image as bytes if the dataset is not made of individual files. + +You can also define a dataset of images from numpy arrays: + +```python +>>> ds = Dataset.from_dict({"i": [np.zeros(shape=(16, 16, 3), dtype=np.uint8)]}, features=Features({"i": Image()})) +``` + +And in this case the numpy arrays are encoded into PNG (or TIFF if the pixels values precision is important). + +For multi-channels arrays like RGB or RGBA, only uint8 is supported. If you use a larger precision, you get a warning and the array is downcasted to uint8. +For gray-scale images you can use the integer or float precision you want as long as it is compatible with `Pillow`. A warning is shown if your image integer or float precision is too high, and in this case the array is downcated: an int64 array is downcasted to int32, and a float64 array is downcasted to float32. + +## Mesh feature + +Mesh datasets have a column with type [`Mesh`], which loads 3D mesh files as `trimesh` objects. + +When you load a mesh dataset and call the mesh column, the [`Mesh`] feature automatically decodes the mesh file: + +```py +>>> from datasets import load_dataset, Mesh + +>>> dataset = load_dataset("VINAY-UMRETHE/My-Mesh-Dataset", split="train") +>>> dataset[0]["mesh"] + +``` + +Depending on the file content, `trimesh` may return a `trimesh.Trimesh` object or a `trimesh.Scene` object. + +> [!WARNING] +> Index into a mesh dataset using the row index first and then the `mesh` column - `dataset[0]["mesh"]` - to avoid decoding all the mesh files in the dataset. Otherwise, this can be a slow and time-consuming process if you have a large dataset. + +With `decode=False`, the [`Mesh`] type gives you the path or bytes of the mesh file without decoding it with `trimesh`: + +```py +>>> dataset = load_dataset("VINAY-UMRETHE/My-Mesh-Dataset", split="train").cast_column("mesh", Mesh(decode=False)) +>>> dataset[0]["mesh"] +{'bytes': b'...', + 'path': '00001.glb'} +``` + +The [`Mesh`] feature supports `.glb`, `.ply`, and `.stl` files. For embedded bytes, the stored `path` is used to infer the mesh file type. + +## Json feature + +Datasets are based on Arrow which is a columnar format, and therefore they expect every example to have the same type and subtypes, and dictionaries to have the same keys and values types. +Loading a dataset errors out when fields have mismatching types, and fills missing fields in dictionaries with None so all dictionaries have the same keys and value types. + +To avoid this and allow mixed-types without errors, you can use `on_mixed_types="use_json"` or specify `features=` with a [`Json`] type: + +```python +>>> ds = Dataset.from_dict({"a": [0, "foo", {"subfield": "bar"}]}) +Traceback (most recent call last): + ... + File "pyarrow/error.pxi", line 92, in pyarrow.lib.check_status +pyarrow.lib.ArrowInvalid: Could not convert 'foo' with type str: tried to convert to int64 + +>>> features = Features({"a": Json()}) +>>> ds = Dataset.from_dict({"a": [0, "foo", {"subfield": "bar"}]}, features=features) +>>> ds.features +{'a': Json()} +>>> list(ds["a"]) +[0, "foo", {"subfield": "bar"}] +``` + +This is also useful for lists of dictionaries with arbitrary keys and values, to avoid filling missing fields with None: + +```python +>>> ds = Dataset.from_dict({"a": [[{"b": 0}, {"c": 0}]]}) +>>> ds.features +{'a': List({'b': Value('int64'), 'c': Value('int64')})} +>>> list(ds["a"]) +[[{'b': 0, 'c': None}, {'b': None, 'c': 0}]] # missing fields are filled with None + +>>> features = Features({"a": List(Json())}) +>>> ds = Dataset.from_dict({"a": [[{"b": 0}, {"c": 0}]]}, features=features) +>>> ds.features +{'a': List(Json())} +>>> list(ds["a"]) +[[{'b': 0}, {'c': 0}]] # OK +``` + +Another example with tool calling data and the `on_mixed_types="use_json"` argument (useful to not have to specify `features=` manually): + +```python +>>> messages = [ +... {"role": "user", "content": "Turn on the living room lights and play my electronic music playlist."}, +... {"role": "assistant", "tool_calls": [ +... {"type": "function", "function": { +... "name": "control_light", +... "arguments": {"room": "living room", "state": "on"} +... }}, +... {"type": "function", "function": { +... "name": "play_music", +... "arguments": {"playlist": "electronic"} # mixed-type here since keys ["playlist"] and ["room", "state"] are different +... }}] +... }, +... {"role": "tool", "name": "control_light", "content": "The lights in the living room are now on."}, +... {"role": "tool", "name": "play_music", "content": "The music is now playing."}, +... {"role": "assistant", "content": "Done!"} +... ] +>>> ds = Dataset.from_dict({"messages": [messages]}, on_mixed_types="use_json") +>>> ds.features +{'messages': List({'role': Value('string'), 'content': Value('string'), 'tool_calls': List(Json()), 'name': Value('string')})} +>>> ds[0][1]["tool_calls"][0]["function"]["arguments"] +{"room": "living room", "state": "on"} +``` diff --git a/docs/source/about_dataset_load.mdx b/docs/source/about_dataset_load.mdx new file mode 100644 index 0000000..dac34da --- /dev/null +++ b/docs/source/about_dataset_load.mdx @@ -0,0 +1,104 @@ +# Build and load + +Nearly every deep learning workflow begins with loading a dataset, which makes it one of the most important steps. With 🤗 Datasets, there are more than 900 datasets available to help you get started with your NLP task. All you have to do is call: [`load_dataset`] to take your first step. This function is a true workhorse in every sense because it builds and loads every dataset you use. + +## ELI5: `load_dataset` + +Let's begin with a basic Explain Like I'm Five. + +A dataset is a directory that contains: + +- Some data files in generic formats (JSON, CSV, Parquet, text, etc.) +- A dataset card named `README.md` that contains documentation about the dataset as well as a YAML header to define the datasets tags and configurations + +The [`load_dataset`] function fetches the requested dataset locally or from the Hugging Face Hub. +The Hub is a central repository where all the Hugging Face datasets and models are stored. + +If the dataset only contains data files, then [`load_dataset`] automatically infers how to load the data files from their extensions (json, csv, parquet, tsfile, txt, etc.). +Under the hood, 🤗 Datasets will use an appropriate [`DatasetBuilder`] based on the data files format. There exist one builder per data file format in 🤗 Datasets: + +* [`datasets.packaged_modules.text.Text`] for text +* [`datasets.packaged_modules.csv.Csv`] for CSV and TSV +* [`datasets.packaged_modules.json.Json`] for JSON and JSONL +* [`datasets.packaged_modules.parquet.Parquet`] for Parquet +* [`datasets.packaged_modules.arrow.Arrow`] for Arrow (streaming file format) +* [`datasets.packaged_modules.sql.Sql`] for SQL databases +* [`datasets.packaged_modules.tsfile.TsFile`] for TsFile (time-series data) +* [`datasets.packaged_modules.imagefolder.ImageFolder`] for image folders +* [`datasets.packaged_modules.audiofolder.AudioFolder`] for audio folders + +> [!TIP] +> Read the [Share](./upload_dataset) section to learn more about how to share a dataset. + +🤗 Datasets downloads the dataset files from the original URL, generates the dataset and caches it in an Arrow table on your drive. +If you've downloaded the dataset before, then 🤗 Datasets will reload it from the cache to save you the trouble of downloading it again. + +Now that you have a high-level understanding about how datasets are built, let's take a closer look at the nuts and bolts of how all this works. + +## Building a dataset + +When you load a dataset for the first time, 🤗 Datasets takes the raw data file and builds it into a table of rows and typed columns. There are two main classes responsible for building a dataset: [`BuilderConfig`] and [`DatasetBuilder`]. + + +
+ +
+ +### BuilderConfig[[datasets-builderconfig]] + +[`BuilderConfig`] is the configuration class of [`DatasetBuilder`]. The [`BuilderConfig`] contains the following basic attributes about a dataset: + +| Attribute | Description | +|---------------|--------------------------------------------------------------| +| `name` | Short name of the dataset. | +| `version` | Dataset version identifier. | +| `data_dir` | Stores the path to a local folder containing the data files. | +| `data_files` | Stores paths to local data files. | +| `description` | Description of the dataset. | + +If you want to add additional attributes to your dataset such as the class labels, you can subclass the base [`BuilderConfig`] class. There are two ways to populate the attributes of a [`BuilderConfig`] class or subclass: + +- Provide a list of predefined [`BuilderConfig`] class (or subclass) instances in the datasets [`DatasetBuilder.BUILDER_CONFIGS`] attribute. + +- When you call [`load_dataset`], any keyword arguments that are not specific to the method will be used to set the associated attributes of the [`BuilderConfig`] class. This will override the predefined attributes if a specific configuration was selected. + +You can also set the [`DatasetBuilder.BUILDER_CONFIG_CLASS`] to any custom subclass of [`BuilderConfig`]. + +### DatasetBuilder[[datasets-datasetbuilder]] + +[`DatasetBuilder`] accesses all the attributes inside [`BuilderConfig`] to build the actual dataset. + +
+ +
+ +There are three main methods in [`DatasetBuilder`]: + +1. [`DatasetBuilder._info`] is in charge of defining the dataset attributes. When you call `dataset.info`, 🤗 Datasets returns the information stored here. Likewise, the [`Features`] are also specified here. Remember, the [`Features`] are like the skeleton of the dataset. It provides the names and types of each column. + +2. [`DatasetBuilder._split_generator`] downloads or retrieves the requested data files, organizes them into splits, and defines specific arguments for the generation process. This method has a [`DownloadManager`] that downloads files or fetches them from your local filesystem. Within the [`DownloadManager`], there is a [`DownloadManager.download_and_extract`] method that accepts a dictionary of URLs to the original data files, and downloads the requested files. Accepted inputs include: a single URL or path, or a list/dictionary of URLs or paths. Any compressed file types like TAR, GZIP and ZIP archives will be automatically extracted. + + Once the files are downloaded, [`SplitGenerator`] organizes them into splits. The [`SplitGenerator`] contains the name of the split, and any keyword arguments that are provided to the [`DatasetBuilder._generate_examples`] method. The keyword arguments can be specific to each split, and typically comprise at least the local path to the data files for each split. + +3. [`DatasetBuilder._generate_examples`] reads and parses the data files for a split. Then it yields dataset examples according to the format specified in the `features` from [`DatasetBuilder._info`]. The input of [`DatasetBuilder._generate_examples`] is actually the `filepath` provided in the keyword arguments of the last method. + + The dataset is generated with a Python generator, which doesn't load all the data in memory. As a result, the generator can handle large datasets. However, before the generated samples are flushed to the dataset file on disk, they are stored in an `ArrowWriter` buffer. This means the generated samples are written by batch. If your dataset samples consumes a lot of memory (images or videos), then make sure to specify a low value for the `DEFAULT_WRITER_BATCH_SIZE` attribute in [`DatasetBuilder`]. We recommend not exceeding a size of 200 MB. + +## Maintaining integrity + +To ensure a dataset is complete, [`load_dataset`] will perform a series of tests on the downloaded files to make sure everything is there. This way, you don't encounter any surprises when your requested dataset doesn't get generated as expected. [`load_dataset`] verifies: + +- The number of splits in the generated `DatasetDict`. +- The number of samples in each split of the generated `DatasetDict`. +- The list of downloaded files. +- The SHA256 checksums of the downloaded files (disabled by default). + +If the dataset doesn't pass the verifications, it is likely that the dataset author made some changes in the data files. + +In this case, an error is raised to alert that the dataset has changed. +To ignore the error, one needs to specify `verification_mode="no_checks"` in [`load_dataset`]. +Anytime you see a verification error, feel free to open a discussion or pull request in the corresponding dataset "Community" tab, so that the integrity checks for that dataset are updated. + +## Security + +The dataset repositories on the Hub are scanned for malware, see more information [here](https://huggingface.co/docs/hub/security#malware-scanning). diff --git a/docs/source/about_map_batch.mdx b/docs/source/about_map_batch.mdx new file mode 100644 index 0000000..6c33fed --- /dev/null +++ b/docs/source/about_map_batch.mdx @@ -0,0 +1,59 @@ +# Batch mapping + +Combining the utility of [`Dataset.map`] with batch mode is very powerful. It allows you to speed up processing, and freely control the size of the generated dataset. + +## Need for speed + +The primary objective of batch mapping is to speed up processing. Often times, it is faster to work with batches of data instead of single examples. Naturally, batch mapping lends itself to tokenization. For example, the 🤗 [Tokenizers](https://huggingface.co/docs/tokenizers/python/latest/) library works faster with batches because it parallelizes the tokenization of all the examples in a batch. + +## Input size != output size + +The ability to control the size of the generated dataset can be leveraged for many interesting use-cases. In the How-to [map](#map) section, there are examples of using batch mapping to: + +- Split long sentences into shorter chunks. +- Augment a dataset with additional tokens. + +It is helpful to understand how this works, so you can come up with your own ways to use batch mapping. At this point, you may be wondering how you can control the size of the generated dataset. The answer is: **the mapped function does not have to return an output batch of the same size**. + +In other words, your mapped function input can be a batch of size `N` and return a batch of size `M`. The output `M` can be greater than or less than `N`. This means you can concatenate your examples, divide it up, and even add more examples! + +However, remember that all values in the output dictionary must contain the **same number of elements** as the other fields in the output dictionary. Otherwise, it is not possible to define the number of examples in the output returned by the mapped function. The number can vary between successive batches processed by the mapped function. For a single batch though, all values of the output dictionary should have the same length (i.e., the number of elements). + +For example, from a dataset of 1 column and 3 rows, if you use `map` to return a new column with twice as many rows, then you will have an error. +In this case, you end up with one column with 3 rows, and one column with 6 rows. As you can see, the table will not be valid: + +```py +>>> from datasets import Dataset +>>> dataset = Dataset.from_dict({"a": [0, 1, 2]}) +>>> dataset.map(lambda batch: {"b": batch["a"] * 2}, batched=True) # new column with 6 elements: [0, 1, 2, 0, 1, 2] +'ArrowInvalid: Column 1 named b expected length 3 but got length 6' +``` + +To make it valid, you have to drop one of the columns: + +```py +>>> from datasets import Dataset +>>> dataset = Dataset.from_dict({"a": [0, 1, 2]}) +>>> dataset_with_duplicates = dataset.map(lambda batch: {"b": batch["a"] * 2}, remove_columns=["a"], batched=True) +>>> len(dataset_with_duplicates) +6 +``` +Alternatively, you can overwrite the existing column to achieve the same result. +For example, here’s how to duplicate every row in the dataset by overwriting column `"a"`: + +```py +>>> from datasets import Dataset +>>> dataset = Dataset.from_dict({"a": [0, 1, 2]}) +# overwrites the existing "a" column with duplicated values +>>> duplicated_dataset = dataset.map( +... lambda batch: {"a": [x for x in batch["a"] for _ in range(2)]}, +... batched=True +... ) +>>> duplicated_dataset +Dataset({ + features: ['a'], + num_rows: 6 +}) +>>> duplicated_dataset["a"] +[0, 0, 1, 1, 2, 2] +``` diff --git a/docs/source/about_mapstyle_vs_iterable.mdx b/docs/source/about_mapstyle_vs_iterable.mdx new file mode 100644 index 0000000..e87a2db --- /dev/null +++ b/docs/source/about_mapstyle_vs_iterable.mdx @@ -0,0 +1,250 @@ +# Differences between Dataset and IterableDataset + +There are two types of dataset objects, a [`Dataset`] and an [`IterableDataset`]. +Whichever type of dataset you choose to use or create depends on the size of the dataset. +In general, an [`IterableDataset`] is ideal for big datasets (think hundreds of GBs!) due to its lazy behavior and speed advantages, while a [`Dataset`] is great for everything else. +This page will compare the differences between a [`Dataset`] and an [`IterableDataset`] to help you pick the right dataset object for you. + +## Downloading and streaming + +When you have a regular [`Dataset`], you can access it using `my_dataset[0]`. This provides random access to the rows. +Such datasets are also called "map-style" datasets. +For example you can download ImageNet-1k like this and access any row: + +```python +from datasets import load_dataset + +imagenet = load_dataset("timm/imagenet-1k-wds", split="train") # downloads the full dataset +print(imagenet[0]) +``` + +But one caveat is that you must have the entire dataset stored on your disk or in memory, which blocks you from accessing datasets bigger than the disk. +Because it can become inconvenient for big datasets, there exists another type of dataset, the [`IterableDataset`]. +When you have an `IterableDataset`, you can access it using a `for` loop to load the data progressively as you iterate over the dataset. +This way, only a small fraction of examples is loaded in memory, and you don't write anything on disk. + +For example, you can stream the ImageNet-1k dataset without downloading it on disk: + +```python +from datasets import load_dataset + +imagenet = load_dataset("timm/imagenet-1k-wds", split="train", streaming=True) # will start loading the data when iterated over +for example in imagenet: + print(example) + break +``` + +Streaming can read online data without writing any file to disk. +For example, you can stream datasets made out of multiple shards, each of which is hundreds of gigabytes like [C4](https://huggingface.co/datasets/c4) or [LAION-2B](https://huggingface.co/datasets/laion/laion2B-en). +Learn more about how to stream a dataset in the [Dataset Streaming Guide](./stream). + +This is not the only difference though, because the "lazy" behavior of an `IterableDataset` is also present when it comes to dataset creation and processing. + +## Creating map-style datasets and iterable datasets + +You can create a [`Dataset`] using lists or dictionaries, and the data is entirely converted to Arrow so you can easily access any row: +```python +my_dataset = Dataset.from_dict({"col_1": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}) +print(my_dataset[0]) +``` + +To create an `IterableDataset` on the other hand, you must provide a "lazy" way to load the data. +In Python, we generally use generator functions. These functions `yield` one example at a time, which means you can't access a row by slicing it like a regular `Dataset`: +```python +def my_generator(n): + for i in range(n): + yield {"col_1": i} + +my_iterable_dataset = IterableDataset.from_generator(my_generator, gen_kwargs={"n": 10}) +for example in my_iterable_dataset: + print(example) + break +``` + +## Loading local files entirely and progressively + +It is possible to convert local or remote data files to an Arrow [`Dataset`] using [`load_dataset`]: +```python +data_files = {"train": ["path/to/data.csv"]} +my_dataset = load_dataset("csv", data_files=data_files, split="train") +print(my_dataset[0]) +``` + +However, this requires a conversion step from CSV to Arrow format, which takes time and disk space if your dataset is big. + +To save disk space and skip the conversion step, you can define an `IterableDataset` by streaming from the local files directly. +This way, the data is read progressively from the local files as you iterate over the dataset: + +```python +data_files = {"train": ["path/to/data.csv"]} +my_iterable_dataset = load_dataset("csv", data_files=data_files, split="train", streaming=True) +for example in my_iterable_dataset: # this reads the CSV file progressively as you iterate over the dataset + print(example) + break +``` + +Many file formats are supported, like CSV, JSONL, and Parquet, as well as image and audio files. +You can find more information in the corresponding guides for loading [tabular](./tabular_load), [text](./nlp_load), [vision](./image_load), and [audio](./audio_load]) datasets. + +## Eager data processing and lazy data processing + +When you process a [`Dataset`] object using [`Dataset.map`], the entire dataset is processed immediately and returned. +This is similar to how `pandas` works for example. + +```python +my_dataset = my_dataset.map(process_fn) # process_fn is applied on all the examples of the dataset +print(my_dataset[0]) +``` + +On the other hand, due to the "lazy" nature of an `IterableDataset`, calling [`IterableDataset.map`] does not apply your `map` function over the full dataset. +Instead, your `map` function is applied on-the-fly. + +Because of that, you can chain multiple processing steps and they will all run at once when you start iterating over the dataset: + +```python +my_iterable_dataset = my_iterable_dataset.map(process_fn_1) +my_iterable_dataset = my_iterable_dataset.filter(filter_fn) +my_iterable_dataset = my_iterable_dataset.map(process_fn_2) + +# process_fn_1, filter_fn and process_fn_2 are applied on-the-fly when iterating over the dataset +for example in my_iterable_dataset: + print(example) + break +``` + +## Exact and fast approximate shuffling + +When you shuffle a [`Dataset`] using [`Dataset.shuffle`], you apply an exact shuffling of the dataset. +It works by taking a list of indices `[0, 1, 2, ... len(my_dataset) - 1]` and shuffling this list. +Then, accessing `my_dataset[0]` returns the row and index defined by the first element of the indices mapping that has been shuffled: +```python +my_dataset = my_dataset.shuffle(seed=42) +print(my_dataset[0]) +``` + +Since we don't have random access to the rows in the case of an `IterableDataset`, we can't use a shuffled list of indices and access a row at an arbitrary position. +This prevents the use of exact shuffling. +Instead, a fast approximate shuffling is used in [`IterableDataset.shuffle`]. +It uses a shuffle buffer to sample random examples iteratively from the dataset. +Since the dataset is still read iteratively, it provides excellent speed performance: +```python +my_iterable_dataset = my_iterable_dataset.shuffle(seed=42, buffer_size=100) +for example in my_iterable_dataset: + print(example) + break +``` + +But using a shuffle buffer is not enough to provide a satisfactory shuffling for machine learning model training. So [`IterableDataset.shuffle`] also shuffles the dataset shards if your dataset is made of multiple files or sources. Additionally, it fills the buffer using up to `max_buffer_input_shards` shards at a time (default is 10), which greatly improves the quality of the shuffling: + +```python +# Stream from the internet +my_iterable_dataset = load_dataset("deepmind/code_contests", split="train", streaming=True) +my_iterable_dataset.num_shards # 39 + +# Stream from local files +data_files = {"train": [f"path/to/data_{i}.csv" for i in range(1024)]} +my_iterable_dataset = load_dataset("csv", data_files=data_files, split="train", streaming=True) +my_iterable_dataset.num_shards # 1024 + +# From a generator function +def my_generator(n, sources): + for source in sources: + for example_id_for_current_source in range(n): + yield {"example_id": f"{source}_{example_id_for_current_source}"} + +gen_kwargs = {"n": 10, "sources": [f"path/to/data_{i}" for i in range(1024)]} +my_iterable_dataset = IterableDataset.from_generator(my_generator, gen_kwargs=gen_kwargs) +my_iterable_dataset.num_shards # 1024 +``` + +> [!TIP] +> +> If your dataset has few files, you can improve shuffling quality by calling [`~IterableDataset.reshard`] before shuffling. For example, for Parquet datasets this reshards using row groups instead of having one file per shard, giving you many more shards to shuffle from. + +## Speed differences + +Regular [`Dataset`] objects are based on Arrow which provides fast random access to the rows. +Thanks to memory mapping and the fact that Arrow is an in-memory format, reading data from disk doesn't do expensive system calls and deserialization. +It provides even faster data loading when iterating using a `for` loop by iterating on contiguous Arrow record batches. + +However as soon as your [`Dataset`] has an indices mapping (via [`Dataset.shuffle`] for example), the speed can become 10x slower. +This is because there is an extra step to get the row index to read using the indices mapping, and most importantly, you aren't reading contiguous chunks of data anymore. +To restore the speed, you'd need to rewrite the entire dataset on your disk again using [`Dataset.flatten_indices`], which removes the indices mapping. +This may take a lot of time depending on the size of your dataset though: + +```python +my_dataset[0] # fast +my_dataset = my_dataset.shuffle(seed=42) +my_dataset[0] # up to 10x slower +my_dataset = my_dataset.flatten_indices() # rewrite the shuffled dataset on disk as contiguous chunks of data +my_dataset[0] # fast again +``` + + +In this case, we recommend switching to an [`IterableDataset`] and leveraging its fast approximate shuffling method [`IterableDataset.shuffle`]. +It only shuffles the shards order and adds a shuffle buffer to your dataset, which keeps the speed of your dataset optimal. +You can also reshuffle the dataset easily: + +```python +for example in enumerate(my_iterable_dataset): # fast + pass + +shuffled_iterable_dataset = my_iterable_dataset.shuffle(seed=42, buffer_size=100) + +for example in enumerate(shuffled_iterable_dataset): # as fast as before + pass + +shuffled_iterable_dataset = my_iterable_dataset.shuffle(seed=1337, buffer_size=100) # reshuffling using another seed is instantaneous + +for example in enumerate(shuffled_iterable_dataset): # still as fast as before + pass +``` + +If you're using your dataset on multiple epochs, the effective seed to shuffle the shards order in the shuffle buffer is `seed + epoch`. +It makes it easy to reshuffle a dataset between epochs: +```python +for epoch in range(n_epochs): + my_iterable_dataset.set_epoch(epoch) + for example in my_iterable_dataset: # fast + reshuffled at each epoch using `effective_seed = seed + epoch` + pass +``` + +To restart the iteration of a map-style dataset, you can simply skip the first examples: + +```python +my_dataset = my_dataset.select(range(start_index, len(dataset))) +``` + +But if you use a `DataLoader` with a `Sampler`, you should instead save the state of your sampler (you might have written a custom sampler that allows resuming). + +On the other hand, iterable datasets don't provide random access to a specific example index to resume from. But you can use [`IterableDataset.state_dict`] and [`IterableDataset.load_state_dict`] to resume from a checkpoint instead, similarly to what you can do for models and optimizers: + +```python +>>> iterable_dataset = Dataset.from_dict({"a": range(6)}).to_iterable_dataset(num_shards=3) +>>> # save in the middle of training +>>> state_dict = iterable_dataset.state_dict() +>>> # and resume later +>>> iterable_dataset.load_state_dict(state_dict) +``` + +Under the hood, the iterable dataset keeps track of the current shard being read and the example index in the current shard and it stores this info in the `state_dict`. + +To resume from a checkpoint, the dataset skips all the shards that were previously read to restart from the current shard. +Then it reads the shard and skips examples until it reaches the exact example from the checkpoint. + +Therefore restarting a dataset is quite fast, since it will not re-read the shards that have already been iterated on. Still, resuming a dataset is generally not instantaneous since it has to restart reading from the beginning of the current shard and skip examples until it reaches the checkpoint location. + +This can be used with the `StatefulDataLoader` from `torchdata`, see [streaming with a PyTorch DataLoader](./use_with_pytorch#stream-data). + +## Switch from map-style to iterable + +If you want to benefit from the "lazy" behavior of an [`IterableDataset`] or their speed advantages, you can switch your map-style [`Dataset`] to an [`IterableDataset`]: +```python +my_iterable_dataset = my_dataset.to_iterable_dataset() +``` + +If you want to shuffle your dataset or [use it with a PyTorch DataLoader](./use_with_pytorch#stream-data), we recommend generating a sharded [`IterableDataset`]: +```python +my_iterable_dataset = my_dataset.to_iterable_dataset(num_shards=1024) +my_iterable_dataset.num_shards # 1024 +``` diff --git a/docs/source/access.mdx b/docs/source/access.mdx new file mode 100644 index 0000000..33a1999 --- /dev/null +++ b/docs/source/access.mdx @@ -0,0 +1,163 @@ +# Know your dataset + +There are two types of dataset objects, a regular [`Dataset`] and then an ✨ [`IterableDataset`] ✨. A [`Dataset`] provides fast random access to the rows, and memory-mapping so that loading even large datasets only uses a relatively small amount of device memory. But for really, really big datasets that won't even fit on disk or in memory, an [`IterableDataset`] allows you to access and use the dataset without waiting for it to download completely! + +This tutorial will show you how to load and access a [`Dataset`] and an [`IterableDataset`]. + +## Dataset + +When you load a dataset split, you'll get a [`Dataset`] object. You can do many things with a [`Dataset`] object, which is why it's important to learn how to manipulate and interact with the data stored inside. + +This tutorial uses the [rotten_tomatoes](https://huggingface.co/datasets/rotten_tomatoes) dataset, but feel free to load any dataset you'd like and follow along! + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train") +``` + +### Indexing + +A [`Dataset`] contains columns of data, and each column can be a different type of data. The *index*, or axis label, is used to access examples from the dataset. For example, indexing by the row returns a dictionary of an example from the dataset: + +```py +# Get the first row in the dataset +>>> dataset[0] +{'label': 1, + 'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'} +``` + +Use the `-` operator to start from the end of the dataset: + +```py +# Get the last row in the dataset +>>> dataset[-1] +{'label': 0, + 'text': 'things really get weird , though not particularly scary : the movie is all portent and no content .'} +``` + +Indexing by the column name returns a list of all the values in the column: + +```py +>>> dataset["text"] +['the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .', + 'the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .', + 'effective but too-tepid biopic', + ..., + 'things really get weird , though not particularly scary : the movie is all portent and no content .'] +``` + +You can combine row and column name indexing to return a specific value at a position: + +```py +>>> dataset[0]["text"] +'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .' +``` + +Indexing order doesn't matter. Indexing by the column name first returns a [`Column`] object that you can index as usual with row indices: + +```py +>>> import time + +>>> start_time = time.time() +>>> text = dataset[0]["text"] +>>> end_time = time.time() +>>> print(f"Elapsed time: {end_time - start_time:.4f} seconds") +Elapsed time: 0.0031 seconds + +>>> start_time = time.time() +>>> text = dataset["text"][0] +>>> end_time = time.time() +>>> print(f"Elapsed time: {end_time - start_time:.4f} seconds") +Elapsed time: 0.0042 seconds +``` + +### Slicing + +Slicing returns a slice - or subset - of the dataset, which is useful for viewing several rows at once. To slice a dataset, use the `:` operator to specify a range of positions. + +```py +# Get the first three rows +>>> dataset[:3] +{'label': [1, 1, 1], + 'text': ['the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .', + 'the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .', + 'effective but too-tepid biopic']} + +# Get rows between three and six +>>> dataset[3:6] +{'label': [1, 1, 1], + 'text': ['if you sometimes like to go to the movies to have fun , wasabi is a good place to start .', + "emerges as something rare , an issue movie that's so honest and keenly observed that it doesn't feel like one .", + 'the film provides some great insight into the neurotic mindset of all comics -- even those who have reached the absolute top of the game .']} +``` + +## IterableDataset + +An [`IterableDataset`] is loaded when you set the `streaming` parameter to `True` in [`~datasets.load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> iterable_dataset = load_dataset("ethz/food101", split="train", streaming=True) +>>> for example in iterable_dataset: +... print(example) +... break +{'image': , 'label': 6} +``` + +You can also create an [`IterableDataset`] from an *existing* [`Dataset`], but it is faster than streaming mode because the dataset is streamed from local files: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train") +>>> iterable_dataset = dataset.to_iterable_dataset() +``` + +An [`IterableDataset`] progressively iterates over a dataset one example at a time, so you don't have to wait for the whole dataset to download before you can use it. As you can imagine, this is quite useful for large datasets you want to use immediately! + +### Indexing + +An [`IterableDataset`]'s behavior is different from a regular [`Dataset`]. You don't get random access to examples in an [`IterableDataset`]. Instead, you should iterate over its elements, for example, by calling `next(iter())` or with a `for` loop to return the next item from the [`IterableDataset`]: + +```py +>>> next(iter(iterable_dataset)) +{'image': , + 'label': 6} + +>>> for example in iterable_dataset: +... print(example) +... break +{'image': , 'label': 6} +``` + +But an [`IterableDataset`] supports column indexing that returns an iterable for the column values: + +```py +>>> next(iter(iterable_dataset["label"])) +6 +``` + +### Creating a subset + +You can return a subset of the dataset with a specific number of examples in it with [`IterableDataset.take`]: + +```py +# Get first three examples +>>> list(iterable_dataset.take(3)) +[{'image': , + 'label': 6}, + {'image': , + 'label': 6}, + {'image': , + 'label': 6}] +``` + +But unlike [slicing](access/#slicing), [`IterableDataset.take`] creates a new [`IterableDataset`]. + +## Next steps + +Interested in learning more about the differences between these two types of datasets? Learn more about them in the [Differences between `Dataset` and `IterableDataset`](about_mapstyle_vs_iterable) conceptual guide. + +To get more hands-on with these datasets types, check out the [Process](process) guide to learn how to preprocess a [`Dataset`] or the [Stream](stream) guide to learn how to preprocess an [`IterableDataset`]. diff --git a/docs/source/audio_dataset.mdx b/docs/source/audio_dataset.mdx new file mode 100644 index 0000000..5a29a27 --- /dev/null +++ b/docs/source/audio_dataset.mdx @@ -0,0 +1,192 @@ +# Create an audio dataset + +You can share a dataset with your team or with anyone in the community by creating a dataset repository on the Hugging Face Hub: + +```py +from datasets import load_dataset + +dataset = load_dataset("/my_dataset") +``` + +There are several methods for creating and sharing an audio dataset: + +- Create an audio dataset from local files in python with [`Dataset.push_to_hub`]. This is an easy way that requires only a few steps in python. + +- Create an audio dataset repository with the `AudioFolder` builder. This is a no-code solution for quickly creating an audio dataset with several thousand audio files. + +> [!TIP] +> You can control access to your dataset by requiring users to share their contact information first. Check out the [Gated datasets](https://huggingface.co/docs/hub/datasets-gated) guide for more information about how to enable this feature on the Hub. + +## Local files + +You can load your own dataset using the paths to your audio files. Use the [`~Dataset.cast_column`] function to take a column of audio file paths, and cast it to the [`Audio`] feature: + +```py +>>> audio_dataset = Dataset.from_dict({"audio": ["path/to/audio_1", "path/to/audio_2", ..., "path/to/audio_n"]}).cast_column("audio", Audio()) +>>> audio_dataset[0]["audio"] + +``` + +Then upload the dataset to the Hugging Face Hub using [`Dataset.push_to_hub`]: + +```py +audio_dataset.push_to_hub("/my_dataset") +``` + +This will create a dataset repository containing your audio dataset: + +``` +my_dataset/ +├── README.md +└── data/ + └── train-00000-of-00001.parquet +``` + +## AudioFolder + +The `AudioFolder` is a dataset builder designed to quickly load an audio dataset with several thousand audio files without requiring you to write any code. + +> [!TIP] +> 💡 Take a look at the [Split pattern hierarchy](repository_structure#split-pattern-hierarchy) to learn more about how `AudioFolder` creates dataset splits based on your dataset repository structure. + +`AudioFolder` automatically infers the class labels of your dataset based on the directory name. Store your dataset in a directory structure like: + +``` +folder/train/dog/golden_retriever.mp3 +folder/train/dog/german_shepherd.mp3 +folder/train/dog/chihuahua.mp3 + +folder/train/cat/maine_coon.mp3 +folder/train/cat/bengal.mp3 +folder/train/cat/birman.mp3 +``` + +If the dataset follows the `AudioFolder` structure, then you can load it directly with [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("username/dataset_name") +``` + +This is equivalent to passing `audiofolder` manually in [`load_dataset`] and the directory in `data_dir`: + +```py +>>> dataset = load_dataset("audiofolder", data_dir="/path/to/folder") +``` + +You can also use `audiofolder` to load datasets involving multiple splits. To do so, your dataset directory should have the following structure: + +``` +folder/train/dog/golden_retriever.mp3 +folder/train/cat/maine_coon.mp3 +folder/test/dog/german_shepherd.mp3 +folder/test/cat/bengal.mp3 +``` + +> [!WARNING] +> If all audio files are contained in a single directory or if they are not on the same level of directory structure, `label` column won't be added automatically. If you need it, set `drop_labels=False` explicitly. + +If there is additional information you'd like to include about your dataset, like text captions or bounding boxes, add it as a `metadata.csv` file in your folder. This lets you quickly create datasets for different computer vision tasks like text captioning or object detection. You can also use a JSONL file `metadata.jsonl` or a Parquet file `metadata.parquet`. + +``` +folder/train/metadata.csv +folder/train/0001.mp3 +folder/train/0002.mp3 +folder/train/0003.mp3 +``` + +You can also zip your audio files, and in this case each zip should contain both the audio files and the metadata + +``` +folder/train.zip +folder/test.zip +folder/validation.zip +``` + +Your `metadata.csv` file must have a `file_name` or `*_file_name` field which links audio files with their metadata: + +```csv +file_name,additional_feature +0001.mp3,This is a first value of a text feature you added to your audio files +0002.mp3,This is a second value of a text feature you added to your audio files +0003.mp3,This is a third value of a text feature you added to your audio files +``` + +or using `metadata.jsonl`: + +```jsonl +{"file_name": "0001.mp3", "additional_feature": "This is a first value of a text feature you added to your audio files"} +{"file_name": "0002.mp3", "additional_feature": "This is a second value of a text feature you added to your audio files"} +{"file_name": "0003.mp3", "additional_feature": "This is a third value of a text feature you added to your audio files"} +``` + +Here the `file_name` must be the name of the audio file next to the metadata file. More generally, it must be the relative path from the directory containing the metadata to the audio file. + +It's possible to point to more than one audio in each row in your dataset, for example if both your input and output are audio files: + +```jsonl +{"input_file_name": "0001.mp3", "output_file_name": "0001_output.mp3"} +{"input_file_name": "0002.mp3", "output_file_name": "0002_output.mp3"} +{"input_file_name": "0003.mp3", "output_file_name": "0003_output.mp3"} +``` + +You can also define lists of audio files. In that case you need to name the field `file_names` or `*_file_names`. Here is an example: + +```jsonl +{"recordings_file_names": ["0001_r0.mp3", "0001_r1.mp3"], label: "same_person"} +{"recordings_file_names": ["0002_r0.mp3", "0002_r1.mp3"], label: "same_person"} +{"recordings_file_names": ["0003_r0.mp3", "0003_r1.mp3"], label: "different_person"} +``` + +## WebDataset + +The [WebDataset](https://github.com/webdataset/webdataset) format is based on TAR archives and is suitable for big audio datasets. +Indeed you can group your audio files in TAR archives (e.g. 1GB of audio files per TAR archive) and have thousands of TAR archives: + +``` +folder/train/00000.tar +folder/train/00001.tar +folder/train/00002.tar +... +``` + +In the archives, each example is made of files sharing the same prefix: + +``` +e39871fd9fd74f55.mp3 +e39871fd9fd74f55.json +f18b91585c4d3f3e.mp3 +f18b91585c4d3f3e.json +ede6e66b2fb59aab.mp3 +ede6e66b2fb59aab.json +ed600d57fcee4f94.mp3 +ed600d57fcee4f94.json +... +``` + +You can put your audio files labels/captions/bounding boxes using JSON or text files for example. + +Load your WebDataset and it will create on column per file suffix (here "mp3" and "json"): + +```python +>>> from datasets import load_dataset + +>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", split="train") +>>> dataset[0]["json"] +{"transcript": "Hello there !", "speaker": "Obi-Wan Kenobi"} +``` + +It's also possible to have several audio files per example like this: + +``` +e39871fd9fd74f55.input.mp3 +e39871fd9fd74f55.output.mp3 +e39871fd9fd74f55.json +f18b91585c4d3f3e.input.mp3 +f18b91585c4d3f3e.output.mp3 +f18b91585c4d3f3e.json +... +``` + +For more details on the WebDataset format and the python library, please check the [WebDataset documentation](https://webdataset.github.io/webdataset). diff --git a/docs/source/audio_load.mdx b/docs/source/audio_load.mdx new file mode 100644 index 0000000..1d81554 --- /dev/null +++ b/docs/source/audio_load.mdx @@ -0,0 +1,115 @@ +# Load audio data + +You can load an audio dataset using the [`Audio`] feature that automatically decodes and resamples the audio files when you access the examples. +Audio decoding is based on the [`torchcodec`](https://github.com/pytorch/torchcodec) python package, which uses the [`FFmpeg`](https://www.ffmpeg.org/) C library under the hood. + +## Installation + +To work with audio datasets, you need to have the `audio` dependencies installed. +Check out the [installation](./installation#audio) guide to learn how to install it. + +## Local files + +You can load your own dataset using the paths to your audio files. Use the [`~Dataset.cast_column`] function to take a column of audio file paths, and cast it to the [`Audio`] feature: + +```py +>>> audio_dataset = Dataset.from_dict({"audio": ["path/to/audio_1", "path/to/audio_2", ..., "path/to/audio_n"]}).cast_column("audio", Audio()) +>>> audio_dataset[0]["audio"] + +``` + +## AudioFolder + +You can also load a dataset with an `AudioFolder` dataset builder. It does not require writing a custom dataloader, making it useful for quickly creating and loading audio datasets with several thousand audio files. + +## AudioFolder with metadata + +To link your audio files with metadata information, make sure your dataset has a `metadata.csv` file. Your dataset structure might look like: + +``` +folder/train/metadata.csv +folder/train/first_audio_file.mp3 +folder/train/second_audio_file.mp3 +folder/train/third_audio_file.mp3 +``` + +Your `metadata.csv` file must have a `file_name` column which links audio files with their metadata. An example `metadata.csv` file might look like: + +```text +file_name,transcription +first_audio_file.mp3,znowu się duch z ciałem zrośnie w młodocianej wstaniesz wiosnie i możesz skutkiem tych leków umierać wstawać wiek wieków dalej tam były przestrogi jak siekać głowę jak nogi +second_audio_file.mp3,już u źwierzyńca podwojów król zasiada przy nim książęta i panowie rada a gdzie wzniosły krążył ganek rycerze obok kochanek król skinął palcem zaczęto igrzysko +third_audio_file.mp3,pewnie kędyś w obłędzie ubite minęły szlaki zaczekajmy dzień jaki poślemy szukać wszędzie dziś jutro pewnie będzie posłali wszędzie sługi czekali dzień i drugi gdy nic nie doczekali z płaczem chcą jechać dali +``` + +`AudioFolder` will load audio data and create a `transcription` column containing texts from `metadata.csv`: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("username/dataset_name") +>>> # OR locally: +>>> dataset = load_dataset("/path/to/folder") +``` + +For local datasets, this is equivalent to passing `audiofolder` manually in [`load_dataset`] and the directory in `data_dir`: + +```py +>>> dataset = load_dataset("audiofolder", data_dir="/path/to/folder") +``` + +Metadata can also be specified as JSON Lines, in which case use `metadata.jsonl` as the name of the metadata file. This format is helpful in scenarios when one of the columns is complex, e.g. a list of floats, to avoid parsing errors or reading the complex values as strings. + +To ignore the information in the metadata file, set `drop_metadata=True` in [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True) +``` + +If you don't have a metadata file, `AudioFolder` automatically infers the label name from the directory name. +If you want to drop automatically created labels, set `drop_labels=True`. +In this case, your dataset will only contain an audio column: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True) +``` + +Finally the `filters` argument lets you load only a subset of the dataset, based on a condition on the label or the metadata. This is especially useful if the metadata is in Parquet format, since this format enables fast filtering. It is also recommended to use this argument with `streaming=True`, because by default the dataset is fully downloaded before filtering. + +```python +>>> filters = [("label", "=", 0)] +>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters) +``` + +> [!TIP] +> For more information about creating your own `AudioFolder` dataset, take a look at the [Create an audio dataset](./audio_dataset) guide. + +For a guide on how to load any type of dataset, take a look at the general loading guide. + +## Audio decoding + +By default, audio files are decoded sequentially as torchcodec [`AudioDecoder`](https://docs.pytorch.org/torchcodec/stable/generated/torchcodec.decoders.AudioDecoder.html#torchcodec.decoders.AudioDecoder) objects when you iterate on a dataset. +However it is possible to speed up the dataset significantly using multithreaded decoding: + +```python +>>> import os +>>> num_threads = num_threads = min(32, (os.cpu_count() or 1) + 4) +>>> dataset = dataset.decode(num_threads=num_threads) +>>> for example in dataset: # up to 20 times faster ! +... ... +``` + +You can enable multithreading using `num_threads`. This is especially useful to speed up remote data streaming. +However it can be slower than `num_threads=0` for local data on fast disks. + +If you are not interested in the images decoded as NumPy arrays and would like to access the path/bytes instead, you can disable decoding: + +```python +>>> dataset = dataset.decode(False) +``` + +Note: [`IterableDataset.decode`] is only available for streaming datasets at the moment. diff --git a/docs/source/audio_process.mdx b/docs/source/audio_process.mdx new file mode 100644 index 0000000..e822da6 --- /dev/null +++ b/docs/source/audio_process.mdx @@ -0,0 +1,81 @@ +# Process audio data + +This guide shows specific methods for processing audio datasets. Learn how to: + +- Resample the sampling rate. +- Use [`~Dataset.map`] with audio datasets. + +For a guide on how to process any type of dataset, take a look at the general process guide. + +## Cast + +The [`~Dataset.cast_column`] function is used to cast a column to another feature to be decoded. When you use this function with the [`Audio`] feature, you can resample the sampling rate: + +```py +>>> from datasets import load_dataset, Audio + +>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train") +>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16000)) +``` + +Audio files are decoded and resampled on-the-fly, so the next time you access an example, the audio file is resampled to 16kHz: + +```py +>>> audio = dataset[0]["audio"] + +>>> audio = audio_dataset[0]["audio"] +>>> samples = audio.get_all_samples() +>>> samples.data +tensor([[ 0.0000e+00, 0.0000e+00, 0.0000e+00, ..., 2.3447e-06, + -1.9127e-04, -5.3330e-05]] +>>> samples.sample_rate +16000 +``` + +
+ + +
+ +## Map + +The [`~Dataset.map`] function helps preprocess your entire dataset at once. Depending on the type of model you're working with, you'll need to either load a [feature extractor](https://huggingface.co/docs/transformers/model_doc/auto#transformers.AutoFeatureExtractor) or a [processor](https://huggingface.co/docs/transformers/model_doc/auto#transformers.AutoProcessor). + +- For pretrained speech recognition models, load a feature extractor and tokenizer and combine them in a `processor`: + + ```py + >>> from transformers import AutoTokenizer, AutoFeatureExtractor, AutoProcessor + + >>> model_checkpoint = "facebook/wav2vec2-large-xlsr-53" + # after defining a vocab.json file you can instantiate a tokenizer object: + >>> tokenizer = AutoTokenizer("./vocab.json", unk_token="[UNK]", pad_token="[PAD]", word_delimiter_token="|") + >>> feature_extractor = AutoFeatureExtractor.from_pretrained(model_checkpoint) + >>> processor = AutoProcessor.from_pretrained(feature_extractor=feature_extractor, tokenizer=tokenizer) + ``` + +- For fine-tuned speech recognition models, you only need to load a `processor`: + + ```py + >>> from transformers import AutoProcessor + + >>> processor = AutoProcessor.from_pretrained("facebook/wav2vec2-base-960h") + ``` + +When you use [`~Dataset.map`] with your preprocessing function, include the `audio` column to ensure you're actually resampling the audio data: + +```py +>>> def prepare_dataset(batch): +... audio = batch["audio"] +... batch["input_values"] = processor(audio.get_all_samples().data, sampling_rate=audio["sampling_rate"]).input_values[0] +... batch["input_length"] = len(batch["input_values"]) +... with processor.as_target_processor(): +... batch["labels"] = processor(batch["sentence"]).input_ids +... return batch +>>> dataset = dataset.map(prepare_dataset, remove_columns=dataset.column_names) +``` diff --git a/docs/source/cache.mdx b/docs/source/cache.mdx new file mode 100644 index 0000000..338b373 --- /dev/null +++ b/docs/source/cache.mdx @@ -0,0 +1,110 @@ +# Cache management + +When you download a dataset from Hugging Face, the data are stored locally on your computer. +Files from Hugging Face are stored as usual in the `huggingface_hub` cache, which is at `~/.cache/huggingface/hub` by default. +See the [Hub cache documentation](https://huggingface.co/docs/huggingface_hub/guides/manage-cache) for more details and how to change its location. + +The Hub cache allows 🤗 Datasets to avoid re-downloading dataset files from Hugging Face every time you use them. + +🤗 Datasets also has its own cache to store datasets converted in Arrow format (the format used by [`Dataset`] objects). + +This guide focuses on the 🤗 Datasets cache and will show you how to: + +- Change the cache directory. +- Control how a dataset is loaded from the cache. +- Clean up cache files in the directory. +- Enable or disable caching. + +## Cache directory + +The default 🤗 Datasets cache directory is `~/.cache/huggingface/datasets`. Change the cache location by setting the shell environment variable, `HF_HOME` to another directory: + +``` +$ export HF_HOME="/path/to/another/directory/datasets" +``` + +Alternatively, you can set the `HF_DATASETS_CACHE` environment variable to control only the datasets-specific cache directory: + +``` +$ export HF_DATASETS_CACHE="/path/to/datasets_cache" +``` + +⚠️ This only applies to files written by the `datasets` library (e.g., Arrow files and indices). +It does **not** affect files downloaded from the Hugging Face Hub (such as models, tokenizers, or raw dataset sources), which are located in `~/.cache/huggingface/hub` by default and controlled separately via the `HF_HUB_CACHE` variable: + +``` +$ export HF_HUB_CACHE="/path/to/hub_cache" +``` + +💡 If you'd like to relocate all Hugging Face caches — including datasets and hub downloads — use the `HF_HOME` variable instead: + +``` +$ export HF_HOME="/path/to/cache_root" +``` + +This results in: +- datasets cache → `/path/to/cache_root/datasets` +- hub cache → `/path/to/cache_root/hub` + +These distinctions are especially useful when working in shared environments or networked file systems (e.g., NFS). +See [issue #7480](https://github.com/huggingface/datasets/issues/7480) for discussion on how users encountered unexpected cache locations when `HF_HUB_CACHE` was not set alongside `HF_DATASETS_CACHE`. + +When you load a dataset, you also have the option to change where the data is cached. Change the `cache_dir` parameter to the path you want: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('username/dataset', cache_dir="/path/to/another/directory/datasets") +``` + +## Download mode + +After you download a dataset, control how it is loaded by [`load_dataset`] with the `download_mode` parameter. By default, 🤗 Datasets will reuse a dataset if it exists. But if you need the original dataset without any processing functions applied, re-download the files as shown below: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('rajpurkar/squad', download_mode='force_redownload') +``` + +Refer to [`DownloadMode`] for a full list of download modes. + +## Cache files + +Clean up the Arrow cache files in the directory with [`Dataset.cleanup_cache_files`]: + +```py +# Returns the number of removed cache files +>>> dataset.cleanup_cache_files() +2 +``` + +## Enable or disable caching + +If you're using a cached file locally, it will automatically reload the dataset with any previous transforms you applied to the dataset. Disable this behavior by setting the argument `load_from_cache_file=False` in [`Dataset.map`]: + +```py +>>> updated_dataset = small_dataset.map(add_prefix, load_from_cache_file=False) +``` + +In the example above, 🤗 Datasets will execute the function `add_prefix` over the entire dataset again instead of loading the dataset from its previous state. + +Disable caching on a global scale with [`disable_caching`]: + +```py +>>> from datasets import disable_caching +>>> disable_caching() +``` + +When you disable caching, 🤗 Datasets will no longer reload cached files when applying transforms to datasets. Any transform you apply on your dataset will be need to be reapplied. + +> [!TIP] +> If you want to reuse a dataset from scratch, try setting the `download_mode` parameter in [`load_dataset`] instead. + + + +## Improve performance + +Disabling the cache and copying the dataset in-memory will speed up dataset operations. There are two options for copying the dataset in-memory: + +1. Set `datasets.config.IN_MEMORY_MAX_SIZE` to a nonzero value (in bytes) that fits in your RAM memory. + +2. Set the environment variable `HF_DATASETS_IN_MEMORY_MAX_SIZE` to a nonzero value. Note that the first method takes higher precedence. diff --git a/docs/source/cli.mdx b/docs/source/cli.mdx new file mode 100644 index 0000000..e1c2207 --- /dev/null +++ b/docs/source/cli.mdx @@ -0,0 +1,48 @@ +# Command Line Interface (CLI) + +🤗 Datasets provides a command line interface (CLI) with useful shell commands to interact with your dataset. + +You can check the available commands: +```bash +>>> datasets-cli --help +usage: datasets-cli [] + +positional arguments: + {env,test,delete_from_hub} + datasets-cli command helpers + env Print relevant system environment info. + test Test dataset loading. + delete_from_hub Delete dataset config from the Hub + +optional arguments: + -h, --help show this help message and exit +``` + +## Delete from Hub + +Delete a dataset configuration from a [supported dataset](repository_structure) on the Hub. + +```bash +>>> datasets-cli delete_from_hub --help +usage: datasets-cli [] delete_from_hub [-h] [--token TOKEN] [--revision REVISION] dataset_id config_name + +positional arguments: + dataset_id source dataset ID, e.g. USERNAME/DATASET_NAME or ORGANIZATION/DATASET_NAME + config_name config name to delete + +optional arguments: + -h, --help show this help message and exit + --token TOKEN access token to the Hugging Face Hub + --revision REVISION source revision +``` + +For example: +```bash +>>> datasets-cli delete_from_hub USERNAME/DATASET_NAME CONFIG_NAME +``` + +> [!TIP] +> Do not forget that you need to log in first to your Hugging Face account: +> ```bash +> >>> hf auth login +> ``` diff --git a/docs/source/create_dataset.mdx b/docs/source/create_dataset.mdx new file mode 100644 index 0000000..a35ac88 --- /dev/null +++ b/docs/source/create_dataset.mdx @@ -0,0 +1,125 @@ +# Create a dataset + +Sometimes, you may need to create a dataset if you're working with your own data. Creating a dataset with 🤗 Datasets confers all the advantages of the library to your dataset: fast loading and processing, [stream enormous datasets](stream), [memory-mapping](https://huggingface.co/course/chapter5/4?fw=pt#the-magic-of-memory-mapping), and more. You can easily and rapidly create a dataset with 🤗 Datasets low-code approaches, reducing the time it takes to start training a model. In many cases, it is as easy as [dragging and dropping](upload_dataset#upload-with-the-hub-ui) your data files into a dataset repository on the Hub. + +In this tutorial, you'll learn how to use 🤗 Datasets low-code methods for creating datasets from your own data. + +> **Note** +> +> If you want to learn how to load existing datasets, or how to load local and remote files (CSV, JSON, Parquet, etc.), see the [Load guide](https://huggingface.co/docs/datasets/loading). + +This tutorial covers: + +- Folder-based builders for quickly creating an image or audio dataset +- `from_` methods for creating datasets from local Python objects + +## File-based builders + +🤗 Datasets supports many common formats such as `csv`, `json/jsonl`, `parquet`, `txt`. + +For example it can read a dataset made up of one or several CSV files (in this case, pass your CSV files as a list): + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("csv", data_files="my_file.csv") +``` + +To get the list of supported formats and code examples, follow this guide [here](https://huggingface.co/docs/datasets/loading#local-and-remote-files). + +## Folder-based builders + +There are two folder-based builders, [`ImageFolder`] and [`AudioFolder`]. These are low-code methods for quickly creating an image or speech and audio dataset with several thousand examples. They are great for rapidly prototyping computer vision and speech models before scaling to a larger dataset. Folder-based builders takes your data and automatically generates the dataset's features, splits, and labels. Under the hood: + +- [`ImageFolder`] uses the [`~datasets.Image`] feature to decode an image file. Many image extension formats are supported, such as jpg and png, but other formats are also supported. You can check the complete [list](https://github.com/huggingface/datasets/blob/b5672a956d5de864e6f5550e493527d962d6ae55/src/datasets/packaged_modules/imagefolder/imagefolder.py#L39) of supported image extensions. +- [`AudioFolder`] uses the [`~datasets.Audio`] feature to decode an audio file. Extensions such as wav, mp3, and even mp4 are supported, and you can check the complete [list](https://ffmpeg.org/ffmpeg-formats.html) of supported audio extensions. Decoding is done via ffmpeg. + +The dataset splits are generated from the repository structure, and the label names are automatically inferred from the directory name. + +For example, if your image dataset (it is the same for an audio dataset) is stored like this: + +``` +pokemon/train/grass/bulbasaur.png +pokemon/train/fire/charmander.png +pokemon/train/water/squirtle.png + +pokemon/test/grass/ivysaur.png +pokemon/test/fire/charmeleon.png +pokemon/test/water/wartortle.png +``` + +Then this is how the folder-based builder generates an example: + +
+ +
+ +Create the image dataset by specifying `imagefolder` in [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("imagefolder", data_dir="/path/to/pokemon") +``` + +An audio dataset is created in the same way, except you specify `audiofolder` in [`load_dataset`] instead: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("audiofolder", data_dir="/path/to/folder") +``` + +Any additional information about your dataset, such as text captions or transcriptions, can be included with a `metadata.csv` file in the folder containing your dataset. The metadata file needs to have a `file_name` column that links the image or audio file to its corresponding metadata: + +``` +file_name, text +bulbasaur.png, There is a plant seed on its back right from the day this Pokémon is born. +charmander.png, It has a preference for hot things. +squirtle.png, When it retracts its long neck into its shell, it squirts out water with vigorous force. +``` + +To learn more about each of these folder-based builders, check out the ImageFolder, AudioFolder, or MeshFolder guides. + +## From Python dictionaries + +You can also create a dataset from data in Python dictionaries. There are two ways you can create a dataset using the `from_` methods: + + * The [`~Dataset.from_generator`] method is the most memory-efficient way to create a dataset from a [generator](https://wiki.python.org/moin/Generators) due to a generators iterative behavior. This is especially useful when you're working with a really large dataset that may not fit in memory, since the dataset is generated on disk progressively and then memory-mapped. + + ```py + >>> from datasets import Dataset + >>> def gen(): + ... yield {"pokemon": "bulbasaur", "type": "grass"} + ... yield {"pokemon": "squirtle", "type": "water"} + >>> ds = Dataset.from_generator(gen) + >>> ds[0] + {"pokemon": "bulbasaur", "type": "grass"} + ``` + + A generator-based [`IterableDataset`] needs to be iterated over with a `for` loop for example: + + ```py + >>> from datasets import IterableDataset + >>> ds = IterableDataset.from_generator(gen) + >>> for example in ds: + ... print(example) + {"pokemon": "bulbasaur", "type": "grass"} + {"pokemon": "squirtle", "type": "water"} + ``` + + * The [`~Dataset.from_dict`] method is a straightforward way to create a dataset from a dictionary: + + ```py + >>> from datasets import Dataset + >>> ds = Dataset.from_dict({"pokemon": ["bulbasaur", "squirtle"], "type": ["grass", "water"]}) + >>> ds[0] + {"pokemon": "bulbasaur", "type": "grass"} + ``` + + To create an image or audio dataset, chain the [`~Dataset.cast_column`] method with [`~Dataset.from_dict`] and specify the column and feature type. For example, to create an audio dataset: + + ```py + >>> audio_dataset = Dataset.from_dict({"audio": ["path/to/audio_1", ..., "path/to/audio_n"]}).cast_column("audio", Audio()) + ``` + +Now that you know how to create a dataset, consider sharing it on the Hub so the community can also benefit from your work! Go on to the next section to learn how to share your dataset. diff --git a/docs/source/dataset_card.mdx b/docs/source/dataset_card.mdx new file mode 100644 index 0000000..5f8b998 --- /dev/null +++ b/docs/source/dataset_card.mdx @@ -0,0 +1,27 @@ +# Create a dataset card + +Each dataset should have a dataset card to promote responsible usage and inform users of any potential biases within the dataset. +This idea was inspired by the Model Cards proposed by [Mitchell, 2018](https://huggingface.co/papers/1810.03993). +Dataset cards help users understand a dataset's contents, the context for using the dataset, how it was created, and any other considerations a user should be aware of. + +Creating a dataset card is easy and can be done in just a few steps: + +1. Go to your dataset repository on the [Hub](https://hf.co/new-dataset) and click on **Create Dataset Card** to create a new `README.md` file in your repository. + +2. Use the **Metadata UI** to select the tags that describe your dataset. You can add a license, language, pretty_name, the task_categories, size_categories, and any other tags that you think are relevant. These tags help users discover and find your dataset on the Hub. + +
+ + +
+ + > [!TIP] + > For a complete, but not required, set of tag options you can also look at the [Dataset Card specifications](https://github.com/huggingface/hub-docs/blob/main/datasetcard.md?plain=1). This'll have a few more tag options like `multilinguality` and `language_creators` which are useful but not absolutely necessary. + +3. Click on the **Import dataset card template** link to automatically create a template with all the relevant fields to complete. Fill out the template sections to the best of your ability. Take a look at the [Dataset Card Creation Guide](https://github.com/huggingface/datasets/blob/main/templates/README_guide.md) for more detailed information about what to include in each section of the card. For fields you are unable to complete, you can write **[More Information Needed]**. + +4. Once you're done, commit the changes to the `README.md` file and you'll see the completed dataset card on your repository. + +YAML also allows you to customize the way your dataset is loaded by [defining splits and/or configurations](./repository_structure#define-your-splits-and-subsets-in-yaml) without the need to write any code. + +Feel free to take a look at the [SNLI](https://huggingface.co/datasets/stanfordnlp/snli), [CNN/DailyMail](https://huggingface.co/datasets/abisee/cnn_dailymail), and [Allociné](https://huggingface.co/datasets/tblard/allocine) dataset cards as examples to help you get started. diff --git a/docs/source/depth_estimation.mdx b/docs/source/depth_estimation.mdx new file mode 100644 index 0000000..7b42e21 --- /dev/null +++ b/docs/source/depth_estimation.mdx @@ -0,0 +1,231 @@ +# Depth estimation + +Depth estimation datasets are used to train a model to approximate the relative distance of every pixel in an +image from the camera, also known as depth. The applications enabled by these datasets primarily lie in areas like visual machine +perception and perception in robotics. Example applications include mapping streets for self-driving cars. This guide will show you how to apply transformations +to a depth estimation dataset. + +Before you start, make sure you have up-to-date versions of `albumentations` installed: + +```bash +pip install -U albumentations +``` + +[Albumentations](https://albumentations.ai/) is a Python library for performing data augmentation +for computer vision. It supports various computer vision tasks such as image classification, object +detection, segmentation, and keypoint estimation. + +This guide uses the [NYU Depth V2](https://huggingface.co/datasets/sayakpaul/nyu_depth_v2) dataset which is +comprised of video sequences from various indoor scenes, recorded by RGB and depth cameras. The dataset consists of scenes from 3 cities and provides images along with +their depth maps as labels. + +Load the `train` split of the dataset and take a look at an example: + +```py +>>> from datasets import load_dataset + +>>> train_dataset = load_dataset("sayakpaul/nyu_depth_v2", split="train") +>>> index = 17 +>>> example = train_dataset[index] +>>> example +{'image': , + 'depth_map': } +``` + +The dataset has two fields: + +* `image`: a PIL PNG image object with `uint8` data type. +* `depth_map`: a PIL Tiff image object with `float32` data type which is the depth map of the image. + +Here the depth maps are using TIFF format as it supports a wide range of data types, including `float32` data. +However it is mention-worthy that JPEG/PNG format can only store `uint8` or `uint16` data. +Therefore if you have depth maps saved as JPEG/PNG, use the `Image(mode="F")` type to load them as single channel `float32` like normal depth maps: + +```python +>>> from datasets import Image + +>>> train_dataset = train_dataset.cast_column("depth_map", Image(mode="F")) +``` + +Next, check out an image with: + +```py +>>> example["image"] +``` + +
+ +
+ +Before we look at the depth map, we need to first convert its data type to `uint8` using `.convert('RGB')` as PIL can't display `float32` images. Now take a look at its corresponding depth map: + +```py +>>> example["depth_map"].convert("RGB") +``` + +
+ +
+ +It's all black! You'll need to add some color to the depth map to visualize it properly. To do that, either we can apply color automatically during display using `plt.imshow()` or create a colored depth map using `plt.cm` and then display it. In this example, we have used the latter one, as we can save/write the colored depth map later. (the utility below is taken from the [FastDepth repository](https://github.com/dwofk/fast-depth/blob/master/utils.py)). + +```py +>>> import numpy as np +>>> import matplotlib.pyplot as plt + +>>> cmap = plt.cm.viridis + +>>> def colored_depthmap(depth, d_min=None, d_max=None): +... if d_min is None: +... d_min = np.min(depth) +... if d_max is None: +... d_max = np.max(depth) +... depth_relative = (depth - d_min) / (d_max - d_min) +... return 255 * cmap(depth_relative)[:,:,:3] + +>>> def show_depthmap(depth_map): +... if not isinstance(depth_map, np.ndarray): +... depth_map = np.array(depth_map) +... if depth_map.ndim == 3: +... depth_map = depth_map.squeeze() + +... d_min = np.min(depth_map) +... d_max = np.max(depth_map) +... depth_map = colored_depthmap(depth_map, d_min, d_max) + +... plt.imshow(depth_map.astype("uint8")) +... plt.axis("off") +... plt.show() + +>>> show_depthmap(example["depth_map"]) +``` + +
+ +
+ +You can also visualize several different images and their corresponding depth maps. + +```py +>>> def merge_into_row(input_image, depth_target): +... if not isinstance(input_image, np.ndarray): +... input_image = np.array(input_image) +... +... d_min = np.min(depth_target) +... d_max = np.max(depth_target) +... depth_target_col = colored_depthmap(depth_target, d_min, d_max) +... img_merge = np.hstack([input_image, depth_target_col]) +... +... return img_merge + +>>> random_indices = np.random.choice(len(train_dataset), 9).tolist() +>>> plt.figure(figsize=(15, 6)) +>>> for i, idx in enumerate(random_indices): +... example = train_dataset[idx] +... ax = plt.subplot(3, 3, i + 1) +... image_viz = merge_into_row( +... example["image"], example["depth_map"] +... ) +... plt.imshow(image_viz.astype("uint8")) +... plt.axis("off") +``` + +
+ +
+ +Now apply some augmentations with `albumentations`. The augmentation transformations include: + +* Random horizontal flipping +* Random cropping +* Random brightness and contrast +* Random gamma correction +* Random hue saturation + +```py +>>> import albumentations as A + +>>> crop_size = (448, 576) +>>> transforms = [ +... A.HorizontalFlip(p=0.5), +... A.RandomCrop(crop_size[0], crop_size[1]), +... A.RandomBrightnessContrast(), +... A.RandomGamma(), +... A.HueSaturationValue() +... ] +``` + +Additionally, define a mapping to better reflect the target key name. + +```py +>>> additional_targets = {"depth": "mask"} +>>> aug = A.Compose(transforms=transforms, additional_targets=additional_targets) +``` + +With `additional_targets` defined, you can pass the target depth maps to the `depth` argument of `aug` instead of `mask`. You'll notice this change +in the `apply_transforms()` function defined below. + +Create a function to apply the transformation to the images as well as their depth maps: + +```py +>>> def apply_transforms(examples): +... transformed_images, transformed_maps = [], [] +... for image, depth_map in zip(examples["image"], examples["depth_map"]): +... image, depth_map = np.array(image), np.array(depth_map) +... transformed = aug(image=image, depth=depth_map) +... transformed_images.append(transformed["image"]) +... transformed_maps.append(transformed["depth"]) +... +... examples["pixel_values"] = transformed_images +... examples["labels"] = transformed_maps +... return examples +``` + +Use the [`~Dataset.set_transform`] function to apply the transformation on-the-fly to batches of the dataset to consume less disk space: + +```py +>>> train_dataset.set_transform(apply_transforms) +``` + +You can verify the transformation worked by indexing into the `pixel_values` and `labels` of an example image: + +```py +>>> example = train_dataset[index] + +>>> plt.imshow(example["pixel_values"]) +>>> plt.axis("off") +>>> plt.show() +``` + +
+ +
+ +Visualize the same transformation on the image's corresponding depth map: + +```py +>>> show_depthmap(example["labels"]) +``` + +
+ +
+ +You can also visualize multiple training samples reusing the previous `random_indices`: + +```py +>>> plt.figure(figsize=(15, 6)) + +>>> for i, idx in enumerate(random_indices): +... ax = plt.subplot(3, 3, i + 1) +... example = train_dataset[idx] +... image_viz = merge_into_row( +... example["pixel_values"], example["labels"] +... ) +... plt.imshow(image_viz.astype("uint8")) +... plt.axis("off") +``` + +
+ +
\ No newline at end of file diff --git a/docs/source/document_dataset.mdx b/docs/source/document_dataset.mdx new file mode 100644 index 0000000..bc2a8a2 --- /dev/null +++ b/docs/source/document_dataset.mdx @@ -0,0 +1,132 @@ +# Create a document dataset + +This guide will show you how to create a document dataset with `PdfFolder` and some metadata. This is a no-code solution for quickly creating a document dataset with several thousand PDFs. + +> [!TIP] +> You can control access to your dataset by requiring users to share their contact information first. Check out the [Gated datasets](https://huggingface.co/docs/hub/datasets-gated) guide for more information about how to enable this feature on the Hub. + +## PdfFolder + +The `PdfFolder` is a dataset builder designed to quickly load a document dataset with several thousand PDFs without requiring you to write any code. + +> [!TIP] +> 💡 Take a look at the [Split pattern hierarchy](repository_structure#split-pattern-hierarchy) to learn more about how `PdfFolder` creates dataset splits based on your dataset repository structure. + +`PdfFolder` automatically infers the class labels of your dataset based on the directory name. Store your dataset in a directory structure like: + +``` +folder/train/resume/0001.pdf +folder/train/resume/0002.pdf +folder/train/resume/0003.pdf + +folder/train/invoice/0001.pdf +folder/train/invoice/0002.pdf +folder/train/invoice/0003.pdf +``` + +If the dataset follows the `PdfFolder` structure, then you can load it directly with [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("path/to/folder") +``` + +This is equivalent to passing `pdffolder` manually in [`load_dataset`] and the directory in `data_dir`: + +```py +>>> dataset = load_dataset("pdffolder", data_dir="/path/to/folder") +``` + +You can also use `pdffolder` to load datasets involving multiple splits. To do so, your dataset directory should have the following structure: + +``` +folder/train/resume/0001.pdf +folder/train/resume/0002.pdf +folder/test/invoice/0001.pdf +folder/test/invoice/0002.pdf +``` + +> [!WARNING] +> If all PDF files are contained in a single directory or if they are not on the same level of directory structure, `label` column won't be added automatically. If you need it, set `drop_labels=False` explicitly. + + +If there is additional information you'd like to include about your dataset, like text captions or bounding boxes, add it as a `metadata.csv` file in your folder. This lets you quickly create datasets for different computer vision tasks like text captioning or object detection. You can also use a JSONL file `metadata.jsonl` or a Parquet file `metadata.parquet`. + +``` +folder/train/metadata.csv +folder/train/0001.pdf +folder/train/0002.pdf +folder/train/0003.pdf +``` + +Your `metadata.csv` file must have a `file_name` or `*_file_name` field which links PDF files with their metadata: + +```csv +file_name,additional_feature +0001.pdf,This is a first value of a text feature you added to your pdfs +0002.pdf,This is a second value of a text feature you added to your pdfs +0003.pdf,This is a third value of a text feature you added to your pdfs +``` + +or using `metadata.jsonl`: + +```jsonl +{"file_name": "0001.pdf", "additional_feature": "This is a first value of a text feature you added to your PDFs"} +{"file_name": "0002.pdf", "additional_feature": "This is a second value of a text feature you added to your PDFs"} +{"file_name": "0003.pdf", "additional_feature": "This is a third value of a text feature you added to your PDFs"} +``` + +Here the `file_name` must be the name of the PDF file next to the metadata file. More generally, it must be the relative path from the directory containing the metadata to the PDF file. + +It's possible to point to more than one PDF in each row in your dataset, for example if both your input and output are pdfs: + +```jsonl +{"input_file_name": "0001.pdf", "output_file_name": "0001_output.pdf"} +{"input_file_name": "0002.pdf", "output_file_name": "0002_output.pdf"} +{"input_file_name": "0003.pdf", "output_file_name": "0003_output.pdf"} +``` + +You can also define lists of PDFs. In that case you need to name the field `file_names` or `*_file_names`. Here is an example: + +```jsonl +{"pdfs_file_names": ["0001_part1.pdf", "0001_part2.pdf"], "label": "urgent"} +{"pdfs_file_names": ["0002_part1.pdf", "0002_part2.pdf"], "label": "urgent"} +{"pdfs_file_names": ["0003_part1.pdf", "0002_part2.pdf"], "label": "normal"} +``` + +### OCR (Optical Character Recognition) + +OCR datasets have the text contained in a PDF. An example `metadata.csv` may look like: + +```csv +file_name,text +0001.pdf,Invoice 1234 from 01/01/1970... +0002.pdf,Software Engineer Resume. Education: ... +0003.pdf,Attention is all you need. Abstract. The ... +``` + +Load the dataset with `PdfFolder`, and it will create a `text` column for the PDF captions: + +```py +>>> dataset = load_dataset("pdffolder", data_dir="/path/to/folder", split="train") +>>> dataset[0]["text"] +"Invoice 1234 from 01/01/1970..." +``` + +### Upload dataset to the Hub + +Once you've created a dataset, you can share it to the using `huggingface_hub` for example. Make sure you have the [huggingface_hub](https://huggingface.co/docs/huggingface_hub/index) library installed and you're logged in to your Hugging Face account (see the [Upload with Python tutorial](upload_dataset#upload-with-python) for more details). + +Upload your dataset with `huggingface_hub.HfApi.upload_folder`: + +```py +from huggingface_hub import HfApi +api = HfApi() + +api.upload_folder( + folder_path="/path/to/local/dataset", + repo_id="username/my-cool-dataset", + repo_type="dataset", +) +``` diff --git a/docs/source/document_load.mdx b/docs/source/document_load.mdx new file mode 100644 index 0000000..2d1717f --- /dev/null +++ b/docs/source/document_load.mdx @@ -0,0 +1,204 @@ +# Load pdf data + +> [!WARNING] +> Pdf support is experimental and is subject to change. + +Pdf datasets have [`Pdf`] type columns, which contain `pdfplumber` objects. + +> [!TIP] +> To work with pdf datasets, you need to have the `pdfplumber` package installed. Check out the [installation](https://github.com/jsvine/pdfplumber#installation) guide to learn how to install it. + +When you load a pdf dataset and call the pdf column, the pdfs are decoded as `pdfplumber` Pdfs: + +```py +>>> from datasets import load_dataset, Pdf + +>>> dataset = load_dataset("path/to/pdf/folder", split="train") +>>> dataset[0]["pdf"] + +``` + +> [!WARNING] +> Index into a pdf dataset using the row index first and then the `pdf` column - `dataset[0]["pdf"]` - to avoid creating all the pdf objects in the dataset. Otherwise, this can be a slow and time-consuming process if you have a large dataset. + +For a guide on how to load any type of dataset, take a look at the general loading guide. + +## Read pages + +Access pages directly from a pdf using the `.pages` attribute. + +Then you can use the `pdfplumber` functions to read texts, tables and images, e.g.: + +```python +>>> pdf = dataset[0]["pdf"] +>>> first_page = pdf.pages[0] +>>> first_page + +>>> first_page.extract_text() +Docling Technical Report +Version1.0 +ChristophAuer MaksymLysak AhmedNassar MicheleDolfi NikolaosLivathinos +PanosVagenas CesarBerrospiRamis MatteoOmenetti FabianLindlbauer +KasperDinkla LokeshMishra YusikKim ShubhamGupta RafaelTeixeiradeLima +ValeryWeber LucasMorin IngmarMeijer ViktorKuropiatnyk PeterW.J.Staar +AI4KGroup,IBMResearch +Ru¨schlikon,Switzerland +Abstract +This technical report introduces Docling, an easy to use, self-contained, MIT- +licensed open-source package for PDF document conversion. +... +>>> first_page.images +In [24]: first_page.images +Out[24]: +[{'x0': 256.5, + 'y0': 621.0, + 'x1': 355.49519999999995, + 'y1': 719.9952, + 'width': 98.99519999999995, + 'height': 98.99519999999995, + 'name': 'Im1', + 'stream': , + 'srcsize': (1024, 1024), + 'imagemask': None, + 'bits': 8, + 'colorspace': [/'DeviceRGB'], + 'mcid': None, + 'tag': None, + 'object_type': 'image', + 'page_number': 1, + 'top': 72.00480000000005, + 'bottom': 171.0, + 'doctop': 72.00480000000005}] +>>> first_page.extract_tables() +[] +``` + +You can also load each page as a `PIL.Image`: + +```python +>>> import PIL.Image +>>> import io +>>> first_page.to_image() + +>>> buffer = io.BytesIO() +>>> first_page.to_image().save(buffer) +>>> img = PIL.Image.open(buffer) +>>> img + +``` + +Note that you can pass `resolution=` to `.to_image()` to render the image in higher resolution that the default (72 ppi). + +## Local files + +You can load a dataset from the pdf path. Use the [`~Dataset.cast_column`] function to accept a column of pdf file paths, and decode it into a `pdfplumber` pdf with the [`Pdf`] feature: +```py +>>> from datasets import Dataset, Pdf + +>>> dataset = Dataset.from_dict({"pdf": ["path/to/pdf_1", "path/to/pdf_2", ..., "path/to/pdf_n"]}).cast_column("pdf", Pdf()) +>>> dataset[0]["pdf"] + +``` + +If you only want to load the underlying path to the pdf dataset without decoding the pdf object, set `decode=False` in the [`Pdf`] feature: + +```py +>>> dataset = dataset.cast_column("pdf", Pdf(decode=False)) +>>> dataset[0]["pdf"] +{'bytes': None, + 'path': 'path/to/pdf/folder/pdf0.pdf'} +``` + +## PdfFolder + +You can also load a dataset with an `PdfFolder` dataset builder which does not require writing a custom dataloader. This makes `PdfFolder` ideal for quickly creating and loading pdf datasets with several thousand pdfs for different vision tasks. Your pdf dataset structure should look like this: + +``` +folder/train/resume/0001.pdf +folder/train/resume/0002.pdf +folder/train/resume/0003.pdf + +folder/train/invoice/0001.pdf +folder/train/invoice/0002.pdf +folder/train/invoice/0003.pdf +``` + +If the dataset follows the `PdfFolder` structure, then you can load it directly with [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("username/dataset_name") +>>> # OR locally: +>>> dataset = load_dataset("/path/to/folder") +``` + +For local datasets, this is equivalent to passing `pdffolder` manually in [`load_dataset`] and the directory in `data_dir`: + +```py +>>> dataset = load_dataset("pdffolder", data_dir="/path/to/folder") +``` + +Then you can access the pdfs as `pdfplumber.pdf.PDF` objects: + +``` +>>> dataset["train"][0] +{"pdf": , "label": 0} + +>>> dataset["train"][-1] +{"pdf": , "label": 1} +``` + +To ignore the information in the metadata file, set `drop_metadata=True` in [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True) +``` + +If you don't have a metadata file, `PdfFolder` automatically infers the label name from the directory name. +If you want to drop automatically created labels, set `drop_labels=True`. +In this case, your dataset will only contain a pdf column: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True) +``` + +Finally the `filters` argument lets you load only a subset of the dataset, based on a condition on the label or the metadata. This is especially useful if the metadata is in Parquet format, since this format enables fast filtering. It is also recommended to use this argument with `streaming=True`, because by default the dataset is fully downloaded before filtering. + +```python +>>> filters = [("label", "=", 0)] +>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters) +``` + +> [!TIP] +> For more information about creating your own `PdfFolder` dataset, take a look at the [Create a pdf dataset](./document_dataset) guide. + +## Pdf decoding + +By default, pdfs are decoded sequentially as pdfplumber `PDFs` when you iterate on a dataset. +It sequentially decodes the metadata of the pdfs, and doesn't read the pdf pages until you access them. + +However it is possible to speed up the dataset significantly using multithreaded decoding: + +```python +>>> import os +>>> num_threads = num_threads = min(32, (os.cpu_count() or 1) + 4) +>>> dataset = dataset.decode(num_threads=num_threads) +>>> for example in dataset: # up to 20 times faster ! +... ... +``` + +You can enable multithreading using `num_threads`. This is especially useful to speed up remote data streaming. +However it can be slower than `num_threads=0` for local data on fast disks. + +If you are not interested in the documents decoded as pdfplumber `PDFs` and would like to access the path/bytes instead, you can disable decoding: + +```python +>>> dataset = dataset.decode(False) +``` + +Note: [`IterableDataset.decode`] is only available for streaming datasets at the moment. diff --git a/docs/source/faiss_es.mdx b/docs/source/faiss_es.mdx new file mode 100644 index 0000000..6350517 --- /dev/null +++ b/docs/source/faiss_es.mdx @@ -0,0 +1,133 @@ +# Search index + +[FAISS](https://github.com/facebookresearch/faiss) and [Elasticsearch](https://www.elastic.co/elasticsearch/) enables searching for examples in a dataset. This can be useful when you want to retrieve specific examples from a dataset that are relevant to your NLP task. For example, if you are working on an Open Domain Question Answering task, you may want to only return examples that are relevant to answering your question. + +This guide will show you how to build an index for your dataset that will allow you to search it. + +## FAISS + +FAISS retrieves documents based on the similarity of their vector representations. In this example, you will generate the vector representations with the [DPR](https://huggingface.co/transformers/model_doc/dpr.html) model. + +1. Download the DPR model from 🤗 Transformers: + +```py +>>> from transformers import DPRContextEncoder, DPRContextEncoderTokenizer +>>> import torch +>>> torch.set_grad_enabled(False) +>>> ctx_encoder = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base") +>>> ctx_tokenizer = DPRContextEncoderTokenizer.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base") +``` + +2. Load your dataset and compute the vector representations: + +```py +>>> from datasets import load_dataset +>>> ds = load_dataset('community-datasets/crime_and_punish', split='train[:100]') +>>> ds_with_embeddings = ds.map(lambda example: {'embeddings': ctx_encoder(**ctx_tokenizer(example["line"], return_tensors="pt"))[0][0].numpy()}) +``` + +3. Create the index with [`Dataset.add_faiss_index`]: + +```py +>>> ds_with_embeddings.add_faiss_index(column='embeddings') +``` + +4. Now you can query your dataset with the `embeddings` index. Load the DPR Question Encoder, and search for a question with [`Dataset.get_nearest_examples`]: + +```py +>>> from transformers import DPRQuestionEncoder, DPRQuestionEncoderTokenizer +>>> q_encoder = DPRQuestionEncoder.from_pretrained("facebook/dpr-question_encoder-single-nq-base") +>>> q_tokenizer = DPRQuestionEncoderTokenizer.from_pretrained("facebook/dpr-question_encoder-single-nq-base") + +>>> question = "Is it serious ?" +>>> question_embedding = q_encoder(**q_tokenizer(question, return_tensors="pt"))[0][0].numpy() +>>> scores, retrieved_examples = ds_with_embeddings.get_nearest_examples('embeddings', question_embedding, k=10) +>>> retrieved_examples["line"][0] +'_that_ serious? It is not serious at all. It’s simply a fantasy to amuse\r\n' +``` + +5. You can access the index with [`Dataset.get_index`] and use it for special operations, e.g. query it using `range_search`: + +```py +>>> faiss_index = ds_with_embeddings.get_index('embeddings').faiss_index +>>> limits, distances, indices = faiss_index.range_search(x=question_embedding.reshape(1, -1), thresh=0.95) +``` + +6. When you are done querying, save the index on disk with [`Dataset.save_faiss_index`]: + +```py +>>> ds_with_embeddings.save_faiss_index('embeddings', 'my_index.faiss') +``` + +7. Reload it at a later time with [`Dataset.load_faiss_index`]: + +```py +>>> ds = load_dataset('community-datasets/crime_and_punish', split='train[:100]') +>>> ds.load_faiss_index('embeddings', 'my_index.faiss') +``` + +## Elasticsearch + +Unlike FAISS, Elasticsearch retrieves documents based on exact matches. + +Start Elasticsearch on your machine, or see the [Elasticsearch installation guide](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup.html) if you don't already have it installed. + +1. Load the dataset you want to index: + +```py +>>> from datasets import load_dataset +>>> squad = load_dataset('rajpurkar/squad', split='validation') +``` + +2. Build the index with [`Dataset.add_elasticsearch_index`]: + +```py +>>> squad.add_elasticsearch_index("context", host="localhost", port="9200") +``` + +3. Then you can query the `context` index with [`Dataset.get_nearest_examples`]: + +```py +>>> query = "machine" +>>> scores, retrieved_examples = squad.get_nearest_examples("context", query, k=10) +>>> retrieved_examples["title"][0] +'Computational_complexity_theory' +``` + +4. If you want to reuse the index, define the `es_index_name` parameter when you build the index: + +```py +>>> from datasets import load_dataset +>>> squad = load_dataset('rajpurkar/squad', split='validation') +>>> squad.add_elasticsearch_index("context", host="localhost", port="9200", es_index_name="hf_squad_val_context") +>>> squad.get_index("context").es_index_name +hf_squad_val_context +``` + +5. Reload it later with the index name when you call [`Dataset.load_elasticsearch_index`]: + +```py +>>> from datasets import load_dataset +>>> squad = load_dataset('rajpurkar/squad', split='validation') +>>> squad.load_elasticsearch_index("context", host="localhost", port="9200", es_index_name="hf_squad_val_context") +>>> query = "machine" +>>> scores, retrieved_examples = squad.get_nearest_examples("context", query, k=10) +``` + +For more advanced Elasticsearch usage, you can specify your own configuration with custom settings: + +```py +>>> import elasticsearch as es +>>> import elasticsearch.helpers +>>> from elasticsearch import Elasticsearch +>>> es_client = Elasticsearch([{"host": "localhost", "port": "9200"}]) # default client +>>> es_config = { +... "settings": { +... "number_of_shards": 1, +... "analysis": {"analyzer": {"stop_standard": {"type": "standard", " stopwords": "_english_"}}}, +... }, +... "mappings": {"properties": {"text": {"type": "text", "analyzer": "standard", "similarity": "BM25"}}}, +... } # default config +>>> es_index_name = "hf_squad_context" # name of the index in Elasticsearch +>>> squad.add_elasticsearch_index("context", es_client=es_client, es_config=es_config, es_index_name=es_index_name) +``` diff --git a/docs/source/filesystems.mdx b/docs/source/filesystems.mdx new file mode 100644 index 0000000..a77bc68 --- /dev/null +++ b/docs/source/filesystems.mdx @@ -0,0 +1,124 @@ +# Cloud storage + +## Hugging Face Datasets + +The Hugging Face Dataset Hub is home to a growing collection of datasets that span a variety of domains and tasks. + +It's more than a cloud storage: the Dataset Hub is a platform that provides data versioning thanks to git, as well as a Dataset Viewer to explore the data, making it a great place to store AI-ready datasets. + +This guide shows how to import data from other cloud storage using the filesystems implementations from `fsspec`. + +## Hugging Face Storage Buckets + +Storage Buckets are a repo type on the Hugging Face Hub providing S3-like object storage, powered by the Xet storage backend. Unlike Git-based dataset repositories, buckets are non-versioned and mutable, designed for use cases where you need simple, fast storage such as logs, intermediate artifacts, or any large collection of files that doesn’t need version control. + +## Import data from a cloud storage + +Most cloud storage providers have a `fsspec` FileSystem implementation, which is useful to import data from any cloud provider with the same code. +This is especially useful to publish datasets on Hugging Face. + +Take a look at the following table for some example of supported cloud storage providers: + +| Storage provider | Filesystem implementation | +|----------------------|---------------------------------------------------------------| +| Amazon S3 | [s3fs](https://s3fs.readthedocs.io/en/latest/) | +| Google Cloud Storage | [gcsfs](https://gcsfs.readthedocs.io/en/latest/) | +| Azure Blob/DataLake | [adlfs](https://github.com/fsspec/adlfs) | +| Oracle Cloud Storage | [ocifs](https://ocifs.readthedocs.io/en/latest/) | + +This guide will show you how to import data files from any cloud storage and save a dataset on Hugging Face. + +Let's say we want to publish a dataset on Hugging Face from Parquet files from a cloud storage. + +First, instantiate your cloud storage filesystem and list the files you'd like to import: + +```python +>>> import fsspec +>>> fs = fsspec.filesystem("...") # s3 / gcs / abfs / adl / oci / ... +>>> data_dir = "path/to/my/data/" +>>> pattern = "*.parquet" +>>> data_files = fs.glob(data_dir + pattern) +["path/to/my/data/0001.parquet", "path/to/my/data/0001.parquet", ...] +``` + +### Publish a Dataset + +Then you can create a dataset on Hugging Face and import the data files, using for example: + +```python +>>> from huggingface_hub import create_repo, upload_folder +>>> from tqdm.auto import tqdm +>>> destination_dataset = "username/my-dataset" +>>> create_repo(destination_dataset, repo_type="dataset") +>>> batch_size = 100 +>>> for data_files in batched(tqdm(fs.glob(data_dir + pattern)), batch_size): +... with TemporaryDirectory() as tmp_dir: +... tmp_files = [os.path.join(tmp_dir, x[len(data_dir):]) for x in data_files] +... fs.download(data_files, tmp_files) +... upload_folder( +... repo_id=destination_dataset, +... folder_path=tmp_dir, +... repo_type="dataset", +... ) +``` + +Check out the [huggingface_hub](https://huggingface.co/docs/huggingface_hub) documentation on files uploads [here](https://huggingface.co/docs/huggingface_hub/en/guides/upload) if you're looking for more upload options. + +Finally you can now load the dataset using 🤗 Datasets: + +```python +>>> from datasets import load_dataset +>>> ds = load_dataset("username/my-dataset") +``` + +### Import raw data to Storage Buckets + +Alternatively if you wish not to publish a dataset but simply import raw data files in a Hugging Face [Storage Bucket](https://huggingface.co/docs/hub/storage-buckets), you can use: + +```python +>>> from huggingface_hub import create_bucket, sync_bucket +>>> from tqdm.auto import tqdm +>>> from itertools import batched +>>> from tempfile import TemporaryDirectory +>>> import os +>>> create_bucket("username/my-bucket") +>>> bucket_files_location = "hf://buckets/username/my-bucket/path/to/raw/files" +>>> batch_size = 100 +>>> for data_files in batched(tqdm(fs.glob(data_dir + pattern)), batch_size): +... with TemporaryDirectory() as tmp_dir: +... tmp_files = [os.path.join(tmp_dir, x[len(data_dir):]) for x in data_files] +... fs.download(data_files, tmp_files) +... sync_bucket(tmp_dir, bucket_files_location) +``` + +Check out the [huggingface_hub](https://huggingface.co/docs/huggingface_hub) documentation on Storage Buckets [here](https://huggingface.co/docs/hub/storage-buckets) if you're looking for more upload options. + +Then later you can load the raw files using 🤗 Datasets, transform them and upload the final AI-ready datasets, e.g. in a streaming manner: + +If the files are in a format supported by 🤗 Datasets: + +```python +>>> from datasets import load_dataset +>>> ds = load_dataset(bucket_files_location, streaming=True) +>>> ds = ds.map(...).filter(...) +>>> ds.push_to_hub("username/my-dataset", num_proc=4) +>>> # and later +>>> ds = load_dataset("username/my-dataset") +``` + +Otherwise you can use your own file parsing function: + +```python +>>> from datasets import IterableDataset +>>> from huggingface_hub import hffs +>>> data_files = hffs.find(bucket_files_location) +>>> num_shards = 1024 # For parallelism. PS: every shard should fit in RAM +>>> ds = IterableDataset.from_dict({"data_file": data_files}, num_shards=num_shards) +>>> def parse_data_files(data_files): +... ... +... return {"col_1": [...], "col_2": [...]} +>>> ds = ds.map(parse_data_files, batched=True, input_column=["data_file"]) +>>> ds.push_to_hub("username/my-dataset", num_proc=4) +>>> # and later +>>> ds = load_dataset("username/my-dataset") +``` diff --git a/docs/source/how_to.md b/docs/source/how_to.md new file mode 100644 index 0000000..79fd76e --- /dev/null +++ b/docs/source/how_to.md @@ -0,0 +1,19 @@ +# Overview + +The how-to guides offer a more comprehensive overview of all the tools 🤗 Datasets offers and how to use them. This will help you tackle messier real-world datasets where you may need to manipulate the dataset structure or content to get it ready for training. + +The guides assume you are familiar and comfortable with the 🤗 Datasets basics. We recommend newer users check out our [tutorials](tutorial) first. + +> [!TIP] +> Interested in learning more? Take a look at [Chapter 5](https://huggingface.co/course/chapter5/1?fw=pt) of the Hugging Face course! + +The guides are organized into six sections: + +- General usage: Functions for general dataset loading and processing. The functions shown in this section are applicable across all dataset modalities. +- Audio: How to load, process, and share audio datasets. +- Vision: How to load, process, and share image and video datasets. +- Text: How to load, process, and share text datasets. +- Tabular: How to load, process, and share tabular datasets. +- Dataset repository: How to share and upload a dataset to the Hub. + +If you have any questions about 🤗 Datasets, feel free to join and ask the community on our [forum](https://discuss.huggingface.co/c/datasets/10). diff --git a/docs/source/image_classification.mdx b/docs/source/image_classification.mdx new file mode 100644 index 0000000..ea52a44 --- /dev/null +++ b/docs/source/image_classification.mdx @@ -0,0 +1,86 @@ +# Image classification + +Image classification datasets are used to train a model to classify an entire image. There are a wide variety of applications enabled by these datasets such as identifying endangered wildlife species or screening for disease in medical images. This guide will show you how to apply transformations to an image classification dataset. + +Before you start, make sure you have up-to-date versions of `albumentations` and `cv2` installed: + +```bash +pip install -U albumentations opencv-python +``` + +This guide uses the [Beans](https://huggingface.co/datasets/beans) dataset for identifying the type of bean plant disease based on an image of its leaf. + +Load the dataset and take a look at an example: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("AI-Lab-Makerere/beans") +>>> dataset["train"][10] +{'image': , + 'image_file_path': '/root/.cache/huggingface/datasets/downloads/extracted/b0a21163f78769a2cf11f58dfc767fb458fc7cea5c05dccc0144a2c0f0bc1292/train/angular_leaf_spot/angular_leaf_spot_train.204.jpg', + 'labels': 0} +``` + +The dataset has three fields: + +* `image`: a PIL image object. +* `image_file_path`: the path to the image file. +* `labels`: the label or category of the image. + +Next, check out an image: + +
+ +
+ +Now apply some augmentations with `albumentations`. You'll randomly crop the image, flip it horizontally, and adjust its brightness. + +```py +>>> import cv2 +>>> import albumentations +>>> import numpy as np + +>>> transform = albumentations.Compose([ +... albumentations.RandomCrop(width=256, height=256), +... albumentations.HorizontalFlip(p=0.5), +... albumentations.RandomBrightnessContrast(p=0.2), +... ]) +``` + +Create a function to apply the transformation to the images: + +```py +>>> def transforms(examples): +... examples["pixel_values"] = [ +... transform(image=np.array(image))["image"] for image in examples["image"] +... ] +... +... return examples +``` + +Use the [`~Dataset.set_transform`] function to apply the transformation on-the-fly to batches of the dataset to consume less disk space: + +```py +>>> dataset.set_transform(transforms) +``` + +You can verify the transformation worked by indexing into the `pixel_values` of the first example: + +```py +>>> import numpy as np +>>> import matplotlib.pyplot as plt + +>>> img = dataset["train"][0]["pixel_values"] +>>> plt.imshow(img) +``` + +
+ + +
+ +> [!TIP] +> Now that you know how to process a dataset for image classification, learn +> [how to train an image classification model](https://colab.research.google.com/github/huggingface/notebooks/blob/main/examples/image_classification.ipynb) +> and use it for inference. \ No newline at end of file diff --git a/docs/source/image_dataset.mdx b/docs/source/image_dataset.mdx new file mode 100644 index 0000000..189b5bd --- /dev/null +++ b/docs/source/image_dataset.mdx @@ -0,0 +1,297 @@ +# Create an image dataset + +There are two methods for creating and sharing an image dataset. This guide will show you how to: + +* Create an image dataset from local files in python with [`Dataset.push_to_hub`]. This is an easy way that requires only a few steps in python. + +* Create an image dataset with `ImageFolder` and some metadata. This is a no-code solution for quickly creating an image dataset with several thousand images. + +> [!TIP] +> You can control access to your dataset by requiring users to share their contact information first. Check out the [Gated datasets](https://huggingface.co/docs/hub/datasets-gated) guide for more information about how to enable this feature on the Hub. + +## ImageFolder + +The `ImageFolder` is a dataset builder designed to quickly load an image dataset with several thousand images without requiring you to write any code. + +> [!TIP] +> 💡 Take a look at the [Split pattern hierarchy](repository_structure#split-pattern-hierarchy) to learn more about how `ImageFolder` creates dataset splits based on your dataset repository structure. + +`ImageFolder` automatically infers the class labels of your dataset based on the directory name. Store your dataset in a directory structure like: + +``` +folder/train/dog/golden_retriever.png +folder/train/dog/german_shepherd.png +folder/train/dog/chihuahua.png + +folder/train/cat/maine_coon.png +folder/train/cat/bengal.png +folder/train/cat/birman.png +``` + +If the dataset follows the `ImageFolder` structure, then you can load it directly with [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("path/to/folder") +``` + +This is equivalent to passing `imagefolder` manually in [`load_dataset`] and the directory in `data_dir`: + +```py +>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder") +``` + +You can also use `imagefolder` to load datasets involving multiple splits. To do so, your dataset directory should have the following structure: + +``` +folder/train/dog/golden_retriever.png +folder/train/cat/maine_coon.png +folder/test/dog/german_shepherd.png +folder/test/cat/bengal.png +``` + +> [!WARNING] +> If all image files are contained in a single directory or if they are not on the same level of directory structure, `label` column won't be added automatically. If you need it, set `drop_labels=False` explicitly. + + +If there is additional information you'd like to include about your dataset, like text captions or bounding boxes, add it as a `metadata.csv` file in your folder. This lets you quickly create datasets for different computer vision tasks like text captioning or object detection. You can also use a JSONL file `metadata.jsonl` or a Parquet file `metadata.parquet`. + +``` +folder/train/metadata.csv +folder/train/0001.png +folder/train/0002.png +folder/train/0003.png +``` + +You can also zip your images, and in this case each zip should contain both the images and the metadata + +``` +folder/train.zip +folder/test.zip +folder/validation.zip +``` + +Your `metadata.csv` file must have a `file_name` or `*_file_name` field which links image files with their metadata: + +```csv +file_name,additional_feature +0001.png,This is a first value of a text feature you added to your images +0002.png,This is a second value of a text feature you added to your images +0003.png,This is a third value of a text feature you added to your images +``` + +or using `metadata.jsonl`: + +```jsonl +{"file_name": "0001.png", "additional_feature": "This is a first value of a text feature you added to your images"} +{"file_name": "0002.png", "additional_feature": "This is a second value of a text feature you added to your images"} +{"file_name": "0003.png", "additional_feature": "This is a third value of a text feature you added to your images"} +``` + +Here the `file_name` must be the name of the image file next to the metadata file. More generally, it must be the relative path from the directory containing the metadata to the image file. + +It's possible to point to more than one image in each row in your dataset, for example if both your input and output are images: + +```jsonl +{"input_file_name": "0001.png", "output_file_name": "0001_output.png"} +{"input_file_name": "0002.png", "output_file_name": "0002_output.png"} +{"input_file_name": "0003.png", "output_file_name": "0003_output.png"} +``` + +You can also define lists of images. In that case you need to name the field `file_names` or `*_file_names`. Here is an example: + +```jsonl +{"frames_file_names": ["0001_t0.png", "0001_t1.png"], label: "moving_up"} +{"frames_file_names": ["0002_t0.png", "0002_t1.png"], label: "moving_down"} +{"frames_file_names": ["0003_t0.png", "0003_t1.png"], label: "moving_right"} +``` + +### Image captioning + +Image captioning datasets have text describing an image. An example `metadata.csv` may look like: + +```csv +file_name,text +0001.png,This is a golden retriever playing with a ball +0002.png,A german shepherd +0003.png,One chihuahua +``` + +Load the dataset with `ImageFolder`, and it will create a `text` column for the image captions: + +```py +>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", split="train") +>>> dataset[0]["text"] +"This is a golden retriever playing with a ball" +``` + +### Object detection + +Object detection datasets have bounding boxes and categories identifying objects in an image. An example `metadata.jsonl` may look like: + +```jsonl +{"file_name": "0001.png", "objects": {"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]}} +{"file_name": "0002.png", "objects": {"bbox": [[810.0, 100.0, 57.0, 28.0]], "categories": [1]}} +{"file_name": "0003.png", "objects": {"bbox": [[160.0, 31.0, 248.0, 616.0], [741.0, 68.0, 202.0, 401.0]], "categories": [2, 2]}} +``` + +Load the dataset with `ImageFolder`, and it will create a `objects` column with the bounding boxes and the categories: + +```py +>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", split="train") +>>> dataset[0]["objects"] +{"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]} +``` + +### Upload dataset to the Hub + +Once you've created a dataset, you can share it to the Hub with the [`~datasets.DatasetDict.push_to_hub`] method. Make sure you have the [huggingface_hub](https://huggingface.co/docs/huggingface_hub/index) library installed and you're logged in to your Hugging Face account (see the [Upload with Python tutorial](upload_dataset#upload-with-python) for more details). + +Upload your dataset with [`~datasets.DatasetDict.push_to_hub`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", split="train") +>>> dataset.push_to_hub("stevhliu/my-image-captioning-dataset") +``` + +## WebDataset + +The [WebDataset](https://github.com/webdataset/webdataset) format is based on TAR archives and is suitable for big image datasets. +Indeed you can group your images in TAR archives (e.g. 1GB of images per TAR archive) and have thousands of TAR archives: + +``` +folder/train/00000.tar +folder/train/00001.tar +folder/train/00002.tar +... +``` + +In the archives, each example is made of files sharing the same prefix: + +``` +e39871fd9fd74f55.jpg +e39871fd9fd74f55.json +f18b91585c4d3f3e.jpg +f18b91585c4d3f3e.json +ede6e66b2fb59aab.jpg +ede6e66b2fb59aab.json +ed600d57fcee4f94.jpg +ed600d57fcee4f94.json +... +``` + +You can put your images labels/captions/bounding boxes using JSON or text files for example. + +Load your WebDataset and it will create on column per file suffix (here "jpg" and "json"): + +```python +>>> from datasets import load_dataset + +>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", split="train") +>>> dataset[0]["json"] +{"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]} +``` + +It's also possible to have several images per example like this: + +``` +e39871fd9fd74f55.input.jpg +e39871fd9fd74f55.output.jpg +e39871fd9fd74f55.json +f18b91585c4d3f3e.input.jpg +f18b91585c4d3f3e.output.jpg +f18b91585c4d3f3e.json +... +``` + +For more details on the WebDataset format and the python library, please check the [WebDataset documentation](https://webdataset.github.io/webdataset). + +## Lance + +[Lance](https://lance.org) is an open multimodal lakehouse table format. Lance tables can natively store not only text and scalar values, +but also large binary objects (blobs) such as images, audio, and video alongside your tabular data. + +Starting from image files on disk plus associated metadata (for example, captions and dimensions), you can write a self-contained Lance dataset to a +local `*.lance` directory. The resulting table can store your metadata columns alongside an `image` column containing the encoded image bytes. + +For example, you might start with metadata like: + +```text +{'caption': 'Cordelia and Dudley on their wedding day last year', 'height': 315, 'width': 233} +{'caption': 'Statistics on challenges for automation in 2021', 'height': 299, 'width': 701} +``` + +You can define a `pyarrow` schema for your metadata and image bytes, build a table, and write it as a Lance dataset: + +```python +import lance +import pyarrow as pa + +schema = pa.schema( + [ + pa.field("caption", pa.utf8()), + pa.field("height", pa.int32()), + pa.field("width", pa.int32()), + # ... add any additional metadata columns you want here ... + pa.field("image", pa.binary()), + ] +) + +# Provide image files alongside metadata +rows = [ + { + "image_path": "/path/to/images/0001.jpg", + "caption": "Cordelia and Dudley on their wedding day last year", + "height": 315, + "width": 233, + }, + { + "image_path": "/path/to/images/0002.jpg", + "caption": "Statistics on challenges for automation in 2021", + "height": 299, + "width": 701, + }, +] + +image_bytes = [] +for r in rows: + with open(r["image_path"], "rb") as f: + image_bytes.append(f.read()) + +table = pa.table( + { + "caption": [r["caption"] for r in rows], + "height": [r["height"] for r in rows], + "width": [r["width"] for r in rows], + "image": image_bytes, + }, + schema=schema, +) + +ds = lance.write_dataset( + table, + "./images.lance", + schema=schema, + mode="create", +) +``` + +Here's a representative view of what a Lance table storing images might look like (the `image` column contains encoded bytes): + +```text ++-----------------------------------------------+--------+-------+-----+------------------------------+ +| caption | height | width | ... | image | ++-----------------------------------------------+--------+-------+-----+------------------------------+ +| "Cordelia and Dudley on their wedding ..." | 315 | 233 | ... | b"\\xff\\xd8\\xff...\\xd9" | +| "Statistics on challenges for automation ..." | 299 | 701 | ... | b"\\xff\\xd8\\xff...\\xd9" | ++-----------------------------------------------+--------+-------+-----+------------------------------+ +``` + +Using this approach, you can store arbitrarily large image datasets in Lance. The resulting `images.lance/` directory with +its `*.lance` files can be uploaded to the Hugging Face Hub, just like the other examples above. See the `lance-format/laion-1m` +[on the Hub](https://huggingface.co/datasets/lance-format/laion-1m) dataset for an example of a Lance image dataset. + +For more details on working with Lance datasets, see the [Lance documentation](https://lance.org). \ No newline at end of file diff --git a/docs/source/image_load.mdx b/docs/source/image_load.mdx new file mode 100644 index 0000000..14fed64 --- /dev/null +++ b/docs/source/image_load.mdx @@ -0,0 +1,188 @@ +# Load image data + +Image datasets have [`Image`] type columns, which contain PIL objects. + +> [!TIP] +> To work with image datasets, you need to have the `vision` dependency installed. Check out the [installation](./installation#vision) guide to learn how to install it. + +When you load an image dataset and call the image column, the images are decoded as PIL Images: + +```py +>>> from datasets import load_dataset, Image + +>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train") +>>> dataset[0]["image"] +``` + +> [!WARNING] +> Index into an image dataset using the row index first and then the `image` column - `dataset[0]["image"]` - to avoid decoding and resampling all the image objects in the dataset. Otherwise, this can be a slow and time-consuming process if you have a large dataset. + +For a guide on how to load any type of dataset, take a look at the general loading guide. + +## Local files + +You can load a dataset from the image path. Use the [`~Dataset.cast_column`] function to accept a column of image file paths, and decode it into a PIL image with the [`Image`] feature: +```py +>>> from datasets import Dataset, Image + +>>> dataset = Dataset.from_dict({"image": ["path/to/image_1", "path/to/image_2", ..., "path/to/image_n"]}).cast_column("image", Image()) +>>> dataset[0]["image"] +] +``` + +If you only want to load the underlying path to the image dataset without decoding the image object, set `decode=False` in the [`Image`] feature: + +```py +>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train").cast_column("image", Image(decode=False)) +>>> dataset[0]["image"] +{'bytes': None, + 'path': '/root/.cache/huggingface/datasets/downloads/extracted/b0a21163f78769a2cf11f58dfc767fb458fc7cea5c05dccc0144a2c0f0bc1292/train/bean_rust/bean_rust_train.29.jpg'} +``` + +## ImageFolder + +You can also load a dataset with an `ImageFolder` dataset builder which does not require writing a custom dataloader. This makes `ImageFolder` ideal for quickly creating and loading image datasets with several thousand images for different vision tasks. Your image dataset structure should look like this: + +``` +folder/train/dog/golden_retriever.png +folder/train/dog/german_shepherd.png +folder/train/dog/chihuahua.png + +folder/train/cat/maine_coon.png +folder/train/cat/bengal.png +folder/train/cat/birman.png +``` + +Alternatively it should have metadata, for example: + +``` +folder/train/metadata.csv +folder/train/0001.png +folder/train/0002.png +folder/train/0003.png +``` + +If the dataset follows the `ImageFolder` structure, then you can load it directly with [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("username/dataset_name") +>>> # OR locally: +>>> dataset = load_dataset("/path/to/folder") +``` + +For local datasets, this is equivalent to passing `imagefolder` manually in [`load_dataset`] and the directory in `data_dir`: + +```py +>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder") +``` + +Then you can access the videos as `PIL.Image` objects: + +``` +>>> dataset["train"][0] +{"image": , "label": 0} + +>>> dataset["train"][-1] +{"image": , "label": 1} +``` + +To ignore the information in the metadata file, set `drop_metadata=True` in [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True) +``` + +If you don't have a metadata file, `ImageFolder` automatically infers the label name from the directory name. +If you want to drop automatically created labels, set `drop_labels=True`. +In this case, your dataset will only contain an image column: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True) +``` + +Finally the `filters` argument lets you load only a subset of the dataset, based on a condition on the label or the metadata. This is especially useful if the metadata is in Parquet format, since this format enables fast filtering. It is also recommended to use this argument with `streaming=True`, because by default the dataset is fully downloaded before filtering. + +```python +>>> filters = [("label", "=", 0)] +>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters) +``` + +> [!TIP] +> For more information about creating your own `ImageFolder` dataset, take a look at the [Create an image dataset](./image_dataset) guide. + + +## WebDataset + +The [WebDataset](https://github.com/webdataset/webdataset) format is based on a folder of TAR archives and is suitable for big image datasets. +Because of their size, WebDatasets are generally loaded in streaming mode (using `streaming=True`). + +You can load a WebDataset like this: + +```python +>>> from datasets import load_dataset + +>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", streaming=True) +``` + +## Lance + +[Lance](https://lance.org) is an open multimodal lakehouse table format. Lance tables can natively store not only text and scalar values, +but also large binary objects (blobs) such as images, audio, and video alongside your tabular data. + +Lance keeps your metadata and image blobs together in one place, while still letting you efficiently scan only the metadata columns you care about +without loading image bytes. When you're ready, you can fetch a small subset of rows (including the image blobs) and write them directly to files on +your local filesystem. + +```python +from datasets import load_dataset + +# Return as a Hugging Face dataset +ds = load_dataset( + "lance-format/laion-1m", + split="train", + streaming=True +) + +dir_name = "laion_samples" +Path(dir_name).mkdir(exist_ok=True) + +for idx, row in enumerate(ds.take(3)): + with open(f"{dir_name}/{idx}.jpg", "wb") as f: + f.write(row["image"]) +``` + +In this example, the `image` column contains the encoded image bytes, so you can write them directly to `.jpg` files. + +> [!NOTE] The `datasets` API doesn't currently push down operations to the Lance table, so for larger datasets it may be slow. +> For now, you'll get much better performance using the `lance` Python package directly. See the +> documentation on [the Hub](https://huggingface.co/docs/datasets-lance) for examples on usage. + +## Image decoding + +By default, images are decoded sequentially as `PIL.Images` when you iterate on a dataset. +However it is possible to speed up the dataset significantly using multithreaded decoding: + +```python +>>> import os +>>> num_threads = num_threads = min(32, (os.cpu_count() or 1) + 4) +>>> dataset = dataset.decode(num_threads=num_threads) +>>> for example in dataset: # up to 20 times faster ! +... ... +``` + +You can enable multithreading using `num_threads`. This is especially useful to speed up remote data streaming. +However it can be slower than `num_threads=0` for local data on fast disks. + +If you are not interested in the images decoded as `PIL.Images` and would like to access the path/bytes instead, you can disable decoding: + +```python +>>> dataset = dataset.decode(False) +``` + +Note: [`IterableDataset.decode`] is only available for streaming datasets at the moment. diff --git a/docs/source/image_process.mdx b/docs/source/image_process.mdx new file mode 100644 index 0000000..c1653a1 --- /dev/null +++ b/docs/source/image_process.mdx @@ -0,0 +1,72 @@ +# Process image data + +This guide shows specific methods for processing image datasets. Learn how to: + +- Use [`~Dataset.map`] with image dataset. +- Apply data augmentations to a dataset with [`~Dataset.set_transform`]. + +For a guide on how to process any type of dataset, take a look at the general process guide. + +## Map + +The [`~Dataset.map`] function can apply transforms over an entire dataset. + +For example, create a basic [`Resize`](https://pytorch.org/vision/stable/generated/torchvision.transforms.Resize.html) function: + +```py +>>> def transforms(examples): +... examples["pixel_values"] = [image.convert("RGB").resize((100,100)) for image in examples["image"]] +... return examples +``` + +Now use the [`~Dataset.map`] function to resize the entire dataset, and set `batched=True` to speed up the process by accepting batches of examples. The transform returns `pixel_values` as a cacheable `PIL.Image` object: + +```py +>>> dataset = dataset.map(transforms, remove_columns=["image"], batched=True) +>>> dataset[0] +{'label': 6, + 'pixel_values': } +``` + +The cache file saves time because you don't have to execute the same transform twice. The [`~Dataset.map`] function is best for operations you only run once per training - like resizing an image - instead of using it for operations executed for each epoch, like data augmentations. + +[`~Dataset.map`] takes up some memory, but you can reduce its memory requirements with the following parameters: + +- [`batch_size`](./package_reference/main_classes#datasets.DatasetDict.map.batch_size) determines the number of examples that are processed in one call to the transform function. +- [`writer_batch_size`](./package_reference/main_classes#datasets.DatasetDict.map.writer_batch_size) determines the number of processed examples that are kept in memory before they are stored away. + +Both parameter values default to 1000, which can be expensive if you are storing images. Lower these values to use less memory when you use [`~Dataset.map`]. + +## Apply transforms + +🤗 Datasets applies data augmentations from any library or package to your dataset. Transforms can be applied on-the-fly on batches of data with [`~Dataset.set_transform`], which consumes less disk space. + +> [!TIP] +> The following example uses [torchvision](https://pytorch.org/vision/stable/index.html), but feel free to use other data augmentation libraries like [Albumentations](https://albumentations.ai/docs/), [Kornia](https://kornia.readthedocs.io/en/latest/), and [imgaug](https://imgaug.readthedocs.io/en/latest/). + +For example, if you'd like to change the color properties of an image randomly: + +```py +>>> from torchvision.transforms import Compose, ColorJitter, ToTensor + +>>> jitter = Compose( +... [ +... ColorJitter(brightness=0.25, contrast=0.25, saturation=0.25, hue=0.7), +... ToTensor(), +... ] +... ) +``` + +Create a function to apply the `ColorJitter` transform: + +```py +>>> def transforms(examples): +... examples["pixel_values"] = [jitter(image.convert("RGB")) for image in examples["image"]] +... return examples +``` + +Apply the transform with the [`~Dataset.set_transform`] function: + +```py +>>> dataset.set_transform(transforms) +``` \ No newline at end of file diff --git a/docs/source/imgs/course_banner.png b/docs/source/imgs/course_banner.png new file mode 100644 index 0000000000000000000000000000000000000000..45773d164c4c009d4c0d9a0c37cb93613b1a9160 GIT binary patch literal 80305 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 literal 0 HcmV?d00001 diff --git a/docs/source/imgs/datasets_logo_name.jpg b/docs/source/imgs/datasets_logo_name.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7162c2c1f22b902852d45fd6c1f21256ba33d938 GIT binary patch literal 46530 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 + +🤗 Datasets is a library for easily accessing and sharing AI datasets for Audio, Computer Vision, and Natural Language Processing (NLP) tasks. + +Load a dataset in a single line of code, and use our powerful data processing and streaming methods to quickly get your dataset ready for training in a deep learning model. Backed by the Apache Arrow format, process large datasets with zero-copy reads without any memory constraints for optimal speed and efficiency. We also feature a deep integration with the [Hugging Face Hub](https://huggingface.co/datasets), allowing you to easily load and share a dataset with the wider machine learning community. + +Find your dataset today on the [Hugging Face Hub](https://huggingface.co/datasets), and take an in-depth look inside of it with the live viewer. + +

diff --git a/docs/source/installation.md b/docs/source/installation.md new file mode 100644 index 0000000..fd50aac --- /dev/null +++ b/docs/source/installation.md @@ -0,0 +1,103 @@ +# Installation + +Before you start, you'll need to setup your environment and install the appropriate packages. 🤗 Datasets is tested on **Python 3.10+**. + +> [!TIP] +> If you want to use 🤗 Datasets with TensorFlow or PyTorch, you'll need to install them separately. Refer to the [TensorFlow installation page](https://www.tensorflow.org/install/pip#tensorflow-2-packages-are-available) or the [PyTorch installation page](https://pytorch.org/get-started/locally/#start-locally) for the specific install command for your framework. + +## Virtual environment + +You should install 🤗 Datasets in a [virtual environment](https://docs.python.org/3/library/venv.html) to keep things tidy and avoid dependency conflicts. + +1. Create and navigate to your project directory: + + ```bash + mkdir ~/my-project + cd ~/my-project + ``` + +2. Start a virtual environment inside your directory: + + ```bash + python -m venv .env + ``` + +3. Activate and deactivate the virtual environment with the following commands: + + ```bash + # Activate the virtual environment + source .env/bin/activate + + # Deactivate the virtual environment + source .env/bin/deactivate + ``` + +Once you've created your virtual environment, you can install 🤗 Datasets in it. + +## pip + +The most straightforward way to install 🤗 Datasets is with pip: + +```bash +pip install datasets +``` + +Run the following command to check if 🤗 Datasets has been properly installed: + +```bash +python -c "from datasets import load_dataset; print(load_dataset('rajpurkar/squad', split='train')[0])" +``` + +This command downloads version 1 of the [Stanford Question Answering Dataset (SQuAD)](https://rajpurkar.github.io/SQuAD-explorer/), loads the training split, and prints the first training example. You should see: + +```python +{'answers': {'answer_start': [515], 'text': ['Saint Bernadette Soubirous']}, 'context': 'Architecturally, the school has a Catholic character. Atop the Main Building\'s gold dome is a golden statue of the Virgin Mary. Immediately in front of the Main Building and facing it, is a copper statue of Christ with arms upraised with the legend "Venite Ad Me Omnes". Next to the Main Building is the Basilica of the Sacred Heart. Immediately behind the basilica is the Grotto, a Marian place of prayer and reflection. It is a replica of the grotto at Lourdes, France where the Virgin Mary reputedly appeared to Saint Bernadette Soubirous in 1858. At the end of the main drive (and in a direct line that connects through 3 statues and the Gold Dome), is a simple, modern stone statue of Mary.', 'id': '5733be284776f41900661182', 'question': 'To whom did the Virgin Mary allegedly appear in 1858 in Lourdes France?', 'title': 'University_of_Notre_Dame'} +``` + +## Audio + +To work with audio datasets, you need to install the [`Audio`] feature as an extra dependency: + +```bash +pip install datasets[audio] +``` + +## Vision + +To work with image datasets, you need to install the [`Image`] feature as an extra dependency: + +```bash +pip install datasets[vision] +``` + +## Mesh + +To work with mesh datasets, you need to install the [`Mesh`] feature as an extra dependency: + +```bash +pip install datasets[mesh] +``` + +## source + +Building 🤗 Datasets from source lets you make changes to the code base. To install from the source, clone the repository and install with the following commands: + +```bash +git clone https://github.com/huggingface/datasets.git +cd datasets +pip install -e . +``` + +Again, you can check if 🤗 Datasets was properly installed with the following command: + +```bash +python -c "from datasets import load_dataset; print(load_dataset('rajpurkar/squad', split='train')[0])" +``` + +## conda + +🤗 Datasets can also be installed from conda, a package management system: + +```bash +conda install -c huggingface -c conda-forge datasets +``` diff --git a/docs/source/load_hub.mdx b/docs/source/load_hub.mdx new file mode 100644 index 0000000..49777e7 --- /dev/null +++ b/docs/source/load_hub.mdx @@ -0,0 +1,101 @@ +# Load a dataset from the Hub + +Finding high-quality datasets that are reproducible and accessible can be difficult. One of 🤗 Datasets main goals is to provide a simple way to load a dataset of any format or type. The easiest way to get started is to discover an existing dataset on the [Hugging Face Hub](https://huggingface.co/datasets) - a community-driven collection of datasets for tasks in NLP, computer vision, and audio - and use 🤗 Datasets to download and generate the dataset. + +This tutorial uses the [rotten_tomatoes](https://huggingface.co/datasets/rotten_tomatoes) and [MInDS-14](https://huggingface.co/datasets/PolyAI/minds14) datasets, but feel free to load any dataset you want and follow along. Head over to the Hub now and find a dataset for your task! + +## Load a dataset + +Before you take the time to download a dataset, it's often helpful to quickly get some general information about a dataset. A dataset's information is stored inside [`DatasetInfo`] and can include information such as the dataset description, features, and dataset size. + +Use the [`load_dataset_builder`] function to load a dataset builder and inspect a dataset's attributes without committing to downloading it: + +```py +>>> from datasets import load_dataset_builder +>>> ds_builder = load_dataset_builder("cornell-movie-review-data/rotten_tomatoes") + +# Inspect dataset description +>>> ds_builder.info.description +Movie Review Dataset. This is a dataset of containing 5,331 positive and 5,331 negative processed sentences from Rotten Tomatoes movie reviews. This data was first used in Bo Pang and Lillian Lee, ``Seeing stars: Exploiting class relationships for sentiment categorization with respect to rating scales.'', Proceedings of the ACL, 2005. + +# Inspect dataset features +>>> ds_builder.info.features +{'label': ClassLabel(names=['neg', 'pos']), + 'text': Value('string')} +``` + +If you're happy with the dataset, then load it with [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train") +``` + +## Splits + +A split is a specific subset of a dataset like `train` and `test`. List a dataset's split names with the [`get_dataset_split_names`] function: + +```py +>>> from datasets import get_dataset_split_names + +>>> get_dataset_split_names("cornell-movie-review-data/rotten_tomatoes") +['train', 'validation', 'test'] +``` + +Then you can load a specific split with the `split` parameter. Loading a dataset `split` returns a [`Dataset`] object: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train") +>>> dataset +Dataset({ + features: ['text', 'label'], + num_rows: 8530 +}) +``` + +If you don't specify a `split`, 🤗 Datasets returns a [`DatasetDict`] object instead: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes") +DatasetDict({ + train: Dataset({ + features: ['text', 'label'], + num_rows: 8530 + }) + validation: Dataset({ + features: ['text', 'label'], + num_rows: 1066 + }) + test: Dataset({ + features: ['text', 'label'], + num_rows: 1066 + }) +}) +``` + +## Configurations + +Some datasets contain several sub-datasets. For example, the [MInDS-14](https://huggingface.co/datasets/PolyAI/minds14) dataset has several sub-datasets, each one containing audio data in a different language. These sub-datasets are known as *configurations* or *subsets*, and you must explicitly select one when loading the dataset. If you don't provide a configuration name, 🤗 Datasets will raise a `ValueError` and remind you to choose a configuration. + +Use the [`get_dataset_config_names`] function to retrieve a list of all the possible configurations available to your dataset: + +```py +>>> from datasets import get_dataset_config_names + +>>> configs = get_dataset_config_names("PolyAI/minds14") +>>> print(configs) +['cs-CZ', 'de-DE', 'en-AU', 'en-GB', 'en-US', 'es-ES', 'fr-FR', 'it-IT', 'ko-KR', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'zh-CN', 'all'] +``` + +Then load the configuration you want: + +```py +>>> from datasets import load_dataset + +>>> mindsFR = load_dataset("PolyAI/minds14", "fr-FR", split="train") +``` diff --git a/docs/source/loading.mdx b/docs/source/loading.mdx new file mode 100644 index 0000000..c39b0e3 --- /dev/null +++ b/docs/source/loading.mdx @@ -0,0 +1,469 @@ +# Load + +Your data can be stored in various places; they can be on your local machine's disk, in a Github repository, and in in-memory data structures like Python dictionaries and Pandas DataFrames. Wherever a dataset is stored, 🤗 Datasets can help you load it. + +This guide will show you how to load a dataset from: + +- The Hugging Face Hub +- Local files +- In-memory data +- Offline +- A specific slice of a split + +For more details specific to loading other dataset modalities, take a look at the load audio dataset guide, the load image dataset guide, the load video dataset guide, the load mesh dataset guide, or the load text dataset guide. + + + +## Hugging Face Hub + +You can also load a dataset from any dataset repository on the Hub! Begin by [creating a dataset repository](share#create-the-repository) and upload your data files. Now you can use the [`load_dataset`] function to load the dataset. + +For example, try loading the files from this [demo repository](https://huggingface.co/datasets/lhoestq/demo1) by providing the repository namespace and dataset name. This dataset repository contains CSV files, and the code below loads the dataset from the CSV files: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("lhoestq/demo1") +``` + +Some datasets may have more than one version based on Git tags, branches, or commits. Use the `revision` parameter to specify the dataset version you want to load: + +```py +>>> dataset = load_dataset( +... "lhoestq/custom_squad", +... revision="main" # tag name, or branch name, or commit hash +... ) +``` + +> [!TIP] +> Refer to the [Upload a dataset to the Hub](./upload_dataset) tutorial for more details on how to create a dataset repository on the Hub, and how to upload your data files. + +A dataset loads by default all the data into the `train` split, or checks for mentions or split names in the data files names (e.g. "train", "test" and "validation"). Use the `data_files` parameter to map data files to splits like `train`, `validation` and `test`: + +```py +>>> data_files = {"train": "train.csv", "test": "test.csv"} +>>> dataset = load_dataset("namespace/your_dataset_name", data_files=data_files) +``` + +> [!WARNING] +> If you don't specify which data files to use, [`load_dataset`] will return all the data files. This can take a long time if you load a large dataset like C4, which is approximately 13TB of data. + +You can also load a specific subset of the files with the `data_files` or `data_dir` parameter. These parameters can accept a relative path which resolves to the base path corresponding to where the dataset is loaded from. + +```py +>>> from datasets import load_dataset + +# load files that match the grep pattern +>>> c4_subset = load_dataset("allenai/c4", data_files="en/c4-train.0000*-of-01024.json.gz") + +# load dataset from the en directory on the Hub +>>> c4_subset = load_dataset("allenai/c4", data_dir="en") +``` + +The `split` parameter can also map a data file to a specific split: + +```py +>>> data_files = {"validation": "en/c4-validation.*.json.gz"} +>>> c4_validation = load_dataset("allenai/c4", data_files=data_files, split="validation") +``` + +## Local and remote files + +Datasets can be loaded from local files stored on your computer and from remote files. The datasets are most likely stored as a `csv`, `json`, `txt`, `parquet` or `tsfile` file. The [`load_dataset`] function can load each of these file types. + +### CSV + +🤗 Datasets can read a dataset made up of one or several CSV files (in this case, pass your CSV files as a list): + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("csv", data_files="my_file.csv") +``` + +> [!TIP] +> For more details, check out the [how to load tabular datasets from CSV files](tabular_load#csv-files) guide. + +### JSON + +JSON files are loaded directly with [`load_dataset`] as shown below: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("json", data_files="my_file.json") +``` + +JSON files have diverse formats, but we think the most efficient format is to have multiple JSON objects; each line represents an individual row of data. For example: + +```json +{"a": 1, "b": 2.0, "c": "foo", "d": false} +{"a": 4, "b": -5.5, "c": null, "d": true} +``` + +Another JSON format you may encounter is a nested field, in which case you'll need to specify the `field` argument as shown in the following: + +```py +{"version": "0.1.0", + "data": [{"a": 1, "b": 2.0, "c": "foo", "d": false}, + {"a": 4, "b": -5.5, "c": null, "d": true}] +} + +>>> from datasets import load_dataset +>>> dataset = load_dataset("json", data_files="my_file.json", field="data") +``` + +To load remote JSON files via HTTP, pass the URLs instead: + +```py +>>> base_url = "https://rajpurkar.github.io/SQuAD-explorer/dataset/" +>>> dataset = load_dataset("json", data_files={"train": base_url + "train-v1.1.json", "validation": base_url + "dev-v1.1.json"}, field="data") +``` + +While these are the most common JSON formats, you'll see other datasets that are formatted differently. 🤗 Datasets recognizes these other formats and will fallback accordingly on the Python JSON loading methods to handle them. + +### Parquet + +Parquet files are stored in a columnar format, unlike row-based files like a CSV. Large datasets may be stored in a Parquet file because it is more efficient and faster at returning your query. + +To load a Parquet file: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("parquet", data_files={'train': 'train.parquet', 'test': 'test.parquet'}) +``` + +To load remote Parquet files via HTTP, pass the URLs instead: + +```py +>>> base_url = "https://huggingface.co/datasets/wikimedia/wikipedia/resolve/main/20231101.ab/" +>>> data_files = {"train": base_url + "train-00000-of-00001.parquet"} +>>> wiki = load_dataset("parquet", data_files=data_files, split="train") +``` + +### Arrow + +Arrow files are stored in an in-memory columnar format, unlike row-based formats like CSV and uncompressed formats like Parquet. + +To load an Arrow file: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("arrow", data_files={'train': 'train.arrow', 'test': 'test.arrow'}) +``` + +To load remote Arrow files via HTTP, pass the URLs instead: + +```py +>>> base_url = "https://huggingface.co/datasets/croissantllm/croissant_dataset/resolve/main/english_660B_11/" +>>> data_files = {"train": base_url + "train/data-00000-of-00080.arrow"} +>>> wiki = load_dataset("arrow", data_files=data_files, split="train") +``` + +Arrow is the file format used by 🤗 Datasets under the hood, therefore you can load a local Arrow file using [`Dataset.from_file`] directly: + +```py +>>> from datasets import Dataset +>>> dataset = Dataset.from_file("data.arrow") +``` + +Unlike [`load_dataset`], [`Dataset.from_file`] memory maps the Arrow file without preparing the dataset in the cache, saving you disk space. +The cache directory to store intermediate processing results will be the Arrow file directory in that case. + +For now only the Arrow streaming format is supported. The Arrow IPC file format (also known as Feather V2) is not supported. + +### Lance + +[Lance](https://lance.org) is an open multimodal lakehouse table format for AI. Lance tables can natively store not only text and scalar values, but also large binary objects (blobs) such as images, audio, and video alongside your tabular data. + +```py +>>> from datasets import load_dataset +>>> lance_base_url = "lance-format/laion-1m" +``` + +To stream the dataset without copying it to your local machine, specify the `streaming=True` parameter: + +```py +ds = load_dataset(lance_base_url, split="train", streaming=True) +# Take first three rows +for row in ds.take(3): + print(row["caption"], row["image"]) +``` + +This will return the image caption and the image bytes in a single request. + +### HDF5 files + +[HDF5](https://www.hdfgroup.org/solutions/hdf5/) files are commonly used for storing large amounts of numerical data in scientific computing and machine learning. Loading HDF5 files with 🤗 Datasets is similar to loading CSV files: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("hdf5", data_files="data.h5") +``` + +Note that the HDF5 loader assumes that the file has "tabular" structure, i.e. that all datasets in the file have (the same number of) rows on their first dimension. + +### TsFile + +[TsFile](https://tsfile.apache.org/) is a columnar file format designed for time-series data, used as the native storage layer of [Apache IoTDB](https://iotdb.apache.org/). It natively represents timestamps, device tags, and measurement fields, and maintains an internal time index that enables efficient time-range pruning. + +Each row in the resulting dataset corresponds to one **device** (identified by its TAG columns); the `time` column and every FIELD column are list columns containing that device's full time series, sorted in ascending time order. + +To load a TsFile: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("tsfile", data_files="my_data.tsfile") +``` + +Filter by time range — bounds are pushed down to TsFile's internal time index and accept `int` epochs, `datetime`, `date`, ISO-8601 strings, or `pyarrow` timestamp scalars: + +```py +>>> from datetime import datetime +>>> dataset = load_dataset( +... "tsfile", +... data_files="my_data.tsfile", +... start_time=datetime(2023, 11, 14), +... end_time=datetime(2023, 11, 15), +... ) +``` + +> [!TIP] +> For more details, check out the [how to load TsFile data](tsfile_load) guide. + +### SQL + +Read database contents with [`~datasets.Dataset.from_sql`] by specifying the URI to connect to your database. You can read both table names and queries: + +```py +>>> from datasets import Dataset +# load entire table +>>> dataset = Dataset.from_sql("data_table_name", con="sqlite:///sqlite_file.db") +# load from query +>>> dataset = Dataset.from_sql("SELECT text FROM table WHERE length(text) > 100 LIMIT 10", con="sqlite:///sqlite_file.db") +``` + +> [!TIP] +> For more details, check out the [how to load tabular datasets from SQL databases](tabular_load#databases) guide. + +### WebDataset + +The [WebDataset](https://github.com/webdataset/webdataset) format is based on TAR archives and is suitable for big image datasets. +Because of their size, WebDatasets are generally loaded in streaming mode (using `streaming=True`). + +You can load a WebDataset like this: + +```python +>>> from datasets import load_dataset +>>> +>>> path = "path/to/train/*.tar" +>>> dataset = load_dataset("webdataset", data_files={"train": path}, split="train", streaming=True) +``` + +To load remote WebDatasets via HTTP, pass the URLs instead: + +```python +>>> from datasets import load_dataset +>>> +>>> base_url = "https://huggingface.co/datasets/lhoestq/small-publaynet-wds/resolve/main/publaynet-train-{i:06d}.tar" +>>> urls = [base_url.format(i=i) for i in range(4)] +>>> dataset = load_dataset("webdataset", data_files={"train": urls}, split="train", streaming=True) +``` + +## Remote files + +If you have remote files likely stored as a `csv`, `json`, `txt`, `parquet` or any supported format, the [`load_dataset`] function can load load them if you specify their remote paths: + +- `https://` URLs for public online files, e.g. `data_files=["https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json"]` +- `hf://` URLs for files in any [Dataset repository](https://huggingface.co/docs/hub/datasets-overview) or [Storage Bucket](https://huggingface.co/docs/hub/storage-buckets) on Hugging Face, e.g. `data_files=["hf://datasets/karpathy/tinystories-gpt4-clean/tinystories_gpt4_clean.parquet"]` or `data_files=["hf://buckets/julien-c/my-training-bucket/julien/affluence.csv"]` + +## Multiprocessing + +When a dataset is made of several files (that we call "shards"), it is possible to significantly speed up the dataset downloading and preparation step. + +You can choose how many processes you'd like to use to prepare a dataset in parallel using `num_proc`. +In this case, each process is given a subset of shards to prepare: + +```python +from datasets import load_dataset + +imagenet = load_dataset("timm/imagenet-1k-wds", num_proc=8) +ml_librispeech_spanish = load_dataset("facebook/multilingual_librispeech", "spanish", num_proc=8) +``` + +## In-memory data + +🤗 Datasets will also allow you to create a [`Dataset`] directly from in-memory data structures like Python dictionaries and Pandas DataFrames. + +### Python dictionary + +Load Python dictionaries with [`~Dataset.from_dict`]: + +```py +>>> from datasets import Dataset +>>> my_dict = {"a": [1, 2, 3]} +>>> dataset = Dataset.from_dict(my_dict) +``` + +### Python list of dictionaries + +Load a list of Python dictionaries with [`~Dataset.from_list`]: + +```py +>>> from datasets import Dataset +>>> my_list = [{"a": 1}, {"a": 2}, {"a": 3}] +>>> dataset = Dataset.from_list(my_list) +``` + +### Python generator + +Create a dataset from a Python generator with [`~Dataset.from_generator`]: + +```py +>>> from datasets import Dataset +>>> def my_gen(): +... for i in range(1, 4): +... yield {"a": i} +... +>>> dataset = Dataset.from_generator(my_gen) +``` + +This approach supports loading data larger than available memory. + +You can also define a sharded dataset by passing lists to `gen_kwargs`: + +```py +>>> def gen(shards): +... for shard in shards: +... with open(shard) as f: +... for line in f: +... yield {"line": line} +... +>>> shards = [f"data{i}.txt" for i in range(32)] +>>> ds = IterableDataset.from_generator(gen, gen_kwargs={"shards": shards}) +>>> ds = ds.shuffle(seed=42, buffer_size=10_000) # shuffles the shards order + uses a shuffle buffer +>>> from torch.utils.data import DataLoader +>>> dataloader = DataLoader(ds.with_format("torch"), num_workers=4) # give each worker a subset of 32/4=8 shards +``` + +### Pandas DataFrame + +Load Pandas DataFrames with [`~Dataset.from_pandas`]: + +```py +>>> from datasets import Dataset +>>> import pandas as pd +>>> df = pd.DataFrame({"a": [1, 2, 3]}) +>>> dataset = Dataset.from_pandas(df) +``` + +> [!TIP] +> For more details, check out the [how to load tabular datasets from Pandas DataFrames](tabular_load#pandas-dataframes) guide. + +## Offline + +Even if you don't have an internet connection, it is still possible to load a dataset. As long as you've downloaded a dataset from the Hub repository before, it should be cached. This means you can reload the dataset from the cache and use it offline. + +If you know you won't have internet access, you can run 🤗 Datasets in full offline mode. This saves time because instead of waiting for the Dataset builder download to time out, 🤗 Datasets will look directly in the cache. Set the environment variable `HF_HUB_OFFLINE` to `1` to enable full offline mode. + +## Slice splits + +You can also choose only to load specific slices of a split. There are two options for slicing a split: using strings or the [`ReadInstruction`] API. Strings are more compact and readable for simple cases, while [`ReadInstruction`] is easier to use with variable slicing parameters. + +Concatenate a `train` and `test` split by: + +```py +>>> train_test_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train+test") +===STRINGAPI-READINSTRUCTION-SPLIT=== +>>> ri = datasets.ReadInstruction("train") + datasets.ReadInstruction("test") +>>> train_test_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split=ri) +``` + +Select specific rows of the `train` split: + +```py +>>> train_10_20_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[10:20]") +===STRINGAPI-READINSTRUCTION-SPLIT=== +>>> train_10_20_ds = datasets.load_dataset("rojagtap/bookcorpus", split=datasets.ReadInstruction("train", from_=10, to=20, unit="abs")) +``` + +Or select a percentage of a split with: + +```py +>>> train_10pct_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[:10%]") +===STRINGAPI-READINSTRUCTION-SPLIT=== +>>> train_10_20_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split=datasets.ReadInstruction("train", to=10, unit="%")) +``` + +Select a combination of percentages from each split: + +```py +>>> train_10_80pct_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[:10%]+train[-80%:]") +===STRINGAPI-READINSTRUCTION-SPLIT=== +>>> ri = (datasets.ReadInstruction("train", to=10, unit="%") + datasets.ReadInstruction("train", from_=-80, unit="%")) +>>> train_10_80pct_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split=ri) +``` + +Finally, you can even create cross-validated splits. The example below creates 10-fold cross-validated splits. Each validation dataset is a 10% chunk, and the training dataset makes up the remaining complementary 90% chunk: + +```py +>>> val_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split=[f"train[{k}%:{k+10}%]" for k in range(0, 100, 10)]) +>>> train_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split=[f"train[:{k}%]+train[{k+10}%:]" for k in range(0, 100, 10)]) +===STRINGAPI-READINSTRUCTION-SPLIT=== +>>> val_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", [datasets.ReadInstruction("train", from_=k, to=k+10, unit="%") for k in range(0, 100, 10)]) +>>> train_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", [(datasets.ReadInstruction("train", to=k, unit="%") + datasets.ReadInstruction("train", from_=k+10, unit="%")) for k in range(0, 100, 10)]) +``` + +### Percent slicing and rounding + +The default behavior is to round the boundaries to the nearest integer for datasets where the requested slice boundaries do not divide evenly by 100. As shown below, some slices may contain more examples than others. For instance, if the following train split includes 999 records, then: + +```py +# 19 records, from 500 (included) to 519 (excluded). +>>> train_50_52_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[50%:52%]") +# 20 records, from 519 (included) to 539 (excluded). +>>> train_52_54_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[52%:54%]") +``` + +If you want equal sized splits, use `pct1_dropremainder` rounding instead. This treats the specified percentage boundaries as multiples of 1%. + +```py +# 18 records, from 450 (included) to 468 (excluded). +>>> train_50_52pct1_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split=datasets.ReadInstruction("train", from_=50, to=52, unit="%", rounding="pct1_dropremainder")) +# 18 records, from 468 (included) to 486 (excluded). +>>> train_52_54pct1_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split=datasets.ReadInstruction("train",from_=52, to=54, unit="%", rounding="pct1_dropremainder")) +# Or equivalently: +>>> train_50_52pct1_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[50%:52%](pct1_dropremainder)") +>>> train_52_54pct1_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[52%:54%](pct1_dropremainder)") +``` + +> [!WARNING] +> `pct1_dropremainder` rounding may truncate the last examples in a dataset if the number of examples in your dataset don't divide evenly by 100. + + + +## Troubleshooting + +Sometimes, you may get unexpected results when you load a dataset. Two of the most common issues you may encounter are manually downloading a dataset and specifying features of a dataset. + +### Specify features + +When you create a dataset from local files, the [`Features`] are automatically inferred by [Apache Arrow](https://arrow.apache.org/docs/). However, the dataset's features may not always align with your expectations, or you may want to define the features yourself. The following example shows how you can add custom labels with the [`ClassLabel`] feature. + +Start by defining your own labels with the [`Features`] class: + +```py +>>> class_names = ["sadness", "joy", "love", "anger", "fear", "surprise"] +>>> emotion_features = Features({'text': Value('string'), 'label': ClassLabel(names=class_names)}) +``` + +Next, specify the `features` parameter in [`load_dataset`] with the features you just created: + +```py +>>> dataset = load_dataset('csv', data_files=file_dict, delimiter=';', column_names=['text', 'label'], features=emotion_features) +``` + +Now when you look at your dataset features, you can see it uses the custom labels you defined: + +```py +>>> dataset['train'].features +{'text': Value('string'), +'label': ClassLabel(names=['sadness', 'joy', 'love', 'anger', 'fear', 'surprise'])} +``` diff --git a/docs/source/mesh_dataset.mdx b/docs/source/mesh_dataset.mdx new file mode 100644 index 0000000..fd0ef4a --- /dev/null +++ b/docs/source/mesh_dataset.mdx @@ -0,0 +1,164 @@ +# Create a mesh dataset + +There are two methods for creating and sharing a mesh dataset. This guide will show you how to: + +* Create a mesh dataset from local files in python with [`Dataset.push_to_hub`]. This is an easy way that requires only a few steps in python. + +* Create a mesh dataset with `MeshFolder` and some metadata. This is a no-code solution for quickly creating a mesh dataset with several thousand 3D files. + +> [!TIP] +> You can control access to your dataset by requiring users to share their contact information first. Check out the [Gated datasets](https://huggingface.co/docs/hub/datasets-gated) guide for more information about how to enable this feature on the Hub. + +## Local files + +You can load your own dataset using the paths to your mesh files. Use the [`~Dataset.cast_column`] function to take a column of mesh file paths, and cast it to the [`Mesh`] feature: + +```py +>>> from datasets import Dataset, Mesh + +>>> mesh_dataset = Dataset.from_dict({"mesh": ["path/to/model_1.glb", "path/to/model_2.ply", "path/to/model_3.stl"]}).cast_column("mesh", Mesh()) +>>> mesh_dataset[0]["mesh"] + +``` + +Then upload the dataset to the Hugging Face Hub using [`Dataset.push_to_hub`]: + +```py +mesh_dataset.push_to_hub("/my_dataset") +``` + +This will create a dataset repository containing your mesh dataset: + +```text +my_dataset/README.md +my_dataset/data/train-00000-of-00001.parquet +``` + +## MeshFolder + +The `MeshFolder` is a dataset builder designed to quickly load a mesh dataset with several thousand mesh files without requiring you to write any code. + +> [!TIP] +> Take a look at the [Split pattern hierarchy](repository_structure#split-pattern-hierarchy) to learn more about how `MeshFolder` creates dataset splits based on your dataset repository structure. + +`MeshFolder` automatically infers the class labels of your dataset based on the directory name. Store your dataset in a directory structure like: + +```text +folder/train/diya/brass_diya.glb +folder/train/diya/clay_diya.ply +folder/train/diya/festival_diya.stl + +folder/train/kalash/copper_kalash.glb +folder/train/kalash/pooja_kalash.ply +folder/train/kalash/temple_kalash.stl +``` + +If the dataset follows the `MeshFolder` structure, then you can load it directly with [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("path/to/folder") +``` + +This is equivalent to passing `meshfolder` manually in [`load_dataset`] and the directory in `data_dir`: + +```py +>>> dataset = load_dataset("meshfolder", data_dir="/path/to/folder") +``` + +You can also use `meshfolder` to load datasets involving multiple splits. To do so, your dataset directory should have the following structure: + +```text +folder/train/diya/brass_diya.glb +folder/train/kalash/copper_kalash.glb +folder/test/diya/clay_diya.ply +folder/test/kalash/temple_kalash.stl +``` + +> [!WARNING] +> If all mesh files are contained in a single directory or if they are not on the same level of directory structure, `label` column won't be added automatically. If you need it, set `drop_labels=False` explicitly. + +If there is additional information you'd like to include about your dataset, like text captions or 3D asset metadata, add it as a `metadata.csv` file in your folder. You can also use a JSONL file `metadata.jsonl` or a Parquet file `metadata.parquet`. + +```text +folder/train/metadata.csv +folder/train/0001.glb +folder/train/0002.ply +folder/train/0003.stl +``` + +You can also zip your mesh files, and in this case each zip should contain both the mesh files and the metadata. + +```text +folder/train.zip +folder/test.zip +folder/validation.zip +``` + +Your `metadata.csv` file must have a `file_name` or `*_file_name` field which links mesh files with their metadata: + +```csv +file_name,caption +0001.glb,A brass diya with a small bowl and raised wick holder +0002.ply,A copper kalash with a rounded body and narrow neck +0003.stl,A carved jharokha window with an arched frame +``` + +or using `metadata.jsonl`: + +```jsonl +{"file_name": "0001.glb", "caption": "A brass diya with a small bowl and raised wick holder"} +{"file_name": "0002.ply", "caption": "A copper kalash with a rounded body and narrow neck"} +{"file_name": "0003.stl", "caption": "A carved jharokha window with an arched frame"} +``` + +Here the `file_name` must be the name of the mesh file next to the metadata file. More generally, it must be the relative path from the directory containing the metadata to the mesh file. + +It's possible to point to more than one mesh in each row in your dataset, for example if both your input and output are mesh files: + +```jsonl +{"input_file_name": "0001.glb", "output_file_name": "0001_output.glb"} +{"input_file_name": "0002.ply", "output_file_name": "0002_output.ply"} +{"input_file_name": "0003.stl", "output_file_name": "0003_output.stl"} +``` + +You can also define lists of meshes. In that case you need to name the field `file_names` or `*_file_names`. Here is an example: + +```jsonl +{"parts_file_names": ["0001_bowl.glb", "0001_wick_holder.glb"], "label": "diya"} +{"parts_file_names": ["0002_body.ply", "0002_neck.ply"], "label": "kalash"} +{"parts_file_names": ["0003_frame.stl", "0003_arch.stl"], "label": "jharokha"} +``` + +### Mesh captioning + +Mesh captioning datasets have text describing a 3D mesh. An example `metadata.csv` may look like: + +```csv +file_name,text +0001.glb,A brass diya with a small bowl and raised wick holder +0002.ply,A copper kalash with a rounded body and narrow neck +0003.stl,A carved jharokha window with an arched frame +``` + +Load the dataset with `MeshFolder`, and it will create a `text` column for the mesh captions: + +```py +>>> dataset = load_dataset("meshfolder", data_dir="/path/to/folder", split="train") +>>> dataset[0]["text"] +"A brass diya with a small bowl and raised wick holder" +``` + +### Upload dataset to the Hub + +Once you've created a dataset, you can share it to the Hub with the [`~datasets.DatasetDict.push_to_hub`] method. Make sure you have the [huggingface_hub](https://huggingface.co/docs/huggingface_hub/index) library installed and you're logged in to your Hugging Face account (see the [Upload with Python tutorial](upload_dataset#upload-with-python) for more details). + +Upload your dataset with [`~datasets.DatasetDict.push_to_hub`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("meshfolder", data_dir="/path/to/folder", split="train") +>>> dataset.push_to_hub("username/my-mesh-captioning-dataset") +``` diff --git a/docs/source/mesh_load.mdx b/docs/source/mesh_load.mdx new file mode 100644 index 0000000..f33c45f --- /dev/null +++ b/docs/source/mesh_load.mdx @@ -0,0 +1,123 @@ +# Load mesh data + +Mesh datasets have [`Mesh`] type columns, which contain `trimesh.Trimesh` or `trimesh.Scene` objects. + +> [!TIP] +> To work with mesh datasets, you need to have the `mesh` dependency installed. Check out the [installation](./installation#mesh) guide to learn how to install it. + +When you load a mesh dataset and call the mesh column, the meshes are decoded with `trimesh`: + +```py +>>> from datasets import load_dataset, Mesh + +>>> dataset = load_dataset("VINAY-UMRETHE/My-Mesh-Dataset", split="train") +>>> dataset[0]["mesh"] + +``` + +Depending on the file content, `trimesh` may return a `trimesh.Trimesh` object or a `trimesh.Scene` object. + +> [!WARNING] +> Index into a mesh dataset using the row index first and then the `mesh` column - `dataset[0]["mesh"]` - to avoid decoding all the mesh files in the dataset. Otherwise, this can be a slow and time-consuming process if you have a large dataset. + +For a guide on how to load any type of dataset, take a look at the general loading guide. + +## Local files + +You can load a dataset from mesh paths. Use the [`~Dataset.cast_column`] function to accept a column of mesh file paths, and decode it into a `trimesh` object with the [`Mesh`] feature: + +```py +>>> from datasets import Dataset, Mesh + +>>> dataset = Dataset.from_dict({"mesh": ["path/to/model_1.glb", "path/to/model_2.ply", "path/to/model_3.stl"]}).cast_column("mesh", Mesh()) +>>> dataset[0]["mesh"] + +``` + +If you only want to load the underlying path or bytes of the mesh dataset without decoding the mesh object, set `decode=False` in the [`Mesh`] feature: + +```py +>>> dataset = load_dataset("VINAY-UMRETHE/My-Mesh-Dataset", split="train").cast_column("mesh", Mesh(decode=False)) +>>> dataset[0]["mesh"] +{'bytes': b'...', + 'path': '00001.glb'} +``` + +The [`Mesh`] feature supports `.glb`, `.ply`, and `.stl` files. Depending on the file content, `trimesh` may return a `trimesh.Trimesh` object or a `trimesh.Scene` object. + +## MeshFolder + +You can also load a dataset with a `MeshFolder` dataset builder which does not require writing a custom dataloader. This makes `MeshFolder` useful for quickly creating and loading mesh datasets with several thousand 3D files. Your mesh dataset structure should look like this: + +```text +folder/train/diya/brass_diya.glb +folder/train/diya/clay_diya.ply +folder/train/diya/festival_diya.stl + +folder/train/kalash/copper_kalash.glb +folder/train/kalash/pooja_kalash.ply +folder/train/kalash/temple_kalash.stl +``` + +If the dataset follows the `MeshFolder` structure, then you can load it directly with [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("username/dataset_name") +>>> # OR locally: +>>> dataset = load_dataset("/path/to/folder") +``` + +For local datasets, this is equivalent to passing `meshfolder` manually in [`load_dataset`] and the directory in `data_dir`: + +```py +>>> dataset = load_dataset("meshfolder", data_dir="/path/to/folder") +``` + +Then you can access the meshes as `trimesh` objects: + +```py +>>> dataset["train"][0] +{"mesh": , "label": 0} +``` + +To ignore the information in the metadata file, set `drop_metadata=True` in [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True) +``` + +If you don't have a metadata file, `MeshFolder` automatically infers the label name from the directory name. +If you want to drop automatically created labels, set `drop_labels=True`. +In this case, your dataset will only contain a mesh column: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True) +``` + +Finally the `filters` argument lets you load only a subset of the dataset, based on a condition on the label or the metadata. This is especially useful if the metadata is in Parquet format, since this format enables fast filtering. It is also recommended to use this argument with `streaming=True`, because by default the dataset is fully downloaded before filtering. + +```python +>>> filters = [("label", "=", 0)] +>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters) +``` + +> [!TIP] +> For more information about creating your own `MeshFolder` dataset, take a look at the [Create a mesh dataset](./mesh_dataset) guide. + +## Mesh decoding + +By default, meshes are decoded sequentially as `trimesh.Trimesh` or `trimesh.Scene` objects when you iterate on a dataset. + +If you are not interested in the meshes decoded as `trimesh` objects and would like to access the path or bytes instead, you can disable decoding: + +```python +>>> dataset = dataset.decode(False) +``` + +Note: [`IterableDataset.decode`] is only available for streaming datasets at the moment. diff --git a/docs/source/nifti_dataset.mdx b/docs/source/nifti_dataset.mdx new file mode 100644 index 0000000..2770460 --- /dev/null +++ b/docs/source/nifti_dataset.mdx @@ -0,0 +1,130 @@ +# Create a NIfTI dataset + +This page shows how to create and share a dataset of medical images in NIfTI format (.nii / .nii.gz) using the `datasets` library. + +You can share a dataset with your team or with anyone in the community by creating a dataset repository on the Hugging Face Hub: + +```py +from datasets import load_dataset + +dataset = load_dataset("/my_nifti_dataset") +``` + +There are two common ways to create a NIfTI dataset: + +- Create a dataset from local NIfTI files in Python and upload it with `Dataset.push_to_hub`. +- Use a folder-based convention (one file per example) and a small helper to convert it into a `Dataset`. + +> [!TIP] +> You can control access to your dataset by requiring users to share their contact information first. Check out the [Gated datasets](https://huggingface.co/docs/hub/datasets-gated) guide for more information. + +## Local files + +If you already have a list of file paths to NIfTI files, the easiest workflow is to create a `Dataset` from that list and cast the column to the `Nifti` feature. + +```py +from datasets import Dataset +from datasets import Nifti + +# simple example: create a dataset from file paths +files = ["/path/to/scan_001.nii.gz", "/path/to/scan_002.nii.gz"] +ds = Dataset.from_dict({"nifti": files}).cast_column("nifti", Nifti()) + +# access a decoded nibabel image (if decode=True) +# ds[0]["nifti"] will be a nibabel.Nifti1Image object when decode=True +# or a dict {'bytes': None, 'path': '...'} when decode=False +``` + +The `Nifti` feature supports a `decode` parameter. When `decode=True` (the default), it loads the NIfTI file into a `nibabel.nifti1.Nifti1Image` object. You can access the image data as a numpy array with `img.get_fdata()`. When `decode=False`, it returns a dict with the file path and bytes. + +```py +from datasets import Dataset, Nifti + +ds = Dataset.from_dict({"nifti": ["/path/to/scan.nii.gz"]}).cast_column("nifti", Nifti(decode=True)) +img = ds[0]["nifti"] # instance of: nibabel.nifti1.Nifti1Image +arr = img.get_fdata() +``` + +After preparing the dataset you can push it to the Hub: + +```py +ds.push_to_hub("/my_nifti_dataset") +``` + +This will create a dataset repository containing your NIfTI dataset with a `data/` folder of parquet shards. + +## Folder conventions and metadata + +If you organize your dataset in folders you can create splits automatically (train/test/validation) by following a structure like: + +``` +dataset/train/scan_0001.nii +dataset/train/scan_0002.nii +dataset/validation/scan_1001.nii +dataset/test/scan_2001.nii +``` + +If you have labels or other metadata, provide a `metadata.csv`, `metadata.jsonl`, or `metadata.parquet` in the folder so files can be linked to metadata rows. The metadata must contain a `file_name` (or `*_file_name`) field with the relative path to the NIfTI file next to the metadata file. + +Example `metadata.csv`: + +```csv +file_name,patient_id,age,diagnosis +scan_0001.nii.gz,P001,45,healthy +scan_0002.nii.gz,P002,59,disease_x +``` + +The `Nifti` feature works with zipped datasets too — each zip can contain NIfTI files and a metadata file. This is useful when uploading large datasets as archives. +This means your dataset structure could look like this (mixed compressed and uncompressed files): +``` +dataset/train/scan_0001.nii.gz +dataset/train/scan_0002.nii +dataset/validation/scan_1001.nii.gz +dataset/test/scan_2001.nii +``` + +## Converting to PyTorch tensors + +Use the [`~Dataset.set_transform`] function to apply the transformation on-the-fly to batches of the dataset: + +```py +import torch +import nibabel +import numpy as np + +def transform_to_pytorch(example): + example["nifti_torch"] = [torch.tensor(ex.get_fdata()) for ex in example["nifti"]] + return example + +ds.set_transform(transform_to_pytorch) + +``` +Accessing elements now (e.g. `ds[0]`) will yield torch tensors in the `"nifti_torch"` key. + + +## Usage of NifTI1Image + +NifTI is a format to store the result of 3 (or even 4) dimensional brain scans. This includes 3 spatial dimensions (x,y,z) +and optionally a time dimension (t). Furthermore, the given positions here are only relative to the scanner, therefore +the dimensions (4, 5, 6) are used to lift this to real world coordinates. + +You can visualize nifti files for instance leveraging `matplotlib` as follows: +```python +import matplotlib.pyplot as plt +from datasets import load_dataset + +def show_slices(slices): + """ Function to display row of image slices """ + fig, axes = plt.subplots(1, len(slices)) + for i, slice in enumerate(slices): + axes[i].imshow(slice.T, cmap="gray", origin="lower") + +nifti_ds = load_dataset("/my_nifti_dataset") +for epi_img in nifti_ds: + nifti_img = epi_img["nifti"].get_fdata() + show_slices([nifti_img[:, :, 16], nifti_img[26, :, :], nifti_img[:, 30, :]]) + plt.show() +``` + +For further reading we refer to the [nibabel documentation](https://nipy.org/nibabel/index.html) and especially [this nibabel tutorial](https://nipy.org/nibabel/coordinate_systems.html) +--- diff --git a/docs/source/nlp_load.mdx b/docs/source/nlp_load.mdx new file mode 100644 index 0000000..5a06153 --- /dev/null +++ b/docs/source/nlp_load.mdx @@ -0,0 +1,46 @@ +# Load text data + +This guide shows you how to load text datasets. To learn how to load any type of dataset, take a look at the general loading guide. + +Text files are one of the most common file types for storing a dataset. By default, 🤗 Datasets samples a text file line by line to build the dataset. + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("text", data_files={"train": ["my_text_1.txt", "my_text_2.txt"], "test": "my_test_file.txt"}) + +# Load from a directory +>>> dataset = load_dataset("text", data_dir="path/to/text/dataset") +``` + +To sample a text file by paragraph or even an entire document, use the `sample_by` parameter: + +```py +# Sample by paragraph +>>> dataset = load_dataset("text", data_files={"train": "my_train_file.txt", "test": "my_test_file.txt"}, sample_by="paragraph") + +# Sample by document +>>> dataset = load_dataset("text", data_files={"train": "my_train_file.txt", "test": "my_test_file.txt"}, sample_by="document") +``` + +You can also use grep patterns to load specific files: + +```py +>>> from datasets import load_dataset +>>> c4_subset = load_dataset("allenai/c4", data_files="en/c4-train.0000*-of-01024.json.gz") +``` + +To load remote text files via HTTP, pass the URLs instead: + +```py +>>> dataset = load_dataset("text", data_files="https://huggingface.co/datasets/hf-internal-testing/dataset_with_data_files/resolve/main/data/train.txt") +``` + +To load XML data you can use the "xml" loader, which is equivalent to "text" with sample_by="document": + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("xml", data_files={"train": ["my_xml_1.xml", "my_xml_2.xml"], "test": "my_xml_file.xml"}) + +# Load from a directory +>>> dataset = load_dataset("xml", data_dir="path/to/xml/dataset") +``` diff --git a/docs/source/nlp_process.mdx b/docs/source/nlp_process.mdx new file mode 100644 index 0000000..f2ef233 --- /dev/null +++ b/docs/source/nlp_process.mdx @@ -0,0 +1,63 @@ +# Process text data + +This guide shows specific methods for processing text datasets. Learn how to: + +- Tokenize a dataset with [`~Dataset.map`]. +- Align dataset labels with label ids for NLI datasets. + +For a guide on how to process any type of dataset, take a look at the general process guide. + +## Map + +The [`~Dataset.map`] function supports processing batches of examples at once which speeds up tokenization. + +Load a tokenizer from 🤗 [Transformers](https://huggingface.co/transformers/): + +```py +>>> from transformers import AutoTokenizer + +>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") +``` + +Set the `batched` parameter to `True` in the [`~Dataset.map`] function to apply the tokenizer to batches of examples: + +```py +>>> dataset = dataset.map(lambda examples: tokenizer(examples["text"]), batched=True) +>>> dataset[0] +{'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .', + 'label': 1, + 'input_ids': [101, 1996, 2600, 2003, 16036, 2000, 2022, 1996, 7398, 2301, 1005, 1055, 2047, 1000, 16608, 1000, 1998, 2008, 2002, 1005, 1055, 2183, 2000, 2191, 1037, 17624, 2130, 3618, 2084, 7779, 29058, 8625, 13327, 1010, 3744, 1011, 18856, 19513, 3158, 5477, 4168, 2030, 7112, 16562, 2140, 1012, 102], + 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +``` + +The [`~Dataset.map`] function converts the returned values to a PyArrow-supported format. But explicitly returning the tensors as NumPy arrays is faster because it is a natively supported PyArrow format. Set `return_tensors="np"` when you tokenize your text: + +```py +>>> dataset = dataset.map(lambda examples: tokenizer(examples["text"], return_tensors="np"), batched=True) +``` + +## Align + +The [`~Dataset.align_labels_with_mapping`] function aligns a dataset label id with the label name. Not all 🤗 Transformers models follow the prescribed label mapping of the original dataset, especially for NLI datasets. For example, the [MNLI](https://huggingface.co/datasets/glue) dataset uses the following label mapping: + +```py +>>> label2id = {"entailment": 0, "neutral": 1, "contradiction": 2} +``` + +To align the dataset label mapping with the mapping used by a model, create a dictionary of the label name and id to align on: + +```py +>>> label2id = {"contradiction": 0, "neutral": 1, "entailment": 2} +``` + +Pass the dictionary of the label mappings to the [`~Dataset.align_labels_with_mapping`] function, and the column to align on: + +```py +>>> from datasets import load_dataset + +>>> mnli = load_dataset("nyu-mll/glue", "mnli", split="train") +>>> mnli_aligned = mnli.align_labels_with_mapping(label2id, "label") +``` + +You can also use this function to assign a custom mapping of labels to ids. \ No newline at end of file diff --git a/docs/source/object_detection.mdx b/docs/source/object_detection.mdx new file mode 100644 index 0000000..f1360e3 --- /dev/null +++ b/docs/source/object_detection.mdx @@ -0,0 +1,161 @@ +# Object detection + +Object detection models identify something in an image, and object detection datasets are used for applications such as autonomous driving and detecting natural hazards like wildfire. This guide will show you how to apply transformations to an object detection dataset following the [tutorial](https://albumentations.ai/docs/examples/example_bboxes/) from [Albumentations](https://albumentations.ai/docs/). + +To run these examples, make sure you have up-to-date versions of [albumentations](https://albumentations.ai/docs/) and [cv2](https://docs.opencv.org/4.10.0/) installed: + +```bash +pip install -U albumentations opencv-python +``` + +In this example, you'll use the [`cppe-5`](https://huggingface.co/datasets/rishitdagli/cppe-5) dataset for identifying medical personal protective equipment (PPE) in the context of the COVID-19 pandemic. + +Load the dataset and take a look at an example: + +```py +>>> from datasets import load_dataset + +>>> ds = load_dataset("rishitdagli/cppe-5") +>>> example = ds['train'][0] +>>> example +{'height': 663, + 'image': , + 'image_id': 15, + 'objects': {'area': [3796, 1596, 152768, 81002], + 'bbox': [[302.0, 109.0, 73.0, 52.0], + [810.0, 100.0, 57.0, 28.0], + [160.0, 31.0, 248.0, 616.0], + [741.0, 68.0, 202.0, 401.0]], + 'category': [4, 4, 0, 0], + 'id': [114, 115, 116, 117]}, + 'width': 943} +``` + +The dataset has the following fields: + +- `image`: PIL.Image.Image object containing the image. +- `image_id`: The image ID. +- `height`: The image height. +- `width`: The image width. +- `objects`: A dictionary containing bounding box metadata for the objects in the image: + - `id`: The annotation id. + - `area`: The area of the bounding box. + - `bbox`: The object's bounding box (in the [coco](https://albumentations.ai/docs/3-basic-usage/bounding-boxes-augmentations/#understanding-bounding-box-formats) format). + - `category`: The object's category, with possible values including `Coverall (0)`, `Face_Shield (1)`, `Gloves (2)`, `Goggles (3)` and `Mask (4)`. + +You can visualize the `bboxes` on the image using some internal torch utilities. To do that, you will need to reference the [`~datasets.ClassLabel`] feature associated with the category IDs so you can look up the string labels: + + +```py +>>> import torch +>>> from torchvision.ops import box_convert +>>> from torchvision.utils import draw_bounding_boxes +>>> from torchvision.transforms.functional import pil_to_tensor, to_pil_image + +>>> categories = ds['train'].features['objects'].feature['category'] + +>>> boxes_xywh = torch.tensor(example['objects']['bbox']) +>>> boxes_xyxy = box_convert(boxes_xywh, 'xywh', 'xyxy') +>>> labels = [categories.int2str(x) for x in example['objects']['category']] +>>> to_pil_image( +... draw_bounding_boxes( +... pil_to_tensor(example['image']), +... boxes_xyxy, +... colors="red", +... labels=labels, +... ) +... ) +``` + +
+ +
+ + +With `albumentations`, you can apply transforms that will affect the image while also updating the `bboxes` accordingly. In this case, the image is resized to (480, 480), flipped horizontally, and brightened. + +```py +>>> import albumentations +>>> import numpy as np + +>>> transform = albumentations.Compose([ +... albumentations.Resize(480, 480), +... albumentations.HorizontalFlip(p=1.0), +... albumentations.RandomBrightnessContrast(p=1.0), +... ], bbox_params=albumentations.BboxParams(format='coco', label_fields=['category'])) + +>>> image = np.array(example['image']) +>>> out = transform( +... image=image, +... bboxes=example['objects']['bbox'], +... category=example['objects']['category'], +... ) +``` + +Now when you visualize the result, the image should be flipped, but the `bboxes` should still be in the right places. + +```py +>>> image = torch.tensor(out['image']).permute(2, 0, 1) +>>> boxes_xywh = torch.stack([torch.tensor(x) for x in out['bboxes']]) +>>> boxes_xyxy = box_convert(boxes_xywh, 'xywh', 'xyxy') +>>> labels = [categories.int2str(x) for x in out['category']] +>>> to_pil_image( +... draw_bounding_boxes( +... image, +... boxes_xyxy, +... colors='red', +... labels=labels +... ) +... ) +``` + +
+ +
+ +Create a function to apply the transform to a batch of examples: + +```py +>>> def transforms(examples): +... images, bboxes, categories = [], [], [] +... for image, objects in zip(examples['image'], examples['objects']): +... image = np.array(image.convert("RGB")) +... out = transform( +... image=image, +... bboxes=objects['bbox'], +... category=objects['category'] +... ) +... images.append(torch.tensor(out['image']).permute(2, 0, 1)) +... bboxes.append(torch.tensor(out['bboxes'])) +... categories.append(out['category']) +... return {'image': images, 'bbox': bboxes, 'category': categories} +``` + +Use the [`~Dataset.set_transform`] function to apply the transform on-the-fly which consumes less disk space. The randomness of data augmentation may return a different image if you access the same example twice. It is especially useful when training a model for several epochs. + +```py +>>> ds['train'].set_transform(transforms) +``` + +You can verify the transform works by visualizing the 10th example: + +```py +>>> example = ds['train'][10] +>>> to_pil_image( +... draw_bounding_boxes( +... example['image'], +... box_convert(example['bbox'], 'xywh', 'xyxy'), +... colors='red', +... labels=[categories.int2str(x) for x in example['category']] +... ) +... ) +``` + +
+ +
+ +> [!TIP] +> Now that you know how to process a dataset for object detection, learn +> [how to train an object detection model](https://colab.research.google.com/github/NielsRogge/Transformers-Tutorials/blob/master/YOLOS/Fine_tuning_YOLOS_for_object_detection_on_custom_dataset_(balloon).ipynb) +> and use it for inference. diff --git a/docs/source/package_reference/builder_classes.mdx b/docs/source/package_reference/builder_classes.mdx new file mode 100644 index 0000000..bd4ddfc --- /dev/null +++ b/docs/source/package_reference/builder_classes.mdx @@ -0,0 +1,43 @@ +# Builder classes + +## Builders + +🤗 Datasets relies on two main classes during the dataset building process: [`DatasetBuilder`] and [`BuilderConfig`]. + +[[autodoc]] datasets.DatasetBuilder + +[[autodoc]] datasets.GeneratorBasedBuilder + +[[autodoc]] datasets.ArrowBasedBuilder + +[[autodoc]] datasets.BuilderConfig + +## Download + +[[autodoc]] datasets.DownloadManager + +[[autodoc]] datasets.StreamingDownloadManager + +[[autodoc]] datasets.DownloadConfig + +[[autodoc]] datasets.DownloadMode + +## Verification + +[[autodoc]] datasets.VerificationMode + +## Splits + +[[autodoc]] datasets.SplitGenerator + +[[autodoc]] datasets.Split + +[[autodoc]] datasets.NamedSplit + +[[autodoc]] datasets.NamedSplitAll + +[[autodoc]] datasets.ReadInstruction + +## Version + +[[autodoc]] datasets.utils.Version diff --git a/docs/source/package_reference/loading_methods.mdx b/docs/source/package_reference/loading_methods.mdx new file mode 100644 index 0000000..4dc1ffa --- /dev/null +++ b/docs/source/package_reference/loading_methods.mdx @@ -0,0 +1,120 @@ +# Loading methods + +Methods for listing and loading datasets: + +## Datasets + +[[autodoc]] datasets.load_dataset + +[[autodoc]] datasets.load_from_disk + +[[autodoc]] datasets.load_dataset_builder + +[[autodoc]] datasets.get_dataset_config_names + +[[autodoc]] datasets.get_dataset_infos + +[[autodoc]] datasets.get_dataset_split_names + +## From files + +Configurations used to load data files. +They are used when loading local files or a dataset repository: + +- local files: `load_dataset("parquet", data_dir="path/to/data/dir")` +- dataset repository: `load_dataset("allenai/c4")` + +You can pass arguments to `load_dataset` to configure data loading. +For example you can specify the `sep` parameter to define the [`~datasets.packaged_modules.csv.CsvConfig`] that is used to load the data: + +```python +load_dataset("csv", data_dir="path/to/data/dir", sep="\t") +``` + +### Text + +[[autodoc]] datasets.packaged_modules.text.TextConfig + +[[autodoc]] datasets.packaged_modules.text.Text + +### CSV + +[[autodoc]] datasets.packaged_modules.csv.CsvConfig + +[[autodoc]] datasets.packaged_modules.csv.Csv + +### JSON + +[[autodoc]] datasets.packaged_modules.json.JsonConfig + +[[autodoc]] datasets.packaged_modules.json.Json + +### XML + +[[autodoc]] datasets.packaged_modules.xml.XmlConfig + +[[autodoc]] datasets.packaged_modules.xml.Xml + +### Parquet + +[[autodoc]] datasets.packaged_modules.parquet.ParquetConfig + +[[autodoc]] datasets.packaged_modules.parquet.Parquet + +### Arrow + +[[autodoc]] datasets.packaged_modules.arrow.ArrowConfig + +[[autodoc]] datasets.packaged_modules.arrow.Arrow + +### SQL + +[[autodoc]] datasets.packaged_modules.sql.SqlConfig + +[[autodoc]] datasets.packaged_modules.sql.Sql + +### Images + +[[autodoc]] datasets.packaged_modules.imagefolder.ImageFolderConfig + +[[autodoc]] datasets.packaged_modules.imagefolder.ImageFolder + +### Audio + +[[autodoc]] datasets.packaged_modules.audiofolder.AudioFolderConfig + +[[autodoc]] datasets.packaged_modules.audiofolder.AudioFolder + +### Videos + +[[autodoc]] datasets.packaged_modules.videofolder.VideoFolderConfig + +[[autodoc]] datasets.packaged_modules.videofolder.VideoFolder + +### HDF5 + +[[autodoc]] datasets.packaged_modules.hdf5.HDF5Config + +[[autodoc]] datasets.packaged_modules.hdf5.HDF5 + +### TsFile + +[[autodoc]] datasets.packaged_modules.tsfile.TsFileConfig + +[[autodoc]] datasets.packaged_modules.tsfile.TsFile + +### Pdf + +[[autodoc]] datasets.packaged_modules.pdffolder.PdfFolderConfig + +[[autodoc]] datasets.packaged_modules.pdffolder.PdfFolder + +### Nifti + +[[autodoc]] datasets.packaged_modules.niftifolder.NiftiFolderConfig + +[[autodoc]] datasets.packaged_modules.niftifolder.NiftiFolder + +### WebDataset + +[[autodoc]] datasets.packaged_modules.webdataset.WebDataset diff --git a/docs/source/package_reference/main_classes.mdx b/docs/source/package_reference/main_classes.mdx new file mode 100644 index 0000000..5d3ce65 --- /dev/null +++ b/docs/source/package_reference/main_classes.mdx @@ -0,0 +1,302 @@ +# Main classes + + +## DatasetInfo + +[[autodoc]] datasets.DatasetInfo + +## Dataset + +The base class [`Dataset`] implements a Dataset backed by an Apache Arrow table. + +[[autodoc]] datasets.Dataset + - add_column + - add_item + - from_file + - from_buffer + - from_pandas + - from_dict + - from_list + - from_generator + - data + - cache_files + - num_columns + - num_rows + - column_names + - shape + - unique + - flatten + - cast + - cast_column + - remove_columns + - rename_column + - rename_columns + - select_columns + - class_encode_column + - __len__ + - __iter__ + - iter + - formatted_as + - set_format + - set_transform + - reset_format + - with_format + - with_transform + - __getitem__ + - cleanup_cache_files + - map + - filter + - select + - sort + - shuffle + - skip + - take + - train_test_split + - shard + - repeat + - to_tf_dataset + - push_to_hub + - save_to_disk + - load_from_disk + - flatten_indices + - to_csv + - to_pandas + - to_dict + - to_json + - to_parquet + - to_sql + - to_iterable_dataset + - add_faiss_index + - add_faiss_index_from_external_arrays + - save_faiss_index + - load_faiss_index + - add_elasticsearch_index + - load_elasticsearch_index + - list_indexes + - get_index + - drop_index + - search + - search_batch + - get_nearest_examples + - get_nearest_examples_batch + - info + - split + - builder_name + - citation + - config_name + - dataset_size + - description + - download_checksums + - download_size + - features + - homepage + - license + - size_in_bytes + - supervised_keys + - version + - from_csv + - from_json + - from_parquet + - from_text + - from_sql + - align_labels_with_mapping + +[[autodoc]] datasets.concatenate_datasets + +[[autodoc]] datasets.interleave_datasets + +[[autodoc]] datasets.distributed.split_dataset_by_node + +[[autodoc]] datasets.enable_caching + +[[autodoc]] datasets.disable_caching + +[[autodoc]] datasets.is_caching_enabled + +[[autodoc]] datasets.Column + +## DatasetDict + +Dictionary with split names as keys ('train', 'test' for example), and `Dataset` objects as values. +It also has dataset transform methods like map or filter, to process all the splits at once. + +[[autodoc]] datasets.DatasetDict + - data + - cache_files + - num_columns + - num_rows + - column_names + - shape + - unique + - cleanup_cache_files + - map + - filter + - sort + - shuffle + - set_format + - reset_format + - formatted_as + - with_format + - with_transform + - flatten + - cast + - cast_column + - remove_columns + - rename_column + - rename_columns + - select_columns + - class_encode_column + - push_to_hub + - save_to_disk + - load_from_disk + - from_csv + - from_json + - from_parquet + - from_text + + + +## IterableDataset + +The base class [`IterableDataset`] implements an iterable Dataset backed by python generators. + +[[autodoc]] datasets.IterableDataset + - from_file + - from_pandas + - from_dict + - from_list + - from_generator + - remove_columns + - select_columns + - cast_column + - cast + - decode + - __iter__ + - iter + - map + - rename_column + - filter + - shuffle + - batch + - skip + - take + - shard + - reshard + - repeat + - to_csv + - to_pandas + - to_dict + - to_json + - to_parquet + - to_sql + - push_to_hub + - load_state_dict + - state_dict + - info + - split + - builder_name + - citation + - config_name + - dataset_size + - description + - download_checksums + - download_size + - features + - homepage + - license + - size_in_bytes + - supervised_keys + - version + - from_csv + - from_json + - from_parquet + - from_text + +[[autodoc]] datasets.IterableColumn + +## IterableDatasetDict + +Dictionary with split names as keys ('train', 'test' for example), and `IterableDataset` objects as values. + +[[autodoc]] datasets.IterableDatasetDict + - map + - filter + - shuffle + - with_format + - cast + - cast_column + - remove_columns + - rename_column + - rename_columns + - select_columns + - push_to_hub + +## Features + +[[autodoc]] datasets.Features + +### Scalar + +[[autodoc]] datasets.Value + +[[autodoc]] datasets.ClassLabel + +### Composite + +[[autodoc]] datasets.LargeList + +[[autodoc]] datasets.List + +[[autodoc]] datasets.Sequence + +### Translation + +[[autodoc]] datasets.Translation + +[[autodoc]] datasets.TranslationVariableLanguages + +### Arrays + +[[autodoc]] datasets.Array2D + +[[autodoc]] datasets.Array3D + +[[autodoc]] datasets.Array4D + +[[autodoc]] datasets.Array5D + +### Audio + +[[autodoc]] datasets.Audio + +### Image + +[[autodoc]] datasets.Image + +### Video + +[[autodoc]] datasets.Video + +### Mesh + +[[autodoc]] datasets.Mesh + +### Json + +[[autodoc]] datasets.Json + +### Pdf + +[[autodoc]] datasets.Pdf + +### Nifti + +[[autodoc]] datasets.Nifti + +## Filesystems + +[[autodoc]] datasets.filesystems.is_remote_filesystem + +## Fingerprint + +[[autodoc]] datasets.fingerprint.Hasher diff --git a/docs/source/package_reference/table_classes.mdx b/docs/source/package_reference/table_classes.mdx new file mode 100644 index 0000000..4a46c15 --- /dev/null +++ b/docs/source/package_reference/table_classes.mdx @@ -0,0 +1,138 @@ +# Table Classes + +Each `Dataset` object is backed by a PyArrow Table. +A Table can be loaded from either the disk (memory mapped) or in memory. +Several Table types are available, and they all inherit from [`table.Table`]. + +## Table + +[[autodoc]] datasets.table.Table + - validate + - equals + - to_batches + - to_pydict + - to_pandas + - to_string + - field + - column + - itercolumns + - schema + - columns + - num_columns + - num_rows + - shape + - nbytes + +## InMemoryTable + +[[autodoc]] datasets.table.InMemoryTable + - validate + - equals + - to_batches + - to_pydict + - to_pandas + - to_string + - field + - column + - itercolumns + - schema + - columns + - num_columns + - num_rows + - shape + - nbytes + - column_names + - slice + - filter + - flatten + - combine_chunks + - cast + - replace_schema_metadata + - add_column + - append_column + - remove_column + - set_column + - rename_columns + - select + - drop + - from_file + - from_buffer + - from_pandas + - from_arrays + - from_pydict + - from_batches + +## MemoryMappedTable + +[[autodoc]] datasets.table.MemoryMappedTable + - validate + - equals + - to_batches + - to_pydict + - to_pandas + - to_string + - field + - column + - itercolumns + - schema + - columns + - num_columns + - num_rows + - shape + - nbytes + - column_names + - slice + - filter + - flatten + - combine_chunks + - cast + - replace_schema_metadata + - add_column + - append_column + - remove_column + - set_column + - rename_columns + - select + - drop + - from_file + +## ConcatenationTable + +[[autodoc]] datasets.table.ConcatenationTable + - validate + - equals + - to_batches + - to_pydict + - to_pandas + - to_string + - field + - column + - itercolumns + - schema + - columns + - num_columns + - num_rows + - shape + - nbytes + - column_names + - slice + - filter + - flatten + - combine_chunks + - cast + - replace_schema_metadata + - add_column + - append_column + - remove_column + - set_column + - rename_columns + - select + - drop + - from_blocks + - from_tables + +## Utils + +[[autodoc]] datasets.table.concat_tables + +[[autodoc]] datasets.table.list_table_cache_files diff --git a/docs/source/package_reference/utilities.mdx b/docs/source/package_reference/utilities.mdx new file mode 100644 index 0000000..59668db --- /dev/null +++ b/docs/source/package_reference/utilities.mdx @@ -0,0 +1,58 @@ +# Utilities + +## Configure logging + +🤗 Datasets strives to be transparent and explicit about how it works, but this can be quite verbose at times. We have included a series of logging methods which allow you to easily adjust the level of verbosity of the entire library. Currently the default verbosity of the library is set to `WARNING`. + +To change the level of verbosity, use one of the direct setters. For instance, here is how to change the verbosity to the `INFO` level: + +```py +import datasets +datasets.logging.set_verbosity_info() +``` + +You can also use the environment variable `DATASETS_VERBOSITY` to override the default verbosity, and set it to one of the following: `debug`, `info`, `warning`, `error`, `critical`: + +```bash +DATASETS_VERBOSITY=error ./myprogram.py +``` + +All the methods of this logging module are documented below. The main ones are: + +- [`logging.get_verbosity`] to get the current level of verbosity in the logger +- [`logging.set_verbosity`] to set the verbosity to the level of your choice + +In order from the least to the most verbose (with their corresponding `int` values): + +1. `logging.CRITICAL` or `logging.FATAL` (int value, 50): only report the most critical errors. +2. `logging.ERROR` (int value, 40): only report errors. +3. `logging.WARNING` or `logging.WARN` (int value, 30): only reports error and warnings. This the default level used by the library. +4. `logging.INFO` (int value, 20): reports error, warnings and basic information. +5. `logging.DEBUG` (int value, 10): report all information. + +[[autodoc]] datasets.logging.get_verbosity + +[[autodoc]] datasets.logging.set_verbosity + +[[autodoc]] datasets.logging.set_verbosity_info + +[[autodoc]] datasets.logging.set_verbosity_warning + +[[autodoc]] datasets.logging.set_verbosity_debug + +[[autodoc]] datasets.logging.set_verbosity_error + +[[autodoc]] datasets.logging.disable_propagation + +[[autodoc]] datasets.logging.enable_propagation + +## Configure progress bars + +By default, `tqdm` progress bars will be displayed during dataset download and preprocessing. You can disable them globally by setting `HF_DATASETS_DISABLE_PROGRESS_BARS` +environment variable. You can also enable/disable them using [`~utils.enable_progress_bars`] and [`~utils.disable_progress_bars`]. If set, the environment variable has priority on the helpers. + +[[autodoc]] datasets.utils.enable_progress_bars + +[[autodoc]] datasets.utils.disable_progress_bars + +[[autodoc]] datasets.utils.are_progress_bars_disabled \ No newline at end of file diff --git a/docs/source/process.mdx b/docs/source/process.mdx new file mode 100644 index 0000000..de156d2 --- /dev/null +++ b/docs/source/process.mdx @@ -0,0 +1,856 @@ +# Process + +🤗 Datasets provides many tools for modifying the structure and content of a dataset. These tools are important for tidying up a dataset, creating additional columns, converting between features and formats, and much more. + +This guide will show you how to: + +- Reorder rows and split the dataset. +- Rename and remove columns, and other common column operations. +- Apply processing functions to each example in a dataset. +- Concatenate datasets. +- Apply a custom formatting transform. +- Save and export processed datasets. + +For more details specific to processing other dataset modalities, take a look at the process audio dataset guide, the process image dataset guide, or the process text dataset guide. + +The examples in this guide use the MRPC dataset, but feel free to load any dataset of your choice and follow along! + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("nyu-mll/glue", "mrpc", split="train") +``` + +> [!WARNING] +> All processing methods in this guide return a new [`Dataset`] object. Modification is not done in-place. Be careful about overriding your previous dataset! + +## Sort, shuffle, select, split, and shard + +There are several functions for rearranging the structure of a dataset. +These functions are useful for selecting only the rows you want, creating train and test splits, and sharding very large datasets into smaller chunks. + +### Sort + +Use [`~Dataset.sort`] to sort column values according to their numerical values. The provided column must be NumPy compatible. + +```py +>>> dataset["label"][:10] +[1, 0, 1, 0, 1, 1, 0, 1, 0, 0] +>>> sorted_dataset = dataset.sort("label") +>>> sorted_dataset["label"][:10] +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +>>> sorted_dataset["label"][-10:] +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +``` + +Under the hood, this creates a list of indices that is sorted according to values of the column. +This indices mapping is then used to access the right rows in the underlying Arrow table. + +### Shuffle + +The [`~Dataset.shuffle`] function randomly rearranges the column values. You can specify the `generator` parameter in this function to use a different `numpy.random.Generator` if you want more control over the algorithm used to shuffle the dataset. + +```py +>>> shuffled_dataset = sorted_dataset.shuffle(seed=42) +>>> shuffled_dataset["label"][:10] +[1, 1, 1, 0, 1, 1, 1, 1, 1, 0] +``` + +Shuffling takes the list of indices `[0:len(my_dataset)]` and shuffles it to create an indices mapping. +However as soon as your [`Dataset`] has an indices mapping, the speed can become 10x slower. +This is because there is an extra step to get the row index to read using the indices mapping, and most importantly, you aren't reading contiguous chunks of data anymore. +To restore the speed, you'd need to rewrite the entire dataset on your disk again using [`Dataset.flatten_indices`], which removes the indices mapping. +Alternatively, you can switch to an [`IterableDataset`] and leverage its fast approximate shuffling [`IterableDataset.shuffle`]: + +```py +>>> iterable_dataset = dataset.to_iterable_dataset(num_shards=128) +>>> shuffled_iterable_dataset = iterable_dataset.shuffle(seed=42, buffer_size=1000) +``` + +### Select and Filter + +There are two options for filtering rows in a dataset: [`~Dataset.select`] and [`~Dataset.filter`]. + +- [`~Dataset.select`] returns rows according to a list of indices: + +```py +>>> small_dataset = dataset.select([0, 10, 20, 30, 40, 50]) +>>> len(small_dataset) +6 +``` + +- [`~Dataset.filter`] returns rows that match a specified condition: + +```py +>>> start_with_ar = dataset.filter(lambda example: example["sentence1"].startswith("Ar")) +>>> len(start_with_ar) +6 +>>> start_with_ar["sentence1"] +['Around 0335 GMT , Tab shares were up 19 cents , or 4.4 % , at A $ 4.56 , having earlier set a record high of A $ 4.57 .', +'Arison said Mann may have been one of the pioneers of the world music movement and he had a deep love of Brazilian music .', +'Arts helped coach the youth on an eighth-grade football team at Lombardi Middle School in Green Bay .', +'Around 9 : 00 a.m. EDT ( 1300 GMT ) , the euro was at $ 1.1566 against the dollar , up 0.07 percent on the day .', +"Arguing that the case was an isolated example , Canada has threatened a trade backlash if Tokyo 's ban is not justified on scientific grounds .", +'Artists are worried the plan would harm those who need help most - performers who have a difficult time lining up shows .' +] +``` + +[`~Dataset.filter`] can also filter by indices if you set `with_indices=True`: + +```py +>>> even_dataset = dataset.filter(lambda example, idx: idx % 2 == 0, with_indices=True) +>>> len(even_dataset) +1834 +>>> len(dataset) / 2 +1834.0 +``` + +Unless the list of indices to keep is contiguous, those methods also create an indices mapping under the hood. + +### Split + +The [`~Dataset.train_test_split`] function creates train and test splits if your dataset doesn't already have them. This allows you to adjust the relative proportions or an absolute number of samples in each split. In the example below, use the `test_size` parameter to create a test split that is 10% of the original dataset: + +```py +>>> dataset.train_test_split(test_size=0.1) +{'train': Dataset(schema: {'sentence1': 'string', 'sentence2': 'string', 'label': 'int64', 'idx': 'int32'}, num_rows: 3301), +'test': Dataset(schema: {'sentence1': 'string', 'sentence2': 'string', 'label': 'int64', 'idx': 'int32'}, num_rows: 367)} +>>> 0.1 * len(dataset) +366.8 +``` + +The splits are shuffled by default, but you can set `shuffle=False` to prevent shuffling. + +### Shard + +🤗 Datasets supports sharding to divide a very large dataset into a predefined number of chunks. Specify the `num_shards` parameter in [`~Dataset.shard`] to determine the number of shards to split the dataset into. You'll also need to provide the shard you want to return with the `index` parameter. + +For example, the [stanfordnlp/imdb](https://huggingface.co/datasets/stanfordnlp/imdb) dataset has 25000 examples: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("stanfordnlp/imdb", split="train") +>>> print(dataset) +Dataset({ + features: ['text', 'label'], + num_rows: 25000 +}) +``` + +After sharding the dataset into four chunks, the first shard will only have 6250 examples: + +```py +>>> dataset.shard(num_shards=4, index=0) +Dataset({ + features: ['text', 'label'], + num_rows: 6250 +}) +>>> print(25000/4) +6250.0 +``` + +## Rename, remove, cast, and flatten + +The following functions allow you to modify the columns of a dataset. These functions are useful for renaming or removing columns, changing columns to a new set of features, and flattening nested column structures. + +### Rename + +Use [`~Dataset.rename_column`] when you need to rename a column in your dataset. Features associated with the original column are actually moved under the new column name, instead of just replacing the original column in-place. + +Provide [`~Dataset.rename_column`] with the name of the original column, and the new column name: + +```py +>>> dataset +Dataset({ + features: ['sentence1', 'sentence2', 'label', 'idx'], + num_rows: 3668 +}) +>>> dataset = dataset.rename_column("sentence1", "sentenceA") +>>> dataset = dataset.rename_column("sentence2", "sentenceB") +>>> dataset +Dataset({ + features: ['sentenceA', 'sentenceB', 'label', 'idx'], + num_rows: 3668 +}) +``` + +### Remove + +When you need to remove one or more columns, provide the column name to remove to the [`~Dataset.remove_columns`] function. Remove more than one column by providing a list of column names: + +```py +>>> dataset = dataset.remove_columns("label") +>>> dataset +Dataset({ + features: ['sentence1', 'sentence2', 'idx'], + num_rows: 3668 +}) +>>> dataset = dataset.remove_columns(["sentence1", "sentence2"]) +>>> dataset +Dataset({ + features: ['idx'], + num_rows: 3668 +}) +``` + +Conversely, [`~Dataset.select_columns`] selects one or more columns to keep and removes the rest. This function takes either one or a list of column names: + +```py +>>> dataset +Dataset({ + features: ['sentence1', 'sentence2', 'label', 'idx'], + num_rows: 3668 +}) +>>> dataset = dataset.select_columns(['sentence1', 'sentence2', 'idx']) +>>> dataset +Dataset({ + features: ['sentence1', 'sentence2', 'idx'], + num_rows: 3668 +}) +>>> dataset = dataset.select_columns('idx') +>>> dataset +Dataset({ + features: ['idx'], + num_rows: 3668 +}) +``` + +### Cast + +The [`~Dataset.cast`] function transforms the feature type of one or more columns. This function accepts your new [`Features`] as its argument. The example below demonstrates how to change the [`ClassLabel`] and [`Value`] features: + +```py +>>> dataset.features +{'sentence1': Value('string'), +'sentence2': Value('string'), +'label': ClassLabel(names=['not_equivalent', 'equivalent']), +'idx': Value('int32')} + +>>> from datasets import ClassLabel, Value +>>> new_features = dataset.features.copy() +>>> new_features["label"] = ClassLabel(names=["negative", "positive"]) +>>> new_features["idx"] = Value("int64") +>>> dataset = dataset.cast(new_features) +>>> dataset.features +{'sentence1': Value('string'), +'sentence2': Value('string'), +'label': ClassLabel(names=['negative', 'positive']), +'idx': Value('int64')} +``` + +> [!TIP] +> Casting only works if the original feature type and new feature type are compatible. For example, you can cast a column with the feature type `Value("int32")` to `Value("bool")` if the original column only contains ones and zeros. + +Use the [`~Dataset.cast_column`] function to change the feature type of a single column. Pass the column name and its new feature type as arguments: + +```py +>>> dataset.features +{'audio': Audio(sampling_rate=44100, mono=True)} + +>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16000)) +>>> dataset.features +{'audio': Audio(sampling_rate=16000, mono=True)} +``` + +### Flatten + +Sometimes a column can be a nested structure of several types. Take a look at the nested structure below from the SQuAD dataset: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("rajpurkar/squad", split="train") +>>> dataset.features +{'id': Value('string'), + 'title': Value('string'), + 'context': Value('string'), + 'question': Value('string'), + 'answers': {'text': List(Value('string')), + 'answer_start': List(Value('int32'))}} +``` + +The `answers` field contains two subfields: `text` and `answer_start`. Use the [`~Dataset.flatten`] function to extract the subfields into their own separate columns: + +```py +>>> flat_dataset = dataset.flatten() +>>> flat_dataset +Dataset({ + features: ['id', 'title', 'context', 'question', 'answers.text', 'answers.answer_start'], + num_rows: 87599 +}) +``` + +Notice how the subfields are now their own independent columns: `answers.text` and `answers.answer_start`. + +## Map + +Some of the more powerful applications of 🤗 Datasets come from using the [`~Dataset.map`] function. The primary purpose of [`~Dataset.map`] is to speed up processing functions. It allows you to apply a processing function to each example in a dataset, independently or in batches. This function can even create new rows and columns. + +In the following example, prefix each `sentence1` value in the dataset with `'My sentence: '`. + +Start by creating a function that adds `'My sentence: '` to the beginning of each sentence. The function needs to accept and output a `dict`: + +```py +>>> def add_prefix(example): +... example["sentence1"] = 'My sentence: ' + example["sentence1"] +... return example +``` + +Now use [`~Dataset.map`] to apply the `add_prefix` function to the entire dataset: + +```py +>>> updated_dataset = small_dataset.map(add_prefix) +>>> updated_dataset["sentence1"][:5] +['My sentence: Amrozi accused his brother , whom he called " the witness " , of deliberately distorting his evidence .', +"My sentence: Yucaipa owned Dominick 's before selling the chain to Safeway in 1998 for $ 2.5 billion .", +'My sentence: They had published an advertisement on the Internet on June 10 , offering the cargo for sale , he added .', +'My sentence: Around 0335 GMT , Tab shares were up 19 cents , or 4.4 % , at A $ 4.56 , having earlier set a record high of A $ 4.57 .', +] +``` + +Let's take a look at another example, except this time, you'll remove a column with [`~Dataset.map`]. When you remove a column, it is only removed after the example has been provided to the mapped function. This allows the mapped function to use the content of the columns before they are removed. + +Specify the column to remove with the `remove_columns` parameter in [`~Dataset.map`]: + +```py +>>> updated_dataset = dataset.map(lambda example: {"new_sentence": example["sentence1"]}, remove_columns=["sentence1"]) +>>> updated_dataset.column_names +['sentence2', 'label', 'idx', 'new_sentence'] +``` + +> [!TIP] +> 🤗 Datasets also has a [`~Dataset.remove_columns`] function which is faster because it doesn't copy the data of the remaining columns. + +You can also use [`~Dataset.map`] with indices if you set `with_indices=True`. The example below adds the index to the beginning of each sentence: + +```py +>>> updated_dataset = dataset.map(lambda example, idx: {"sentence2": f"{idx}: " + example["sentence2"]}, with_indices=True) +>>> updated_dataset["sentence2"][:5] +['0: Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .', + "1: Yucaipa bought Dominick 's in 1995 for $ 693 million and sold it to Safeway for $ 1.8 billion in 1998 .", + "2: On June 10 , the ship 's owners had published an advertisement on the Internet , offering the explosives for sale .", + '3: Tab shares jumped 20 cents , or 4.6 % , to set a record closing high at A $ 4.57 .', + '4: PG & E Corp. shares jumped $ 1.63 or 8 percent to $ 21.03 on the New York Stock Exchange on Friday .' +] +``` + +### Multiprocessing + +Multiprocessing significantly speeds up processing by parallelizing processes on the CPU. Set the `num_proc` parameter in [`~Dataset.map`] to set the number of processes to use: + +```py +>>> updated_dataset = dataset.map(lambda example, idx: {"sentence2": f"{idx}: " + example["sentence2"]}, with_indices=True, num_proc=4) +``` + +The [`~Dataset.map`] also works with the rank of the process if you set `with_rank=True`. This is analogous to the `with_indices` parameter. The `with_rank` parameter in the mapped function goes after the `index` one if it is already present. + +```py +>>> import torch +>>> from multiprocess import set_start_method +>>> from transformers import AutoTokenizer, AutoModelForCausalLM +>>> from datasets import load_dataset +>>> +>>> # Get an example dataset +>>> dataset = load_dataset("fka/awesome-chatgpt-prompts", split="train") +>>> +>>> # Get an example model and its tokenizer +>>> model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen1.5-0.5B-Chat").eval() +>>> tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen1.5-0.5B-Chat") +>>> +>>> def gpu_computation(batch, rank): +... # Move the model on the right GPU if it's not there already +... device = f"cuda:{(rank or 0) % torch.cuda.device_count()}" +... model.to(device) +... +... # Your big GPU call goes here, for example: +... chats = [[ +... {"role": "system", "content": "You are a helpful assistant."}, +... {"role": "user", "content": prompt} +... ] for prompt in batch["prompt"]] +... texts = [tokenizer.apply_chat_template( +... chat, +... tokenize=False, +... add_generation_prompt=True +... ) for chat in chats] +... model_inputs = tokenizer(texts, padding=True, return_tensors="pt").to(device) +... with torch.no_grad(): +... outputs = model.generate(**model_inputs, max_new_tokens=512) +... batch["output"] = tokenizer.batch_decode(outputs, skip_special_tokens=True) +... return batch +>>> +>>> if __name__ == "__main__": +... set_start_method("spawn") +... updated_dataset = dataset.map( +... gpu_computation, +... batched=True, +... batch_size=16, +... with_rank=True, +... num_proc=torch.cuda.device_count(), # one process per GPU +... ) +``` + +The main use-case for rank is to parallelize computation across several GPUs. This requires setting `multiprocess.set_start_method("spawn")`. If you don't you'll receive the following CUDA error: + +```bash +RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the 'spawn' start method. +``` + +### Batch processing + +The [`~Dataset.map`] function supports working with batches of examples. Operate on batches by setting `batched=True`. The default batch size is 1000, but you can adjust it with the `batch_size` parameter. Batch processing enables interesting applications such as splitting long sentences into shorter chunks and data augmentation. + +#### Split long examples + +When examples are too long, you may want to split them into several smaller chunks. Begin by creating a function that: + +1. Splits the `sentence1` field into chunks of 50 characters. + +2. Stacks all the chunks together to create the new dataset. + +```py +>>> def chunk_examples(examples): +... chunks = [] +... for sentence in examples["sentence1"]: +... chunks += [sentence[i:i + 50] for i in range(0, len(sentence), 50)] +... return {"chunks": chunks} +``` + +Apply the function with [`~Dataset.map`]: + +```py +>>> chunked_dataset = dataset.map(chunk_examples, batched=True, remove_columns=dataset.column_names) +>>> chunked_dataset[:10] +{'chunks': ['Amrozi accused his brother , whom he called " the ', + 'witness " , of deliberately distorting his evidenc', + 'e .', + "Yucaipa owned Dominick 's before selling the chain", + ' to Safeway in 1998 for $ 2.5 billion .', + 'They had published an advertisement on the Interne', + 't on June 10 , offering the cargo for sale , he ad', + 'ded .', + 'Around 0335 GMT , Tab shares were up 19 cents , or', + ' 4.4 % , at A $ 4.56 , having earlier set a record']} +``` + +Notice how the sentences are split into shorter chunks now, and there are more rows in the dataset. + +```py +>>> dataset +Dataset({ + features: ['sentence1', 'sentence2', 'label', 'idx'], + num_rows: 3668 +}) +>>> chunked_dataset +Dataset({ + features: ['chunks'], + num_rows: 10470 +}) +``` + +#### Data augmentation + +The [`~Dataset.map`] function could also be used for data augmentation. The following example generates additional words for a masked token in a sentence. + +Load and use the [RoBERTA](https://huggingface.co/roberta-base) model in 🤗 Transformers' [FillMaskPipeline](https://huggingface.co/transformers/main_classes/pipelines#transformers.FillMaskPipeline): + +```py +>>> from random import randint +>>> from transformers import pipeline + +>>> fillmask = pipeline("fill-mask", model="roberta-base") +>>> mask_token = fillmask.tokenizer.mask_token +>>> smaller_dataset = dataset.filter(lambda e, i: i<100, with_indices=True) +``` + +Create a function to randomly select a word to mask in the sentence. The function should also return the original sentence and the top two replacements generated by RoBERTA. + +```py +>>> def augment_data(examples): +... outputs = [] +... for sentence in examples["sentence1"]: +... words = sentence.split(' ') +... K = randint(1, len(words)-1) +... masked_sentence = " ".join(words[:K] + [mask_token] + words[K+1:]) +... predictions = fillmask(masked_sentence) +... augmented_sequences = [predictions[i]["sequence"] for i in range(3)] +... outputs += [sentence] + augmented_sequences +... +... return {"data": outputs} +``` + +Use [`~Dataset.map`] to apply the function over the whole dataset: + +```py +>>> augmented_dataset = smaller_dataset.map(augment_data, batched=True, remove_columns=dataset.column_names, batch_size=8) +>>> augmented_dataset[:9]["data"] +['Amrozi accused his brother , whom he called " the witness " , of deliberately distorting his evidence .', + 'Amrozi accused his brother, whom he called " the witness ", of deliberately withholding his evidence.', + 'Amrozi accused his brother, whom he called " the witness ", of deliberately suppressing his evidence.', + 'Amrozi accused his brother, whom he called " the witness ", of deliberately destroying his evidence.', + "Yucaipa owned Dominick 's before selling the chain to Safeway in 1998 for $ 2.5 billion .", + 'Yucaipa owned Dominick Stores before selling the chain to Safeway in 1998 for $ 2.5 billion.', + "Yucaipa owned Dominick's before selling the chain to Safeway in 1998 for $ 2.5 billion.", + 'Yucaipa owned Dominick Pizza before selling the chain to Safeway in 1998 for $ 2.5 billion.' +] +``` + +For each original sentence, RoBERTA augmented a random word with three alternatives. The original word `distorting` is supplemented by `withholding`, `suppressing`, and `destroying`. + +### Asynchronous processing + +Asynchronous functions are useful to call API endpoints in parallel, for example to download content like images or call a model endpoint. + +You can define an asynchronous function using the `async` and `await` keywords, here is an example function to call a chat model from Hugging Face: + +```python +>>> import aiohttp +>>> import asyncio +>>> from huggingface_hub import get_token +>>> sem = asyncio.Semaphore(20) # max number of simultaneous queries +>>> async def query_model(model, prompt): +... api_url = f"https://api-inference.huggingface.co/models/{model}/v1/chat/completions" +... headers = {"Authorization": f"Bearer {get_token()}", "Content-Type": "application/json"} +... json = {"messages": [{"role": "user", "content": prompt}], "max_tokens": 20, "seed": 42} +... async with sem, aiohttp.ClientSession() as session, session.post(api_url, headers=headers, json=json) as response: +... output = await response.json() +... return {"Output": output["choices"][0]["message"]["content"]} +``` + +Asynchronous functions run in parallel, which accelerates the process a lot. The same code takes a lot more time if it's run sequentially, because it does nothing while waiting for the model response. It is generally recommended to use `async` / `await` when you function has to wait for a response from an API for example, or if it downloads data and it can take some time. + +Note the presence of a `Semaphore`: it sets the maximum number of queries that can run in parallel. It is recommended to use a `Semaphore` when calling APIs to avoid rate limit errors. + +Let's use it to call the [microsoft/Phi-3-mini-4k-instruct](https://huggingface.co/microsoft/Phi-3-mini-4k-instruct) model and ask it to return the main topic of each math problem in the [Maxwell-Jia/AIME_2024](https://huggingface.co/Maxwell-Jia/AIME_2024) dataset: + +````python +>>> from datasets import load_dataset +>>> ds = load_dataset("Maxwell-Jia/AIME_2024", split="train") +>>> model = "microsoft/Phi-3-mini-4k-instruct" +>>> prompt = 'What is this text mainly about ? Here is the text:\n\n```\n{Problem}\n```\n\nReply using one or two words max, e.g. "The main topic is Linear Algebra".' +>>> async def get_topic(example): +... return await query_model(model, prompt.format(Problem=example['Problem'])) +>>> ds = ds.map(get_topic) +>>> ds[0] +{'ID': '2024-II-4', + 'Problem': 'Let $x,y$ and $z$ be positive real numbers that...', + 'Solution': 'Denote $\\log_2(x) = a$, $\\log_2(y) = b$, and..., + 'Answer': 33, + 'Output': 'The main topic is Logarithms.'} +```` + +Here, [`Dataset.map`] runs many `get_topic` function asynchronously so it doesn't have to wait for every single model response which would take a lot of time to do sequentially. + +By default, [`Dataset.map`] runs up to one thousand map functions in parallel, so don't forget to set the maximum number of API calls that can run in parallel with a `Semaphore`, otherwise the model could return rate limit errors or overload. For advanced use cases, you can change the maximum number of queries in parallel in `datasets.config`. + +### Process multiple splits + +Many datasets have splits that can be processed simultaneously with [`DatasetDict.map`]. For example, tokenize the `sentence1` field in the train and test split by: + +```py +>>> from datasets import load_dataset + +# load all the splits +>>> dataset = load_dataset('nyu-mll/glue', 'mrpc') +>>> encoded_dataset = dataset.map(lambda examples: tokenizer(examples["sentence1"]), batched=True) +>>> encoded_dataset["train"][0] +{'sentence1': 'Amrozi accused his brother , whom he called " the witness " , of deliberately distorting his evidence .', +'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .', +'label': 1, +'idx': 0, +'input_ids': [ 101, 7277, 2180, 5303, 4806, 1117, 1711, 117, 2292, 1119, 1270, 107, 1103, 7737, 107, 117, 1104, 9938, 4267, 12223, 21811, 1117, 2554, 119, 102], +'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +} +``` + +### Distributed usage + +When you use [`~Dataset.map`] in a distributed setting, you should also use [torch.distributed.barrier](https://pytorch.org/docs/stable/distributed?highlight=barrier#torch.distributed.barrier). This ensures the main process performs the mapping, while the other processes load the results, thereby avoiding duplicate work. + +The following example shows how you can use `torch.distributed.barrier` to synchronize the processes: + +```py +>>> from datasets import Dataset +>>> import torch.distributed + +>>> dataset1 = Dataset.from_dict({"a": [0, 1, 2]}) + +>>> if training_args.local_rank > 0: +... print("Waiting for main process to perform the mapping") +... torch.distributed.barrier() + +>>> dataset2 = dataset1.map(lambda x: {"a": x["a"] + 1}) + +>>> if training_args.local_rank == 0: +... print("Loading results from main process") +... torch.distributed.barrier() +``` + +## Batch + +The [`~Dataset.batch`] method allows you to group samples from the dataset into batches. This is particularly useful when you want to create batches of data for training or evaluation, especially when working with deep learning models. + +Here's an example of how to use the `batch()` method: + +```python +>>> from datasets import load_dataset +>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train") +>>> batched_dataset = dataset.batch(batch_size=4) +>>> batched_dataset[0] +{'text': ['the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .', + 'the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .', + 'effective but too-tepid biopic', + 'if you sometimes like to go to the movies to have fun , wasabi is a good place to start .'], +'label': [1, 1, 1, 1]} +``` + +The `batch()` method accepts the following parameters: + +- `batch_size` (`int`): The number of samples in each batch. +- `drop_last_batch` (`bool`, defaults to `False`): Whether to drop the last incomplete batch if the dataset size is not divisible by the batch size. +- `num_proc` (`int`, optional, defaults to `None`): The number of processes to use for multiprocessing. If None, no multiprocessing is used. This can significantly speed up batching for large datasets. + +Note that `Dataset.batch()` returns a new [`Dataset`] where each item is a batch of multiple samples from the original dataset. If you want to process data in batches, you should use a batched [`~Dataset.map`] directly, which applies a function to batches but the output dataset is unbatched. + +## Concatenate + +Separate datasets can be concatenated if they share the same column types. Concatenate datasets with [`concatenate_datasets`]: + +```py +>>> from datasets import concatenate_datasets, load_dataset + +>>> stories = load_dataset("ajibawa-2023/General-Stories-Collection", split="train") +>>> stories = stories.select_columns(["text"]) # only keep the 'text' column +>>> wiki = load_dataset("wikimedia/wikipedia", "20231101.en", split="train") +>>> wiki = wiki.select_columns(["text"]) # only keep the 'text' column + +>>> assert stories.features.type == wiki.features.type +>>> bert_dataset = concatenate_datasets([stories, wiki]) +``` + +You can also concatenate two datasets horizontally by setting `axis=1` as long as the datasets have the same number of rows: + +```py +>>> from datasets import Dataset +>>> stories_ids = Dataset.from_dict({"ids": list(range(len(stories)))}) +>>> stories_with_ids = concatenate_datasets([stories, stories_ids], axis=1) +``` + +### Interleave + +You can also mix several datasets together by taking alternating examples from each one to create a new dataset. This is known as _interleaving_, which is enabled by the [`interleave_datasets`] function. Both [`interleave_datasets`] and [`concatenate_datasets`] work with regular [`Dataset`] and [`IterableDataset`] objects. +Refer to the [Stream](./stream#interleave) guide for an example of how to interleave [`IterableDataset`] objects. + +You can define sampling probabilities for each of the original datasets to specify how to interleave the datasets. +In this case, the new dataset is constructed by getting examples one by one from a random dataset until one of the datasets runs out of samples. + +```py +>>> from datasets import Dataset, interleave_datasets +>>> seed = 42 +>>> probabilities = [0.3, 0.5, 0.2] +>>> d1 = Dataset.from_dict({"a": [0, 1, 2]}) +>>> d2 = Dataset.from_dict({"a": [10, 11, 12, 13]}) +>>> d3 = Dataset.from_dict({"a": [20, 21, 22]}) +>>> dataset = interleave_datasets([d1, d2, d3], probabilities=probabilities, seed=seed) +>>> dataset["a"] +[10, 11, 20, 12, 0, 21, 13] +``` + +You can also specify the `stopping_strategy`. The default strategy, `first_exhausted`, is a subsampling strategy, i.e the dataset construction is stopped as soon one of the dataset runs out of samples. +You can specify `stopping_strategy=all_exhausted` to execute an oversampling strategy. In this case, the dataset construction is stopped as soon as every samples in every dataset has been added at least once. In practice, it means that if a dataset is exhausted, it will return to the beginning of this dataset until the stop criterion has been reached. +Note that if no sampling probabilities are specified, the new dataset will have `max_length_datasets*nb_dataset samples`. +There is also `stopping_strategy=all_exhausted_without_replacement` to ensure that every sample is seen exactly once. + +```py +>>> d1 = Dataset.from_dict({"a": [0, 1, 2]}) +>>> d2 = Dataset.from_dict({"a": [10, 11, 12, 13]}) +>>> d3 = Dataset.from_dict({"a": [20, 21, 22]}) +>>> dataset = interleave_datasets([d1, d2, d3], stopping_strategy="all_exhausted") +>>> dataset["a"] +[0, 10, 20, 1, 11, 21, 2, 12, 22, 0, 13, 20] +``` + +## Format + +The [`~Dataset.with_format`] function changes the format of a column to be compatible with some common data formats. Specify the output you'd like in the `type` parameter. You can also choose which the columns you want to format using `columns=`. Formatting is applied on-the-fly. + +For example, create PyTorch tensors by setting `type="torch"`: + +```py +>>> dataset = dataset.with_format(type="torch") +``` + +The [`~Dataset.set_format`] function also changes the format of a column, except it runs in-place: + +```py +>>> dataset.set_format(type="torch") +``` + +If you need to reset the dataset to its original format, set the format to `None` (or use [`~Dataset.reset_format`]): + +```py +>>> dataset.format +{'type': 'torch', 'format_kwargs': {}, 'columns': [...], 'output_all_columns': False} +>>> dataset = dataset.with_format(None) +>>> dataset.format +{'type': None, 'format_kwargs': {}, 'columns': [...], 'output_all_columns': False} +``` + +### Tensors formats + +Several tensors or arrays formats are supported. It is generally recommended to use these formats instead of converting outputs of a dataset to tensors or arrays manually to avoid unnecessary data copies and accelerate data loading. + +Here is the list of supported tensors or arrays formats: + +- NumPy: format name is "numpy", for more information see [Using Datasets with NumPy](use_with_numpy) +- PyTorch: format name is "torch", for more information see [Using Datasets with PyTorch](use_with_pytorch) +- TensorFlow: format name is "tensorflow", for more information see [Using Datasets with TensorFlow](use_with_tensorflow) +- JAX: format name is "jax", for more information see [Using Datasets with JAX](use_with_jax) + +> [!TIP] +> Check out the [Using Datasets with TensorFlow](use_with_tensorflow#using-totfdataset) guide for more details on how to efficiently create a TensorFlow dataset. + +When a dataset is formatted in a tensor or array format, all the data are formatted as tensors or arrays (except unsupported types like strings for example for PyTorch): + +```python +>>> ds = Dataset.from_dict({"text": ["foo", "bar"], "tokens": [[0, 1, 2], [3, 4, 5]]}) +>>> ds = ds.with_format("torch") +>>> ds[0] +{'text': 'foo', 'tokens': tensor([0, 1, 2])} +>>> ds[:2] +{'text': ['foo', 'bar'], + 'tokens': tensor([[0, 1, 2], + [3, 4, 5]])} +``` + +### Tabular formats + +You can use a dataframes or tables format to optimize data loading and data processing, since they generally offer zero-copy operations and transforms written in low-level languages. + +Here is the list of supported dataframes or tables formats: + +- Pandas: format name is "pandas", for more information see [Using Datasets with Pandas](use_with_pandas) +- Polars: format name is "polars", for more information see [Using Datasets with Polars](use_with_polars) +- PyArrow: format name is "arrow", for more information see [Using Datasets with PyArrow](use_with_tensorflow) + +When a dataset is formatted in a dataframe or table format, every dataset row or batches of rows is formatted as a dataframe or table, and dataset colums are formatted as a series or array: + +```python +>>> ds = Dataset.from_dict({"text": ["foo", "bar"], "label": [0, 1]}) +>>> ds = ds.with_format("pandas") +>>> ds[:2] + text label +0 foo 0 +1 bar 1 +``` + +Those formats make it possible to iterate on the data faster by avoiding data copies, and also enable faster data processing in [`~Dataset.map`] or [`~Dataset.filter`]: + +```python +>>> ds = ds.map(lambda df: df.assign(upper_text=df.text.str.upper()), batched=True) +>>> ds[:2] + text label upper_text +0 foo 0 FOO +1 bar 1 BAR +``` + +### Custom format transform + +The [`~Dataset.with_transform`] function applies a custom formatting transform on-the-fly. This function replaces any previously specified format. For example, you can use this function to tokenize and pad tokens on-the-fly. Tokenization is only applied when examples are accessed: + +```py +>>> from transformers import AutoTokenizer + +>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") +>>> def encode(batch): +... return tokenizer(batch["sentence1"], batch["sentence2"], padding="longest", truncation=True, max_length=512, return_tensors="pt") +>>> dataset = dataset.with_transform(encode) +>>> dataset.format +{'type': 'custom', 'format_kwargs': {'transform': }, 'columns': ['idx', 'label', 'sentence1', 'sentence2'], 'output_all_columns': False} +``` + +There is also [`~Dataset.set_transform`] which does the same but runs in-place. + +You can also use the [`~Dataset.with_transform`] function for custom decoding on [`Features`]. + +The example below uses the [`pydub`](http://pydub.com/) package as an alternative to `torchcodec` decoding: + +```py +>>> import numpy as np +>>> from pydub import AudioSegment + +>>> audio_dataset_amr = Dataset.from_dict({"audio": ["audio_samples/audio.amr"]}) + +>>> def decode_audio_with_pydub(batch, sampling_rate=16_000): +... def pydub_decode_file(audio_path): +... sound = AudioSegment.from_file(audio_path) +... if sound.frame_rate != sampling_rate: +... sound = sound.set_frame_rate(sampling_rate) +... channel_sounds = sound.split_to_mono() +... samples = [s.get_array_of_samples() for s in channel_sounds] +... fp_arr = np.array(samples).T.astype(np.float32) +... fp_arr /= np.iinfo(samples[0].typecode).max +... return fp_arr +... +... batch["audio"] = [pydub_decode_file(audio_path) for audio_path in batch["audio"]] +... return batch + +>>> audio_dataset_amr.set_transform(decode_audio_with_pydub) +``` + +## Save + +Once your dataset is ready, you can save it as a Hugging Face Dataset in Parquet format and reuse it later with [`load_dataset`]. + +Save your dataset by providing the name of the dataset repository on Hugging Face you wish to save it to to [`~Dataset.push_to_hub`]: + +```python +encoded_dataset.push_to_hub("username/my_dataset") +``` + +You can use multiple processes to upload it in parallel. This is especially useful if you want to speed up the process: + +```python +dataset.push_to_hub("username/my_dataset", num_proc=8) +``` + +Use the [`load_dataset`] function to reload the dataset (in streaming mode or not): + +```python +from datasets import load_dataset +reloaded_dataset = load_dataset("username/my_dataset", streaming=True) +``` + +Alternatively, you can save it locally in Arrow format on disk. Compared to Parquet, Arrow is uncompressed which makes it much faster to reload which is great for local use on disk and ephemeral caching. But since it's larger and with less metadata, it is slower to upload/download/query than Parquet and less suited for long term storage. + +Use the [`~Dataset.save_to_disk`] and [`load_from_disk`] function to reload the dataset from your disk: + +```py +>>> encoded_dataset.save_to_disk("path/of/my/dataset/directory") +>>> # later +>>> from datasets import load_from_disk +>>> reloaded_dataset = load_from_disk("path/of/my/dataset/directory") +``` + +## Export + +🤗 Datasets supports exporting as well so you can work with your dataset in other applications. The following table shows currently supported file formats you can export to: + +| File type | Export method | +| ----------------------- | ------------------------------------------------------------------- | +| CSV | [`Dataset.to_csv`] | +| JSON | [`Dataset.to_json`] | +| Parquet | [`Dataset.to_parquet`] | +| SQL | [`Dataset.to_sql`] | +| In-memory Python object | [`Dataset.to_pandas`], [`Dataset.to_polars`] or [`Dataset.to_dict`] | + +For example, export your dataset to a CSV file like this: + +```py +>>> encoded_dataset.to_csv("path/of/my/dataset.csv") +``` + +Use a `hf://` path to export to a [Dataset repository](https://huggingface.co/docs/hub/datasets-overview) or a [Storage Bucket](https://huggingface.co/docs/hub/storage-buckets) on Hugging Face: + +```py +>>> encoded_dataset.to_csv("hf://datasets/username/dataset_name/path/of/my/dataset.csv") +>>> encoded_dataset.to_csv("hf://buckets/username/raw_data_bucket/path/of/my/dataset.csv") +``` diff --git a/docs/source/quickstart.mdx b/docs/source/quickstart.mdx new file mode 100644 index 0000000..a6f2dc2 --- /dev/null +++ b/docs/source/quickstart.mdx @@ -0,0 +1,380 @@ + + +# Quickstart + +[[open-in-colab]] + +This quickstart is intended for developers who are ready to dive into the code and see an example of how to integrate 🤗 Datasets into their model training workflow. If you're a beginner, we recommend starting with our [tutorials](./tutorial), where you'll get a more thorough introduction. + +Each dataset is unique, and depending on the task, some datasets may require additional steps to prepare it for training. But you can always use 🤗 Datasets tools to load and process a dataset. The fastest and easiest way to get started is by loading an existing dataset from the [Hugging Face Hub](https://huggingface.co/datasets). There are thousands of datasets to choose from, spanning many tasks. Choose the type of dataset you want to work with, and let's get started! + + + +> [!TIP] +> Check out [Chapter 5](https://huggingface.co/course/chapter5/1?fw=pt) of the Hugging Face course to learn more about other important topics such as loading remote or local datasets, tools for cleaning up a dataset, and creating your own dataset. + +Start by installing 🤗 Datasets: + +```bash +pip install datasets +``` + +🤗 Datasets also support audio and image data formats: + +- To work with audio datasets, install the [`Audio`] feature: + + ```bash + pip install datasets[audio] + ``` + +- To work with image datasets, install the [`Image`] feature: + + ```bash + pip install datasets[vision] + ``` + +Besides 🤗 Datasets, make sure your preferred machine learning framework is installed: + + + ```bash pip install torch ``` + ```bash pip install tensorflow ``` + + +## Audio + +Audio datasets are loaded just like text datasets. However, an audio dataset is preprocessed a bit differently. Instead of a tokenizer, you'll need a [feature extractor](https://huggingface.co/docs/transformers/main_classes/feature_extractor#feature-extractor). An audio input may also require resampling its sampling rate to match the sampling rate of the pretrained model you're using. In this quickstart, you'll prepare the [MInDS-14](https://huggingface.co/datasets/PolyAI/minds14) dataset for a model train on and classify the banking issue a customer is having. + +**1**. Load the MInDS-14 dataset by providing the [`load_dataset`] function with the dataset name, dataset configuration (not all datasets will have a configuration), and a dataset split: + +```py +>>> from datasets import load_dataset, Audio + +>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train") +``` + +**2**. Next, load a pretrained [Wav2Vec2](https://huggingface.co/facebook/wav2vec2-base) model and its corresponding feature extractor from the [🤗 Transformers](https://huggingface.co/transformers/) library. It is totally normal to see a warning after you load the model about some weights not being initialized. This is expected because you are loading this model checkpoint for training with another task. + +```py +>>> from transformers import AutoModelForAudioClassification, AutoFeatureExtractor + +>>> model = AutoModelForAudioClassification.from_pretrained("facebook/wav2vec2-base") +>>> feature_extractor = AutoFeatureExtractor.from_pretrained("facebook/wav2vec2-base") +``` + +**3**. The [MInDS-14](https://huggingface.co/datasets/PolyAI/minds14) dataset card indicates the sampling rate is 8kHz, but the Wav2Vec2 model was pretrained on a sampling rate of 16kHZ. You'll need to upsample the `audio` column with the [`~Dataset.cast_column`] function and [`Audio`] feature to match the model's sampling rate. + +```py +>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16000)) +>>> dataset[0]["audio"] + +``` + +**4**. Create a function to preprocess the audio `array` with the feature extractor, and truncate and pad the sequences into tidy rectangular tensors. The most important thing to remember is to call the audio `array` in the feature extractor since the `array` - the actual speech signal - is the model input. + +Once you have a preprocessing function, use the [`~Dataset.map`] function to speed up processing by applying the function to batches of examples in the dataset. + +```py +>>> def preprocess_function(examples): +... audio_arrays = [x.get_all_samples().data for x in examples["audio"]] +... inputs = feature_extractor( +... audio_arrays, +... sampling_rate=16000, +... padding=True, +... max_length=100000, +... truncation=True, +... ) +... return inputs + +>>> dataset = dataset.map(preprocess_function, batched=True) +``` + +**5**. Use the [`~Dataset.rename_column`] function to rename the `intent_class` column to `labels`, which is the expected input name in [Wav2Vec2ForSequenceClassification](https://huggingface.co/docs/transformers/main/en/model_doc/wav2vec2#transformers.Wav2Vec2ForSequenceClassification): + +```py +>>> dataset = dataset.rename_column("intent_class", "labels") +``` + +**6**. Set the dataset format according to the machine learning framework you're using. + + + +Use the [`~Dataset.set_format`] function to set the dataset format to `torch` and specify the columns you want to format. This function applies formatting on-the-fly. After converting to PyTorch tensors, wrap the dataset in [`torch.utils.data.DataLoader`](https://alband.github.io/doc_view/data.html?highlight=torch%20utils%20data%20dataloader#torch.utils.data.DataLoader): + +```py +>>> from torch.utils.data import DataLoader + +>>> dataset.set_format(type="torch", columns=["input_values", "labels"]) +>>> dataloader = DataLoader(dataset, batch_size=4) +``` + + + + +Use the [`~transformers.TFPreTrainedModel.prepare_tf_dataset`] method from 🤗 Transformers to prepare the dataset to be compatible with +TensorFlow, and ready to train/fine-tune a model, as it wraps a HuggingFace [`~datasets.Dataset`] as a `tf.data.Dataset` +with collation and batching, so one can pass it directly to Keras methods like `fit()` without further modification. + +```py +>>> import tensorflow as tf + +>>> tf_dataset = model.prepare_tf_dataset( +... dataset, +... batch_size=4, +... shuffle=True, +... ) +``` + + + + +**7**. Start training with your machine learning framework! Check out the 🤗 Transformers [audio classification guide](https://huggingface.co/docs/transformers/tasks/audio_classification) for an end-to-end example of how to train a model on an audio dataset. + +## Vision + +Image datasets are loaded just like text datasets. However, instead of a tokenizer, you'll need a [feature extractor](https://huggingface.co/docs/transformers/main_classes/feature_extractor#feature-extractor) to preprocess the dataset. Applying data augmentation to an image is common in computer vision to make the model more robust against overfitting. You're free to use any data augmentation library you want, and then you can apply the augmentations with 🤗 Datasets. In this quickstart, you'll load the [Beans](https://huggingface.co/datasets/beans) dataset and get it ready for the model to train on and identify disease from the leaf images. + +**1**. Load the Beans dataset by providing the [`load_dataset`] function with the dataset name and a dataset split: + +```py +>>> from datasets import load_dataset, Image + +>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train") +``` + +Most image models work with RBG images. If your dataset contains images in a different mode, you can use the [`~Dataset.cast_column`] function to set the mode to RGB: + +```py +>>> dataset = dataset.cast_column("image", Image(mode="RGB")) +``` + +The Beans dataset contains only RGB images, so this step is unnecessary here. + +**2**. Now you can add some data augmentations with any library ([Albumentations](https://albumentations.ai/), [imgaug](https://imgaug.readthedocs.io/en/latest/), [Kornia](https://kornia.readthedocs.io/en/latest/)) you like. Here, you'll use [torchvision](https://pytorch.org/vision/stable/transforms.html) to randomly change the color properties of an image: + +```py +>>> from torchvision.transforms import Compose, ColorJitter, ToTensor + +>>> jitter = Compose( +... [ColorJitter(brightness=0.5, hue=0.5), ToTensor()] +... ) +``` + +**3**. Create a function to apply your transform to the dataset and generate the model input: `pixel_values`. + +```python +>>> def transforms(examples): +... examples["pixel_values"] = [jitter(image.convert("RGB")) for image in examples["image"]] +... return examples +``` + +**4**. Use the [`~Dataset.with_transform`] function to apply the data augmentations on-the-fly: + +```py +>>> dataset = dataset.with_transform(transforms) +``` + +**5**. Set the dataset format according to the machine learning framework you're using. + + + +Wrap the dataset in [`torch.utils.data.DataLoader`](https://alband.github.io/doc_view/data.html?highlight=torch%20utils%20data%20dataloader#torch.utils.data.DataLoader). You'll also need to create a collate function to collate the samples into batches: + +```py +>>> from torch.utils.data import DataLoader + +>>> def collate_fn(examples): +... images = [] +... labels = [] +... for example in examples: +... images.append((example["pixel_values"])) +... labels.append(example["labels"]) +... +... pixel_values = torch.stack(images) +... labels = torch.tensor(labels) +... return {"pixel_values": pixel_values, "labels": labels} +>>> dataloader = DataLoader(dataset, collate_fn=collate_fn, batch_size=4) +``` + + + + +Use the [`~transformers.TFPreTrainedModel.prepare_tf_dataset`] method from 🤗 Transformers to prepare the dataset to be compatible with +TensorFlow, and ready to train/fine-tune a model, as it wraps a HuggingFace [`~datasets.Dataset`] as a `tf.data.Dataset` +with collation and batching, so one can pass it directly to Keras methods like `fit()` without further modification. + +Before you start, make sure you have up-to-date versions of `albumentations` and `cv2` installed: + +```bash +pip install -U albumentations opencv-python +``` + +```py +>>> import albumentations +>>> import numpy as np + +>>> transform = albumentations.Compose([ +... albumentations.RandomCrop(width=256, height=256), +... albumentations.HorizontalFlip(p=0.5), +... albumentations.RandomBrightnessContrast(p=0.2), +... ]) + +>>> def transforms(examples): +... examples["pixel_values"] = [ +... transform(image=np.array(image))["image"] for image in examples["image"] +... ] +... return examples + +>>> dataset.set_transform(transforms) +>>> tf_dataset = model.prepare_tf_dataset( +... dataset, +... batch_size=4, +... shuffle=True, +... ) +``` + + + + +**6**. Start training with your machine learning framework! Check out the 🤗 Transformers [image classification guide](https://huggingface.co/docs/transformers/tasks/image_classification) for an end-to-end example of how to train a model on an image dataset. + +## NLP + +Text needs to be tokenized into individual tokens by a [tokenizer](https://huggingface.co/docs/transformers/main_classes/tokenizer). For the quickstart, you'll load the [Microsoft Research Paraphrase Corpus (MRPC)](https://huggingface.co/datasets/nyu-mll/glue/viewer/mrpc) training dataset to train a model to determine whether a pair of sentences mean the same thing. + +**1**. Load the MRPC dataset by providing the [`load_dataset`] function with the dataset name, dataset configuration (not all datasets will have a configuration), and dataset split: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("nyu-mll/glue", "mrpc", split="train") +``` + +**2**. Next, load a pretrained [BERT](https://huggingface.co/bert-base-uncased) model and its corresponding tokenizer from the [🤗 Transformers](https://huggingface.co/transformers/) library. It is totally normal to see a warning after you load the model about some weights not being initialized. This is expected because you are loading this model checkpoint for training with another task. + +```py +>>> from transformers import AutoModelForSequenceClassification, AutoTokenizer + +>>> model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased") +>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") +===PT-TF-SPLIT=== +>>> from transformers import TFAutoModelForSequenceClassification, AutoTokenizer + +>>> model = TFAutoModelForSequenceClassification.from_pretrained("bert-base-uncased") +>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") +``` + +**3**. Create a function to tokenize the dataset, and you should also truncate and pad the text into tidy rectangular tensors. The tokenizer generates three new columns in the dataset: `input_ids`, `token_type_ids`, and an `attention_mask`. These are the model inputs. + +Use the [`~Dataset.map`] function to speed up processing by applying your tokenization function to batches of examples in the dataset: + +```py +>>> def encode(examples): +... return tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, padding="max_length") + +>>> dataset = dataset.map(encode, batched=True) +>>> dataset[0] +{'sentence1': 'Amrozi accused his brother , whom he called " the witness " , of deliberately distorting his evidence .', +'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .', +'label': 1, +'idx': 0, +'input_ids': [ 101, 7277, 2180, 5303, 4806, 1117, 1711, 117, 2292, 1119, 1270, 107, 1103, 7737, 107, 117, 1104, 9938, 4267, 12223, 21811, 1117, 2554, 119, 102, 11336, 6732, 3384, 1106, 1140, 1112, 1178, 107, 1103, 7737, 107, 117, 7277, 2180, 5303, 4806, 1117, 1711, 1104, 9938, 4267, 12223, 21811, 1117, 2554, 119, 102, 0, 0, ...], +'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, ...], +'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, ...]} +``` + +**4**. Rename the `label` column to `labels`, which is the expected input name in [BertForSequenceClassification](https://huggingface.co/docs/transformers/main/en/model_doc/bert#transformers.BertForSequenceClassification): + +```py +>>> dataset = dataset.map(lambda examples: {"labels": examples["label"]}, batched=True) +``` + +**5**. Set the dataset format according to the machine learning framework you're using. + + + +Use the [`~Dataset.with_format`] function to set the dataset format to `torch` and specify the columns you want to format. This function applies formatting on-the-fly. After converting to PyTorch tensors, wrap the dataset in [`torch.utils.data.DataLoader`](https://alband.github.io/doc_view/data.html?highlight=torch%20utils%20data%20dataloader#torch.utils.data.DataLoader): + +```py +>>> import torch + +>>> dataset = dataset.select_columns(["input_ids", "token_type_ids", "attention_mask", "labels"]) +>>> dataset = dataset.with_format(type="torch") +>>> dataloader = torch.utils.data.DataLoader(dataset, batch_size=32) +``` + + + + +Use the [`~transformers.TFPreTrainedModel.prepare_tf_dataset`] method from 🤗 Transformers to prepare the dataset to be compatible with +TensorFlow, and ready to train/fine-tune a model, as it wraps a HuggingFace [`~datasets.Dataset`] as a `tf.data.Dataset` +with collation and batching, so one can pass it directly to Keras methods like `fit()` without further modification. + +```py +>>> import tensorflow as tf + +>>> tf_dataset = model.prepare_tf_dataset( +... dataset, +... batch_size=4, +... shuffle=True, +... ) +``` + + + + +**6**. Start training with your machine learning framework! Check out the 🤗 Transformers [text classification guide](https://huggingface.co/docs/transformers/tasks/sequence_classification) for an end-to-end example of how to train a model on a text dataset. + +## What's next? + +This completes the 🤗 Datasets quickstart! You can load any text, audio, or image dataset with a single function and get it ready for your model to train on. + +For your next steps, take a look at our [How-to guides](./how_to) and learn how to do more specific things like loading different dataset formats, aligning labels, and streaming large datasets. If you're interested in learning more about 🤗 Datasets core concepts, grab a cup of coffee and read our [Conceptual Guides](./about_arrow)! diff --git a/docs/source/repository_structure.mdx b/docs/source/repository_structure.mdx new file mode 100644 index 0000000..acb2bb1 --- /dev/null +++ b/docs/source/repository_structure.mdx @@ -0,0 +1,273 @@ +# Structure your repository + +To host and share your dataset, create a dataset repository on the Hugging Face Hub and upload your data files. + +This guide will show you how to structure your dataset repository when you upload it. +A dataset with a supported structure and file format (`.txt`, `.csv`, `.parquet`, `.jsonl`, `.mp3`, `.jpg`, `.zip` etc.) are loaded automatically with [`~datasets.load_dataset`], and it'll have a dataset viewer on its dataset page on the Hub. + +## Main use-case + +The simplest dataset structure has two files: `train.csv` and `test.csv` (this works with any supported file format). + +Your repository will also contain a `README.md` file, the [dataset card](dataset_card) displayed on your dataset page. + +``` +my_dataset_repository/ +├── README.md +├── train.csv +└── test.csv +``` + +In this simple case, you'll get a dataset with two splits: `train` (containing examples from `train.csv`) and `test` (containing examples from `test.csv`). + +## Define your splits and subsets in YAML + +## Splits + +If you have multiple files and want to define which file goes into which split, you can use the YAML `configs` field at the top of your README.md. + +For example, given a repository like this one: + +``` +my_dataset_repository/ +├── README.md +├── data.csv +└── holdout.csv +``` + +You can define your splits by adding the `configs` field in the YAML block at the top of your README.md: + +```yaml +--- +configs: +- config_name: default + data_files: + - split: train + path: "data.csv" + - split: test + path: "holdout.csv" +--- +``` + + +You can select multiple files per split using a list of paths: + +``` +my_dataset_repository/ +├── README.md +├── data/ +│ ├── abc.csv +│ └── def.csv +└── holdout/ + └── ghi.csv +``` + +```yaml +--- +configs: +- config_name: default + data_files: + - split: train + path: + - "data/abc.csv" + - "data/def.csv" + - split: test + path: "holdout/ghi.csv" +--- +``` + +Or you can use glob patterns to automatically list all the files you need: + +```yaml +--- +configs: +- config_name: default + data_files: + - split: train + path: "data/*.csv" + - split: test + path: "holdout/*.csv" +--- +``` + +> [!WARNING] +> Note that `config_name` field is required even if you have a single configuration. + +## Configurations + +Your dataset might have several subsets of data that you want to be able to load separately. In that case you can define a list of configurations inside the `configs` field in YAML: + +``` +my_dataset_repository/ +├── README.md +├── main_data.csv +└── additional_data.csv +``` + +```yaml +--- +configs: +- config_name: main_data + data_files: "main_data.csv" +- config_name: additional_data + data_files: "additional_data.csv" +--- +``` + +Each configuration is shown separately on the Hugging Face Hub, and can be loaded by passing its name as a second parameter: + +```python +from datasets import load_dataset + +main_data = load_dataset("my_dataset_repository", "main_data") +additional_data = load_dataset("my_dataset_repository", "additional_data") +``` + +## Builder parameters + +Not only `data_files`, but other builder-specific parameters can be passed via YAML, allowing for more flexibility on how to load the data while not requiring any custom code. For example, define which separator to use in which configuration to load your `csv` files: + +```yaml +--- +configs: +- config_name: tab + data_files: "main_data.csv" + sep: "\t" +- config_name: comma + data_files: "additional_data.csv" + sep: "," +--- +``` + +Refer to [specific builders' documentation](./package_reference/builder_classes) to see what configuration parameters they have. + +> [!TIP] +> You can set a default configuration using `default: true`, e.g. you can run `main_data = load_dataset("my_dataset_repository")` if you set +> +> ```yaml +> - config_name: main_data +> data_files: "main_data.csv" +> default: true +> ``` + +## Automatic splits detection + +If no YAML is provided, 🤗 Datasets searches for certain patterns in the dataset repository to automatically infer the dataset splits. +There is an order to the patterns, beginning with the custom filename split format to treating all files as a single split if no pattern is found. + +### Directory name + +Your data files may also be placed into different directories named `train`, `test`, and `validation` where each directory contains the data files for that split: + +``` +my_dataset_repository/ +├── README.md +└── data/ + ├── train/ + │ └── bees.csv + ├── test/ + │ └── more_bees.csv + └── validation/ + └── even_more_bees.csv +``` + +### Filename splits + +If you don't have any non-traditional splits, then you can place the split name anywhere in the data file and it is automatically inferred. The only rule is that the split name must be delimited by non-word characters, like `test-file.csv` for example instead of `testfile.csv`. Supported delimiters include underscores, dashes, spaces, dots, and numbers. + +For example, the following file names are all acceptable: + +- train split: `train.csv`, `my_train_file.csv`, `train1.csv` +- validation split: `validation.csv`, `my_validation_file.csv`, `validation1.csv` +- test split: `test.csv`, `my_test_file.csv`, `test1.csv` + +Here is an example where all the files are placed into a directory named `data`: + +``` +my_dataset_repository/ +├── README.md +└── data/ + ├── train.csv + ├── test.csv + └── validation.csv +``` + +### Custom filename split + +If your dataset splits have custom names that aren't `train`, `test`, or `validation`, then you can name your data files like `data/-xxxxx-of-xxxxx.csv`. + +Here is an example with three splits, `train`, `test`, and `random`: + +``` +my_dataset_repository/ +├── README.md +└── data/ + ├── train-00000-of-00003.csv + ├── train-00001-of-00003.csv + ├── train-00002-of-00003.csv + ├── test-00000-of-00001.csv + ├── random-00000-of-00003.csv + ├── random-00001-of-00003.csv + └── random-00002-of-00003.csv +``` + +### Single split + +When 🤗 Datasets can't find any of the above patterns, then it'll treat all the files as a single train split. If your dataset splits aren't loading as expected, it may be due to an incorrect pattern. + +### Split name keywords + +There are several ways to name splits. Validation splits are sometimes called "dev", and test splits may be referred to as "eval". +These other split names are also supported, and the following keywords are equivalent: + +- train, training +- validation, valid, val, dev +- test, testing, eval, evaluation + +The structure below is a valid repository: + +``` +my_dataset_repository/ +├── README.md +└── data/ + ├── training.csv + ├── eval.csv + └── valid.csv +``` + +### Multiple files per split + +If one of your splits comprises several files, 🤗 Datasets can still infer whether it is the train, validation, and test split from the file name. +For example, if your train and test splits span several files: + +``` +my_dataset_repository/ +├── README.md +├── train_0.csv +├── train_1.csv +├── train_2.csv +├── train_3.csv +├── test_0.csv +└── test_1.csv +``` + +Make sure all the files of your `train` set have *train* in their names (same for test and validation). +Even if you add a prefix or suffix to `train` in the file name (like `my_train_file_00001.csv` for example), +🤗 Datasets can still infer the appropriate split. + +For convenience, you can also place your data files into different directories. +In this case, the split name is inferred from the directory name. + +``` +my_dataset_repository/ +├── README.md +└── data/ + ├── train/ + │ ├── shard_0.csv + │ ├── shard_1.csv + │ ├── shard_2.csv + │ └── shard_3.csv + └── test/ + ├── shard_0.csv + └── shard_1.csv +``` diff --git a/docs/source/semantic_segmentation.mdx b/docs/source/semantic_segmentation.mdx new file mode 100644 index 0000000..44ceb2a --- /dev/null +++ b/docs/source/semantic_segmentation.mdx @@ -0,0 +1,174 @@ +# Semantic segmentation + +Semantic segmentation datasets are used to train a model to classify every pixel in an image. There are +a wide variety of applications enabled by these datasets such as background removal from images, stylizing +images, or scene understanding for autonomous driving. This guide will show you how to apply transformations +to an image segmentation dataset. + +Before you start, make sure you have up-to-date versions of `albumentations` and `cv2` installed: + +```bash +pip install -U albumentations opencv-python +``` + +[Albumentations](https://albumentations.ai/) is a Python library for performing data augmentation +for computer vision. It supports various computer vision tasks such as image classification, object +detection, segmentation, and keypoint estimation. + +This guide uses the [Scene Parsing](https://huggingface.co/datasets/scene_parse_150) dataset for segmenting +and parsing an image into different image regions associated with semantic categories, such as sky, road, person, and bed. + +Load the `train` split of the dataset and take a look at an example: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("scene_parse_150", split="train") +>>> index = 10 +>>> dataset[index] +{'image': , + 'annotation': , + 'scene_category': 927} +``` + +The dataset has three fields: + +* `image`: a PIL image object. +* `annotation`: segmentation mask of the image. +* `scene_category`: the label or scene category of the image (like “kitchen” or “office”). + +Next, check out an image with: + +```py +>>> dataset[index]["image"] +``` + +
+ +
+ +Similarly, you can check out the respective segmentation mask: + +```py +>>> dataset[index]["annotation"] +``` + +
+ +
+ +We can also add a [color palette](https://github.com/tensorflow/models/blob/3f1ca33afe3c1631b733ea7e40c294273b9e406d/research/deeplab/utils/get_dataset_colormap.py#L51) on the +segmentation mask and overlay it on top of the original image to visualize the dataset: + +After defining the color palette, you should be ready to visualize some overlays. + +```py +>>> import matplotlib.pyplot as plt + +>>> def visualize_seg_mask(image: np.ndarray, mask: np.ndarray): +... color_seg = np.zeros((mask.shape[0], mask.shape[1], 3), dtype=np.uint8) +... palette = np.array(create_ade20k_label_colormap()) +... for label, color in enumerate(palette): +... color_seg[mask == label, :] = color +... color_seg = color_seg[..., ::-1] # convert to BGR + +... img = np.array(image) * 0.5 + color_seg * 0.5 # plot the image with the segmentation map +... img = img.astype(np.uint8) + +... plt.figure(figsize=(15, 10)) +... plt.imshow(img) +... plt.axis("off") +... plt.show() + + +>>> visualize_seg_mask( +... np.array(dataset[index]["image"]), +... np.array(dataset[index]["annotation"]) +... ) +``` + +
+ +
+ +Now apply some augmentations with `albumentations`. You’ll first resize the image and adjust its brightness. + +```py +>>> import albumentations + +>>> transform = albumentations.Compose( +... [ +... albumentations.Resize(256, 256), +... albumentations.RandomBrightnessContrast(brightness_limit=0.3, contrast_limit=0.3, p=0.5), +... ] +... ) +``` + +Create a function to apply the transformation to the images: + +```py +>>> def transforms(examples): +... transformed_images, transformed_masks = [], [] +... +... for image, seg_mask in zip(examples["image"], examples["annotation"]): +... image, seg_mask = np.array(image), np.array(seg_mask) +... transformed = transform(image=image, mask=seg_mask) +... transformed_images.append(transformed["image"]) +... transformed_masks.append(transformed["mask"]) +... +... examples["pixel_values"] = transformed_images +... examples["label"] = transformed_masks +... return examples +``` + +Use the [`~Dataset.set_transform`] function to apply the transformation on-the-fly to batches of the dataset to consume less disk space: + +```py +>>> dataset.set_transform(transforms) +``` + +You can verify the transformation worked by indexing into the `pixel_values` and `label` of an example: + +```py +>>> image = np.array(dataset[index]["pixel_values"]) +>>> mask = np.array(dataset[index]["label"]) + +>>> visualize_seg_mask(image, mask) +``` + +
+ +
+ +In this guide, you have used `albumentations` for augmenting the dataset. It's also possible to use `torchvision` to apply some similar transforms. + +```py +>>> from torchvision.transforms import Resize, ColorJitter, Compose + +>>> transformation_chain = Compose([ +... Resize((256, 256)), +... ColorJitter(brightness=0.25, contrast=0.25, saturation=0.25, hue=0.1) +... ]) +>>> resize = Resize((256, 256)) + +>>> def train_transforms(example_batch): +... example_batch["pixel_values"] = [transformation_chain(x) for x in example_batch["image"]] +... example_batch["label"] = [resize(x) for x in example_batch["annotation"]] +... return example_batch + +>>> dataset.set_transform(train_transforms) + +>>> image = np.array(dataset[index]["pixel_values"]) +>>> mask = np.array(dataset[index]["label"]) + +>>> visualize_seg_mask(image, mask) +``` + +
+ +
+ +> [!TIP] +> Now that you know how to process a dataset for semantic segmentation, learn +> [how to train a semantic segmentation model](https://huggingface.co/docs/transformers/tasks/semantic_segmentation) +> and use it for inference. \ No newline at end of file diff --git a/docs/source/share.mdx b/docs/source/share.mdx new file mode 100644 index 0000000..bbaaa56 --- /dev/null +++ b/docs/source/share.mdx @@ -0,0 +1,211 @@ +# Share a dataset using the CLI + +At Hugging Face, we are on a mission to democratize good Machine Learning and we believe in the value of open source. That's why we designed 🤗 Datasets so that anyone can share a dataset with the greater ML community. There are currently thousands of datasets in over 100 languages in the Hugging Face Hub, and the Hugging Face team always welcomes new contributions! + +Dataset repositories offer features such as: + +- Free dataset hosting +- Dataset versioning +- Commit history and diffs +- Metadata for discoverability +- Dataset cards for documentation, licensing, limitations, etc. +- [Dataset Viewer](https://huggingface.co/docs/hub/datasets-viewer) + +This guide will show you how to share a dataset folder or repository that can be easily accessed by anyone. + + + +## Add a dataset + +You can share your dataset with the community with a dataset repository on the Hugging Face Hub. +It can also be a private dataset if you want to control who has access to it. + +In a dataset repository, you can host all your data files and [configure your dataset](./repository_structure#define-your-splits-in-yaml) to define which file goes to which split. +The following formats are supported: CSV, TSV, JSON, JSON lines, text, Parquet, Arrow, SQLite, WebDataset. +Many kinds of compressed file types are also supported: GZ, BZ2, LZ4, LZMA or ZSTD. +For example, your dataset can be made of `.json.gz` files. + +When loading a dataset from the Hub, all the files in the supported formats are loaded, following the [repository structure](./repository_structure). + +For more information on how to load a dataset from the Hub, take a look at the [load a dataset from the Hub](./load_hub) tutorial. + +### Create the repository + +Sharing a community dataset will require you to create an account on [hf.co](https://huggingface.co/join) if you don't have one yet. +You can directly create a [new dataset repository](https://huggingface.co/login?next=%2Fnew-dataset) from your account on the Hugging Face Hub, but this guide will show you how to upload a dataset from the terminal. + +1. Make sure you are in the virtual environment where you installed Datasets, and run the following command: + +``` +huggingface-cli login +``` + +2. Login using your Hugging Face Hub credentials, and create a new dataset repository: + +``` +huggingface-cli repo create my-cool-dataset --type dataset +``` + +Add the `-organization` flag to create a repository under a specific organization: + +``` +huggingface-cli repo create my-cool-dataset --type dataset --organization your-org-name +``` + +## Prepare your files + +Check your directory to ensure the only files you're uploading are: + +- The data files of the dataset + +- The dataset card `README.md` + + +## huggingface-cli upload + +Use the `huggingface-cli upload` command to upload files to the Hub directly. Internally, it uses the same [`upload_file`] and [`upload_folder`] helpers described in the [Upload guide](https://huggingface.co/docs/huggingface_hub/guides/upload). In the examples below, we will walk through the most common use cases. For a full list of available options, you can run: + +```bash +>>> huggingface-cli upload --help +``` + +For more general information about `huggingface-cli` you can check the [CLI guide](https://huggingface.co/docs/huggingface_hub/guides/cli). + +### Upload an entire folder + +The default usage for this command is: + +```bash +# Usage: huggingface-cli upload [dataset_repo_id] [local_path] [path_in_repo] --repo-type dataset +``` + +To upload the current directory at the root of the repo, use: + +```bash +>>> huggingface-cli upload my-cool-dataset . . --repo-type dataset +https://huggingface.co/datasets/Wauplin/my-cool-dataset/tree/main/ +``` + +> [!TIP] +> If the repo doesn't exist yet, it will be created automatically. + +You can also upload a specific folder: + +```bash +>>> huggingface-cli upload my-cool-dataset ./data . --repo-type dataset +https://huggingface.co/datasetsWauplin/my-cool-dataset/tree/main/ +``` + +Finally, you can upload a folder to a specific destination on the repo: + +```bash +>>> huggingface-cli upload my-cool-dataset ./path/to/curated/data /data/train --repo-type dataset +https://huggingface.co/datasetsWauplin/my-cool-dataset/tree/main/data/train +``` + +### Upload a single file + +You can also upload a single file by setting `local_path` to point to a file on your machine. If that's the case, `path_in_repo` is optional and will default to the name of your local file: + +```bash +>>> huggingface-cli upload Wauplin/my-cool-dataset ./files/train.csv --repo-type dataset +https://huggingface.co/datasetsWauplin/my-cool-dataset/blob/main/train.csv +``` + +If you want to upload a single file to a specific directory, set `path_in_repo` accordingly: + +```bash +>>> huggingface-cli upload Wauplin/my-cool-dataset ./files/train.csv /data/train.csv --repo-type dataset +https://huggingface.co/datasetsWauplin/my-cool-dataset/blob/main/data/train.csv +``` + +### Upload multiple files + +To upload multiple files from a folder at once without uploading the entire folder, use the `--include` and `--exclude` patterns. It can also be combined with the `--delete` option to delete files on the repo while uploading new ones. In the example below, we sync the local Space by deleting remote files and uploading all CSV files: + +```bash +# Sync local Space with Hub (upload new CSV files, delete removed files) +>>> huggingface-cli upload Wauplin/my-cool-dataset --repo-type dataset --include="/data/*.csv" --delete="*" --commit-message="Sync local dataset with Hub" +... +``` + +### Upload to an organization + +To upload content to a repo owned by an organization instead of a personal repo, you must explicitly specify it in the `repo_id`: + +```bash +>>> huggingface-cli upload MyCoolOrganization/my-cool-dataset . . --repo-type dataset +https://huggingface.co/datasetsMyCoolOrganization/my-cool-dataset/tree/main/ +``` + +### Upload to a specific revision + +By default, files are uploaded to the `main` branch. If you want to upload files to another branch or reference, use the `--revision` option: + +```bash +# Upload files to a PR +huggingface-cli upload bigcode/the-stack . . --repo-type dataset --revision refs/pr/104 +... +``` + +**Note:** if `revision` does not exist and `--create-pr` is not set, a branch will be created automatically from the `main` branch. + +### Upload and create a PR + +If you don't have the permission to push to a repo, you must open a PR and let the authors know about the changes you want to make. This can be done by setting the `--create-pr` option: + +```bash +# Create a PR and upload the files to it +>>> huggingface-cli upload bigcode/the-stack --repo-type dataset --revision refs/pr/104 --create-pr . . +https://huggingface.co/datasets/bigcode/the-stack/blob/refs%2Fpr%2F104/ +``` + +### Upload at regular intervals + +In some cases, you might want to push regular updates to a repo. For example, this is useful if your dataset is growing over time and you want to upload the data folder every 10 minutes. You can do this using the `--every` option: + +```bash +# Upload new logs every 10 minutes +huggingface-cli upload my-cool-dynamic-dataset data/ --every=10 +``` + +### Specify a commit message + +Use the `--commit-message` and `--commit-description` to set a custom message and description for your commit instead of the default one + +```bash +>>> huggingface-cli upload Wauplin/my-cool-dataset ./data . --repo-type dataset --commit-message="Version 2" --commit-description="Train size: 4321. Check Dataset Viewer for more details." +... +https://huggingface.co/datasetsWauplin/my-cool-dataset/tree/main +``` + +### Specify a token + +To upload files, you must use a token. By default, the token saved locally (using `huggingface-cli login`) will be used. If you want to authenticate explicitly, use the `--token` option: + +```bash +>>> huggingface-cli upload Wauplin/my-cool-dataset ./data . --repo-type dataset --token=hf_**** +... +https://huggingface.co/datasetsWauplin/my-cool-data/tree/main +``` + +### Quiet mode + +By default, the `huggingface-cli upload` command will be verbose. It will print details such as warning messages, information about the uploaded files, and progress bars. If you want to silence all of this, use the `--quiet` option. Only the last line (i.e. the URL to the uploaded files) is printed. This can prove useful if you want to pass the output to another command in a script. + +```bash +>>> huggingface-cli upload Wauplin/my-cool-dataset ./data . --repo-type dataset --quiet +https://huggingface.co/datasets/Wauplin/my-cool-dataset/tree/main +``` + +## Enjoy ! + +Congratulations, your dataset has now been uploaded to the Hugging Face Hub where anyone can load it in a single line of code! 🥳 + +``` +dataset = load_dataset("Wauplin/my-cool-dataset") +``` + +If your dataset is supported, it should also have a [Dataset Viewer](https://huggingface.co/docs/hub/datasets-viewer) for everyone to explore the dataset content. + +Finally, don't forget to enrich the dataset card to document your dataset and make it discoverable! Check out the [Create a dataset card](dataset_card) guide to learn more. diff --git a/docs/source/stream.mdx b/docs/source/stream.mdx new file mode 100644 index 0000000..94d6556 --- /dev/null +++ b/docs/source/stream.mdx @@ -0,0 +1,628 @@ +# Stream + +Dataset streaming lets you work with a dataset without downloading it. +The data is streamed as you iterate over the dataset. +This is especially helpful when: + +- You don't want to wait for an extremely large dataset to download. +- The dataset size exceeds the amount of available disk space on your computer. +- You want to quickly explore just a few samples of a dataset. + +
+ + +
+ +For example, the English split of the [HuggingFaceFW/fineweb](https://huggingface.co/datasets/HuggingFaceFW/fineweb) dataset is 45 terabytes, but you can use it instantly with streaming. Stream a dataset by setting `streaming=True` in [`load_dataset`] as shown below: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('HuggingFaceFW/fineweb', split='train', streaming=True) +>>> print(next(iter(dataset))) +{'text': 'How AP reported in all formats from tornado-stricken regionsMarch 8, 2012\nWhen the first serious bout of tornadoes of 2012 blew through middle America in the middle of the night, they touched down in places hours from any AP bureau...', ..., + 'language_score': 0.9721424579620361, 'token_count': 717} +``` + +Dataset streaming also lets you work with a dataset made of local files without doing any conversion. +In this case, the data is streamed from the local files as you iterate over the dataset. +This is especially helpful when: + +- You don't want to wait for an extremely large local dataset to be converted to Arrow. +- The converted files size would exceed the amount of available disk space on your computer. +- You want to quickly explore just a few samples of a dataset. +- You want to load only certain columns or efficiently filter a Parquet dataset. + +For example, you can stream a local dataset of hundreds of compressed JSONL files like [oscar-corpus/OSCAR-2201](https://huggingface.co/datasets/oscar-corpus/OSCAR-2201) to use it instantly: + +```py +>>> from datasets import load_dataset +>>> data_files = {'train': 'path/to/OSCAR-2201/compressed/en_meta/*.jsonl.gz'} +>>> dataset = load_dataset('json', data_files=data_files, split='train', streaming=True) +>>> print(next(iter(dataset))) +{'id': 0, 'text': 'Founded in 2015, Golden Bees is a leading programmatic recruitment platform dedicated to employers, HR agencies and job boards. The company has developed unique HR-custom technologies and predictive algorithms to identify and attract the best candidates for a job opportunity.', ... +``` + +Parquet is a columnar format that allows you to stream and load only a subset of columns and ignore unwanted columns. Parquet also stores metadata such as column statistics (at the file and row group level), enabling efficient filtering. Use the `columns` and `filters` arguments of [`datasets.packaged_modules.parquet.ParquetConfig`] to stream Parquet datasets, select columns, and apply filters: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('HuggingFaceFW/fineweb', split='train', streaming=True, columns=["url", "date"]) +>>> print(next(iter(dataset))) +{'url': 'http://%20jwashington@ap.org/Content/Press-Release/2012/How-AP-reported-in-all-formats-from-tornado-stricken-regions', 'date': '2013-05-18T05:48:54Z'} +>>> dataset = load_dataset('HuggingFaceFW/fineweb', split='train', streaming=True, filters=[("language_score", ">=", 0.99)]) +>>> print(next(iter(dataset))) +{'text': 'Everyone wishes for something. And lots of people believe they know how to make their wishes come true with magical thinking.\nWhat is it? "Magical thinking is a belief in forms of causation, with no known physical basis," said Professor Emily Pronin of Princeton...', ..., + 'language_score': 0.9900368452072144, 'token_count': 716} +``` + +Loading a dataset in streaming mode creates a new dataset type instance (instead of the classic [`Dataset`] object), known as an [`IterableDataset`]. +This special type of dataset has its own set of processing methods shown below. + +> [!TIP] +> An [`IterableDataset`] is useful for iterative jobs like training a model. +> You shouldn't use a [`IterableDataset`] for jobs that require random access to examples because you have to iterate all over it using a for loop. Getting the last example in an iterable dataset would require you to iterate over all the previous examples. +> You can find more details in the [Dataset vs. IterableDataset guide](./about_mapstyle_vs_iterable). + + +## Column indexing + +Sometimes it is convenient to iterate over values of a specific column. Fortunately, an [`IterableDataset`] supports column indexing: +```python +>>> from datasets import load_dataset +>>> dataset = load_dataset("allenai/c4", "en", streaming=True, split="train") +>>> print(next(iter(dataset["text"]))) +Beginners BBQ Class Taking Place in Missoula!... +``` + +## Convert from a Dataset + +If you have an existing [`Dataset`] object, you can convert it to an [`IterableDataset`] with the [`~Dataset.to_iterable_dataset`] function. This is actually faster than setting the `streaming=True` argument in [`load_dataset`] because the data is streamed from local files. + +```py +>>> from datasets import load_dataset + +# faster 🐇 +>>> dataset = load_dataset("ethz/food101") +>>> iterable_dataset = dataset.to_iterable_dataset() + +# slower 🐢 +>>> iterable_dataset = load_dataset("ethz/food101", streaming=True) +``` + +The [`~Dataset.to_iterable_dataset`] function supports sharding when the [`IterableDataset`] is instantiated. This is useful when working with big datasets, and you'd like to shuffle the dataset or to enable fast parallel loading with a PyTorch DataLoader. + +```py +>>> import torch +>>> from datasets import load_dataset + +>>> dataset = load_dataset("ethz/food101") +>>> iterable_dataset = dataset.to_iterable_dataset(num_shards=64) # shard the dataset +>>> iterable_dataset = iterable_dataset.shuffle(buffer_size=10_000) # shuffles the shards order and use a shuffle buffer when you start iterating +dataloader = torch.utils.data.DataLoader(iterable_dataset, num_workers=4) # assigns 64 / 4 = 16 shards from the shuffled list of shards to each worker when you start iterating +``` + +## Shuffle + +Like a regular [`Dataset`] object, you can also shuffle a [`IterableDataset`] with [`IterableDataset.shuffle`]. + +The `buffer_size` argument controls the size of the buffer to randomly sample examples from. Let's say your dataset has one million examples, and you set the `buffer_size` to ten thousand. [`IterableDataset.shuffle`] will randomly select examples from the first ten thousand examples in the buffer. Selected examples in the buffer are replaced with new examples. By default, the buffer size is 1,000. + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('HuggingFaceFW/fineweb', split='train', streaming=True) +>>> shuffled_dataset = dataset.shuffle(seed=42, buffer_size=10_000) +``` + +> [!TIP] +> +> [`IterableDataset.shuffle`] fills the buffer using up to `max_buffer_input_shards` shards at a time (default is 10), which greatly improves the quality of the shuffling. It also shuffles the order of the shards if the dataset is sharded into multiple files. + +> [!TIP] +> +> If you're streaming a Parquet dataset with only one or few files, use [`~IterableDataset.reshard`] before shuffling. This is useful to shard the dataset by row group instead of by file, improving shuffling quality. + +## Reshuffle + +Sometimes you may want to reshuffle the dataset after each epoch. This will require you to set a different seed for each epoch. Use [`IterableDataset.set_epoch`] in between epochs to tell the dataset what epoch you're on. + +Your seed effectively becomes: `initial seed + current epoch`. + +```py +>>> for epoch in range(epochs): +... shuffled_dataset.set_epoch(epoch) +... for example in shuffled_dataset: +... ... +``` + +## Split dataset + +You can split your dataset one of two ways: + +- [`IterableDataset.take`] returns the first `n` examples in a dataset: + +```py +>>> dataset = load_dataset('HuggingFaceFW/fineweb', split='train', streaming=True) +>>> dataset_head = dataset.take(2) +>>> list(dataset_head) +[{'text': "How AP reported in all formats from tor...}, + {'text': 'Did you know you have two little yellow...}] +``` + +- [`IterableDataset.skip`] omits the first `n` examples in a dataset and returns the remaining examples: + +```py +>>> train_dataset = shuffled_dataset.skip(1000) +``` + +> [!WARNING] +> `take` and `skip` prevent future calls to `shuffle` because they lock in the order of the shards. You should `shuffle` your dataset before splitting it. + + + + +### Shard + +🤗 Datasets supports sharding to divide a very large dataset into a predefined number of chunks. Specify the `num_shards` parameter in [`~IterableDataset.shard`] to determine the number of shards to split the dataset into. You'll also need to provide the shard you want to return with the `index` parameter. + +For example, the [amazon_polarity](https://huggingface.co/datasets/fancyzhx/amazon_polarity) dataset has 4 shards (in this case they are 4 Parquet files): + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("fancyzhx/amazon_polarity", split="train", streaming=True) +>>> print(dataset) +IterableDataset({ + features: ['label', 'title', 'content'], + num_shards: 4 +}) +``` + +After sharding the dataset into two chunks, the first one will only have 2 shards: + +```py +>>> dataset.shard(num_shards=2, index=0) +IterableDataset({ + features: ['label', 'title', 'content'], + num_shards: 2 +}) +``` + +To increase the number of shards of a dataset, you can use [`IterableDataset.reshard`]: + +```py +>>> dataset.reshard() +IterableDataset({ + features: ['label', 'title', 'content'], + num_shards: 3600 +}) +``` + +The resharding mechanism depends on the dataset file format. +For example for Parquet, it reshards using row groups instead of having one file per shard. +See how it works for every format in [`IterableDataset.reshard`]'s documentation. + +If your dataset has `dataset.num_shards==1` even after resharding, you should chunk it using [`IterableDataset.skip`] and [`IterableDataset.take`] instead. + +## Concatenate + +Separate datasets can be concatenated if they share the same column types. Concatenate datasets with [`concatenate_datasets`]: + +```py +>>> from datasets import concatenate_datasets, load_dataset + +>>> stories = load_dataset("ajibawa-2023/General-Stories-Collection", split="train", streaming=True) +>>> stories = stories.select_columns(["text"]) # only keep the 'text' column +IterableDataset({ + features: Unknown, + num_shards: 10 +}) + +>>> wiki = load_dataset("wikimedia/wikipedia", "20231101.en", split="train", streaming=True) +>>> wiki = wiki.select_columns(["text"]) # only keep the 'text' column +IterableDataset({ + features: ['text'], + num_shards: 41 +}) + +>>> bert_dataset = concatenate_datasets([stories, wiki]) +IterableDataset({ + features: ['text'], + num_shards: 51 +}) +``` + +The shards of the concatenated dataset are the shards of the input datasets. + +You can also concatenate two datasets horizontally by setting `axis=1` as long as the datasets have the same number of rows: + +```py +>>> from datasets import IterableDataset +>>> stories_ids = IterableDataset.from_dict({"ids": list(range(num_stories))}) +>>> stories_with_ids = concatenate_datasets([stories, stories_ids], axis=1) +``` + +In this case, the concatenated dataset only has 1 shard, to avoid ending with unaligned shards from the input datasets. + +## Interleave + +[`interleave_datasets`] can combine an [`IterableDataset`] with other datasets if they have the same column types. The combined dataset returns alternating examples from each of the original datasets. + +```py +>>> from datasets import interleave_datasets +>>> es_dataset = load_dataset('allenai/c4', 'es', split='train', streaming=True) +IterableDataset({ + features: Unknown, + num_shards: 2048 +}) +>>> fr_dataset = load_dataset('allenai/c4', 'fr', split='train', streaming=True) +IterableDataset({ + features: Unknown, + num_shards: 2048 +}) + +>>> multilingual_dataset = interleave_datasets([es_dataset, fr_dataset]) +IterableDataset({ + features: ['text', 'timestamp', 'url'], + num_shards: 2048 +}) +>>> list(multilingual_dataset.take(2)) +[{'text': 'Comprar Zapatillas para niña en chancla con goma por...'}, + {'text': 'Le sacre de philippe ier, 23 mai 1059 - Compte Rendu...'}] +``` + +Define sampling probabilities from each of the original datasets for more control over how each of them are sampled and combined. Set the `probabilities` argument with your desired sampling probabilities: + +```py +>>> multilingual_dataset_with_oversampling = interleave_datasets([es_dataset, fr_dataset], probabilities=[0.8, 0.2], seed=42) +>>> list(multilingual_dataset_with_oversampling.take(2)) +[{'text': 'Comprar Zapatillas para niña en chancla con goma por...'}, + {'text': 'Chevrolet Cavalier Usados en Bogota - Carros en Vent...'}] +``` + +Around 80% of the final dataset is made of the `es_dataset`, and 20% of the `fr_dataset`. + +You can also specify the `stopping_strategy`. The default strategy, `first_exhausted`, is a subsampling strategy, i.e the dataset construction is stopped as soon one of the dataset runs out of samples. +You can specify `stopping_strategy=all_exhausted` to execute an oversampling strategy. In this case, the dataset construction is stopped as soon as every samples in every dataset has been added at least once. In practice, it means that if a dataset is exhausted, it will return to the beginning of this dataset until the stop criterion has been reached. +Note that if no sampling probabilities are specified, the new dataset will have `max_length_datasets*nb_dataset samples`. +There is also `stopping_strategy=all_exhausted_without_replacement` to ensure that every sample is seen exactly once. + +To ensure proper parallelism using sharding, the shards of the interleaved dataset contain at least 1 shard of every input dataset. Therefore the sharding level of the interleaved dataset is the minimum sharding level of the input datasets. + +E.g. if the input datasets have respectively 32, 48 and 128 shards, then the interleaved dataset has 32 = min(32, 48, 128) shards, and each new shard has 1 shard from the first dataset, 1-2 shards from the second dataset and 4 shards from the third dataset. + +## Rename, remove, and cast + +The following methods allow you to modify the columns of a dataset. These methods are useful for renaming or removing columns and changing columns to a new set of features. + +### Rename + +Use [`IterableDataset.rename_column`] when you need to rename a column in your dataset. Features associated with the original column are actually moved under the new column name, instead of just replacing the original column in-place. + +Provide [`IterableDataset.rename_column`] with the name of the original column, and the new column name: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('allenai/c4', 'en', streaming=True, split='train') +>>> dataset = dataset.rename_column("text", "content") +``` + +### Remove + +When you need to remove one or more columns, give [`IterableDataset.remove_columns`] the name of the column to remove. Remove more than one column by providing a list of column names: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('allenai/c4', 'en', streaming=True, split='train') +>>> dataset = dataset.remove_columns('timestamp') +``` + +### Cast + +[`IterableDataset.cast`] changes the feature type of one or more columns. This method takes your new `Features` as its argument. The following sample code shows how to change the feature types of `ClassLabel` and `Value`: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('nyu-mll/glue', 'mrpc', split='train', streaming=True) +>>> dataset.features +{'sentence1': Value('string'), +'sentence2': Value('string'), +'label': ClassLabel(names=['not_equivalent', 'equivalent']), +'idx': Value('int32')} + +>>> from datasets import ClassLabel, Value +>>> new_features = dataset.features.copy() +>>> new_features["label"] = ClassLabel(names=['negative', 'positive']) +>>> new_features["idx"] = Value('int64') +>>> dataset = dataset.cast(new_features) +>>> dataset.features +{'sentence1': Value('string'), +'sentence2': Value('string'), +'label': ClassLabel(names=['negative', 'positive']), +'idx': Value('int64')} +``` + +> [!TIP] +> Casting only works if the original feature type and new feature type are compatible. For example, you can cast a column with the feature type `Value('int32')` to `Value('bool')` if the original column only contains ones and zeros. + +Use [`IterableDataset.cast_column`] to change the feature type of just one column. Pass the column name and its new feature type as arguments: + +```py +>>> dataset.features +{'audio': Audio(sampling_rate=44100, mono=True)} + +>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16000)) +>>> dataset.features +{'audio': Audio(sampling_rate=16000, mono=True)} +``` + +## Map + +Similar to the [`Dataset.map`] function for a regular [`Dataset`], 🤗 Datasets features [`IterableDataset.map`] for processing an [`IterableDataset`]. +[`IterableDataset.map`] applies processing on-the-fly when examples are streamed. + +It allows you to apply a processing function to each example in a dataset, independently or in batches. This function can even create new rows and columns. + +The following example demonstrates how to tokenize a [`IterableDataset`]. The function needs to accept and output a `dict`: + +```py +>>> def add_prefix(example): +... example['text'] = 'My text: ' + example['text'] +... return example +``` + +Next, apply this function to the dataset with [`IterableDataset.map`]: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('allenai/c4', 'en', streaming=True, split='train') +>>> updated_dataset = dataset.map(add_prefix) +>>> list(updated_dataset.take(3)) +[{'text': 'My text: Beginners BBQ Class Taking Place in Missoula!\nDo you want to get better at making...', + 'timestamp': '2019-04-25 12:57:54', + 'url': 'https://klyq.com/beginners-bbq-class-taking-place-in-missoula/'}, + {'text': 'My text: Discussion in \'Mac OS X Lion (10.7)\' started by axboi87, Jan 20, 2012.\nI\'ve go...', + 'timestamp': '2019-04-21 10:07:13', + 'url': 'https://forums.macrumors.com/threads/restore-from-larger-disk-to-smaller-disk.1311329/'}, + {'text': 'My text: Foil plaid lycra and spandex shortall with metallic slinky insets. Attached metall...', + 'timestamp': '2019-04-25 10:40:23', + 'url': 'https://awishcometrue.com/Catalogs/Clearance/Tweens/V1960-Find-A-Way'}] +``` + +Let's take a look at another example, except this time, you will remove columns with [`IterableDataset.map`]. When you remove a column, it is only removed after the example has been provided to the mapped function. This allows the mapped function to use the content of the columns before they are removed. + +Specify the column to remove with the `remove_columns` argument in [`IterableDataset.map`]: + +```py +>>> updated_dataset = dataset.map(add_prefix, remove_columns=["timestamp", "url"]) +>>> list(updated_dataset.take(3)) +[{'text': 'My text: Beginners BBQ Class Taking Place in Missoula!\nDo you want to get better at making...'}, + {'text': 'My text: Discussion in \'Mac OS X Lion (10.7)\' started by axboi87, Jan 20, 2012.\nI\'ve go...'}, + {'text': 'My text: Foil plaid lycra and spandex shortall with metallic slinky insets. Attached metall...'}] +``` + +### Batch processing + +[`IterableDataset.map`] also supports working with batches of examples. Operate on batches by setting `batched=True`. The default batch size is 1000, but you can adjust it with the `batch_size` argument. This opens the door to many interesting applications such as tokenization, splitting long sentences into shorter chunks, and data augmentation. + +#### Tokenization + +```py +>>> from datasets import load_dataset +>>> from transformers import AutoTokenizer +>>> dataset = load_dataset("allenai/c4", "en", streaming=True, split="train") +>>> tokenizer = AutoTokenizer.from_pretrained('distilbert-base-uncased') +>>> def encode(examples): +... return tokenizer(examples['text'], truncation=True, padding='max_length') +>>> dataset = dataset.map(encode, batched=True, remove_columns=["text", "timestamp", "url"]) +>>> next(iter(dataset)) +{'input_ids': [101, 4088, 16912, 22861, 4160, 2465, 2635, 2173, 1999, 3335, ..., 0, 0, 0], +'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ..., 0, 0]} +``` + +> [!TIP] +> See other examples of batch processing in the [batched map processing](./process#batch-processing) documentation. They work the same for iterable datasets. + +### Filter + +You can filter rows in the dataset based on a predicate function using [`Dataset.filter`]. It returns rows that match a specified condition: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('HuggingFaceFW/fineweb', streaming=True, split='train') +>>> start_with_ar = dataset.filter(lambda example: example['text'].startswith('San Francisco')) +>>> next(iter(start_with_ar)) +{'text': 'San Francisco 49ers cornerback Shawntae Spencer will miss the rest of the sea...} +``` + +[`Dataset.filter`] can also filter by indices if you set `with_indices=True`: + +```py +>>> even_dataset = dataset.filter(lambda example, idx: idx % 2 == 0, with_indices=True) +>>> list(even_dataset.take(3)) +[{'text': 'How AP reported in all formats from tornado-stricken regionsMarch 8, 2012 Whe...}, + {'text': 'Car Wash For Clara! Now is your chance to help! 2 year old Clara Woodward has...}, + {'text': 'Log In Please enter your ECode to log in. Forgotten your eCode? If you create...}] +``` + +## Batch + +The `batch` method transforms your `IterableDataset` into an iterable of batches. This is particularly useful when you want to work with batches in your training loop or when using frameworks that expect batched inputs. + +> [!TIP] +> There is also a "Batch Processing" option when using the `map` function to apply a function to batches of data, which is discussed in the [Map section](#map) above. The `batch` method described here is different and provides a more direct way to create batches from your dataset. + +You can use the `batch` method like this: + +```python +from datasets import load_dataset + +# Load a dataset in streaming mode +dataset = load_dataset("some_dataset", split="train", streaming=True) + +# Create batches of 32 samples +batched_dataset = dataset.batch(batch_size=32) + +# Iterate over the batched dataset +for batch in batched_dataset: + print(batch) + break +``` + +In this example, batched_dataset is still an IterableDataset, but each item yielded is now a batch of 32 samples instead of a single sample. +This batching is done on-the-fly as you iterate over the dataset, preserving the memory-efficient nature of IterableDataset. + +The batch method also provides a drop_last_batch parameter. +When set to True, it will discard the last batch if it's smaller than the specified batch_size. +This can be useful in scenarios where your downstream processing requires all batches to be of the same size: + +```python +batched_dataset = dataset.batch(batch_size=32, drop_last_batch=True) +``` + +## Stream in a training loop + +[`IterableDataset`] can be integrated into a training loop. First, shuffle the dataset: + + + +```py +>>> seed, buffer_size = 42, 10_000 +>>> dataset = dataset.shuffle(seed, buffer_size=buffer_size) +``` + +Lastly, create a simple training loop and start training: + +```py +>>> import torch +>>> from torch.utils.data import DataLoader +>>> from transformers import AutoModelForMaskedLM, DataCollatorForLanguageModeling +>>> from tqdm import tqdm +>>> dataset = dataset.with_format("torch") +>>> dataloader = DataLoader(dataset, collate_fn=DataCollatorForLanguageModeling(tokenizer)) +>>> device = 'cuda' if torch.cuda.is_available() else 'cpu' +>>> model = AutoModelForMaskedLM.from_pretrained("distilbert-base-uncased") +>>> model.train().to(device) +>>> optimizer = torch.optim.AdamW(params=model.parameters(), lr=1e-5) +>>> for epoch in range(3): +... dataset.set_epoch(epoch) +... for i, batch in enumerate(tqdm(dataloader, total=5)): +... if i == 5: +... break +... batch = {k: v.to(device) for k, v in batch.items()} +... outputs = model(**batch) +... loss = outputs[0] +... loss.backward() +... optimizer.step() +... optimizer.zero_grad() +... if i % 10 == 0: +... print(f"loss: {loss}") +``` + + + + + +### Save a dataset checkpoint and resume iteration + +If your training loop stops, you may want to restart the training from where it was. To do so you can save a checkpoint of your model and optimizers, as well as your data loader. + +Iterable datasets don't provide random access to a specific example index to resume from, but you can use [`IterableDataset.state_dict`] and [`IterableDataset.load_state_dict`] to resume from a checkpoint instead, similarly to what you can do for models and optimizers: + +```python +>>> iterable_dataset = Dataset.from_dict({"a": range(6)}).to_iterable_dataset(num_shards=3) +>>> for idx, example in enumerate(iterable_dataset): +... print(example) +... if idx == 2: +... state_dict = iterable_dataset.state_dict() +... print("checkpoint") +... break +>>> iterable_dataset.load_state_dict(state_dict) +>>> print(f"restart from checkpoint") +>>> for example in iterable_dataset: +... print(example) +``` + +Returns: + +``` +{'a': 0} +{'a': 1} +{'a': 2} +checkpoint +restart from checkpoint +{'a': 3} +{'a': 4} +{'a': 5} +``` + +Under the hood, the iterable dataset keeps track of the current shard being read and the example index in the current shard and it stores this info in the `state_dict`. + +To resume from a checkpoint, the dataset skips all the shards that were previously read to restart from the current shard. +Then it reads the shard and skips examples until it reaches the exact example from the checkpoint. + +Therefore restarting a dataset is quite fast, since it will not re-read the shards that have already been iterated on. Still, resuming a dataset is generally not instantaneous since it has to restart reading from the beginning of the current shard and skip examples until it reaches the checkpoint location. + +This can be used with the `StatefulDataLoader` from `torchdata`: + +```python +>>> from torchdata.stateful_dataloader import StatefulDataLoader +>>> iterable_dataset = load_dataset("deepmind/code_contests", streaming=True, split="train") +>>> dataloader = StatefulDataLoader(iterable_dataset, batch_size=32, num_workers=4) +>>> # checkpoint +>>> state_dict = dataloader.state_dict() # uses iterable_dataset.state_dict() under the hood +>>> # resume from checkpoint +>>> dataloader.load_state_dict(state_dict) # uses iterable_dataset.load_state_dict() under the hood +``` + +> [!TIP] +> Resuming returns exactly where the checkpoint was saved except if `.shuffle()` is used: examples from shuffle buffers are lost when resuming and the buffers are refilled with new data. + + +## Save + +Once your iterable dataset is ready, you can save it as a Hugging Face Dataset in Parquet format and reuse it later with [`load_dataset`]. + +Save your dataset by providing the name of the dataset repository on Hugging Face you wish to save it to as an argument to [`~Dataset.push_to_hub`]. This iterates over the dataset and progressively uploads the data to Hugging Face: + +```python +dataset.push_to_hub("username/my_dataset") +``` + +If the dataset consists of multiple shards (`dataset.num_shards > 1`), you can use multiple processes to upload it in parallel. This is especially useful if you applied `map()` or `filter()` steps since they will run faster in parallel: + +```python +dataset.push_to_hub("username/my_dataset", num_proc=8) +``` + +Use the [`load_dataset`] function to reload the dataset: + +```python +from datasets import load_dataset +reloaded_dataset = load_dataset("username/my_dataset") +``` + +## Export + +🤗 Datasets supports exporting as well so you can work with your dataset in other applications. The following table shows currently supported file formats you can export to: + +| File type | Export method | +|-------------------------|----------------------------------------------------------------| +| CSV | [`IterableDataset.to_csv`] | +| JSON | [`IterableDataset.to_json`] | +| Parquet | [`IterableDataset.to_parquet`] | +| SQL | [`IterableDataset.to_sql`] | +| In-memory Python object | [`IterableDataset.to_pandas`], [`IterableDataset.to_polars`] or [`IterableDataset.to_dict`] | + +For example, export your dataset to a CSV file like this: + +```py +>>> dataset.to_csv("path/of/my/dataset.csv") +``` + +If you have a large dataset, you can save one file per shard, e.g. + +```py +>>> num_shards = dataset.num_shards +>>> for index in range(num_shards): +... shard = dataset.shard(index, num_shards) +... shard.to_parquet(f"path/of/my/dataset/data-{index:05d}.parquet") +``` diff --git a/docs/source/tabular_load.mdx b/docs/source/tabular_load.mdx new file mode 100644 index 0000000..1d5a548 --- /dev/null +++ b/docs/source/tabular_load.mdx @@ -0,0 +1,151 @@ +# Load tabular data + +A tabular dataset is a generic dataset used to describe any data stored in rows and columns, where the rows represent an example and the columns represent a feature (can be continuous or categorical). These datasets are commonly stored in CSV files, Pandas DataFrames, and in database tables. This guide will show you how to load and create a tabular dataset from: + +- CSV files +- Pandas DataFrames +- HDF5 files +- Databases + +## CSV files + +🤗 Datasets can read CSV files by specifying the generic `csv` dataset builder name in the [`~datasets.load_dataset`] method. To load more than one CSV file, pass them as a list to the `data_files` parameter: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("csv", data_files="my_file.csv") + +# load multiple CSV files +>>> dataset = load_dataset("csv", data_files=["my_file_1.csv", "my_file_2.csv", "my_file_3.csv"]) +``` + +You can also map specific CSV files to the train and test splits: + +```py +>>> dataset = load_dataset("csv", data_files={"train": ["my_train_file_1.csv", "my_train_file_2.csv"], "test": "my_test_file.csv"}) +``` + +To load remote CSV files, pass the URLs instead: + +```py +>>> base_url = "https://huggingface.co/datasets/lhoestq/demo1/resolve/main/data/" +>>> dataset = load_dataset('csv', data_files={"train": base_url + "train.csv", "test": base_url + "test.csv"}) +``` + +To load zipped CSV files: + +```py +>>> url = "https://domain.org/train_data.zip" +>>> data_files = {"train": url} +>>> dataset = load_dataset("csv", data_files=data_files) +``` + +## Pandas DataFrames + +🤗 Datasets also supports loading datasets from [Pandas DataFrames](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html) with the [`~datasets.Dataset.from_pandas`] method: + +```py +>>> from datasets import Dataset +>>> import pandas as pd + +# create a Pandas DataFrame +>>> df = pd.read_csv("https://huggingface.co/datasets/imodels/credit-card/raw/main/train.csv") +>>> df = pd.DataFrame(df) +# load Dataset from Pandas DataFrame +>>> dataset = Dataset.from_pandas(df) +``` + +Use the `splits` parameter to specify the name of the dataset split: + +```py +>>> train_ds = Dataset.from_pandas(train_df, split="train") +>>> test_ds = Dataset.from_pandas(test_df, split="test") +``` + +If the dataset doesn't look as expected, you should explicitly [specify your dataset features](loading#specify-features). A [pandas.Series](https://pandas.pydata.org/docs/reference/api/pandas.Series.html) may not always carry enough information for Arrow to automatically infer a data type. For example, if a DataFrame is of length `0` or if the Series only contains `None/NaN` objects, the type is set to `null`. + +## HDF5 files + +[HDF5](https://www.hdfgroup.org/solutions/hdf5/) files are commonly used for storing large amounts of numerical data in scientific computing and machine learning. Loading HDF5 files with 🤗 Datasets is similar to loading CSV files: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("hdf5", data_files="data.h5") +``` + +Note that the HDF5 loader assumes that the file has "tabular" structure, i.e. that all datasets in the file have (the same number of) rows on their first dimension. + +## Databases + +Datasets stored in databases are typically accessed with SQL queries. With 🤗 Datasets, you can connect to a database, query for the data you need, and create a dataset out of it. Then you can use all the processing features of 🤗 Datasets to prepare your dataset for training. + +### SQLite + +SQLite is a small, lightweight database that is fast and easy to set up. You can use an existing database if you'd like, or follow along and start from scratch. + +Start by creating a quick SQLite database with this [Covid-19 data](https://github.com/nytimes/covid-19-data/blob/master/us-states.csv) from the New York Times: + +```py +>>> import sqlite3 +>>> import pandas as pd + +>>> conn = sqlite3.connect("us_covid_data.db") +>>> df = pd.read_csv("https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-states.csv") +>>> df.to_sql("states", conn, if_exists="replace") +``` + +This creates a `states` table in the `us_covid_data.db` database which you can now load into a dataset. + +To connect to the database, you'll need the [URI string](https://docs.sqlalchemy.org/en/13/core/engines.html#database-urls) that identifies your database. Connecting to a database with a URI caches the returned dataset. The URI string differs for each database dialect, so be sure to check the [Database URLs](https://docs.sqlalchemy.org/en/13/core/engines.html#database-urls) for whichever database you're using. + +For SQLite, it is: + +```py +>>> uri = "sqlite:///us_covid_data.db" +``` + +Load the table by passing the table name and URI to [`~datasets.Dataset.from_sql`]: + +```py +>>> from datasets import Dataset + +>>> ds = Dataset.from_sql("states", uri) +>>> ds +Dataset({ + features: ['index', 'date', 'state', 'fips', 'cases', 'deaths'], + num_rows: 54382 +}) +``` + +Then you can use all of 🤗 Datasets process features like [`~datasets.Dataset.filter`] for example: + +```py +>>> ds.filter(lambda x: x["state"] == "California") +``` + +You can also load a dataset from a SQL query instead of an entire table, which is useful for querying and joining multiple tables. + +Load the dataset by passing your query and URI to [`~datasets.Dataset.from_sql`]: + +```py +>>> from datasets import Dataset + +>>> ds = Dataset.from_sql('SELECT * FROM states WHERE state="California";', uri) +>>> ds +Dataset({ + features: ['index', 'date', 'state', 'fips', 'cases', 'deaths'], + num_rows: 1019 +}) +``` + +Then you can use all of 🤗 Datasets process features like [`~datasets.Dataset.filter`] for example: + +```py +>>> ds.filter(lambda x: x["cases"] > 10000) +``` + +### PostgreSQL + +You can also connect and load a dataset from a PostgreSQL database, however we won't directly demonstrate how in the documentation because the example is only meant to be run in a notebook. Instead, take a look at how to install and setup a PostgreSQL server in this [notebook](https://colab.research.google.com/github/nateraw/huggingface-hub-examples/blob/main/sql_with_huggingface_datasets.ipynb#scrollTo=d83yGQMPHGFi)! + +After you've setup your PostgreSQL database, you can use the [`~datasets.Dataset.from_sql`] method to load a dataset from a table or query. \ No newline at end of file diff --git a/docs/source/troubleshoot.mdx b/docs/source/troubleshoot.mdx new file mode 100644 index 0000000..7c2b36c --- /dev/null +++ b/docs/source/troubleshoot.mdx @@ -0,0 +1,118 @@ +# Troubleshooting + +This guide aims to provide you the tools and knowledge required to navigate some common issues. If the suggestions listed +in this guide do not cover your such situation, please refer to the [Asking for Help](#asking-for-help) section to learn where to +find help with your specific issue. + +## Issues when uploading datasets with `push_to_hub` + +### Authentication issues + +If you are experiencing authentication issues when sharing a dataset on 🤗 Hub using [`Dataset.push_to_hub`] and a Hugging Face +access token: + +* Make sure that the Hugging Face token you're using to authenticate yourself is a token with **write** permission. +* On OSX, it may help to clean up all the huggingface.co passwords on your keychain access, as well as reconfigure `git config --global credential.helper osxkeychain`, before using `huggingface-cli login`. + +Alternatively, you can use SSH keys to authenticate yourself - read more in the [🤗 Hub documentation](https://huggingface.co/docs/hub/security-git-ssh). + +### Lost connection on large dataset upload + +When uploading large datasets to Hub, if the number of dataset shards is large, it can create too many commits for the Hub in a +short period. This will result in a connection error. +The connection error can also be caused by a HTTP 500 error returned by AWS S3 bucket that Hub uses internally. +In either situation, you can re-run [`Dataset.push_to_hub`] to proceed with the dataset upload. Hub will check the SHAs +of already uploaded shards to avoid reuploading them. +We are working on making upload process more robust to transient errors, so updating to the latest library version is +always a good idea. + +### `Too Many Requests` + +Uploading large datasets via `push_to_hub()` can result in an error: + +```bash +HfHubHTTPError: 429 Client Error: Too Many Requests for url: ... +You have exceeded our hourly quotas for action: commit. We invite you to retry later. +``` + +If you encounter this issue, you need to upgrade the `datasets` library to the latest version (or at least `2.15.0`). + +## Issues when creating datasets from custom data + +### Loading images and audio from a folder + +When creating a dataset from a folder, one of the most common issues is that the file structure does not follow the +expected format, or there's an issue with the metadata file. + +Learn more about required folder structure in corresponding documentation pages: + +* [AudioFolder](https://huggingface.co/docs/datasets/audio_dataset#audiofolder) +* [ImageFolder](https://huggingface.co/docs/datasets/image_dataset#imagefolder) + + +### Pickling issues + +#### Pickling issues when using `Dataset.from_generator` + +When creating a dataset, [`IterableDataset.from_generator`] and [`Dataset.from_generator`] expect a "picklable" generator function. +This is required to hash the function using [`pickle`](https://docs.python.org/3/library/pickle.html) to be able to cache the dataset on disk. + +While generator functions are generally "picklable", note that generator objects are not. So if you're using a generator object, +you will encounter a `TypeError` like this: + +```bash +TypeError: cannot pickle 'generator' object +``` + +This error can also occur when using a generator function that uses a global object that is not "picklable", such as a +DB connection, for example. If that's the case, you can initialize such object directly inside the generator function to +avoid this error. + +#### Pickling issues with `Dataset.map` + +Pickling errors can also happen in the multiprocess [`Dataset.map`] - objects are pickled to be passed to child processes. +If the objects used in the transformation are not picklable, it's not possible to cache the result of `map`, which leads to an error being raised. + +Here are some ways to address this issue: +* A universal solution to pickle issues is to make sure the objects (or generator classes) are pickable manually by implementing `__getstate__` / `__setstate__` / `__reduce__`. +* You can also provide your own unique hash in `map` with the `new_fingerprint` argument. +* You can also disable caching by calling `datasets.disable_caching()`, however, this is undesirable - [read more about importance of cache](cache) + +## Asking for help + +If the above troubleshooting advice did not help you resolve your issue, reach out for help to the community and the team. + +### Forums + +Ask for help on the Hugging Face forums - post your question in the [🤗Datasets category](https://discuss.huggingface.co/c/datasets/10) +Make sure to write a descriptive post with relevant context about your setup and reproducible code to maximize the likelihood that your problem is solved! + +### Discord + +Post a question on [Discord](http://hf.co/join/discord), and let the team and the community help you. + +### Community Discussions on 🤗 Hub + +If you are facing issues creating a custom dataset on Hub, you can ask the Hugging Face team for help by opening a discussion in the Community tab of your dataset with this message: + +```text +# Dataset rewiew request for + +## Description + + + +## Files to review + +- file1 +- file2 +- ... + +cc @lhoestq @albertvillanova +``` + +### GitHub Issues + +Finally, if you suspect to have found a bug related to the library itself, create an Issue on the 🤗 Datasets +[GitHub repository](https://github.com/huggingface/datasets/issues). Include context regarding the bug: code snippet to reproduce, +details about your environment and data, etc. to help us figure out what's wrong and how we can fix it. diff --git a/docs/source/tsfile_load.mdx b/docs/source/tsfile_load.mdx new file mode 100644 index 0000000..6c37eae --- /dev/null +++ b/docs/source/tsfile_load.mdx @@ -0,0 +1,172 @@ +# Load TsFile data + +[TsFile](https://tsfile.apache.org/) is a columnar file format designed for time-series data and used as the native storage layer of [Apache IoTDB](https://iotdb.apache.org/). Compared with general-purpose columnar formats such as Parquet, TsFile is aware of the time-series data model (timestamps, devices, and measurements) and maintains an internal time index that enables time-range pruning without scanning entire files. + +This loader is provided as a separate guide because it does not follow the usual one-row-per-record tabular convention: each output row corresponds to one *device*, and per-measurement values are returned as Arrow `list<...>` columns. The mapping is described in detail below. + +## Installation + +The loader depends on the [`tsfile`](https://pypi.org/project/tsfile/) Python package: + +```bash +pip install "tsfile>=2.3.0" +``` + +## Data model and output layout + +The loader follows the TsFile *table model*. Each table column is one of: + +- **TAG** — a string-typed identifier; the tuple of TAG values uniquely identifies a *device* (i.e. a single time-series source). +- **FIELD** — a measurement whose value evolves over time. +- **TIME** — the timestamp column, named `time` by default. + +The loader emits one dataset row per device. Within a row, the `time` column and every FIELD column are Arrow `list<...>` columns containing that device's full time series, sorted in ascending time order. TAG columns appear as scalar `string` columns. + +Concretely, the output schema has the form: + +```text +: string +: string # one column per TAG +... +time: list +: list # one column per FIELD +: list +... +``` + +When the same device appears in multiple input files of a split, its per-file chunks are concatenated and sorted by timestamp before being emitted as a single row. Duplicate timestamps for the same device raise `ValueError`. + +## Basic usage + +Load a single TsFile: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("tsfile", data_files="my_data.tsfile") +``` + +Map files to splits explicitly: + +```py +>>> dataset = load_dataset( +... "tsfile", +... data_files={"train": "train_data.tsfile", "test": "test_data.tsfile"}, +... ) +``` + +## Example dataset on the Hub + +A ready-to-use example is available at [`tsfile/lotsa_data`](https://huggingface.co/datasets/tsfile/lotsa_data). Because `.tsfile` files are recognized automatically, you can load it by repository id without specifying `data_files`: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("tsfile/lotsa_data") +>>> dataset +DatasetDict({ + train: Dataset({ + features: ['timeseries_id', 'time', 'value'], + num_rows: 91 + }) +}) +``` + +Each row is one device. The TAG column `timeseries_id` identifies the device, while `time` and `value` are `list<...>` columns holding that device's full series: + +```py +>>> row = dataset["train"][0] +>>> row["timeseries_id"] +'Bear_assembly_Angel' +>>> len(row["time"]), len(row["value"]) +(8760, 8760) +>>> row["time"][:3] +[datetime.datetime(2017, 1, 1, 0, 0), datetime.datetime(2017, 1, 1, 1, 0), datetime.datetime(2017, 1, 1, 2, 0)] +``` + +## Selecting a table + +A TsFile can contain multiple tables. When `table_name` is omitted, the first table found in the first valid file is used. Lookups are case-insensitive. + +```py +>>> dataset = load_dataset("tsfile", data_files="my_data.tsfile", table_name="sensor_data") +``` + +## Selecting columns + +`columns` restricts the FIELD columns that are read. The TAG columns and the `time` column are always returned because they identify the device and its timeline. Names in `columns` that refer to a TAG or to the `time` column are silently ignored (they are emitted as usual, just once); names that match a field absent from every file become all-null list columns. + +```py +>>> dataset = load_dataset( +... "tsfile", +... data_files="my_data.tsfile", +... columns=["temperature", "humidity"], +... ) +``` + +## Filtering by time range + +`start_time` and `end_time` are inclusive bounds; either may be omitted. The bounds are pushed down to TsFile's internal time index, so only the matching data blocks are read from disk. Both bounds accept any of: + +- `int` — raw epoch in `timestamp_unit` (default milliseconds); +- `datetime.datetime` — naive values are interpreted as UTC, tz-aware values are converted to UTC; +- `datetime.date`; +- ISO-8601 `str`, e.g. `"2024-01-01T00:00:00"`; +- `pyarrow.TimestampScalar`. + +```py +>>> from datetime import datetime +>>> dataset = load_dataset( +... "tsfile", +... data_files="my_data.tsfile", +... start_time=datetime(2023, 11, 14), +... end_time="2023-11-15T00:00:00", +... ) +``` + +## Schema evolution across files + +When different files expose different columns — for example a new sensor field is introduced later — the loader takes the union of all FIELD columns and fills missing values with nulls. Numeric FIELD types are promoted following IoTDB's widening rules (`INT32 → INT64 → DOUBLE`, `INT32 → FLOAT → DOUBLE`). + +```py +>>> dataset = load_dataset("tsfile", data_files=["day1.tsfile", "day2.tsfile"]) +``` + +## Handling unreadable files + +By default, an unreadable or non-TsFile input raises an error. Set `on_bad_files` to `"warn"` to log and continue, or `"skip"` to silently drop the file. + +```py +>>> dataset = load_dataset("tsfile", data_files="data/*.tsfile", on_bad_files="skip") +``` + +## Timestamp unit and time zone + +`timestamp_unit` (default `"ms"`, matching IoTDB) controls the resolution of the `time` column and the interpretation of integer time bounds. `timestamp_tz` attaches a time zone to the Arrow timestamp type; `None` (the default) yields a timezone-naive type. + +```py +>>> dataset = load_dataset( +... "tsfile", +... data_files="my_data.tsfile", +... timestamp_unit="us", +... timestamp_tz="UTC", +... ) +``` + +## Memory and batching + +Two parameters control memory usage: + +- `input_batch_size` (default `65_536`) — maximum number of rows fetched per Arrow batch from `TsFileReader.query_table`. Bounds peak memory while streaming a single device. +- `output_batch_size` (default `32`) — number of devices packed into each Arrow record batch yielded to the writer. Smaller values give more responsive progress reporting; larger values reduce per-batch overhead. + +```py +>>> dataset = load_dataset( +... "tsfile", +... data_files="large_data.tsfile", +... input_batch_size=32_768, +... output_batch_size=128, +... ) +``` + +Peak memory is bounded by the payload of a single device across the split, not by the size of the split as a whole. + +See [`~datasets.packaged_modules.tsfile.TsFileConfig`] for the full list of parameters. diff --git a/docs/source/tutorial.md b/docs/source/tutorial.md new file mode 100644 index 0000000..2f5b5ac --- /dev/null +++ b/docs/source/tutorial.md @@ -0,0 +1,12 @@ +# Overview + +Welcome to the 🤗 Datasets tutorials! These beginner-friendly tutorials will guide you through the fundamentals of working with 🤗 Datasets. You'll load and prepare a dataset for training with your machine learning framework of choice. Along the way, you'll learn how to load different dataset configurations and splits, interact with and see what's inside your dataset, preprocess, and share a dataset to the [Hub](https://huggingface.co/datasets). + +The tutorials assume some basic knowledge of Python and a machine learning framework like PyTorch or TensorFlow. If you're already familiar with these, feel free to check out the [quickstart](./quickstart) to see what you can do with 🤗 Datasets. + +> [!TIP] +> The tutorials only cover the basic skills you need to use 🤗 Datasets. There are many other useful functionalities and applications that aren't discussed here. If you're interested in learning more, take a look at [Chapter 5](https://huggingface.co/course/chapter5/1?fw=pt) of the Hugging Face course. + +If you have any questions about 🤗 Datasets, feel free to join and ask the community on our [forum](https://discuss.huggingface.co/c/datasets/10). + +Let's get started! 🏁 diff --git a/docs/source/upload_dataset.mdx b/docs/source/upload_dataset.mdx new file mode 100644 index 0000000..ff35a09 --- /dev/null +++ b/docs/source/upload_dataset.mdx @@ -0,0 +1,134 @@ +# Share a dataset to the Hub + +The [Hub](https://huggingface.co/datasets) is home to an extensive collection of community-curated and popular research datasets. We encourage you to share your dataset to the Hub to help grow the ML community and accelerate progress for everyone. All contributions are welcome; adding a dataset is just a drag and drop away! + +Start by [creating a Hugging Face Hub account](https://huggingface.co/join) if you don't have one yet. + +## Upload with the Hub UI + +The Hub's web-based interface allows users without any developer experience to upload a dataset. + +### Create a repository + +A repository hosts all your dataset files, including the revision history, making storing more than one dataset version possible. + +1. Click on your profile and select **New Dataset** to create a new dataset repository. +2. Pick a name for your dataset, and choose whether it is a public or private dataset. A public dataset is visible to anyone, whereas a private dataset can only be viewed by you or members of your organization. + +
+ +
+ +### Upload dataset + +1. Once you've created a repository, navigate to the **Files and versions** tab to add a file. Select **Add file** to upload your dataset files. We support many text, audio, and image data extensions such as `.csv`, `.mp3`, and `.jpg` among many others. For text data extensions like `.csv`, `.json`, `.jsonl`, and `.txt`, we recommend compressing them before uploading to the Hub (to `.zip` or `.gz` file extension for example). + + Text file extensions are not tracked by Git LFS by default, and if they're greater than 10MB, they will not be committed and uploaded. Take a look at the `.gitattributes` file in your repository for a complete list of tracked file extensions. For this tutorial, you can use the following sample `.csv` files since they're small: train.csv, test.csv. + +
+ +
+ +2. Drag and drop your dataset files and add a brief descriptive commit message. + +
+ +
+ +3. After uploading your dataset files, they are stored in your dataset repository. + +
+ +
+ +### Create a Dataset card + +Adding a Dataset card is super valuable for helping users find your dataset and understand how to use it responsibly. + +1. Click on **Create Dataset Card** to create a Dataset card. This button creates a `README.md` file in your repository. + +
+ +
+ +2. At the top, you'll see the **Metadata UI** with several fields to select from like license, language, and task categories. These are the most important tags for helping users discover your dataset on the Hub. When you select an option from each field, they'll be automatically added to the top of the dataset card. + + You can also look at the [Dataset Card specifications](https://github.com/huggingface/hub-docs/blob/main/datasetcard.md?plain=1), which has a complete set of (but not required) tag options like `annotations_creators`, to help you choose the appropriate tags. + +
+ +
+ +3. Click on the **Import dataset card template** link at the top of the editor to automatically create a dataset card template. Filling out the template is a great way to introduce your dataset to the community and help users understand how to use it. For a detailed example of what a good Dataset card should look like, take a look at the [CNN DailyMail Dataset card](https://huggingface.co/datasets/cnn_dailymail). + +### Load dataset + +Once your dataset is stored on the Hub, anyone can load it with the [`load_dataset`] function: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("stevhliu/demo") +``` + +## Upload with Python + +Users who prefer to upload a dataset programmatically can use the [huggingface_hub](https://huggingface.co/docs/huggingface_hub/index) library. This library allows users to interact with the Hub from Python. + +1. Begin by installing the library: + +```bash +pip install huggingface_hub +``` + +2. To upload a dataset on the Hub in Python, you need to log in to your Hugging Face account: + +```bash +huggingface-cli login +``` + +3. Use the [`push_to_hub()`](https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.DatasetDict.push_to_hub) function to help you add, commit, and push a file to your repository: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("stevhliu/demo") +# dataset = dataset.map(...) # do all your processing here +>>> dataset.push_to_hub("stevhliu/processed_demo") +``` + +To set your dataset as private, set the `private` parameter to `True`. This parameter will only work if you are creating a repository for the first time. + +```py +>>> dataset.push_to_hub("stevhliu/private_processed_demo", private=True) +``` + +To add a new configuration (or subset) to a dataset or to add a new split (train/validation/test), please refer to the [`Dataset.push_to_hub`] documentation. + +### Privacy + +A private dataset is only accessible by you. Similarly, if you share a dataset within your organization, then members of the organization can also access the dataset. + +Load a private dataset by providing your authentication token to the `token` parameter: + +```py +>>> from datasets import load_dataset + +# Load a private individual dataset +>>> dataset = load_dataset("stevhliu/demo", token=True) + +# Load a private organization dataset +>>> dataset = load_dataset("organization/dataset_name", token=True) +``` + +## What's next? + +Congratulations, you've completed the tutorials! 🥳 + +From here, you can go on to: + +- Learn more about how to use 🤗 Datasets other functions to [process your dataset](process). +- [Stream large datasets](stream) without downloading it locally. +- [Define your dataset splits and configurations](repository_structure) and share your dataset with the community. + +If you have any questions about 🤗 Datasets, feel free to join and ask the community on our [forum](https://discuss.huggingface.co/c/datasets/10). diff --git a/docs/source/use_dataset.mdx b/docs/source/use_dataset.mdx new file mode 100644 index 0000000..29f8364 --- /dev/null +++ b/docs/source/use_dataset.mdx @@ -0,0 +1,234 @@ +# Preprocess + +In addition to loading datasets, 🤗 Datasets other main goal is to offer a diverse set of preprocessing functions to get a dataset into an appropriate format for training with your machine learning framework. + +There are many possible ways to preprocess a dataset, and it all depends on your specific dataset. Sometimes you may need to rename a column, and other times you might need to unflatten nested fields. 🤗 Datasets provides a way to do most of these things. But in nearly all preprocessing cases, depending on your dataset modality, you'll need to: + +- Tokenize a text dataset. +- Resample an audio dataset. +- Apply transforms to an image dataset. + +The last preprocessing step is usually setting your dataset format to be compatible with your machine learning framework's expected input format. + +In this tutorial, you'll also need to install the 🤗 Transformers library: + +```bash +pip install transformers +``` + +Grab a dataset of your choice and follow along! + +## Tokenize text + +Models cannot process raw text, so you'll need to convert the text into numbers. Tokenization provides a way to do this by dividing text into individual words called _tokens_. Tokens are finally converted to numbers. + +> [!TIP] +> Check out the [Tokenizers](https://huggingface.co/course/chapter2/4?fw=pt) section in Chapter 2 of the Hugging Face course to learn more about tokenization and different tokenization algorithms. + +**1**. Start by loading the [rotten_tomatoes](https://huggingface.co/datasets/rotten_tomatoes) dataset and the tokenizer corresponding to a pretrained [BERT](https://huggingface.co/bert-base-uncased) model. Using the same tokenizer as the pretrained model is important because you want to make sure the text is split in the same way. + +```py +>>> from transformers import AutoTokenizer +>>> from datasets import load_dataset + +>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") +>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train") +``` + +**2**. Call your tokenizer on the first row of `text` in the dataset: + +```py +>>> tokenizer(dataset[0]["text"]) +{'input_ids': [101, 1103, 2067, 1110, 17348, 1106, 1129, 1103, 6880, 1432, 112, 188, 1207, 107, 14255, 1389, 107, 1105, 1115, 1119, 112, 188, 1280, 1106, 1294, 170, 24194, 1256, 3407, 1190, 170, 11791, 5253, 188, 1732, 7200, 10947, 12606, 2895, 117, 179, 7766, 118, 172, 15554, 1181, 3498, 6961, 3263, 1137, 188, 1566, 7912, 14516, 6997, 119, 102], + 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +``` + +The tokenizer returns a dictionary with three items: + +- `input_ids`: the numbers representing the tokens in the text. +- `token_type_ids`: indicates which sequence a token belongs to if there is more than one sequence. +- `attention_mask`: indicates whether a token should be masked or not. + +These values are actually the model inputs. + +**3**. The fastest way to tokenize your entire dataset is to use the [`~Dataset.map`] function. This function speeds up tokenization by applying the tokenizer to batches of examples instead of individual examples. Set the `batched` parameter to `True`: + +```py +>>> def tokenization(example): +... return tokenizer(example["text"]) + +>>> dataset = dataset.map(tokenization, batched=True) +``` + +**4**. Set the format of your dataset to be compatible with your machine learning framework: + + + +Use the [`~Dataset.set_format`] function to set the dataset format to be compatible with PyTorch: + +```py +>>> dataset.set_format(type="torch", columns=["input_ids", "token_type_ids", "attention_mask", "label"]) +>>> dataset.format['type'] +'torch' +``` + + + +Use the [`~Dataset.to_tf_dataset`] function to set the dataset format to be compatible with TensorFlow. You'll also need to import a [data collator](https://huggingface.co/docs/transformers/main_classes/data_collator#transformers.DataCollatorWithPadding) from 🤗 Transformers to combine the varying sequence lengths into a single batch of equal lengths: + +```py +>>> from transformers import DataCollatorWithPadding + +>>> data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf") +>>> tf_dataset = dataset.to_tf_dataset( +... columns=["input_ids", "token_type_ids", "attention_mask"], +... label_cols=["label"], +... batch_size=2, +... collate_fn=data_collator, +... shuffle=True +... ) +``` + + + + +**5**. The dataset is now ready for training with your machine learning framework! + +## Resample audio signals + +Audio inputs like text datasets need to be divided into discrete data points. This is known as _sampling_; the sampling rate tells you how much of the speech signal is captured per second. It is important to make sure the sampling rate of your dataset matches the sampling rate of the data used to pretrain the model you're using. If the sampling rates are different, the pretrained model may perform poorly on your dataset because it doesn't recognize the differences in the sampling rate. + +**1**. Start by loading the [MInDS-14](https://huggingface.co/datasets/PolyAI/minds14) dataset, the [`Audio`] feature, and the feature extractor corresponding to a pretrained [Wav2Vec2](https://huggingface.co/facebook/wav2vec2-base-960h) model: + +```py +>>> from transformers import AutoFeatureExtractor +>>> from datasets import load_dataset, Audio + +>>> feature_extractor = AutoFeatureExtractor.from_pretrained("facebook/wav2vec2-base-960h") +>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train") +``` + +**2**. Index into the first row of the dataset. When you call the `audio` column of the dataset, it is automatically decoded and resampled: + +```py +>>> audio = dataset[0]["audio"] +>>> print(audio) + +>>> audio.get_all_samples().sample_rate +8000 +``` + +**3**. Reading a dataset card is incredibly useful and can give you a lot of information about the dataset. A quick look at the MInDS-14 dataset card tells you the sampling rate is 8kHz. Likewise, you can get many details about a model from its model card. The Wav2Vec2 model card says it was sampled on 16kHz speech audio. This means you'll need to upsample the MInDS-14 dataset to match the sampling rate of the model. + +Use the [`~Dataset.cast_column`] function and set the `sampling_rate` parameter in the [`Audio`] feature to upsample the audio signal. When you call the `audio` column now, it is decoded and resampled to 16kHz: + +```py +>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16_000)) +>>> audio = dataset[0]["audio"] +>>> print(audio) + +>>> audio.get_all_samples().sample_rate +16000 +``` + +**4**. Use the [`~Dataset.map`] function to resample the entire dataset to 16kHz. This function speeds up resampling by applying the feature extractor to batches of examples instead of individual examples. Set the `batched` parameter to `True`: + +```py +>>> def preprocess_function(examples): +... audio_arrays = [x.get_all_samples().data for x in examples["audio"]] +... inputs = feature_extractor( +... audio_arrays, sampling_rate=feature_extractor.sampling_rate, max_length=16000, truncation=True +... ) +... return inputs + +>>> dataset = dataset.map(preprocess_function, batched=True) +``` + +**5**. The dataset is now ready for training with your machine learning framework! + +## Apply data augmentations + +The most common preprocessing you'll do with image datasets is _data augmentation_, a process that introduces random variations to an image without changing the meaning of the data. This can mean changing the color properties of an image or randomly cropping an image. You are free to use any data augmentation library you like, and 🤗 Datasets will help you apply your data augmentations to your dataset. + +**1**. Start by loading the [Beans](https://huggingface.co/datasets/AI-Lab-Makerere/beans) dataset, the `Image` feature, and the feature extractor corresponding to a pretrained [ViT](https://huggingface.co/google/vit-base-patch16-224-in21k) model: + +```py +>>> from transformers import AutoFeatureExtractor +>>> from datasets import load_dataset, Image + +>>> feature_extractor = AutoFeatureExtractor.from_pretrained("google/vit-base-patch16-224-in21k") +>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train") +``` + +**2**. Index into the first row of the dataset. When you call the `image` column of the dataset, the underlying PIL object is automatically decoded into an image. + +```py +>>> dataset[0]["image"] + +``` + +Most image models expect the image to be in the RGB mode. The Beans images are already in the RGB mode, but if your dataset contains images in a different mode, you can use the [`~Dataset.cast_column`] function to set the mode to RGB: + +```py +>>> dataset = dataset.cast_column("image", Image(mode="RGB")) +``` + +**3**. Now let's apply data augmentations to your images. 🤗 Datasets works with any augmentation library, and in this example we'll use Albumentations. + +[Albumentations](https://albumentations.ai) is a popular image augmentation library that provides a [rich set of transforms](https://albumentations.ai/docs/reference/supported-targets-by-transform/) including spatial-level transforms, pixel-level transforms, and mixing-level transforms. + +Install Albumentations: + +```bash +pip install albumentations +``` + +**4**. Create a typical augmentation pipeline with Albumentations: + +```py +>>> import albumentations as A +>>> import numpy as np +>>> from PIL import Image + +>>> transform = A.Compose([ +... A.RandomCrop(height=256, width=256, pad_if_needed=True, p=1), +... A.HorizontalFlip(p=0.5), +... A.ColorJitter(p=0.5) +... ]) +``` + +**5**. Since 🤗 Datasets uses PIL images but Albumentations expects NumPy arrays, you need to convert between formats: + +```py +>>> def albumentations_transforms(examples): +... # Apply Albumentations transforms +... transformed_images = [] +... for image in examples["image"]: +... # Convert PIL to numpy array (OpenCV format) +... image_np = np.array(image.convert("RGB")) +... +... # Apply Albumentations transforms +... transformed_image = transform(image=image_np)["image"] +... +... # Convert back to PIL Image +... pil_image = Image.fromarray(transformed_image) +... transformed_images.append(pil_image) +... +... examples["pixel_values"] = transformed_images +... return examples +``` + +**6**. Apply the transform using [`~Dataset.with_transform`]: + +```py +>>> dataset = dataset.with_transform(albumentations_transforms) +>>> dataset[0]["pixel_values"] +``` + +**Key points when using Albumentations with 🤗 Datasets:** +- Convert PIL images to NumPy arrays before applying transforms +- Albumentations returns a dictionary with the transformed image under the "image" key +- Convert the result back to PIL format after transformation + +**7**. The dataset is now ready for training with your machine learning framework! diff --git a/docs/source/use_with_jax.mdx b/docs/source/use_with_jax.mdx new file mode 100644 index 0000000..cb0a763 --- /dev/null +++ b/docs/source/use_with_jax.mdx @@ -0,0 +1,221 @@ +# Use with JAX + +This document is a quick introduction to using `datasets` with JAX, with a particular focus on how to get +`jax.Array` objects out of our datasets, and how to use them to train JAX models. + +> [!TIP] +> `jax` and `jaxlib` are required to reproduce to code above, so please make sure you +> install them as `pip install datasets[jax]`. + +## Dataset format + +By default, datasets return regular Python objects: integers, floats, strings, lists, etc., and +string and binary objects are unchanged, since JAX only supports numbers. + +To get JAX arrays (numpy-like) instead, you can set the format of the dataset to `jax`: + +```py +>>> from datasets import Dataset +>>> data = [[1, 2], [3, 4]] +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("jax") +>>> ds[0] +{'data': DeviceArray([1, 2], dtype=int32)} +>>> ds[:2] +{'data': DeviceArray([ + [1, 2], + [3, 4]], dtype=int32)} +``` + +> [!TIP] +> A [`Dataset`] object is a wrapper of an Arrow table, which allows fast reads from arrays in the dataset to JAX arrays. + +Note that the exact same procedure applies to `DatasetDict` objects, so that +when setting the format of a `DatasetDict` to `jax`, all the `Dataset`s there +will be formatted as `jax`: + +```py +>>> from datasets import DatasetDict +>>> data = {"train": {"data": [[1, 2], [3, 4]]}, "test": {"data": [[5, 6], [7, 8]]}} +>>> dds = DatasetDict.from_dict(data) +>>> dds = dds.with_format("jax") +>>> dds["train"][:2] +{'data': DeviceArray([ + [1, 2], + [3, 4]], dtype=int32)} +``` + +Another thing you'll need to take into consideration is that the formatting is not applied +until you actually access the data. So if you want to get a JAX array out of a dataset, +you'll need to access the data first, otherwise the format will remain the same. + +Finally, to load the data in the device of your choice, you can specify the `device` argument, +but note that `jaxlib.xla_extension.Device` is not supported as it's not serializable with neither +`pickle` not `dill`, so you'll need to use its string identifier instead: + +```py +>>> import jax +>>> from datasets import Dataset +>>> data = [[1, 2], [3, 4]] +>>> ds = Dataset.from_dict({"data": data}) +>>> device = str(jax.devices()[0]) # Not casting to `str` before passing it to `with_format` will raise a `ValueError` +>>> ds = ds.with_format("jax", device=device) +>>> ds[0] +{'data': DeviceArray([1, 2], dtype=int32)} +>>> ds[0]["data"].device() +TFRT_CPU_0 +>>> assert ds[0]["data"].device() == jax.devices()[0] +True +``` + +Note that if the `device` argument is not provided to `with_format` then it will use the default +device which is `jax.devices()[0]`. + +### N-dimensional arrays + +If your dataset consists of N-dimensional arrays, you will see that by default they are considered as the same tensor if the shape is fixed: + +```py +>>> from datasets import Dataset +>>> data = [[[1, 2],[3, 4]], [[5, 6],[7, 8]]] # fixed shape +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("jax") +>>> ds[0] +{'data': Array([[1, 2], + [3, 4]], dtype=int32)} +``` + +```py +>>> from datasets import Dataset +>>> data = [[[1, 2],[3]], [[4, 5, 6],[7, 8]]] # varying shape +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("jax") +>>> ds[0] +{'data': [Array([1, 2], dtype=int32), Array([3], dtype=int32)]} +``` + +However this logic often requires slow shape comparisons and data copies. +To avoid this, you must explicitly use the [`Array`] feature type and specify the shape of your tensors: + +```py +>>> from datasets import Dataset, Features, Array2D +>>> data = [[[1, 2],[3, 4]],[[5, 6],[7, 8]]] +>>> features = Features({"data": Array2D(shape=(2, 2), dtype='int32')}) +>>> ds = Dataset.from_dict({"data": data}, features=features) +>>> ds = ds.with_format("jax") +>>> ds[0] +{'data': Array([[1, 2], + [3, 4]], dtype=int32)} +>>> ds[:2] +{'data': Array([[[1, 2], + [3, 4]], + + [[5, 6], + [7, 8]]], dtype=int32)} +``` + +### Other feature types + +[`ClassLabel`] data is properly converted to arrays: + +```py +>>> from datasets import Dataset, Features, ClassLabel +>>> labels = [0, 0, 1] +>>> features = Features({"label": ClassLabel(names=["negative", "positive"])}) +>>> ds = Dataset.from_dict({"label": labels}, features=features) +>>> ds = ds.with_format("jax") +>>> ds[:3] +{'label': DeviceArray([0, 0, 1], dtype=int32)} +``` + +String and binary objects are unchanged, since JAX only supports numbers. + +The [`Image`] and [`Audio`] feature types are also supported. + +> [!TIP] +> To use the [`Image`] feature type, you'll need to install the `vision` extra as +> `pip install datasets[vision]`. + +```py +>>> from datasets import Dataset, Features, Image +>>> images = ["path/to/image.png"] * 10 +>>> features = Features({"image": Image()}) +>>> ds = Dataset.from_dict({"image": images}, features=features) +>>> ds = ds.with_format("jax") +>>> ds[0]["image"].shape +(512, 512, 3) +>>> ds[0] +{'image': DeviceArray([[[ 255, 255, 255], + [ 255, 255, 255], + ..., + [ 255, 255, 255], + [ 255, 255, 255]]], dtype=uint8)} +>>> ds[:2]["image"].shape +(2, 512, 512, 3) +>>> ds[:2] +{'image': DeviceArray([[[[ 255, 255, 255], + [ 255, 255, 255], + ..., + [ 255, 255, 255], + [ 255, 255, 255]]]], dtype=uint8)} +``` + +> [!TIP] +> To use the [`Audio`] feature type, you'll need to install the `audio` extra as +> `pip install datasets[audio]`. + +```py +>>> from datasets import Dataset, Features, Audio +>>> audio = ["path/to/audio.wav"] * 10 +>>> features = Features({"audio": Audio()}) +>>> ds = Dataset.from_dict({"audio": audio}, features=features) +>>> ds = ds.with_format("jax") +>>> ds[0]["audio"]["array"] +DeviceArray([-0.059021 , -0.03894043, -0.00735474, ..., 0.0133667 , + 0.01809692, 0.00268555], dtype=float32) +>>> ds[0]["audio"]["sampling_rate"] +DeviceArray(44100, dtype=int32, weak_type=True) +``` + +## Data loading + +JAX doesn't have any built-in data loading capabilities, so you'll need to use a library such +as [PyTorch](https://pytorch.org/) to load your data using a `DataLoader` or [TensorFlow](https://www.tensorflow.org/) +using a `tf.data.Dataset`. Citing the [JAX documentation](https://jax.readthedocs.io/en/latest/notebooks/Neural_Network_and_Data_Loading.html#data-loading-with-pytorch) on this topic: +"JAX is laser-focused on program transformations and accelerator-backed NumPy, so we don’t +include data loading or munging in the JAX library. There are already a lot of great data loaders +out there, so let’s just use them instead of reinventing anything. We’ll grab PyTorch’s data loader, +and make a tiny shim to make it work with NumPy arrays.". + +So that's the reason why JAX-formatting in `datasets` is so useful, because it lets you use +any model from the HuggingFace Hub with JAX, without having to worry about the data loading +part. + +### Using `with_format('jax')` + +The easiest way to get JAX arrays out of a dataset is to use the `with_format('jax')` method. Lets assume +that we want to train a neural network on the [MNIST dataset](http://yann.lecun.com/exdb/mnist/) available +at the HuggingFace Hub at https://huggingface.co/datasets/ylecun/mnist. + +```py +>>> from datasets import load_dataset +>>> ds = load_dataset("ylecun/mnist") +>>> ds = ds.with_format("jax") +>>> ds["train"][0] +{'image': DeviceArray([[ 0, 0, 0, ...], + [ 0, 0, 0, ...], + ..., + [ 0, 0, 0, ...], + [ 0, 0, 0, ...]], dtype=uint8), + 'label': DeviceArray(5, dtype=int32)} +``` + +Once the format is set we can feed the dataset to the JAX model in batches using the `Dataset.iter()` +method: + +```py +>>> for epoch in range(epochs): +... for batch in ds["train"].iter(batch_size=32): +... x, y = batch["image"], batch["label"] +... ... +``` diff --git a/docs/source/use_with_numpy.mdx b/docs/source/use_with_numpy.mdx new file mode 100644 index 0000000..b3ba458 --- /dev/null +++ b/docs/source/use_with_numpy.mdx @@ -0,0 +1,182 @@ +# Use with NumPy + +This document is a quick introduction to using `datasets` with NumPy, with a particular focus on how to get +`numpy.ndarray` objects out of our datasets, and how to use them to train models based on NumPy such as `scikit-learn` models. + + +## Dataset format + +By default, datasets return regular Python objects: integers, floats, strings, lists, etc.. + +To get NumPy arrays instead, you can set the format of the dataset to `numpy`: + +```py +>>> from datasets import Dataset +>>> data = [[1, 2], [3, 4]] +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("numpy") +>>> ds[0] +{'data': array([1, 2])} +>>> ds[:2] +{'data': array([ + [1, 2], + [3, 4]])} +``` + +> [!TIP] +> A [`Dataset`] object is a wrapper of an Arrow table, which allows fast reads from arrays in the dataset to NumPy arrays. + +Note that the exact same procedure applies to `DatasetDict` objects, so that +when setting the format of a `DatasetDict` to `numpy`, all the `Dataset`s there +will be formatted as `numpy`: + +```py +>>> from datasets import DatasetDict +>>> data = {"train": {"data": [[1, 2], [3, 4]]}, "test": {"data": [[5, 6], [7, 8]]}} +>>> dds = DatasetDict.from_dict(data) +>>> dds = dds.with_format("numpy") +>>> dds["train"][:2] +{'data': array([ + [1, 2], + [3, 4]])} +``` + + +### N-dimensional arrays + +If your dataset consists of N-dimensional arrays, you will see that by default they are considered as the same array if the shape is fixed: + +```py +>>> from datasets import Dataset +>>> data = [[[1, 2],[3, 4]], [[5, 6],[7, 8]]] # fixed shape +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("numpy") +>>> ds[0] +{'data': array([[1, 2], + [3, 4]])} +``` + +```py +>>> from datasets import Dataset +>>> data = [[[1, 2],[3]], [[4, 5, 6],[7, 8]]] # varying shape +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("numpy") +>>> ds[0] +{'data': array([array([1, 2]), array([3])], dtype=object)} +``` + +However this logic often requires slow shape comparisons and data copies. +To avoid this, you must explicitly use the [`Array`] feature type and specify the shape of your tensors: + +```py +>>> from datasets import Dataset, Features, Array2D +>>> data = [[[1, 2],[3, 4]],[[5, 6],[7, 8]]] +>>> features = Features({"data": Array2D(shape=(2, 2), dtype='int32')}) +>>> ds = Dataset.from_dict({"data": data}, features=features) +>>> ds = ds.with_format("numpy") +>>> ds[0] +{'data': array([[1, 2], + [3, 4]])} +>>> ds[:2] +{'data': array([[[1, 2], + [3, 4]], + + [[5, 6], + [7, 8]]])} +``` + +### Other feature types + +[`ClassLabel`] data is properly converted to arrays: + +```py +>>> from datasets import Dataset, Features, ClassLabel +>>> labels = [0, 0, 1] +>>> features = Features({"label": ClassLabel(names=["negative", "positive"])}) +>>> ds = Dataset.from_dict({"label": labels}, features=features) +>>> ds = ds.with_format("numpy") +>>> ds[:3] +{'label': array([0, 0, 1])} +``` + +String and binary objects are unchanged, since NumPy only supports numbers. + +The [`Image`] and [`Audio`] feature types are also supported. + +> [!TIP] +> To use the [`Image`] feature type, you'll need to install the `vision` extra as +> `pip install datasets[vision]`. + +```py +>>> from datasets import Dataset, Features, Image +>>> images = ["path/to/image.png"] * 10 +>>> features = Features({"image": Image()}) +>>> ds = Dataset.from_dict({"image": images}, features=features) +>>> ds = ds.with_format("numpy") +>>> ds[0]["image"].shape +(512, 512, 3) +>>> ds[0] +{'image': array([[[ 255, 255, 255], + [ 255, 255, 255], + ..., + [ 255, 255, 255], + [ 255, 255, 255]]], dtype=uint8)} +>>> ds[:2]["image"].shape +(2, 512, 512, 3) +>>> ds[:2] +{'image': array([[[[ 255, 255, 255], + [ 255, 255, 255], + ..., + [ 255, 255, 255], + [ 255, 255, 255]]]], dtype=uint8)} +``` + +> [!TIP] +> To use the [`Audio`] feature type, you'll need to install the `audio` extra as +> `pip install datasets[audio]`. + +```py +>>> from datasets import Dataset, Features, Audio +>>> audio = ["path/to/audio.wav"] * 10 +>>> features = Features({"audio": Audio()}) +>>> ds = Dataset.from_dict({"audio": audio}, features=features) +>>> ds = ds.with_format("numpy") +>>> ds[0]["audio"]["array"] +array([-0.059021 , -0.03894043, -0.00735474, ..., 0.0133667 , + 0.01809692, 0.00268555], dtype=float32) +>>> ds[0]["audio"]["sampling_rate"] +array(44100, weak_type=True) +``` + +## Data loading + +NumPy doesn't have any built-in data loading capabilities, so you'll either need to materialize the NumPy arrays like `X, y` to use in `scikit-learn` or use a library such as [PyTorch](https://pytorch.org/) to load your data using a `DataLoader`. + +### Using `with_format('numpy')` + +The easiest way to get NumPy arrays out of a dataset is to use the `with_format('numpy')` method. Lets assume +that we want to train a neural network on the [MNIST dataset](http://yann.lecun.com/exdb/mnist/) available +at the HuggingFace Hub at https://huggingface.co/datasets/mnist. + +```py +>>> from datasets import load_dataset +>>> ds = load_dataset("ylecun/mnist") +>>> ds = ds.with_format("numpy") +>>> ds["train"][0] +{'image': array([[ 0, 0, 0, ...], + [ 0, 0, 0, ...], + ..., + [ 0, 0, 0, ...], + [ 0, 0, 0, ...]], dtype=uint8), + 'label': array(5)} +``` + +Once the format is set we can feed the dataset to the model based on NumPy in batches using the `Dataset.iter()` +method: + +```py +>>> for epoch in range(epochs): +... for batch in ds["train"].iter(batch_size=32): +... x, y = batch["image"], batch["label"] +... ... +``` diff --git a/docs/source/use_with_pandas.mdx b/docs/source/use_with_pandas.mdx new file mode 100644 index 0000000..3cc0873 --- /dev/null +++ b/docs/source/use_with_pandas.mdx @@ -0,0 +1,83 @@ +# Use with Pandas + +This document is a quick introduction to using `datasets` with Pandas, with a particular focus on how to process +datasets using Pandas functions, and how to convert a dataset to Pandas or from Pandas. + +This is particularly useful as it allows fast operations, since `datasets` uses PyArrow under the hood and PyArrow is well integrated with Pandas. + +## Dataset format + +By default, datasets return regular Python objects: integers, floats, strings, lists, etc. + +To get Pandas DataFrames or Series instead, you can set the format of the dataset to `pandas` using [`Dataset.with_format`]: + +```py +>>> from datasets import Dataset +>>> data = {"col_0": ["a", "b", "c", "d"], "col_1": [0., 0., 1., 1.]} +>>> ds = Dataset.from_dict(data) +>>> ds = ds.with_format("pandas") +>>> ds[0] # pd.DataFrame + col_0 col_1 +0 a 0.0 +>>> ds[:2] # pd.DataFrame + col_0 col_1 +0 a 0.0 +1 b 0.0 +>>> ds["data"] # pd.Series +0 a +1 b +2 c +3 d +Name: col_0, dtype: object +``` + +This also works for `IterableDataset` objects obtained e.g. using `load_dataset(..., streaming=True)`: + +```py +>>> ds = ds.with_format("pandas") +>>> for df in ds.iter(batch_size=2): +... print(df) +... break + col_0 col_1 +0 a 0.0 +1 b 0.0 +``` + +## Process data + +Pandas functions are generally faster than regular hand-written python functions, and therefore they are a good option to optimize data processing. You can use Pandas functions to process a dataset in [`Dataset.map`] or [`Dataset.filter`]: + +```python +>>> from datasets import Dataset +>>> data = {"col_0": ["a", "b", "c", "d"], "col_1": [0., 0., 1., 1.]} +>>> ds = Dataset.from_dict(data) +>>> ds = ds.with_format("pandas") +>>> ds = ds.map(lambda df: df.assign(col_2=df.col_1 + 1), batched=True) +>>> ds[:2] + col_0 col_1 col_2 +0 a 0.0 1.0 +1 b 0.0 1.0 +>>> ds = ds.filter(lambda df: df.col_0 == "b", batched=True) +>>> ds[0] + col_0 col_1 col_2 +0 b 0.0 1.0 +``` + +We use `batched=True` because it is faster to process batches of data in Pandas rather than row by row. It's also possible to use `batch_size=` in `map()` to set the size of each `df`. + +This also works for [`IterableDataset.map`] and [`IterableDataset.filter`]. + +## Import or Export from Pandas + +To import data from Pandas, you can use [`Dataset.from_pandas`]: + +```python +ds = Dataset.from_pandas(df) +``` + +And you can use [`Dataset.to_pandas`] to export a Dataset to a Pandas DataFrame: + + +```python +df = Dataset.to_pandas() +``` diff --git a/docs/source/use_with_polars.mdx b/docs/source/use_with_polars.mdx new file mode 100644 index 0000000..5e2ab1e --- /dev/null +++ b/docs/source/use_with_polars.mdx @@ -0,0 +1,139 @@ +# Use with Polars + +This document is a quick introduction to using `datasets` with Polars, with a particular focus on how to process +datasets using Polars functions, and how to convert a dataset to Polars or from Polars. + +This is particularly useful as it allows fast zero-copy operations, since both `datasets` and Polars use Arrow under the hood. + +## Dataset format + +By default, datasets return regular Python objects: integers, floats, strings, lists, etc. + +To get Polars DataFrames or Series instead, you can set the format of the dataset to `polars` using [`Dataset.with_format`]: + +```py +>>> from datasets import Dataset +>>> data = {"col_0": ["a", "b", "c", "d"], "col_1": [0., 0., 1., 1.]} +>>> ds = Dataset.from_dict(data) +>>> ds = ds.with_format("polars") +>>> ds[0] # pl.DataFrame +shape: (1, 2) +┌───────┬───────┐ +│ col_0 ┆ col_1 │ +│ --- ┆ --- │ +│ str ┆ f64 │ +╞═══════╪═══════╡ +│ a ┆ 0.0 │ +└───────┴───────┘ +>>> ds[:2] # pl.DataFrame +shape: (2, 2) +┌───────┬───────┐ +│ col_0 ┆ col_1 │ +│ --- ┆ --- │ +│ str ┆ f64 │ +╞═══════╪═══════╡ +│ a ┆ 0.0 │ +│ b ┆ 0.0 │ +└───────┴───────┘ +>>> ds["data"] # pl.Series +shape: (4,) +Series: 'col_0' [str] +[ + "a" + "b" + "c" + "d" +] +``` + +This also works for `IterableDataset` objects obtained e.g. using `load_dataset(..., streaming=True)`: + +```py +>>> ds = ds.with_format("polars") +>>> for df in ds.iter(batch_size=2): +... print(df) +... break +shape: (2, 2) +┌───────┬───────┐ +│ col_0 ┆ col_1 │ +│ --- ┆ --- │ +│ str ┆ f64 │ +╞═══════╪═══════╡ +│ a ┆ 0.0 │ +│ b ┆ 0.0 │ +└───────┴───────┘ +``` + +## Process data + +Polars functions are generally faster than regular hand-written python functions, and therefore they are a good option to optimize data processing. You can use Polars functions to process a dataset in [`Dataset.map`] or [`Dataset.filter`]: + +```python +>>> import polars as pl +>>> from datasets import Dataset +>>> data = {"col_0": ["a", "b", "c", "d"], "col_1": [0., 0., 1., 1.]} +>>> ds = Dataset.from_dict(data) +>>> ds = ds.with_format("polars") +>>> ds = ds.map(lambda df: df.with_columns(pl.col("col_1").add(1).alias("col_2")), batched=True) +>>> ds[:2] +shape: (2, 3) +┌───────┬───────┬───────┐ +│ col_0 ┆ col_1 ┆ col_2 │ +│ --- ┆ --- ┆ --- │ +│ str ┆ f64 ┆ f64 │ +╞═══════╪═══════╪═══════╡ +│ a ┆ 0.0 ┆ 1.0 │ +│ b ┆ 0.0 ┆ 1.0 │ +└───────┴───────┴───────┘ +>>> ds = ds.filter(lambda df: df["col_0"] == "b", batched=True) +>>> ds[0] +shape: (1, 3) +┌───────┬───────┬───────┐ +│ col_0 ┆ col_1 ┆ col_2 │ +│ --- ┆ --- ┆ --- │ +│ str ┆ f64 ┆ f64 │ +╞═══════╪═══════╪═══════╡ +│ b ┆ 0.0 ┆ 1.0 │ +└───────┴───────┴───────┘ +``` + +We use `batched=True` because it is faster to process batches of data in Polars rather than row by row. It's also possible to use `batch_size=` in `map()` to set the size of each `df`. + +This also works for [`IterableDataset.map`] and [`IterableDataset.filter`]. + +### Example: data extraction + +Many functions are available in Polars and for any data type: string, floats, integers, etc. You can find the full list [here](https://docs.pola.rs/api/python/stable/reference/expressions/functions.html). Those functions are written in Rust and run on batches of data which enables fast data processing. + +Here is an example that shows a 5x speed boost using Polars instead of a regular python function to extract solutions from a LLM reasoning dataset: + +```python +from datasets import load_dataset + +ds = load_dataset("ServiceNow-AI/R1-Distill-SFT", "v0", split="train") + +# Using a regular python function +pattern = re.compile("boxed\\{(.*)\\}") +result_ds = ds.map(lambda x: {"value_solution": m.group(1) if (m:=pattern.search(x["solution"])) else None}) +# Time: 10s + +# Using a Polars function +expr = pl.col("solution").str.extract("boxed\\{(.*)\\}").alias("value_solution") +result_ds = ds.with_format("polars").map(lambda df: df.with_columns(expr), batched=True) +# Time: 2s +``` + +## Import or Export from Polars + +To import data from Polars, you can use [`Dataset.from_polars`]: + +```python +ds = Dataset.from_polars(df) +``` + +And you can use [`Dataset.to_polars`] to export a Dataset to a Polars DataFrame: + + +```python +df = Dataset.to_polars(ds) +``` diff --git a/docs/source/use_with_pyarrow.mdx b/docs/source/use_with_pyarrow.mdx new file mode 100644 index 0000000..3e6239c --- /dev/null +++ b/docs/source/use_with_pyarrow.mdx @@ -0,0 +1,108 @@ +# Use with PyArrow + +This document is a quick introduction to using `datasets` with PyArrow, with a particular focus on how to process +datasets using Arrow compute functions, and how to convert a dataset to PyArrow or from PyArrow. + +This is particularly useful as it allows fast zero-copy operations, since `datasets` uses PyArrow under the hood. + +## Dataset format + +By default, datasets return regular Python objects: integers, floats, strings, lists, etc. + +To get PyArrow Tables or Arrays instead, you can set the format of the dataset to `pyarrow` using [`Dataset.with_format`]: + +```py +>>> from datasets import Dataset +>>> data = {"col_0": ["a", "b", "c", "d"], "col_1": [0., 0., 1., 1.]} +>>> ds = Dataset.from_dict(data) +>>> ds = ds.with_format("arrow") +>>> ds[0] # pa.Table +pyarrow.Table +col_0: string +col_1: double +---- +col_0: [["a"]] +col_1: [[0]] +>>> ds[:2] # pa.Table +pyarrow.Table +col_0: string +col_1: double +---- +col_0: [["a","b"]] +col_1: [[0,0]] +>>> ds["data"] # pa.array + +[ + [ + "a", + "b", + "c", + "d" + ] +] +``` + +This also works for `IterableDataset` objects obtained e.g. using `load_dataset(..., streaming=True)`: + +```py +>>> ds = ds.with_format("arrow") +>>> for table in ds.iter(batch_size=2): +... print(table) +... break +pyarrow.Table +col_0: string +col_1: double +---- +col_0: [["a","b"]] +col_1: [[0,0]] +``` + +## Process data + +PyArrow functions are generally faster than regular hand-written python functions, and therefore they are a good option to optimize data processing. You can use Arrow compute functions to process a dataset in [`Dataset.map`] or [`Dataset.filter`]: + +```python +>>> import pyarrow.compute as pc +>>> from datasets import Dataset +>>> data = {"col_0": ["a", "b", "c", "d"], "col_1": [0., 0., 1., 1.]} +>>> ds = Dataset.from_dict(data) +>>> ds = ds.with_format("arrow") +>>> ds = ds.map(lambda t: t.append_column("col_2", pc.add(t["col_1"], 1)), batched=True) +>>> ds[:2] +pyarrow.Table +col_0: string +col_1: double +col_2: double +---- +col_0: [["a","b"]] +col_1: [[0,0]] +col_2: [[1,1]] +>>> ds = ds.filter(lambda t: pc.equal(t["col_0"], "b"), batched=True) +>>> ds[0] +pyarrow.Table +col_0: string +col_1: double +col_2: double +---- +col_0: [["b"]] +col_1: [[0]] +col_2: [[1]] +``` + +We use `batched=True` because it is faster to process batches of data in PyArrow rather than row by row. It's also possible to use `batch_size=` in `map()` to set the size of each `table`. + +This also works for [`IterableDataset.map`] and [`IterableDataset.filter`]. + +## Import or Export from PyArrow + +A [`Dataset`] is a wrapper of a PyArrow Table, you can instantiate a Dataset directly from the Table: + +```python +ds = Dataset(table) +``` + +You can access the PyArrow Table of a dataset using [`Dataset.data`], which returns a [`MemoryMappedTable`] or a [`InMemoryTable`] or a [`ConcatenationTable`], depending on the origin of the Arrow data and the operations that were applied. + +Those objects wrap the underlying PyArrow table accessible at `Dataset.data.table`. This table contains all the data of the dataset, but there might also be an indices mapping at `Dataset._indices` which maps the dataset rows indices to the PyArrow Table rows indices. This can happen if the dataset has been shuffled with [`Dataset.shuffle`] or if only a subset of the rows are used (e.g. after a [`Dataset.select`]). + +In the general case, you can export a dataset to a PyArrow Table using `table = ds.with_format("arrow")[:]`. diff --git a/docs/source/use_with_pytorch.mdx b/docs/source/use_with_pytorch.mdx new file mode 100644 index 0000000..8e77b88 --- /dev/null +++ b/docs/source/use_with_pytorch.mdx @@ -0,0 +1,260 @@ +# Use with PyTorch + +This document is a quick introduction to using `datasets` with PyTorch, with a particular focus on how to get +`torch.Tensor` objects out of our datasets, and how to use a PyTorch `DataLoader` and a Hugging Face `Dataset` +with the best performance. + +## Dataset format + +By default, datasets return regular python objects: integers, floats, strings, lists, etc. + +To get PyTorch tensors instead, you can set the format of the dataset to `pytorch` using [`Dataset.with_format`]: + +```py +>>> from datasets import Dataset +>>> data = [[1, 2],[3, 4]] +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("torch") +>>> ds[0] +{'data': tensor([1, 2])} +>>> ds[:2] +{'data': tensor([[1, 2], + [3, 4]])} +``` + +> [!TIP] +> A [`Dataset`] object is a wrapper of an Arrow table, which allows fast zero-copy reads from arrays in the dataset to PyTorch tensors. + + +To load the data as tensors on a GPU, specify the `device` argument: +```py +>>> import torch +>>> device = torch.device("cuda" if torch.cuda.is_available() else "cpu") +>>> ds = ds.with_format("torch", device=device) +>>> ds[0] +{'data': tensor([1, 2], device='cuda:0')} +``` + +### N-dimensional arrays + +If your dataset consists of N-dimensional arrays, you will see that by default they are considered as the same tensor if the shape is fixed: + +```py +>>> from datasets import Dataset +>>> data = [[[1, 2],[3, 4]],[[5, 6],[7, 8]]] # fixed shape +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("torch") +>>> ds[0] +{'data': tensor([[1, 2], + [3, 4]])} +``` + +```py +>>> from datasets import Dataset +>>> data = [[[1, 2],[3]],[[4, 5, 6],[7, 8]]] # varying shape +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("torch") +>>> ds[0] +{'data': [tensor([1, 2]), tensor([3])]} +``` + +However this logic often requires slow shape comparisons and data copies. +To avoid this, you must explicitly use the [`Array`] feature type and specify the shape of your tensors: + +```py +>>> from datasets import Dataset, Features, Array2D +>>> data = [[[1, 2],[3, 4]],[[5, 6],[7, 8]]] +>>> features = Features({"data": Array2D(shape=(2, 2), dtype='int32')}) +>>> ds = Dataset.from_dict({"data": data}, features=features) +>>> ds = ds.with_format("torch") +>>> ds[0] +{'data': tensor([[1, 2], + [3, 4]])} +>>> ds[:2] +{'data': tensor([[[1, 2], + [3, 4]], + + [[5, 6], + [7, 8]]])} +``` + + +### Other feature types + +[`ClassLabel`] data are properly converted to tensors: + +```py +>>> from datasets import Dataset, Features, ClassLabel +>>> labels = [0, 0, 1] +>>> features = Features({"label": ClassLabel(names=["negative", "positive"])}) +>>> ds = Dataset.from_dict({"label": labels}, features=features) +>>> ds = ds.with_format("torch") +>>> ds[:3] +{'label': tensor([0, 0, 1])} +``` + +String and binary objects are unchanged, since PyTorch only supports numbers. + +The [`Image`] and [`Audio`] feature types are also supported. + +> [!TIP] +> To use the [`Image`] feature type, you'll need to install the `vision` extra as +> `pip install datasets[vision]`. + +```py +>>> from datasets import Dataset, Features, Audio, Image +>>> images = ["path/to/image.png"] * 10 +>>> features = Features({"image": Image()}) +>>> ds = Dataset.from_dict({"image": images}, features=features) +>>> ds = ds.with_format("torch") +>>> ds[0]["image"].shape +torch.Size([512, 512, 4]) +>>> ds[0] +{'image': tensor([[[255, 215, 106, 255], + [255, 215, 106, 255], + ..., + [255, 255, 255, 255], + [255, 255, 255, 255]]], dtype=torch.uint8)} +>>> ds[:2]["image"].shape +torch.Size([2, 512, 512, 4]) +>>> ds[:2] +{'image': tensor([[[[255, 215, 106, 255], + [255, 215, 106, 255], + ..., + [255, 255, 255, 255], + [255, 255, 255, 255]]]], dtype=torch.uint8)} +``` + +> [!TIP] +> To use the [`Audio`] feature type, you'll need to install the `audio` extra as +> `pip install datasets[audio]`. + +```py +>>> from datasets import Dataset, Features, Audio, Image +>>> audio = ["path/to/audio.wav"] * 10 +>>> features = Features({"audio": Audio()}) +>>> ds = Dataset.from_dict({"audio": audio}, features=features) +>>> ds = ds.with_format("torch") +>>> ds[0]["audio"]["array"] +tensor([ 6.1035e-05, 1.5259e-05, 1.6785e-04, ..., -1.5259e-05, + -1.5259e-05, 1.5259e-05]) +>>> ds[0]["audio"]["sampling_rate"] +tensor(44100) +``` + +## Data loading + +Like `torch.utils.data.Dataset` objects, a [`Dataset`] can be passed directly to a PyTorch `DataLoader`: + +```py +>>> import numpy as np +>>> from datasets import Dataset +>>> from torch.utils.data import DataLoader +>>> data = np.random.rand(16) +>>> label = np.random.randint(0, 2, size=16) +>>> ds = Dataset.from_dict({"data": data, "label": label}).with_format("torch") +>>> dataloader = DataLoader(ds, batch_size=4) +>>> for batch in dataloader: +... print(batch) +{'data': tensor([0.0047, 0.4979, 0.6726, 0.8105]), 'label': tensor([0, 1, 0, 1])} +{'data': tensor([0.4832, 0.2723, 0.4259, 0.2224]), 'label': tensor([0, 0, 0, 0])} +{'data': tensor([0.5837, 0.3444, 0.4658, 0.6417]), 'label': tensor([0, 1, 0, 0])} +{'data': tensor([0.7022, 0.1225, 0.7228, 0.8259]), 'label': tensor([1, 1, 1, 1])} +``` + +### Optimize data loading + +There are several ways you can increase the speed your data is loaded which can save you time, especially if you are working with large datasets. +PyTorch offers parallelized data loading, retrieving batches of indices instead of individually, and streaming to iterate over the dataset without downloading it on disk. + +#### Use multiple Workers + +You can parallelize data loading with the `num_workers` argument of a PyTorch `DataLoader` and get a higher throughput. + +Under the hood, the `DataLoader` starts `num_workers` processes. +Each process reloads the dataset passed to the `DataLoader` and is used to query examples. +Reloading the dataset inside a worker doesn't fill up your RAM, since it simply memory-maps the dataset again from your disk. + +```py +>>> import numpy as np +>>> from datasets import Dataset, load_from_disk +>>> from torch.utils.data import DataLoader +>>> data = np.random.rand(10_000) +>>> Dataset.from_dict({"data": data}).save_to_disk("my_dataset") +>>> ds = load_from_disk("my_dataset").with_format("torch") +>>> dataloader = DataLoader(ds, batch_size=32, num_workers=4) +``` + +### Stream data + +Stream a dataset by loading it as an [`IterableDataset`]. This allows you to progressively iterate over a remote dataset without downloading it on disk and or over local data files. +Learn more about which type of dataset is best for your use case in the [choosing between a regular dataset or an iterable dataset](./about_mapstyle_vs_iterable) guide. + + +An iterable dataset from `datasets` inherits from `torch.utils.data.IterableDataset` so you can pass it to a `torch.utils.data.DataLoader`: + +```py +>>> import numpy as np +>>> from datasets import Dataset, load_dataset +>>> from torch.utils.data import DataLoader +>>> data = np.random.rand(10_000) +>>> Dataset.from_dict({"data": data}).push_to_hub("/my_dataset") # Upload to the Hugging Face Hub +>>> my_iterable_dataset = load_dataset("/my_dataset", streaming=True, split="train") +>>> dataloader = DataLoader(my_iterable_dataset, batch_size=32) +``` + +If the dataset is split in several shards (i.e. if the dataset consists of multiple data files), then you can stream in parallel using `num_workers`: + +```py +>>> my_iterable_dataset = load_dataset("deepmind/code_contests", streaming=True, split="train") +>>> my_iterable_dataset.num_shards +39 +>>> dataloader = DataLoader(my_iterable_dataset, batch_size=32, num_workers=4) +``` + +In this case each worker is given a subset of the list of shards to stream from. + +### Checkpoint and resume + +If you need a DataLoader that you can checkpoint and resume in the middle of training, you can use the `StatefulDataLoader` from [torchdata](https://github.com/pytorch/data): + +```py +>>> from torchdata.stateful_dataloader import StatefulDataLoader +>>> my_iterable_dataset = load_dataset("deepmind/code_contests", streaming=True, split="train") +>>> dataloader = StatefulDataLoader(my_iterable_dataset, batch_size=32, num_workers=4) +>>> # save in the middle of training +>>> state_dict = dataloader.state_dict() +>>> # and resume later +>>> dataloader.load_state_dict(state_dict) +``` + +This is possible thanks to [`IterableDataset.state_dict`] and [`IterableDataset.load_state_dict`]. + +### Distributed + +To split your dataset across your training nodes, you can use [`datasets.distributed.split_dataset_by_node`]: + +```python +import os +from datasets.distributed import split_dataset_by_node + +ds = split_dataset_by_node(ds, rank=int(os.environ["RANK"]), world_size=int(os.environ["WORLD_SIZE"])) +``` + +This works for both map-style datasets and iterable datasets. +The dataset is split for the node at rank `rank` in a pool of nodes of size `world_size`. + +For map-style datasets: + +Each node is assigned a chunk of data, e.g. rank 0 is given the first chunk of the dataset. + +For iterable datasets: + +If the dataset has a number of shards that is a factor of `world_size` (i.e. if `dataset.num_shards % world_size == 0`), +then the shards are evenly assigned across the nodes, which is the most optimized. +Otherwise, each node keeps 1 example out of `world_size`, skipping the other examples. + +This can also be combined with a `torch.utils.data.DataLoader` if you want each node to use multiple workers to load the data. + +> [!WARNING] +> If you shuffle your iterable dataset in a distributed setup, make sure to set a fixed `seed` in [`IterableDataset.shuffle`] so the same shuffled list of shards is used on every node to know which shards the node should skip. diff --git a/docs/source/use_with_spark.mdx b/docs/source/use_with_spark.mdx new file mode 100644 index 0000000..cfd7d53 --- /dev/null +++ b/docs/source/use_with_spark.mdx @@ -0,0 +1,67 @@ +# Use with Spark + +This document is a quick introduction to using 🤗 Datasets with Spark, with a particular focus on how to load a Spark DataFrame into a [`Dataset`] object. + +From there, you have fast access to any element and you can use it as a data loader to train models. + +## Load from Spark + +A [`Dataset`] object is a wrapper of an Arrow table, which allows fast reads from arrays in the dataset to PyTorch, TensorFlow and JAX tensors. +The Arrow table is memory mapped from disk, which can load datasets bigger than your available RAM. + +You can get a [`Dataset`] from a Spark DataFrame using [`Dataset.from_spark`]: + +```py +>>> from datasets import Dataset +>>> df = spark.createDataFrame( +... data=[[1, "Elia"], [2, "Teo"], [3, "Fang"]], +... columns=["id", "name"], +... ) +>>> ds = Dataset.from_spark(df) +``` + +The Spark workers write the dataset on disk in a cache directory as Arrow files, and the [`Dataset`] is loaded from there. + +Alternatively, you can skip materialization by using [`IterableDataset.from_spark`], which returns an [`IterableDataset`]: + + ```py + >>> from datasets import IterableDataset + >>> df = spark.createDataFrame( + ... data=[[1, "Elia"], [2, "Teo"], [3, "Fang"]], + ... columns=["id", "name"], + ... ) + >>> ds = IterableDataset.from_spark(df) + >>> print(next(iter(ds))) + {"id": 1, "name": "Elia"} + ``` + +### Caching + +When using [`Dataset.from_spark`], the resulting [`Dataset`] is cached; if you call [`Dataset.from_spark`] multiple +times on the same DataFrame it won't re-run the Spark job that writes the dataset as Arrow files on disk. + +You can set the cache location by passing `cache_dir=` to [`Dataset.from_spark`]. +Make sure to use a disk that is available to both your workers and your current machine (the driver). + +> [!WARNING] +> In a different session, a Spark DataFrame doesn't have the same [semantic hash](https://spark.apache.org/docs/3.2.0/api/python/reference/api/pyspark.sql.DataFrame.semanticHash.html), and it will rerun a Spark job and store it in a new cache. + +### Feature types + +If your dataset is made of images, audio data or N-dimensional arrays, you can specify the `features=` argument in +[`Dataset.from_spark`] (or [`IterableDataset.from_spark`]): + +```py +>>> from datasets import Dataset, Features, Image, Value +>>> data = [(0, open("image.png", "rb").read())] +>>> df = spark.createDataFrame(data, "idx: int, image: binary") +>>> # Also works if you have arrays +>>> # data = [(0, np.zeros(shape=(32, 32, 3), dtype=np.int32).tolist())] +>>> # df = spark.createDataFrame(data, "idx: int, image: array>>") +>>> features = Features({"idx": Value("int64"), "image": Image()}) +>>> dataset = Dataset.from_spark(df, features=features) +>>> dataset[0] +{'idx': 0, 'image': } +``` + +You can check the [`Features`] documentation to know about all the feature types available. diff --git a/docs/source/use_with_tensorflow.mdx b/docs/source/use_with_tensorflow.mdx new file mode 100644 index 0000000..b022f67 --- /dev/null +++ b/docs/source/use_with_tensorflow.mdx @@ -0,0 +1,256 @@ +# Using Datasets with TensorFlow + +This document is a quick introduction to using `datasets` with TensorFlow, with a particular focus on how to get +`tf.Tensor` objects out of our datasets, and how to stream data from Hugging Face `Dataset` objects to Keras methods +like `model.fit()`. + +## Dataset format + +By default, datasets return regular Python objects: integers, floats, strings, lists, etc. + +To get TensorFlow tensors instead, you can set the format of the dataset to `tf`: + +```py +>>> from datasets import Dataset +>>> data = [[1, 2],[3, 4]] +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("tf") +>>> ds[0] +{'data': } +>>> ds[:2] +{'data': } +``` + +> [!TIP] +> A [`Dataset`] object is a wrapper of an Arrow table, which allows fast reads from arrays in the dataset to TensorFlow tensors. + +This can be useful for converting your dataset to a dict of `Tensor` objects, or for writing a generator to load TF +samples from it. If you wish to convert the entire dataset to `Tensor`, simply query the full dataset: + +```py +>>> ds[:] +{'data': } +``` + +### N-dimensional arrays + +If your dataset consists of N-dimensional arrays, you will see that by default they are considered as the same tensor if the shape is fixed: + +```py +>>> from datasets import Dataset +>>> data = [[[1, 2],[3, 4]],[[5, 6],[7, 8]]] # fixed shape +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("tf") +>>> ds[0] +{'data': } +``` + +Otherwise, a TensorFlow formatted dataset outputs a `RaggedTensor` instead of a single tensor: + +```py +>>> from datasets import Dataset +>>> data = [[[1, 2],[3]],[[4, 5, 6],[7, 8]]] # varying shape +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("torch") +>>> ds[0] +{'data': } +``` + +However this logic often requires slow shape comparisons and data copies. +To avoid this, you must explicitly use the [`Array`] feature type and specify the shape of your tensors: + +```py +>>> from datasets import Dataset, Features, Array2D +>>> data = [[[1, 2],[3, 4]],[[5, 6],[7, 8]]] +>>> features = Features({"data": Array2D(shape=(2, 2), dtype='int32')}) +>>> ds = Dataset.from_dict({"data": data}, features=features) +>>> ds = ds.with_format("tf") +>>> ds[0] +{'data': } +>>> ds[:2] +{'data': } +``` + + +### Other feature types + +[`ClassLabel`] data are properly converted to tensors: + +```py +>>> from datasets import Dataset, Features, ClassLabel +>>> labels = [0, 0, 1] +>>> features = Features({"label": ClassLabel(names=["negative", "positive"])}) +>>> ds = Dataset.from_dict({"label": labels}, features=features) +>>> ds = ds.with_format("tf") +>>> ds[:3] +{'label': } +``` + +Strings and binary objects are also supported: + +```py +>>> from datasets import Dataset, Features +>>> text = ["foo", "bar"] +>>> data = [0, 1] +>>> ds = Dataset.from_dict({"text": text, "data": data}) +>>> ds = ds.with_format("tf") +>>> ds[:2] +{'text': , + 'data': } +``` + +You can also explicitly format certain columns and leave the other columns unformatted: + +```py +>>> ds = ds.with_format("tf", columns=["data"], output_all_columns=True) +>>> ds[:2] +{'data': , + 'text': ['foo', 'bar']} +``` + +String and binary objects are unchanged, since PyTorch only supports numbers. + +The [`Image`] and [`Audio`] feature types are also supported. + +> [!TIP] +> To use the [`Image`] feature type, you'll need to install the `vision` extra as +> `pip install datasets[vision]`. + +```py +>>> from datasets import Dataset, Features, Audio, Image +>>> images = ["path/to/image.png"] * 10 +>>> features = Features({"image": Image()}) +>>> ds = Dataset.from_dict({"image": images}, features=features) +>>> ds = ds.with_format("tf") +>>> ds[0] +{'image': } +>>> ds[:2] +{'image': } +``` + +> [!TIP] +> To use the [`Audio`] feature type, you'll need to install the `audio` extra as +> `pip install datasets[audio]`. + +```py +>>> from datasets import Dataset, Features, Audio, Image +>>> audio = ["path/to/audio.wav"] * 10 +>>> features = Features({"audio": Audio()}) +>>> ds = Dataset.from_dict({"audio": audio}, features=features) +>>> ds = ds.with_format("tf") +>>> ds[0]["audio"]["array"] + +>>> ds[0]["audio"]["sampling_rate"] + +``` + +## Data loading + +Although you can load individual samples and batches just by indexing into your dataset, this won't work if you want +to use Keras methods like `fit()` and `predict()`. You could write a generator function that shuffles and loads batches +from your dataset and `fit()` on that, but that sounds like a lot of unnecessary work. Instead, if you want to stream +data from your dataset on-the-fly, we recommend converting your dataset to a `tf.data.Dataset` using the +`to_tf_dataset()` method. + +The `tf.data.Dataset` class covers a wide range of use-cases - it is often created from Tensors in memory, or using a load function to read files on disc +or external storage. The dataset can be transformed arbitrarily with the `map()` method, or methods like `batch()` +and `shuffle()` can be used to create a dataset that's ready for training. These methods do not modify the stored data +in any way - instead, the methods build a data pipeline graph that will be executed when the dataset is iterated over, +usually during model training or inference. This is different from the `map()` method of Hugging Face `Dataset` objects, +which runs the map function immediately and saves the new or changed columns. + +Since the entire data preprocessing pipeline can be compiled in a `tf.data.Dataset`, this approach allows for massively +parallel, asynchronous data loading and training. However, the requirement for graph compilation can be a limitation, +particularly for Hugging Face tokenizers, which are usually not (yet!) compilable as part of a TF graph. As a result, +we usually advise pre-processing the dataset as a Hugging Face dataset, where arbitrary Python functions can be +used, and then converting to `tf.data.Dataset` afterwards using `to_tf_dataset()` to get a batched dataset ready for +training. To see examples of this approach, please see the [examples](https://github.com/huggingface/transformers/tree/main/examples) or [notebooks](https://huggingface.co/docs/transformers/notebooks) for `transformers`. + +### Using `to_tf_dataset()` + +Using `to_tf_dataset()` is straightforward. Once your dataset is preprocessed and ready, simply call it like so: + +```py +>>> from datasets import Dataset +>>> data = {"inputs": [[1, 2],[3, 4]], "labels": [0, 1]} +>>> ds = Dataset.from_dict(data) +>>> tf_ds = ds.to_tf_dataset( + columns=["inputs"], + label_cols=["labels"], + batch_size=2, + shuffle=True + ) +``` + +The returned `tf_ds` object here is now fully ready to train on, and can be passed directly to `model.fit()`. Note +that you set the batch size when creating the dataset, and so you don't need to specify it when calling `fit()`: + +```py +>>> model.fit(tf_ds, epochs=2) +``` + +For a full description of the arguments, please see the [`~Dataset.to_tf_dataset`] documentation. In many cases, +you will also need to add a `collate_fn` to your call. This is a function that takes multiple elements of the dataset +and combines them into a single batch. When all elements have the same length, the built-in default collator will +suffice, but for more complex tasks a custom collator may be necessary. In particular, many tasks have samples +with varying sequence lengths which will require a [data collator](https://huggingface.co/docs/transformers/main/en/main_classes/data_collator) that can pad batches correctly. You can see examples +of this in the `transformers` NLP [examples](https://github.com/huggingface/transformers/tree/main/examples) and +[notebooks](https://huggingface.co/docs/transformers/notebooks), where variable sequence lengths are very common. + +If you find that loading with `to_tf_dataset` is slow, you can also use the `num_workers` argument. This spins +up multiple subprocesses to load data in parallel. This feature is recent and still somewhat experimental - please file +an issue if you encounter any bugs while using it! + +### When to use to_tf_dataset + +The astute reader may have noticed at this point that we have offered two approaches to achieve the same goal - if you +want to pass your dataset to a TensorFlow model, you can either convert the dataset to a `Tensor` or `dict` of `Tensors` +using `.with_format('tf')`, or you can convert the dataset to a `tf.data.Dataset` with `to_tf_dataset()`. Either of these +can be passed to `model.fit()`, so which should you choose? + +The key thing to recognize is that when you convert the whole dataset to `Tensor`s, it is static and fully loaded into +RAM. This is simple and convenient, but if any of the following apply, you should probably use `to_tf_dataset()` +instead: + +- Your dataset is too large to fit in RAM. `to_tf_dataset()` streams only one batch at a time, so even very large + datasets can be handled with this method. +- You want to apply random transformations using `dataset.with_transform()` or the `collate_fn`. This is + common in several modalities, such as image augmentations when training vision models, or random masking when training + masked language models. Using `to_tf_dataset()` will apply those transformations + at the moment when a batch is loaded, which means the same samples will get different augmentations each time + they are loaded. This is usually what you want. +- Your data has a variable dimension, such as input texts in NLP that consist of varying + numbers of tokens. When you create a batch with samples with a variable dimension, the standard solution is to + pad the shorter samples to the length of the longest one. When you stream samples from a dataset with `to_tf_dataset`, + you can apply this padding to each batch via your `collate_fn`. However, if you want to convert + such a dataset to dense `Tensor`s, then you will have to pad samples to the length of the longest sample in *the + entire dataset!* This can result in huge amounts of padding, which wastes memory and reduces your model's speed. + +### Caveats and limitations + +Right now, `to_tf_dataset()` always returns a batched dataset - we will add support for unbatched datasets soon! diff --git a/docs/source/video_dataset.mdx b/docs/source/video_dataset.mdx new file mode 100644 index 0000000..cb0c704 --- /dev/null +++ b/docs/source/video_dataset.mdx @@ -0,0 +1,292 @@ +# Create a video dataset + +This guide will show you how to create a video dataset with `VideoFolder` and some metadata. This is a no-code solution for quickly creating a video dataset with several thousand videos. + +> [!TIP] +> You can control access to your dataset by requiring users to share their contact information first. Check out the [Gated datasets](https://huggingface.co/docs/hub/datasets-gated) guide for more information about how to enable this feature on the Hub. + +## VideoFolder + +The `VideoFolder` is a dataset builder designed to quickly load a video dataset with several thousand videos without requiring you to write any code. + +> [!TIP] +> 💡 Take a look at the [Split pattern hierarchy](repository_structure#split-pattern-hierarchy) to learn more about how `VideoFolder` creates dataset splits based on your dataset repository structure. + +`VideoFolder` automatically infers the class labels of your dataset based on the directory name. Store your dataset in a directory structure like: + +``` +folder/train/dog/golden_retriever.mp4 +folder/train/dog/german_shepherd.mp4 +folder/train/dog/chihuahua.mp4 + +folder/train/cat/maine_coon.mp4 +folder/train/cat/bengal.mp4 +folder/train/cat/birman.mp4 +``` + +If the dataset follows the `VideoFolder` structure, then you can load it directly with [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("path/to/folder") +``` + +This is equivalent to passing `videofolder` manually in [`load_dataset`] and the directory in `data_dir`: + +```py +>>> dataset = load_dataset("videofolder", data_dir="/path/to/folder") +``` + +You can also use `videofolder` to load datasets involving multiple splits. To do so, your dataset directory should have the following structure: + +``` +folder/train/dog/golden_retriever.mp4 +folder/train/cat/maine_coon.mp4 +folder/test/dog/german_shepherd.mp4 +folder/test/cat/bengal.mp4 +``` + +> [!WARNING] +> If all video files are contained in a single directory or if they are not on the same level of directory structure, `label` column won't be added automatically. If you need it, set `drop_labels=False` explicitly. + + +If there is additional information you'd like to include about your dataset, like text captions or bounding boxes, add it as a `metadata.csv` file in your folder. This lets you quickly create datasets for different computer vision tasks like text captioning or object detection. You can also use a JSONL file `metadata.jsonl` or a Parquet file `metadata.parquet`. + +``` +folder/train/metadata.csv +folder/train/0001.mp4 +folder/train/0002.mp4 +folder/train/0003.mp4 +``` + +Your `metadata.csv` file must have a `file_name` or `*_file_name` field which links video files with their metadata: + +```csv +file_name,additional_feature +0001.mp4,This is a first value of a text feature you added to your videos +0002.mp4,This is a second value of a text feature you added to your videos +0003.mp4,This is a third value of a text feature you added to your videos +``` + +or using `metadata.jsonl`: + +```jsonl +{"file_name": "0001.mp4", "additional_feature": "This is a first value of a text feature you added to your videos"} +{"file_name": "0002.mp4", "additional_feature": "This is a second value of a text feature you added to your videos"} +{"file_name": "0003.mp4", "additional_feature": "This is a third value of a text feature you added to your videos"} +``` + +Here the `file_name` must be the name of the video file next to the metadata file. More generally, it must be the relative path from the directory containing the metadata to the video file. + +It's possible to point to more than one video in each row in your dataset, for example if both your input and output are videos: + +```jsonl +{"input_file_name": "0001.mp4", "output_file_name": "0001_output.mp4"} +{"input_file_name": "0002.mp4", "output_file_name": "0002_output.mp4"} +{"input_file_name": "0003.mp4", "output_file_name": "0003_output.mp4"} +``` + +You can also define lists of videos. In that case you need to name the field `file_names` or `*_file_names`. Here is an example: + +```jsonl +{"videos_file_names": ["0001_left.mp4", "0001_right.mp4"], "label": "moving_up"} +{"videos_file_names": ["0002_left.mp4", "0002_right.mp4"], "label": "moving_down"} +{"videos_file_names": ["0003_left.mp4", "0003_right.mp4"], "label": "moving_right"} +``` + +### Video captioning + +Video captioning datasets have text describing a video. An example `metadata.csv` may look like: + +```csv +file_name,text +0001.mp4,This is a golden retriever playing with a ball +0002.mp4,A german shepherd +0003.mp4,One chihuahua +``` + +Load the dataset with `VideoFolder`, and it will create a `text` column for the video captions: + +```py +>>> dataset = load_dataset("videofolder", data_dir="/path/to/folder", split="train") +>>> dataset[0]["text"] +"This is a golden retriever playing with a ball" +``` + +### Upload dataset to the Hub + +Once you've created a dataset, you can share it to the using `huggingface_hub` for example. Make sure you have the [huggingface_hub](https://huggingface.co/docs/huggingface_hub/index) library installed and you're logged in to your Hugging Face account (see the [Upload with Python tutorial](upload_dataset#upload-with-python) for more details). + +Upload your dataset with `huggingface_hub.HfApi.upload_folder`: + +```py +from huggingface_hub import HfApi +api = HfApi() + +api.upload_folder( + folder_path="/path/to/local/dataset", + repo_id="username/my-cool-dataset", + repo_type="dataset", +) +``` + +## WebDataset + +The [WebDataset](https://github.com/webdataset/webdataset) format is based on TAR archives and is suitable for big video datasets. +Indeed you can group your videos in TAR archives (e.g. 1GB of videos per TAR archive) and have thousands of TAR archives: + +``` +folder/train/00000.tar +folder/train/00001.tar +folder/train/00002.tar +... +``` + +In the archives, each example is made of files sharing the same prefix: + +``` +e39871fd9fd74f55.mp4 +e39871fd9fd74f55.json +f18b91585c4d3f3e.mp4 +f18b91585c4d3f3e.json +ede6e66b2fb59aab.mp4 +ede6e66b2fb59aab.json +ed600d57fcee4f94.mp4 +ed600d57fcee4f94.json +... +``` + +You can put your videos labels/captions/features using JSON or text files for example. + +For more details on the WebDataset format and the python library, please check the [WebDataset documentation](https://webdataset.github.io/webdataset). + +Load your WebDataset and it will create on column per file suffix (here "mp4" and "json"): + +```python +>>> from datasets import load_dataset + +>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", split="train") +>>> dataset[0]["json"] +{"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]} +``` + +## Lance + +[Lance](https://lance.org) is an open multimodal lakehouse table format. Lance tables can natively store not only text and scalar values, +but also large binary objects (blobs) such as images, audio, and video alongside your tabular data. + +Lance provides a [blob API](https://lance.org/guide/blob/) that makes it convenient to store and retrieve large blobs in Lance datasets. +The following example shows how to efficiently browse metadata without loading the heavier video blobs, then fetch the relevant video +blobs on demand. + +Here's a representative view of what a Lance table storing videos might look like (the `video_blob` column uses Lance's blob encoding): + +```text ++------------------------------------------+-----------------+-----+------------------------------------------+ +| caption | aesthetic_score | ... | video_blob | ++------------------------------------------+-----------------+-----+------------------------------------------+ +| "a breathtaking view of a mounta..." | 5.2401 | ... | {position: 0, size: 4873879} | +| "a captivating view of the sun, b..." | 5.2401 | ... | {position: 4873920, size: 3370571} | ++------------------------------------------+-----------------+-----+------------------------------------------+ +``` + +### Write a Lance dataset from raw video files + +Starting from raw video files on disk plus associated metadata (for example, captions and scores), you can write a self-contained Lance dataset +to a local `*.lance` directory (a Lance dataset is a directory on disk, and it's common to name it with a `.lance` suffix): + +```py +import lance +import pyarrow as pa + +import urllib.request + +schema = pa.schema( + [ + pa.field("caption", pa.utf8()), + pa.field("aesthetic_score", pa.float64()), + pa.field( + "video_blob", + pa.large_binary(), + metadata={"lance-encoding:blob": "true"}, + ), + ] +) + +# Provide video files alongside metadata +rows = [ + { + "video_path": "/path/to/videos/0001.mp4", + "caption": "a breathtaking view of a mountainous landscape ...", + "aesthetic_score": 5.240138053894043, + }, + { + "video_path": "0002.mp4", + "caption": "a captivating view of the sun, bathed in hues ...", + "aesthetic_score": 5.240137100219727, + }, +] + +video_bytes = [] +for r in rows: + with open(r["video_path"], "rb") as f: + video_bytes.append(f.read()) + +table = pa.table( + { + "caption": [r["caption"] for r in rows], + "aesthetic_score": [r["aesthetic_score"] for r in rows], + "video_blob": video_bytes, + }, + schema=schema, +) + +ds = lance.write_dataset( + table, + "./videos.lance", + schema=schema, + mode="create", +) +``` + +This stores your metadata and video bytes together inside `videos.lance/`, so you can move/copy a single directory without having to keep +separate `*.mp4` files in sync. + +Here's a representative view of what a Lance table storing videos might look like (the `video_blob` column contains data that's +stored natively as blobs inside the Lance dataset): + +```text ++------------------------------------------+-----------------+-----+------------------------------------------+ +| caption | aesthetic_score | ... | video_blob | ++------------------------------------------+-----------------+-----+------------------------------------------+ +| "a breathtaking view of a mounta..." | 5.2401 | ... | {position: 0, size: 4873879} | +| "a captivating view of the sun, b..." | 5.2401 | ... | {position: 4873920, size: 3370571} | ++------------------------------------------+-----------------+-----+------------------------------------------+ +``` + +You can upload the resulting `videos.lance/` directory to the Hub (for example with `huggingface_hub.HfApi.upload_folder`) and share it as a +dataset repository, keeping the metadata and videos together as a single artifact. + +> [!TIP] +> Lance datasets scale to very large sizes (terabytes and beyond) since the data is stored in a columnar format on disk. +> See the [blob API](https://lance.org/guide/blob/) guide for the latest information on best practices for storing and retrieving +> large blobs in Lance. + +When writing large datasets, it's typically best to limit the size of each individual `*.lance` file to a few gigabytest at most. +Simply gather the data via an iterator and specify the `max_bytes_per_file` parameter when writing the dataset: + +```python +MAX_BYTES_PER_FILE = 5 * 1024 * 1024 * 1024 # ~5 GB per file + +# Write as Lance dataset with file size limits for each *.lance file +ds = lance.write_dataset( + table, + "./videos.lance", + schema=schema, + mode="create", + max_bytes_per_file=MAX_BYTES_PER_FILE, +) +``` + +For more details on working with Lance datasets, see the [Lance documentation](https://lance.org). \ No newline at end of file diff --git a/docs/source/video_load.mdx b/docs/source/video_load.mdx new file mode 100644 index 0000000..d9c2e9a --- /dev/null +++ b/docs/source/video_load.mdx @@ -0,0 +1,218 @@ +# Load video data + +> [!WARNING] +> Video support is experimental and is subject to change. + +Video datasets have [`Video`] type columns, which contain `torchcodec` objects. + +> [!TIP] +> To work with video datasets, you need to have the `torchcodec` and `ffmpeg` packages installed. Check out the [installation](https://github.com/meta-pytorch/torchcodec#installing-torchcodec) guide to learn how to install them. + +When you load a video dataset and call the video column, the videos are decoded as `torchcodec` Videos: + +```py +>>> from datasets import load_dataset, Video + +>>> dataset = load_dataset("path/to/video/folder", split="train") +>>> dataset[0]["video"] + +``` + +> [!WARNING] +> Index into a video dataset using the row index first and then the `video` column - `dataset[0]["video"]` - to avoid creating all the video objects in the dataset. Otherwise, this can be a slow and time-consuming process if you have a large dataset. + +For a guide on how to load any type of dataset, take a look at the general loading guide. + +## Read frames + +Access frames directly from a video using the `VideoReader` using `next()`: + +```python +>>> video = dataset[0]["video"] +>>> first_frame = video.get_frame_at(0) +>>> first_frame.data.shape +(3, 240, 320) +>>> first_frame.pts_seconds # timestamp +0.0 +``` + +To get multiple frames at once, you can call `.get_frames_in_range(start: int, stop: int, step: int)`. This will return a frame batch. +This is the efficient way to obtain a long list of frames refer to the [torchcodec docs](https://docs.pytorch.org/torchcodec/stable/generated/torchcodec.decoders.VideoDecoder.html) to see more functions for effiently accessing the data: + +```python +>>> import torch +>>> frames = video.get_frames_in_range(0, 6, 1) +>>> frames.data.shape +torch.Size([5, 3, 240, 320]) +``` + +There is also `.get_frames_played_in_range(start_seconds: float, stop_seconds: float)` to access all frames played whithin a certain time range. + +```python +>>> frames = video.get_frames_played_in_range(.5, 1.2) +>>> frames.data.shape +torch.Size([42, 3, 240, 320]) +``` + +## Local files + +You can load a dataset from the video path. Use the [`~Dataset.cast_column`] function to accept a column of video file paths, and decode it into a `torchcodec` video with the [`Video`] feature: + +```py +>>> from datasets import Dataset, Video + +>>> dataset = Dataset.from_dict({"video": ["path/to/video_1", "path/to/video_2", ..., "path/to/video_n"]}).cast_column("video", Video()) +>>> dataset[0]["video"] + +``` + +If you only want to load the underlying path to the video dataset without decoding the video object, set `decode=False` in the [`Video`] feature: + +```py +>>> dataset = dataset.cast_column("video", Video(decode=False)) +>>> dataset[0]["video"] +{'bytes': None, + 'path': 'path/to/video/folder/video0.mp4'} +``` + +## VideoFolder + +You can also load a dataset with an `VideoFolder` dataset builder which does not require writing a custom dataloader. This makes `VideoFolder` ideal for quickly creating and loading video datasets with several thousand videos for different vision tasks. Your video dataset structure should look like this: + +``` +folder/train/dog/golden_retriever.mp4 +folder/train/dog/german_shepherd.mp4 +folder/train/dog/chihuahua.mp4 + +folder/train/cat/maine_coon.mp4 +folder/train/cat/bengal.mp4 +folder/train/cat/birman.mp4 +``` + +If the dataset follows the `VideoFolder` structure, then you can load it directly with [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("username/dataset_name") +>>> # OR locally: +>>> dataset = load_dataset("/path/to/folder") +``` + +For local datasets, this is equivalent to passing `videofolder` manually in [`load_dataset`] and the directory in `data_dir`: + +```py +>>> dataset = load_dataset("videofolder", data_dir="/path/to/folder") +``` + +Then you can access the videos as `torchcodec.decoders._video_decoder.VideoDecoder` objects: + +``` +>>> dataset["train"][0] +{"video": , "label": 0} + +>>> dataset["train"][-1] +{"video": , "label": 1} +``` + +To ignore the information in the metadata file, set `drop_metadata=True` in [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True) +``` + +If you don't have a metadata file, `VideoFolder` automatically infers the label name from the directory name. +If you want to drop automatically created labels, set `drop_labels=True`. +In this case, your dataset will only contain a video column: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True) +``` + +Finally the `filters` argument lets you load only a subset of the dataset, based on a condition on the label or the metadata. This is especially useful if the metadata is in Parquet format, since this format enables fast filtering. It is also recommended to use this argument with `streaming=True`, because by default the dataset is fully downloaded before filtering. + +```python +>>> filters = [("label", "=", 0)] +>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters) +``` + +> [!TIP] +> For more information about creating your own `VideoFolder` dataset, take a look at the [Create a video dataset](./video_dataset) guide. + +## WebDataset + +The [WebDataset](https://github.com/webdataset/webdataset) format is based on a folder of TAR archives and is suitable for big video datasets. +Because of their size, WebDatasets are generally loaded in streaming mode (using `streaming=True`). + +You can load a WebDataset like this: + +```python +>>> from datasets import load_dataset + +>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", streaming=True) +``` + +## Lance + +[Lance](https://lance.org) is an open multimodal lakehouse table format. Lance tables can natively store not only text and scalar values, +but also large binary objects (blobs) such as images, audio, and video alongside your tabular data. Inside a Lance table, large +blobs like videos are stored as bytes with offsets (see the [blob guide](https://lance.org/guide/blob/) for more details), so this +makes it easy to scan and filter metadata without loading heavier video blobs, and then fetch only the specific video blobs you need on demand. + +Also, because Lance is a columnar columnar format, you can project and filter only the metadata columns you care about +(without fetching large video files), and then retrieve a small subset of rows (including the video) when you're ready. This +keeps your metadata and videos in one place, without needing a separate file store or an external index. + +```python +import lance + +ds = lance.dataset("hf://datasets/lance-format/openvid-lance/data/train.lance") + +# 1. Browse metadata without loading video blobs. +metadata = ds.scanner( + columns=["caption", "aesthetic_score"], + filter="aesthetic_score >= 4.5", + limit=2, +).to_table().to_pylist() + +# 2. Fetch a single video blob by row index. +selected_index = 0 +blob_file = ds.take_blobs("video_blob", ids=[selected_index])[0] +with open("video_0.mp4", "wb") as f: + f.write(blob_file.read()) +``` + +In this example, the video is stored natively (as its encoded bytes) in the Lance table, so you can write it directly to an `mp4` file on your local +filesystem without any extra conversion step. + +For more details on working with Lance datasets, see the [Lance documentation](https://lance.org). + +## Video decoding + +By default, videos are decoded sequentially as torchcodec `VideoDecoders` when you iterate on a dataset. +It sequentially decodes the metadata of the videos, and doesn't read the video frames until you access them. + +However it is possible to speed up the dataset significantly using multithreaded decoding: + +```python +>>> import os +>>> num_threads = num_threads = min(32, (os.cpu_count() or 1) + 4) +>>> dataset = dataset.decode(num_threads=num_threads) +>>> for example in dataset: # up to 20 times faster ! +... ... +``` + +You can enable multithreading using `num_threads`. This is especially useful to speed up remote data streaming. +However it can be slower than `num_threads=0` for local data on fast disks. + +If you are not interested in the videos decoded as torchcodec `VideoDecoders` and would like to access the path/bytes instead, you can disable decoding: + +```python +>>> dataset = dataset.decode(False) +``` + +Note: [`IterableDataset.decode`] is only available for streaming datasets at the moment. diff --git a/notebooks/README.md b/notebooks/README.md new file mode 100644 index 0000000..14e9384 --- /dev/null +++ b/notebooks/README.md @@ -0,0 +1,33 @@ + + +# 🤗 Datasets Notebooks + +You can find here a list of the official notebooks provided by Hugging Face. + +Also, we would like to list here interesting content created by the community. +If you wrote some notebook(s) leveraging 🤗 Datasets and would like it to be listed here, please open a +Pull Request so it can be included under the Community notebooks. + +## Hugging Face's notebooks 🤗 + +### Documentation notebooks + +You can open any page of the documentation as a notebook in Colab (there is a button directly on said pages) but they are also listed here if you need them: + +| Notebook | Description | | | +|:----------|:-------------|:-------------|------:| +| [Quickstart](https://github.com/huggingface/notebooks/blob/main/datasets_doc/en/quickstart.ipynb) | A quick presentation on integrating Datasets into a model training workflow |[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/huggingface/notebooks/blob/main/datasets_doc/en/quickstart.ipynb)| [![Open in AWS Studio](https://studiolab.sagemaker.aws/studiolab.svg)](https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/main/datasets_doc/en/quickstart.ipynb)| diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..511a9e0 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,27 @@ +[tool.ruff] +line-length = 119 + +[tool.ruff.lint] +# Ignored rules: +# "E501" -> line length violation +# "F821" -> undefined named in type annotation (e.g. Literal["something"]) +# "C901" -> `function_name` is too complex +ignore = ["E501", "F821", "C901"] +select = ["C", "E", "F", "I", "W"] + +[tool.ruff.lint.isort] +lines-after-imports = 2 +known-first-party = ["datasets"] + +[tool.ruff.lint.per-file-ignores] +"__init__.py" = ["F401", "F403", "F405"] + +[tool.pytest.ini_options] +# Test fails if a FutureWarning is thrown by `huggingface_hub` +filterwarnings = [ + "error::FutureWarning:huggingface_hub*", +] +markers = [ + "unit: unit test", + "integration: integration test", +] diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..4ce18d3 --- /dev/null +++ b/setup.py @@ -0,0 +1,283 @@ +# Lint as: python3 +"""HuggingFace/Datasets is an open library of datasets. + +Note: + + VERSION needs to be formatted following the MAJOR.MINOR.PATCH convention + +Simple check list for release from AllenNLP repo: https://github.com/allenai/allennlp/blob/master/setup.py + +Steps to make a release: + +0. Prerequisites: + - Dependencies: + - twine: `pip install twine` + - Create an account in (and join the 'datasets' project): + - PyPI: https://pypi.org/ + - Test PyPI: https://test.pypi.org/ + - Don't break `transformers`: run the `transformers` CI using the `main` branch and make sure it's green. + - In `transformers`, use `datasets @ git+https://github.com/huggingface/datasets@main#egg=datasets` + Add a step to install `datasets@main` after `save_cache` in .circleci/create_circleci_config.py: + ``` + {"run": {"name": "Install `datasets@main`", "command": 'pip uninstall datasets -y && pip install "datasets @ git+https://github.com/huggingface/datasets@main#egg=datasets"'}} + ``` + - and then run the CI + +1. Create the release branch from main branch: + ``` + git checkout main + git pull upstream main + git checkout -b release-VERSION + ``` + +2. Change the version to the release VERSION in: + - __init__.py + - setup.py + +3. Commit these changes, push and create a Pull Request: + ``` + git add -u + git commit -m "Release: VERSION" + git push upstream release-VERSION + ``` + - Go to: https://github.com/huggingface/datasets/pull/new/release-VERSION + - Create pull request + +4. From your local release branch, build both the sources and the wheel. Do not change anything in setup.py between + creating the wheel and the source distribution (obviously). + - First, delete any building directories that may exist from previous builds: + - build + - dist + - From the top level directory, build the wheel and the sources: + ``` + python setup.py bdist_wheel + python setup.py sdist + ``` + - You should now have a /dist directory with both .whl and .tar.gz source versions. + +5. Check that everything looks correct by uploading the package to the test PyPI server: + ``` + twine upload dist/* -r testpypi + ``` + Check that you can install it in a virtualenv/notebook by running: + ``` + !pip install -U --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ datasets + ``` + +6. Upload the final version to the actual PyPI: + ``` + twine upload dist/* -r pypi + ``` + +7. Make the release on GitHub once everything is looking hunky-dory: + - Merge the release Pull Request + - Create a new release: https://github.com/huggingface/datasets/releases/new + - Choose a tag: Introduce the new VERSION as tag, that will be created when you publish the release + - Create new tag VERSION on publish + - Release title: Introduce the new VERSION as well + - Describe the release + - Use "Generate release notes" button for automatic generation + - Publish release + +8. Set the dev version + - Create the dev-version branch from the main branch: + ``` + git checkout main + git pull upstream main + git branch -D dev-version + git checkout -b dev-version + ``` + - Change the version to X.X.X+1.dev0 (e.g. VERSION=1.18.3 -> 1.18.4.dev0) in: + - __init__.py + - setup.py + - Commit these changes, push and create a Pull Request: + ``` + git add -u + git commit -m "Set dev version" + git push upstream dev-version + ``` + - Go to: https://github.com/huggingface/datasets/pull/new/dev-version + - Create pull request + - Merge the dev version Pull Request +""" + +from setuptools import find_packages, setup + + +REQUIRED_PKGS = [ + # For file locking + "filelock", + # We use numpy>=1.17 to have np.random.Generator (Dataset shuffling) + "numpy>=1.17", + # Backend and serialization. + # Minimum 21.0.0 to support `use_content_defined_chunking` in ParquetWriter + "pyarrow>=21.0.0", + # For smart caching dataset processing + "dill>=0.3.0,<0.4.2", # tmp pin until dill has official support for determinism see https://github.com/uqfoundation/dill/issues/19 + # For performance gains with apache arrow + "pandas", + # for downloading datasets over HTTPS + "requests>=2.32.2", + "httpx<1.0.0", + # progress bars in downloads and data operations + "tqdm>=4.66.3", + # for fast hashing + "xxhash", + # for better multiprocessing + "multiprocess<0.70.20", # to align with dill<0.3.9 (see above) + # to save datasets locally or on any filesystem + # minimum 2023.1.0 to support protocol=kwargs in fsspec's `open`, `get_fs_token_paths`, etc.: see https://github.com/fsspec/filesystem_spec/pull/1143 + "fsspec[http]>=2023.1.0,<=2026.4.0", + # To get datasets from the Datasets Hub on huggingface.co + "huggingface-hub>=0.25.0,<2.0", + # Utilities from PyPA to e.g., compare versions + "packaging", + # To parse YAML metadata from dataset cards + "pyyaml>=5.1", +] + +AUDIO_REQUIRE = [ + "torchcodec>=0.6.0", + "torch>=2.8.0", +] + +VISION_REQUIRE = [ + "Pillow>=9.4.0", # When PIL.Image.ExifTags was introduced +] + +MESH_REQUIRE = [ + "trimesh>=4.10.0", +] + +BENCHMARKS_REQUIRE = [ + "tensorflow==2.12.0", + "torch==2.0.1", + "transformers==4.30.1", +] + +TESTS_REQUIRE = [ + # fix pip install issues for windows + "numba>=0.56.4; python_version < '3.14'", # to get recent versions of llvmlite for windows ci, not available on 3.14 + # test dependencies + "absl-py", + "decorator", + "joblib<1.3.0", # joblibspark doesn't support recent joblib versions + "joblibspark; python_version < '3.14'", # python 3.14 gives AttributeError: module 'ast' has no attribute 'Num' + "pytest", + "pytest-datadir", + "pytest-xdist", + # optional dependencies + "aiohttp", + "elasticsearch>=7.17.12,<8.0.0", # 8.0 asks users to provide hosts or cloud_id when instantiating ElasticSearch(); 7.9.1 has legacy numpy.float_ which was fixed in https://github.com/elastic/elasticsearch-py/pull/2551. + "faiss-cpu>=1.8.0.post1", # Pins numpy < 2 + "h5py", + "pylance", + "pyiceberg[sql-sqlite,pyarrow]", + "jax>=0.3.14; sys_platform != 'win32'", + "jaxlib>=0.3.14; sys_platform != 'win32'", + "lz4; python_version < '3.14'", # python 3.14 gives ImportError: cannot import name '_compression' from partially initialized module 'lz4.frame + "moto[server]", + "pyspark>=3.4", # https://issues.apache.org/jira/browse/SPARK-40991 fixed in 3.4.0 + "py7zr", + "rarfile>=4.0", + "sqlalchemy", + "protobuf<4.0.0", # 4.0.0 breaks compatibility with tensorflow<2.12 + "tensorflow>=2.6.0; python_version<'3.10' and sys_platform != 'win32'", # numpy-2 is not supported for Python < 3.10 + "tensorflow>=2.16.0; python_version>='3.10' and sys_platform != 'win32' and python_version < '3.14'", # Pins numpy < 2 + "tiktoken", + "torch>=2.8.0", + "torchdata", + "transformers>=4.42.0", # Pins numpy < 2 + "zstandard", + "polars[timezone]>=0.20.0", + "Pillow>=9.4.0", # When PIL.Image.ExifTags was introduced + "torchcodec>=0.7.0; python_version < '3.14'", # minium version to get windows support, torchcodec doesn't have wheels for 3.14 yet + "nibabel>=5.3.1", + "trimesh>=4.10.0", + "teich==0.1.5", +] + +NUMPY2_INCOMPATIBLE_LIBRARIES = [ + "faiss-cpu", + "tensorflow", +] +TESTS_NUMPY2_REQUIRE = [ + library for library in TESTS_REQUIRE if library.partition(">")[0] not in NUMPY2_INCOMPATIBLE_LIBRARIES +] + +QUALITY_REQUIRE = ["ruff>=0.3.0"] + +DOCS_REQUIRE = [ + # Following dependencies are required for the Python reference to be built properly + "transformers", + "torch", + "tensorflow>=2.6.0", +] + +PDFS_REQUIRE = ["pdfplumber>=0.11.4"] + +NIBABEL_REQUIRE = ["nibabel>=5.3.2", "ipyniivue==2.4.2"] + +ICEBERG_REQUIRE = ["pyiceberg>=0.7.0"] + +EXTRAS_REQUIRE = { + "audio": AUDIO_REQUIRE, + "vision": VISION_REQUIRE, + "mesh": MESH_REQUIRE, + "tensorflow": [ + "tensorflow>=2.6.0", + ], + "tensorflow_gpu": ["tensorflow>=2.6.0"], + "torch": ["torch"], + "jax": ["jax>=0.3.14", "jaxlib>=0.3.14"], + "streaming": [], # for backward compatibility + "dev": TESTS_REQUIRE + QUALITY_REQUIRE + DOCS_REQUIRE, + "tests": TESTS_REQUIRE, + "tests_numpy2": TESTS_NUMPY2_REQUIRE, + "quality": QUALITY_REQUIRE, + "benchmarks": BENCHMARKS_REQUIRE, + "docs": DOCS_REQUIRE, + "pdfs": PDFS_REQUIRE, + "nibabel": NIBABEL_REQUIRE, + "iceberg": ICEBERG_REQUIRE, +} + +setup( + name="datasets", + version="5.0.1.dev0", # expected format is one of x.y.z.dev0, or x.y.z.rc1 or x.y.z (no to dashes, yes to dots) + description="HuggingFace community-driven open-source library of datasets", + long_description=open("README.md", encoding="utf-8").read(), + long_description_content_type="text/markdown", + author="HuggingFace Inc.", + author_email="thomas@huggingface.co", + url="https://github.com/huggingface/datasets", + download_url="https://github.com/huggingface/datasets/tags", + license="Apache 2.0", + package_dir={"": "src"}, + packages=find_packages("src"), + package_data={ + "datasets": ["py.typed"], + "datasets.utils.resources": ["*.json", "*.yaml", "*.tsv"], + }, + entry_points={"console_scripts": ["datasets-cli=datasets.commands.datasets_cli:main"]}, + python_requires=">=3.10.0", + install_requires=REQUIRED_PKGS, + extras_require=EXTRAS_REQUIRE, + classifiers=[ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "Intended Audience :: Education", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: Apache Software License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + ], + keywords="datasets machine learning datasets", + zip_safe=False, # Required for mypy to find the py.typed file +) diff --git a/src/datasets/__init__.py b/src/datasets/__init__.py new file mode 100644 index 0000000..5f791e2 --- /dev/null +++ b/src/datasets/__init__.py @@ -0,0 +1,47 @@ +# Copyright 2020 The HuggingFace Datasets Authors and the TensorFlow Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +__version__ = "5.0.1.dev0" + +from .arrow_dataset import Column, Dataset +from .arrow_reader import ReadInstruction +from .builder import ArrowBasedBuilder, BuilderConfig, DatasetBuilder, GeneratorBasedBuilder +from .combine import concatenate_datasets, interleave_datasets +from .dataset_dict import DatasetDict, IterableDatasetDict +from .download import * +from .features import * +from .fingerprint import disable_caching, enable_caching, is_caching_enabled +from .info import DatasetInfo +from .inspect import ( + get_dataset_config_info, + get_dataset_config_names, + get_dataset_default_config_name, + get_dataset_infos, + get_dataset_split_names, +) +from .iterable_dataset import IterableColumn, IterableDataset +from .load import load_dataset, load_dataset_builder, load_from_disk +from .splits import ( + NamedSplit, + NamedSplitAll, + Split, + SplitBase, + SplitDict, + SplitGenerator, + SplitInfo, + SubSplitInfo, + percent, +) +from .utils import * +from .utils import logging diff --git a/src/datasets/arrow_dataset.py b/src/datasets/arrow_dataset.py new file mode 100644 index 0000000..59451a6 --- /dev/null +++ b/src/datasets/arrow_dataset.py @@ -0,0 +1,7391 @@ +# Copyright 2020 The HuggingFace Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""Simple Dataset wrapping an Arrow Table.""" + +import asyncio +import contextlib +import copy +import glob +import inspect +import itertools +import json +import math +import os +import posixpath +import random +import re +import shutil +import string +import sys +import tempfile +import time +import warnings +import weakref +from collections import Counter, defaultdict +from collections.abc import Iterable, Iterator, Mapping +from collections.abc import Sequence as Sequence_ +from copy import deepcopy +from functools import partial, wraps +from math import ceil, floor +from pathlib import Path +from random import sample +from typing import ( + TYPE_CHECKING, + Any, + BinaryIO, + Callable, + Optional, + Union, + overload, +) + +import fsspec +import multiprocess as mp +import numpy as np +import pandas as pd +import pyarrow as pa +import pyarrow.compute as pc +import pyarrow.dataset as pds +from fsspec.core import url_to_fs +from fsspec.implementations.dirfs import DirFileSystem +from huggingface_hub import ( + CommitInfo, + CommitOperationAdd, + CommitOperationDelete, + DatasetCard, + DatasetCardData, + HfApi, + HfFileSystem, + HfFileSystemResolvedPath, +) +from huggingface_hub.utils import EntryNotFoundError, HfHubHTTPError, RepositoryNotFoundError +from packaging import version +from tqdm.contrib.concurrent import thread_map + +from . import __version__, config +from .arrow_reader import ArrowReader +from .arrow_writer import ArrowWriter, OptimizedTypedSequence +from .data_files import sanitize_patterns +from .download.streaming_download_manager import xgetsize +from .features import Audio, ClassLabel, Features, Image, List, Value, Video +from .features.features import ( + FeatureType, + _align_features, + _check_if_features_can_be_aligned, + _fix_for_backward_compatible_features, + generate_from_arrow_type, + pandas_types_mapper, + require_decoding, +) +from .filesystems import is_remote_filesystem +from .fingerprint import ( + fingerprint_transform, + format_kwargs_for_fingerprint, + format_transform_for_fingerprint, + generate_fingerprint, + generate_random_fingerprint, + get_temporary_cache_files_directory, + is_caching_enabled, + maybe_register_dataset_for_temp_dir_deletion, + update_fingerprint, + validate_fingerprint, +) +from .formatting import format_table, get_format_type_from_alias, get_formatter, query_table +from .formatting.formatting import LazyDict, _is_range_contiguous +from .info import DatasetInfo, DatasetInfosDict +from .naming import _split_re +from .search import IndexableMixin +from .splits import NamedSplit, Split, SplitDict, SplitInfo +from .table import ( + InMemoryTable, + MemoryMappedTable, + Table, + _batch_accumulate_arrow_table_by_columns, + _batch_arrow_table, + _memory_mapped_record_batch_reader_from_file, + cast_array_to_feature, + concat_tables, + embed_table_storage, + list_table_cache_files, + table_cast, + table_iter, + table_visitor, +) +from .utils import logging +from .utils import tqdm as hf_tqdm +from .utils.file_utils import estimate_dataset_size +from .utils.info_utils import is_small_dataset +from .utils.metadata import MetadataConfigs +from .utils.py_utils import ( + Literal, + asdict, + convert_file_size_to_int, + glob_pattern_to_regex, + iflatmap_unordered, + string_to_dict, +) +from .utils.stratify import stratified_shuffle_split_generate_indices +from .utils.tf_utils import dataset_to_tf, minimal_tf_collate_fn, multiprocess_dataset_to_tf +from .utils.typing import ListLike, PathLike + + +if config.HF_HUB_VERSION >= version.parse("1.6.0"): + from huggingface_hub.errors import BucketNotFoundError + from huggingface_hub.hf_file_system import HfFileSystemResolvedBucketPath, HfFileSystemResolvedRepositoryPath + +else: + BucketNotFoundError = None + HfFileSystemResolvedBucketPath = None + HfFileSystemResolvedRepositoryPath = HfFileSystemResolvedPath + + +if TYPE_CHECKING: + import sqlite3 + + import polars as pl + import pyspark + import sqlalchemy + + from .dataset_dict import DatasetDict + from .iterable_dataset import IterableDataset + +logger = logging.get_logger(__name__) + +PUSH_TO_HUB_WITHOUT_METADATA_CONFIGS_SPLIT_PATTERN_SHARDED = ( + "data/{split}-[0-9][0-9][0-9][0-9][0-9]-of-[0-9][0-9][0-9][0-9][0-9]*.parquet" +) + + +class DatasetInfoMixin: + """This base class exposes some attributes of DatasetInfo + at the base level of the Dataset for easy access. + """ + + def __init__(self, info: DatasetInfo, split: Optional[NamedSplit]): + self._info = info + self._split = split + + @property + def info(self): + """[`~datasets.DatasetInfo`] object containing all the metadata in the dataset.""" + return self._info + + @property + def split(self): + """[`~datasets.NamedSplit`] object corresponding to a named dataset split.""" + return self._split + + @property + def builder_name(self) -> str: + return self._info.builder_name + + @property + def citation(self) -> str: + return self._info.citation + + @property + def config_name(self) -> str: + return self._info.config_name + + @property + def dataset_size(self) -> Optional[int]: + return self._info.dataset_size + + @property + def description(self) -> str: + return self._info.description + + @property + def download_checksums(self) -> Optional[dict]: + return self._info.download_checksums + + @property + def download_size(self) -> Optional[int]: + return self._info.download_size + + @property + def features(self) -> Optional[Features]: + return self._info.features.copy() if self._info.features is not None else None + + @property + def homepage(self) -> Optional[str]: + return self._info.homepage + + @property + def license(self) -> Optional[str]: + return self._info.license + + @property + def size_in_bytes(self) -> Optional[int]: + return self._info.size_in_bytes + + @property + def supervised_keys(self): + return self._info.supervised_keys + + @property + def version(self): + return self._info.version + + +class TensorflowDatasetMixin: + _TF_DATASET_REFS = set() + + @staticmethod + def _get_output_signature( + dataset: "Dataset", + collate_fn: Callable, + collate_fn_args: dict, + cols_to_retain: Optional[list[str]] = None, + batch_size: Optional[int] = None, + num_test_batches: int = 20, + ): + """Private method used by `to_tf_dataset()` to find the shapes and dtypes of samples from this dataset + after being passed through the collate_fn. Tensorflow needs an exact signature for tf.numpy_function, so + the only way to do this is to run test batches - the collator may add or rename columns, so we can't figure + it out just by inspecting the dataset. + + Args: + dataset (`Dataset`): Dataset to load samples from. + collate_fn(`bool`): Shuffle the dataset order when loading. Recommended True for training, False for + validation/evaluation. + collate_fn(`Callable`): A function or callable object (such as a `DataCollator`) that will collate + lists of samples into a batch. + collate_fn_args (`Dict`): A `dict` of keyword arguments to be passed to the + `collate_fn`. + batch_size (`int`, optional): The size of batches loaded from the dataset. Used for shape inference. + Can be None, which indicates that batch sizes can be variable. + num_test_batches (`int`): The number of batches to load from the dataset for shape inference. + + Returns: + `dict`: Dict mapping column names to tf.Tensorspec objects + `dict`: Dict mapping column names to np.dtype objects + """ + if config.TF_AVAILABLE: + import tensorflow as tf + else: + raise ImportError("Called a Tensorflow-specific function but Tensorflow is not installed.") + + if len(dataset) == 0: + raise ValueError("Unable to get the output signature because the dataset is empty.") + if batch_size is not None: + batch_size = min(len(dataset), batch_size) + test_batch_size = 1 + + if cols_to_retain is not None: + cols_to_retain = list(set(cols_to_retain + ["label_ids", "label", "labels"])) + + test_batches = [] + for _ in range(num_test_batches): + indices = sample(range(len(dataset)), test_batch_size) + test_batch = dataset[indices] + if cols_to_retain is not None: + test_batch = {key: value for key, value in test_batch.items() if key in cols_to_retain} + test_batch = [{key: value[i] for key, value in test_batch.items()} for i in range(test_batch_size)] + test_batch = collate_fn(test_batch, **collate_fn_args) + test_batches.append(test_batch) + + tf_columns_to_signatures = {} + np_columns_to_dtypes = {} + for column in test_batches[0].keys(): + raw_arrays = [batch[column] for batch in test_batches] + # In case the collate_fn returns something strange + np_arrays = [] + for array in raw_arrays: + if isinstance(array, np.ndarray): + np_arrays.append(array) + elif isinstance(array, tf.Tensor): + np_arrays.append(array.numpy()) + else: + np_arrays.append(np.array(array)) + + if np.issubdtype(np_arrays[0].dtype, np.integer) or np_arrays[0].dtype == bool: + tf_dtype = tf.int64 + np_dtype = np.int64 + elif np.issubdtype(np_arrays[0].dtype, np.number): + tf_dtype = tf.float32 + np_dtype = np.float32 + elif np_arrays[0].dtype.kind == "U": # Unicode strings + np_dtype = np.str_ + tf_dtype = tf.string + else: + raise RuntimeError( + f"Unrecognized array dtype {np_arrays[0].dtype}. \n" + "Nested types and image/audio types are not supported yet." + ) + shapes = [array.shape for array in np_arrays] + static_shape = [] + for dim in range(len(shapes[0])): + sizes = {shape[dim] for shape in shapes} + if dim == 0: + static_shape.append(batch_size) + continue + if len(sizes) == 1: # This dimension looks constant + static_shape.append(sizes.pop()) + else: # Use None for variable dimensions + static_shape.append(None) + tf_columns_to_signatures[column] = tf.TensorSpec(shape=static_shape, dtype=tf_dtype) + np_columns_to_dtypes[column] = np_dtype + + return tf_columns_to_signatures, np_columns_to_dtypes + + def to_tf_dataset( + self, + batch_size: Optional[int] = None, + columns: Optional[Union[str, list[str]]] = None, + shuffle: bool = False, + collate_fn: Optional[Callable] = None, + drop_remainder: bool = False, + collate_fn_args: Optional[dict[str, Any]] = None, + label_cols: Optional[Union[str, list[str]]] = None, + prefetch: bool = True, + num_workers: int = 0, + num_test_batches: int = 20, + ): + """Create a `tf.data.Dataset` from the underlying Dataset. This `tf.data.Dataset` will load and collate batches from + the Dataset, and is suitable for passing to methods like `model.fit()` or `model.predict()`. The dataset will yield + `dicts` for both inputs and labels unless the `dict` would contain only a single key, in which case a raw + `tf.Tensor` is yielded instead. + + Args: + batch_size (`int`, *optional*): + Size of batches to load from the dataset. Defaults to `None`, which implies that the dataset won't be + batched, but the returned dataset can be batched later with `tf_dataset.batch(batch_size)`. + columns (`List[str]` or `str`, *optional*): + Dataset column(s) to load in the `tf.data.Dataset`. + Column names that are created by the `collate_fn` and that do not exist in the original dataset can be used. + shuffle(`bool`, defaults to `False`): + Shuffle the dataset order when loading. Recommended `True` for training, `False` for + validation/evaluation. + drop_remainder(`bool`, defaults to `False`): + Drop the last incomplete batch when loading. Ensures + that all batches yielded by the dataset will have the same length on the batch dimension. + collate_fn(`Callable`, *optional*): + A function or callable object (such as a `DataCollator`) that will collate + lists of samples into a batch. + collate_fn_args (`Dict`, *optional*): + An optional `dict` of keyword arguments to be passed to the + `collate_fn`. + label_cols (`List[str]` or `str`, defaults to `None`): + Dataset column(s) to load as labels. + Note that many models compute loss internally rather than letting Keras do it, in which case + passing the labels here is optional, as long as they're in the input `columns`. + prefetch (`bool`, defaults to `True`): + Whether to run the dataloader in a separate thread and maintain + a small buffer of batches for training. Improves performance by allowing data to be loaded in the + background while the model is training. + num_workers (`int`, defaults to `0`): + Number of workers to use for loading the dataset. + num_test_batches (`int`, defaults to `20`): + Number of batches to use to infer the output signature of the dataset. + The higher this number, the more accurate the signature will be, but the longer it will take to + create the dataset. + + Returns: + `tf.data.Dataset` + + Example: + + ```py + >>> ds_train = ds["train"].to_tf_dataset( + ... columns=['input_ids', 'token_type_ids', 'attention_mask', 'label'], + ... shuffle=True, + ... batch_size=16, + ... collate_fn=data_collator, + ... ) + ``` + """ + if config.TF_AVAILABLE: + import tensorflow as tf + else: + raise ImportError("Called a Tensorflow-specific function but Tensorflow is not installed.") + + if (isinstance(columns, list) and len(columns) == 1) or ( + isinstance(label_cols, list) and len(label_cols) == 1 + ): + warnings.warn( + "The output of `to_tf_dataset` will change when a passing single element list for `labels` or " + "`columns` in the next datasets version. To return a tuple structure rather than dict, pass a " + "single string.\n" + "Old behaviour: columns=['a'], labels=['labels'] -> (tf.Tensor, tf.Tensor) \n" + " : columns='a', labels='labels' -> (tf.Tensor, tf.Tensor) \n" + "New behaviour: columns=['a'],labels=['labels'] -> ({'a': tf.Tensor}, {'labels': tf.Tensor}) \n" + " : columns='a', labels='labels' -> (tf.Tensor, tf.Tensor) ", + FutureWarning, + ) + + if isinstance(tf.distribute.get_strategy(), tf.distribute.TPUStrategy): + logger.warning( + "Note that to_tf_dataset() loads the data with a generator rather than a full tf.data " + "pipeline and is not compatible with remote TPU connections. If you encounter errors, please " + "try using a TPU VM or, if your data can fit in memory, loading it into memory as a dict of " + "Tensors instead of streaming with to_tf_dataset()." + ) + + if collate_fn is None: + # Set a very simple default collator that just stacks things together + collate_fn = minimal_tf_collate_fn + if collate_fn_args is None: + collate_fn_args = {} + if label_cols and not columns: + raise ValueError("Cannot specify label_cols without specifying columns!") + if label_cols is None: + label_cols = [] + elif isinstance(label_cols, str): + label_cols = [label_cols] + if len(set(label_cols)) < len(label_cols): + raise ValueError("List of label_cols contains duplicates.") + if columns: + if isinstance(columns, str): + columns = [columns] + if len(set(columns)) < len(columns): + raise ValueError("List of columns contains duplicates.") + cols_to_retain = list(set(columns + label_cols)) + else: + cols_to_retain = None # Indicates keeping all valid columns + columns = [] + + if self.format["type"] not in ["custom", "numpy"]: + dataset = self.with_format("numpy") + else: + dataset = self + + # TODO(Matt, QL): deprecate the retention of label_ids and label + + output_signature, columns_to_np_types = dataset._get_output_signature( + dataset, + collate_fn=collate_fn, + collate_fn_args=collate_fn_args, + cols_to_retain=cols_to_retain, + batch_size=batch_size if drop_remainder else None, + num_test_batches=num_test_batches, + ) + + if "labels" in output_signature: + if ("label_ids" in columns or "label" in columns) and "labels" not in columns: + columns = [col for col in columns if col not in ["label_ids", "label"]] + ["labels"] + if ("label_ids" in label_cols or "label" in label_cols) and "labels" not in label_cols: + label_cols = [col for col in label_cols if col not in ["label_ids", "label"]] + ["labels"] + + for col in columns: + if col not in output_signature: + raise ValueError(f"Column {col} not found in dataset!") + + for col in label_cols: + if col not in output_signature: + raise ValueError(f"Label column {col} not found in dataset!") + + if num_workers == 0: + tf_dataset = dataset_to_tf( + dataset=dataset, + cols_to_retain=cols_to_retain, + collate_fn=collate_fn, + collate_fn_args=collate_fn_args, + columns_to_np_types=columns_to_np_types, + output_signature=output_signature, + shuffle=shuffle, + batch_size=batch_size, + drop_remainder=drop_remainder, + ) + elif num_workers > 0: + if batch_size is None: + raise NotImplementedError( + "`batch_size` must be specified when using multiple workers, as unbatched multiprocessing " + "is not supported yet. Please provide a `batch_size` if `num_workers` is greater than 0." + ) + tf_dataset = multiprocess_dataset_to_tf( + dataset=dataset, + cols_to_retain=cols_to_retain, + collate_fn=collate_fn, + collate_fn_args=collate_fn_args, + columns_to_np_types=columns_to_np_types, + output_signature=output_signature, + shuffle=shuffle, + batch_size=batch_size, + drop_remainder=drop_remainder, + num_workers=num_workers, + ) + else: + raise ValueError("num_workers must be >= 0") + + def split_features_and_labels(input_batch): + # TODO(Matt, QL): deprecate returning the dict content when there's only one key + features = {key: tensor for key, tensor in input_batch.items() if key in columns} + labels = {key: tensor for key, tensor in input_batch.items() if key in label_cols} + if len(features) == 1: + features = list(features.values())[0] + if len(labels) == 1: + labels = list(labels.values())[0] + if isinstance(labels, dict) and len(labels) == 0: + return features + else: + return features, labels + + if cols_to_retain is not None: + tf_dataset = tf_dataset.map(split_features_and_labels) + + if prefetch: + tf_dataset = tf_dataset.prefetch(tf.data.experimental.AUTOTUNE) + + # Remove a reference to the open Arrow file on delete + def cleanup_callback(ref): + dataset.__del__() + self._TF_DATASET_REFS.remove(ref) + + self._TF_DATASET_REFS.add(weakref.ref(tf_dataset, cleanup_callback)) + + return tf_dataset + + +class DatasetTransformationNotAllowedError(Exception): + pass + + +def transmit_format(func): + """Wrapper for dataset transforms that recreate a new Dataset to transmit the format of the original dataset to the new dataset""" + + @wraps(func) + def wrapper(*args, **kwargs): + if args: + self: "Dataset" = args[0] + args = args[1:] + else: + self: "Dataset" = kwargs.pop("self") + # don't use self.format since it returns a list of columns for 'columns' even if self_format_columns is None + unformatted_columns = set(self.column_names) - set(self._format_columns or []) + self_format = { + "type": self._format_type, + "format_kwargs": self._format_kwargs, + "columns": self._format_columns, + "output_all_columns": self._output_all_columns, + } + # apply actual function + out: Union["Dataset", "DatasetDict"] = func(self, *args, **kwargs) + datasets: list["Dataset"] = list(out.values()) if isinstance(out, dict) else [out] + # re-apply format to the output + for dataset in datasets: + new_format = self_format.copy() + if new_format["columns"] is not None: # new formatted columns = (columns - previously unformatted columns) + # sort the columns to have a deterministic list of columns that we can compare with `out_format` + new_format["columns"] = sorted(set(dataset.column_names) - unformatted_columns) + out_format = { + "type": dataset._format_type, + "format_kwargs": dataset._format_kwargs, + "columns": sorted(dataset._format_columns) if dataset._format_columns is not None else None, + "output_all_columns": dataset._output_all_columns, + } + if out_format != new_format: + fingerprint = dataset._fingerprint + dataset.set_format(**new_format) + dataset._fingerprint = fingerprint + return out + + wrapper._decorator_name_ = "transmit_format" + return wrapper + + +def update_metadata_with_features(table: Table, features: Features): + """To be used in dataset transforms that modify the features of the dataset, in order to update the features stored in the metadata of its schema.""" + features = Features({col_name: features[col_name] for col_name in table.column_names}) + if table.schema.metadata is None or b"huggingface" not in table.schema.metadata: + pa_metadata = ArrowWriter._build_metadata(DatasetInfo(features=features)) + else: + metadata = json.loads(table.schema.metadata[b"huggingface"].decode()) + if "info" not in metadata: + metadata["info"] = asdict(DatasetInfo(features=features)) + else: + metadata["info"]["features"] = asdict(DatasetInfo(features=features))["features"] + pa_metadata = {"huggingface": json.dumps(metadata)} + table = table.replace_schema_metadata(pa_metadata) + return table + + +def _check_table(table) -> Table: + """We check the table type to make sure it's an instance of :class:`datasets.table.Table`""" + if isinstance(table, pa.Table): + # for a pyarrow table, we can just consider it as a in-memory table + # this is here for backward compatibility + return InMemoryTable(table) + elif isinstance(table, Table): + return table + else: + raise TypeError(f"Expected a pyarrow.Table or a datasets.table.Table object, but got {table}.") + + +def _check_column_names(column_names: list[str]): + """Check the column names to make sure they don't contain duplicates.""" + counter = Counter(column_names) + if not all(count == 1 for count in counter.values()): + duplicated_columns = [col for col in counter if counter[col] > 1] + raise ValueError(f"The table can't have duplicated columns but columns {duplicated_columns} are duplicated.") + + +def _check_valid_indices_value(index, size): + if (index < 0 and index + size < 0) or (index >= size): + raise IndexError(f"Index {index} out of range for dataset of size {size}.") + + +class NonExistentDatasetError(Exception): + """Used when we expect the existence of a dataset""" + + pass + + +class Column(Sequence_): + """ + An iterable for a specific column of a [`Dataset`]. + + Example: + + Iterate on the texts of the "text" column of a dataset: + + ```python + for text in dataset["text"]: + ... + ``` + + It also works with nested columns: + + ```python + for source in dataset["metadata"]["source"]: + ... + ``` + """ + + def __init__(self, source: Union["Dataset", "Column"], column_name: str): + self.source = source + self.column_name = column_name + if not isinstance(source.features, dict) or column_name not in source.features: + raise ValueError(f"Column '{column_name}' doesn't exist.") + self.features = source.features[column_name] + + def __iter__(self) -> Iterator[Any]: + if isinstance(self.source, Dataset): + if self.source._format_type == "custom": + # the formatting transform may require all columns + source = self.source + else: + source = self.source._fast_select_column(self.column_name) + else: + source = self.source + for example in source: + yield example[self.column_name] + + def __getitem__(self, key: Union[int, str, list[int]]) -> Any: + if isinstance(key, str): + return Column(self, key) + elif isinstance(self.source, Dataset): + if self.source._format_type == "custom": + # the formatting transform may require all columns + source = self.source + else: + source = self.source._fast_select_column(self.column_name) + return source[key][self.column_name] + elif isinstance(key, int): + return self.source[key][self.column_name] + else: + return [item[self.column_name] for item in self.source[key]] + + def __len__(self) -> int: + return len(self.source) + + def __repr__(self): + return "Column(" + repr(list(self[:5]))[:-1] + (", ...])" if len(self) > 5 else "])") + + def __str__(self): + return "Column(" + str(list(self[:5]))[:-1] + (", ...])" if len(self) > 5 else "])") + + def __eq__(self, value): + if isinstance(value, Column): + return list(self) == list(value) + else: + return value == list(self) + + +class Dataset(DatasetInfoMixin, IndexableMixin, TensorflowDatasetMixin): + """A Dataset backed by an Arrow table.""" + + def __init__( + self, + arrow_table: Table, + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + indices_table: Optional[Table] = None, + fingerprint: Optional[str] = None, + ): + info = info.copy() if info is not None else DatasetInfo() + DatasetInfoMixin.__init__(self, info=info, split=split) + IndexableMixin.__init__(self) + + self._data: Table = _check_table(arrow_table) + self._indices: Optional[Table] = _check_table(indices_table) if indices_table is not None else None + maybe_register_dataset_for_temp_dir_deletion(self) + + self._format_type: Optional[str] = None + self._format_kwargs: dict = {} + self._format_columns: Optional[list] = None + self._output_all_columns: bool = False + self._fingerprint: str = fingerprint + + # Read metadata + + if self._data.schema.metadata is not None and b"huggingface" in self._data.schema.metadata: + metadata = json.loads(self._data.schema.metadata[b"huggingface"].decode()) + if ( + "fingerprint" in metadata and self._fingerprint is None + ): # try to load fingerprint from the arrow file metadata + self._fingerprint = metadata["fingerprint"] + + # Infer features if None + inferred_features = Features.from_arrow_schema(arrow_table.schema) + if self.info.features is None: + self.info.features = inferred_features + else: # make sure the nested columns are in the right order + try: + self.info.features = self.info.features.reorder_fields_as(inferred_features) + except ValueError as e: + raise ValueError( + f"{e}\nThe 'source' features come from dataset_info.json, and the 'target' ones are those of the dataset arrow file." + ) + + # In case there are types like pa.dictionary that we need to convert to the underlying type + + if self.data.schema != self.info.features.arrow_schema: + self._data = self.data.cast(self.info.features.arrow_schema) + + # Infer fingerprint if None + + if self._fingerprint is None: + self._fingerprint = generate_fingerprint(self) + + # Sanity checks + + if self._info.features is None: + raise ValueError("Features can't be None in a Dataset object") + if self._fingerprint is None: + raise ValueError("Fingerprint can't be None in a Dataset object") + if self.info.features.type != inferred_features.type: + raise ValueError( + f"External features info don't match the dataset:\nGot\n{self.info.features}\nwith type\n{self.info.features.type}\n\nbut expected something like\n{inferred_features}\nwith type\n{inferred_features.type}" + ) + + if self._indices is not None: + if not pa.types.is_unsigned_integer(self._indices.column(0).type): + raise ValueError( + f"indices must be an Arrow table of unsigned integers, current type is {self._indices.column(0).type}" + ) + _check_column_names(self._data.column_names) + + self._data = update_metadata_with_features(self._data, self._info.features) + + @property + def features(self) -> Features: + features = super().features + if features is None: # this is already checked in __init__ + raise ValueError("Features can't be None in a Dataset object") + return features + + @classmethod + def from_file( + cls, + filename: str, + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + indices_filename: Optional[str] = None, + in_memory: bool = False, + ) -> "Dataset": + """Instantiate a Dataset backed by an Arrow table at filename. + + Args: + filename (`str`): + File name of the dataset. + info (`DatasetInfo`, *optional*): + Dataset information, like description, citation, etc. + split (`NamedSplit`, *optional*): + Name of the dataset split. + indices_filename (`str`, *optional*): + File names of the indices. + in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + + Returns: + [`Dataset`] + """ + table = ArrowReader.read_table(filename, in_memory=in_memory) + + if indices_filename is not None: + indices_pa_table = ArrowReader.read_table(indices_filename, in_memory=in_memory) + else: + indices_pa_table = None + + return cls( + arrow_table=table, + info=info, + split=split, + indices_table=indices_pa_table, + ) + + @classmethod + def from_buffer( + cls, + buffer: pa.Buffer, + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + indices_buffer: Optional[pa.Buffer] = None, + ) -> "Dataset": + """Instantiate a Dataset backed by an Arrow buffer. + + Args: + buffer (`pyarrow.Buffer`): + Arrow buffer. + info (`DatasetInfo`, *optional*): + Dataset information, like description, citation, etc. + split (`NamedSplit`, *optional*): + Name of the dataset split. + indices_buffer (`pyarrow.Buffer`, *optional*): + Indices Arrow buffer. + + Returns: + [`Dataset`] + """ + table = InMemoryTable.from_buffer(buffer) + + if indices_buffer is not None: + indices_table = InMemoryTable.from_buffer(buffer) + else: + indices_table = None + + return cls(table, info=info, split=split, indices_table=indices_table) + + @classmethod + def from_pandas( + cls, + df: pd.DataFrame, + features: Optional[Features] = None, + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + preserve_index: Optional[bool] = None, + ) -> "Dataset": + """ + Convert `pandas.DataFrame` to a `pyarrow.Table` to create a [`Dataset`]. + + The column types in the resulting Arrow Table are inferred from the dtypes of the `pandas.Series` in the + DataFrame. In the case of non-object Series, the NumPy dtype is translated to its Arrow equivalent. In the + case of `object`, we need to guess the datatype by looking at the Python objects in this Series. + + Be aware that Series of the `object` dtype don't carry enough information to always lead to a meaningful Arrow + type. In the case that we cannot infer a type, e.g. because the DataFrame is of length 0 or the Series only + contains `None/nan` objects, the type is set to `null`. This behavior can be avoided by constructing explicit + features and passing it to this function. + + Important: a dataset created with from_pandas() lives in memory + and therefore doesn't have an associated cache directory. + This may change in the future, but in the meantime if you + want to reduce memory usage you should write it back on disk + and reload using e.g. save_to_disk / load_from_disk. + + Args: + df (`pandas.DataFrame`): + Dataframe that contains the dataset. + features ([`Features`], *optional*): + Dataset features. + info (`DatasetInfo`, *optional*): + Dataset information, like description, citation, etc. + split (`NamedSplit`, *optional*): + Name of the dataset split. + preserve_index (`bool`, *optional*): + Whether to store the index as an additional column in the resulting Dataset. + The default of `None` will store the index as a column, except for `RangeIndex` which is stored as metadata only. + Use `preserve_index=True` to force it to be stored as a column. + + Returns: + [`Dataset`] + + Example: + + ```py + >>> ds = Dataset.from_pandas(df) + ``` + """ + if info is not None and features is not None and info.features != features: + raise ValueError( + f"Features specified in `features` and `info.features` can't be different:\n{features}\n{info.features}" + ) + features = features if features is not None else info.features if info is not None else None + if features is not None: + features = _fix_for_backward_compatible_features(features) + if info is None: + info = DatasetInfo() + info.features = features + table = InMemoryTable.from_pandas( + df=df, + preserve_index=preserve_index, + ) + if features is not None: + # more expensive cast than InMemoryTable.from_pandas(..., schema=features.arrow_schema) + # needed to support the str to Audio conversion for instance + table = table.cast(features.arrow_schema) + return cls(table, info=info, split=split) + + @classmethod + def from_polars( + cls, + df: Union["pl.DataFrame", "pl.LazyFrame"], + features: Optional[Features] = None, + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + ) -> "Dataset": + """ + Collect the underlying arrow arrays in an Arrow Table. + + This operation is mostly zero copy. + + Data types that do copy: + * CategoricalType + + Args: + df (`polars.DataFrame`): DataFrame to convert to Arrow Table + features (`Features`, optional): Dataset features. + info (`DatasetInfo`, optional): Dataset information, like description, citation, etc. + split (`NamedSplit`, optional): Name of the dataset split. + + Examples: + ```py + >>> ds = Dataset.from_polars(df) + ``` + """ + import polars as pl + + if info is not None and features is not None and info.features != features: + raise ValueError( + f"Features specified in `features` and `info.features` can't be different:\n{features}\n{info.features}" + ) + features = features if features is not None else info.features if info is not None else None + if features is not None: + features = _fix_for_backward_compatible_features(features) + if info is None: + info = DatasetInfo() + info.features = features + if isinstance(df, pl.LazyFrame): + df = df.collect() + table = InMemoryTable(df.to_arrow()) + if features is not None: + # more expensive cast than InMemoryTable.from_polars(..., schema=features.arrow_schema) + # needed to support the str to Audio conversion for instance + table = table.cast(features.arrow_schema) + return cls(table, info=info, split=split) + + @classmethod + def from_dict( + cls, + mapping: dict, + features: Optional[Features] = None, + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + on_mixed_types: Optional[Literal["use_json"]] = None, + ) -> "Dataset": + """ + Convert `dict` to a `pyarrow.Table` to create a [`Dataset`]. + + Important: a dataset created with from_dict() lives in memory + and therefore doesn't have an associated cache directory. + This may change in the future, but in the meantime if you + want to reduce memory usage you should write it back on disk + and reload using e.g. save_to_disk / load_from_disk. + + Args: + mapping (`Mapping`): + Mapping of strings to Arrays or Python lists. + features ([`Features`], *optional*): + Dataset features. + info (`DatasetInfo`, *optional*): + Dataset information, like description, citation, etc. + split (`NamedSplit`, *optional*): + Name of the dataset split. + on_mixed_types (`Literal["use_json"]`, *optional*, defaults to `None`): + If "use_json", use the Json() type for mixed-types fields, + i.e. unstructured fields that contain data without a predefined schema. + In this case, a field with mixed type is set to Json(). + + This allow loading lists with a mix of strings/integers/floats + for example, or dictionaries with arbitrary value types. + + + + Returns: + [`Dataset`] + + Examples: + + Get a Dataset from a dictionary containing one list per column: + + ```py + >>> ds = Dataset.from_dict({"text": ["hello there !", "general kenobi !"]}) + ``` + + Pass features to set the column types, e.g. for an image dataset: + + ```py + >>> features = Features({"image": Image()}) + >>> ds = Dataset.from_dict({"image": ["path/to/image.png"]}, features=features) + ``` + + Datasets are based on Arrow which is a columnar format, and therefore they expect every example to have the same + type and subtypes, and dictionaries to have the same keys and values types. + Loading a dataset errors out when fields have mismatching types, and fills missing fields in dictionaries with None so all dictionaries have the same keys and value types. + + To avoid this and allow mixed-types without errors, you can use `on_mixed_types="use_json"` or specify `features=` with a [`Json`] type: + + ```py + >>> ds = Dataset.from_dict({"a": [0, "foo", {"subfield": "bar"}]}) + Traceback (most recent call last): + ... + File "pyarrow/error.pxi", line 92, in pyarrow.lib.check_status + pyarrow.lib.ArrowInvalid: Could not convert 'foo' with type str: tried to convert to int64 + + >>> ds = Dataset.from_dict({"a": [0, "foo", {"subfield": "bar"}]}, on_mixed_types="use_json") + >>> ds.features + {'a': Json()} + >>> list(ds["a"]) + [0, "foo", {"subfield": "bar"}] + + >>> features = Features({"a": Json()}) + >>> ds = Dataset.from_dict({"a": [0, "foo", {"subfield": "bar"}]}, features=features) + >>> ds.features + {'a': Json()} + >>> list(ds["a"]) + [0, "foo", {"subfield": "bar"}] + ``` + + This is also useful for lists of dictionaries with arbitrary keys and values, to avoid filling missing fields with None: + + ```py + >>> ds = Dataset.from_dict({"a": [[{"b": 0}, {"c": 0}]]}) + >>> ds.features + {'a': List({'b': Value('int64'), 'c': Value('int64')})} + >>> list(ds["a"]) + [[{'b': 0, 'c': None}, {'b': None, 'c': 0}]] # missing fields are filled with None + + >>> features = Features({"a": List(Json())}) + >>> ds = Dataset.from_dict({"a": [[{"b": 0}, {"c": 0}]]}, features=features) + >>> ds.features + {'a': List(Json())} + >>> list(ds["a"]) + [[{'b': 0}, {'c': 0}]] # OK + + >>> ds = Dataset.from_dict({"a": [[{"b": 0}, {"c": 0}]]}, on_mixed_types="use_json") + >>> ds.features + {'a': List(Json())} + >>> list(ds["a"]) + [[{'b': 0}, {'c': 0}]] # OK + ``` + + Another example with tool calling data: + + ```py + >>> messages = [ + ... {"role": "user", "content": "Turn on the living room lights and play my electronic music playlist."}, + ... {"role": "assistant", "tool_calls": [ + ... {"type": "function", "function": { + ... "name": "control_light", + ... "arguments": {"room": "living room", "state": "on"} + ... }}, + ... {"type": "function", "function": { + ... "name": "play_music", + ... "arguments": {"playlist": "electronic"} # mixed-type here since keys ["playlist"] and ["room", "state"] are different + ... }}] + ... }, + ... {"role": "tool", "name": "control_light", "content": "The lights in the living room are now on."}, + ... {"role": "tool", "name": "play_music", "content": "The music is now playing."}, + ... {"role": "assistant", "content": "Done!"} + ... ] + >>> ds = Dataset.from_dict({"messages": [messages]}, on_mixed_types="use_json") + >>> ds.features + {'messages': List({'role': Value('string'), 'content': Value('string'), 'tool_calls': List(Json()), 'name': Value('string')})} + >>> ds[0]["messages"][1]["tool_calls"][0]["function"]["arguments"] + {"room": "living room", "state": "on"} + ``` + """ + if info is not None and features is not None and info.features != features: + raise ValueError( + f"Features specified in `features` and `info.features` can't be different:\n{features}\n{info.features}" + ) + features = features if features is not None else info.features if info is not None else None + if features is not None: + features = _fix_for_backward_compatible_features(features) + arrow_typed_mapping = {} + for col, data in mapping.items(): + if isinstance(data, (pa.Array, pa.ChunkedArray)): + data = cast_array_to_feature(data, features[col]) if features is not None else data + else: + data = OptimizedTypedSequence( + features.encode_column(data, col) if features is not None else data, + type=features[col] if features is not None else None, + col=col, + on_mixed_types=on_mixed_types, + ) + arrow_typed_mapping[col] = data + mapping = arrow_typed_mapping + pa_table = InMemoryTable.from_pydict(mapping=mapping) + if info is None: + info = DatasetInfo() + info.features = features + if info.features is None: + info.features = Features( + { + col: generate_from_arrow_type(data.type) + if isinstance(data, (pa.Array, pa.ChunkedArray)) + else data.get_inferred_type() + for col, data in mapping.items() + } + ) + return cls(pa_table, info=info, split=split) + + @classmethod + def from_list( + cls, + mapping: list[dict], + features: Optional[Features] = None, + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + on_mixed_types: Optional[Literal["use_json"]] = None, + ) -> "Dataset": + """ + Convert a list of dicts to a `pyarrow.Table` to create a [`Dataset`]`. + + Note that the keys of the first entry will be used to determine the dataset columns, + regardless of what is passed to features. + + Important: a dataset created with from_list() lives in memory + and therefore doesn't have an associated cache directory. + This may change in the future, but in the meantime if you + want to reduce memory usage you should write it back on disk + and reload using e.g. save_to_disk / load_from_disk. + + Args: + mapping (`List[dict]`): A list of mappings of strings to row values. + features (`Features`, optional): Dataset features. + info (`DatasetInfo`, optional): Dataset information, like description, citation, etc. + split (`NamedSplit`, optional): Name of the dataset split. + on_mixed_types (`Literal["use_json"]`, *optional*, defaults to `None`): + If "use_json", use the Json() type for mixed-types fields, + i.e. unstructured fields that contain data without a predefined schema. + In this case, a field with mixed type is set to Json(). + + This allow loading lists with a mix of strings/integers/floats + for example, or dictionaries with arbitrary value types. + + + + Returns: + [`Dataset`] + + Examples: + + Get a Dataset from a list containing the examples: + + ```py + >>> ds = Dataset.from_list([{"text": "hello there !"}, {"text": "general kenobi !"}]}) + ``` + + Pass features to set the column types, e.g. for an image dataset: + + ```py + >>> features = Features({"image": Image()}) + >>> ds = Dataset.from_list([{"image": "path/to/image.png"}], features=features) + ``` + + Datasets are based on Arrow which is a columnar format, and therefore they expect every example to have the same + type and subtypes, and dictionaries to have the same keys and values types. + Loading a dataset errors out when fields have mismatching types, and fills missing fields in dictionaries with None so all dictionaries have the same keys and value types. + + To avoid this and allow mixed-types without errors, you can use `on_mixed_types="use_json"` or specify `features=` with a [`Json`] type: + + ```py + >>> ds = Dataset.from_list([{"a": 0}, {"a": "foo"}, {"a": {"subfield": "bar"}}]) + Traceback (most recent call last): + ... + File "pyarrow/error.pxi", line 92, in pyarrow.lib.check_status + pyarrow.lib.ArrowInvalid: Could not convert 'foo' with type str: tried to convert to int64 + + >>> ds = Dataset.from_list([{"a": 0}, {"a": "foo"}, {"a": {"subfield": "bar"}}], on_mixed_types="use_json") + >>> ds.features + {'a': Json()} + >>> list(ds["a"]) + [0, "foo", {"subfield": "bar"}] + + >>> features = Features({"a": Json()}) + >>> ds = Dataset.from_list([{"a": 0}, {"a": "foo"}, {"a": {"subfield": "bar"}}], features=features) + >>> ds.features + {'a': Json()} + >>> list(ds["a"]) + [0, "foo", {"subfield": "bar"}] + ``` + + This is also useful for lists of dictionaries with arbitrary keys and values, to avoid filling missing fields with None: + + ```py + >>> ds = Dataset.from_list([{"a": [{"b": 0}, {"c": 0}]}]) + >>> ds.features + {'a': List({'b': Value('int64'), 'c': Value('int64')})} + >>> list(ds["a"]) + [[{'b': 0, 'c': None}, {'b': None, 'c': 0}]] # missing fields are filled with None + + >>> features = Features({"a": List(Json())}) + >>> ds = Dataset.from_list([{"a": [{"b": 0}, {"c": 0}]}], features=features) + >>> ds.features + {'a': List(Json())} + >>> list(ds["a"]) + [[{'b': 0}, {'c': 0}]] # OK + + >>> ds = Dataset.from_list([{"a": [{"b": 0}, {"c": 0}]}], on_mixed_types="use_json") + >>> ds.features + {'a': List(Json())} + >>> list(ds["a"]) + [[{'b': 0}, {'c': 0}]] # OK + ``` + + Another example with tool calling data: + + ```py + >>> messages = [ + ... {"role": "user", "content": "Turn on the living room lights and play my electronic music playlist."}, + ... {"role": "assistant", "tool_calls": [ + ... {"type": "function", "function": { + ... "name": "control_light", + ... "arguments": {"room": "living room", "state": "on"} + ... }}, + ... {"type": "function", "function": { + ... "name": "play_music", + ... "arguments": {"playlist": "electronic"} # mixed-type here since keys ["playlist"] and ["room", "state"] are different + ... }}] + ... }, + ... {"role": "tool", "name": "control_light", "content": "The lights in the living room are now on."}, + ... {"role": "tool", "name": "play_music", "content": "The music is now playing."}, + ... {"role": "assistant", "content": "Done!"} + ... ] + >>> ds = Dataset.from_list([{"messages": messages}], on_mixed_types="use_json") + >>> ds.features + {'messages': List({'role': Value('string'), 'content': Value('string'), 'tool_calls': List(Json()), 'name': Value('string')})} + >>> ds[0]["messages"][1]["tool_calls"][0]["function"]["arguments"] + {"room": "living room", "state": "on"} + ``` + """ + # for simplicity and consistency wrt OptimizedTypedSequence we do not use InMemoryTable.from_pylist here + mapping = {k: [r.get(k) for r in mapping] for k in mapping[0]} if mapping else {} + return cls.from_dict(mapping, features, info, split, on_mixed_types=on_mixed_types) + + @staticmethod + def from_csv( + path_or_paths: Union[PathLike, list[PathLike]], + split: Optional[NamedSplit] = None, + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + num_proc: Optional[int] = None, + **kwargs, + ) -> "Dataset": + """Create Dataset from CSV file(s). + + Read the CSV files, cache the data in Arrow format on disk and return the Dataset from the memory-mapped Arrow data on disk. + + Args: + path_or_paths (`path-like` or list of `path-like`): + Path(s) of the CSV file(s). + split ([`NamedSplit`], *optional*): + Split name to be assigned to the dataset. + features ([`Features`], *optional*): + Dataset features. + cache_dir (`str`, *optional*, defaults to `"~/.cache/huggingface/datasets"`): + Directory to cache data. + keep_in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + num_proc (`int`, *optional*, defaults to `None`): + Number of processes when downloading and generating the dataset locally. + This is helpful if the dataset is made of multiple files. Multiprocessing is disabled by default. + + + **kwargs (additional keyword arguments): + Keyword arguments to be passed to [`pandas.read_csv`]. + + Returns: + [`Dataset`] + + Example: + + ```py + >>> ds = Dataset.from_csv('path/to/dataset.csv') + ``` + """ + # Dynamic import to avoid circular dependency + from .io.csv import CsvDatasetReader + + return CsvDatasetReader( + path_or_paths, + split=split, + features=features, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + num_proc=num_proc, + **kwargs, + ).read() + + @staticmethod + def from_generator( + generator: Callable, + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + gen_kwargs: Optional[dict] = None, + num_proc: Optional[int] = None, + split: NamedSplit = Split.TRAIN, + fingerprint: Optional[str] = None, + **kwargs, + ) -> "Dataset": + """Create a Dataset from a generator. + + Load the data from the generator, cache the data in Arrow format on disk and return the Dataset from the memory-mapped Arrow data on disk. + + Args: + generator (:`Callable`): + A generator function that `yields` examples. + features ([`Features`], *optional*): + Dataset features. + cache_dir (`str`, *optional*, defaults to `"~/.cache/huggingface/datasets"`): + Directory to cache data. + keep_in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + gen_kwargs(`dict`, *optional*): + Keyword arguments to be passed to the `generator` callable. + You can define a sharded dataset by passing the list of shards in `gen_kwargs` and setting `num_proc` greater than 1. + num_proc (`int`, *optional*, defaults to `None`): + Number of processes when downloading and generating the dataset locally. + This is helpful if the dataset is made of multiple files. Multiprocessing is disabled by default. + If `num_proc` is greater than one, then all list values in `gen_kwargs` must be the same length. These values will be split between calls to the generator. The number of shards will be the minimum of the shortest list in `gen_kwargs` and `num_proc`. + + + split ([`NamedSplit`], defaults to `Split.TRAIN`): + Split name to be assigned to the dataset. + + + fingerprint (`str`, *optional*): + Fingerprint that will be used to generate dataset ID. + By default `fingerprint` is generated by hashing the generator function and all the args which can be slow + if it uses large objects like AI models. + + + **kwargs (additional keyword arguments): + Keyword arguments to be passed to :[`GeneratorConfig`]. + + Returns: + [`Dataset`] + + Example: + + ```py + >>> def gen(): + ... yield {"text": "Good", "label": 0} + ... yield {"text": "Bad", "label": 1} + ... + >>> ds = Dataset.from_generator(gen) + ``` + + ```py + >>> def gen(shards): + ... for shard in shards: + ... with open(shard) as f: + ... for line in f: + ... yield {"line": line} + ... + >>> shards = [f"data{i}.txt" for i in range(32)] + >>> ds = Dataset.from_generator(gen, gen_kwargs={"shards": shards}) + ``` + """ + from .io.generator import GeneratorDatasetInputStream + + return GeneratorDatasetInputStream( + generator=generator, + features=features, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + gen_kwargs=gen_kwargs, + num_proc=num_proc, + split=split, + fingerprint=fingerprint, + **kwargs, + ).read() + + @staticmethod + def from_json( + path_or_paths: Union[PathLike, list[PathLike]], + split: Optional[NamedSplit] = None, + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + field: Optional[str] = None, + num_proc: Optional[int] = None, + **kwargs, + ) -> "Dataset": + """Create Dataset from JSON or JSON Lines file(s). + + Read the JSON files, cache the data in Arrow format on disk and return the Dataset from the memory-mapped Arrow data on disk. + + Args: + path_or_paths (`path-like` or list of `path-like`): + Path(s) of the JSON or JSON Lines file(s). + split ([`NamedSplit`], *optional*): + Split name to be assigned to the dataset. + features ([`Features`], *optional*): + Dataset features. + cache_dir (`str`, *optional*, defaults to `"~/.cache/huggingface/datasets"`): + Directory to cache data. + keep_in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + field (`str`, *optional*): + Field name of the JSON file where the dataset is contained in. + num_proc (`int`, *optional* defaults to `None`): + Number of processes when downloading and generating the dataset locally. + This is helpful if the dataset is made of multiple files. Multiprocessing is disabled by default. + + + **kwargs (additional keyword arguments): + Keyword arguments to be passed to [`JsonConfig`]. + + Returns: + [`Dataset`] + + Example: + + ```py + >>> ds = Dataset.from_json('path/to/dataset.json') + ``` + """ + # Dynamic import to avoid circular dependency + from .io.json import JsonDatasetReader + + return JsonDatasetReader( + path_or_paths, + split=split, + features=features, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + field=field, + num_proc=num_proc, + **kwargs, + ).read() + + @staticmethod + def from_parquet( + path_or_paths: Union[PathLike, list[PathLike]], + split: Optional[NamedSplit] = None, + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + columns: Optional[list[str]] = None, + num_proc: Optional[int] = None, + filters: Optional[Union[pds.Expression, list[tuple], list[list[tuple]]]] = None, + fragment_scan_options: Optional[pds.ParquetFragmentScanOptions] = None, + on_bad_files: Literal["error", "warn", "skip"] = "error", + **kwargs, + ) -> "Dataset": + """Create Dataset from Parquet file(s). + + Read the Parquet files, cache the data in Arrow format on disk and return the Dataset from the memory-mapped Arrow data on disk. + + Args: + path_or_paths (`path-like` or list of `path-like`): + Path(s) of the Parquet file(s). + split (`NamedSplit`, *optional*): + Split name to be assigned to the dataset. + features (`Features`, *optional*): + Dataset features. + cache_dir (`str`, *optional*, defaults to `"~/.cache/huggingface/datasets"`): + Directory to cache data. + keep_in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + columns (`List[str]`, *optional*): + If not `None`, only these columns will be read from the file. + A column name may be a prefix of a nested field, e.g. 'a' will select + 'a.b', 'a.c', and 'a.d.e'. + num_proc (`int`, *optional*, defaults to `None`): + Number of processes when downloading and generating the dataset locally. + This is helpful if the dataset is made of multiple files. Multiprocessing is disabled by default. + + + filters (`Union[pyarrow.dataset.Expression, list[tuple], list[list[tuple]]]`, *optional*): + Return only the rows matching the filter. + If possible the predicate will be pushed down to exploit the partition information + or internal metadata found in the data source, e.g. Parquet statistics. + Otherwise filters the loaded RecordBatches before yielding them. + fragment_scan_options (`pyarrow.dataset.ParquetFragmentScanOptions`, *optional*) + Scan-specific options for Parquet fragments. + This is especially useful to configure buffering and caching. + + + on_bad_files (`Literal["error", "warn", "skip"]`, *optional*, defaults to "error") + Specify what to do upon encountering a bad file (a file that can't be read). Allowed values are : + * 'error', raise an Exception when a bad file is encountered. + * 'warn', raise a warning when a bad file is encountered and skip that file. + * 'skip', skip bad files without raising or warning when they are encountered. + + + **kwargs (additional keyword arguments): + Keyword arguments to be passed to [`ParquetConfig`]. + + Returns: + [`Dataset`] + + Example: + + ```py + >>> ds = Dataset.from_parquet('path/to/dataset.parquet') + ``` + + Load a subset of columns: + + ```python + >>> ds = Dataset.from_parquet('path/to/dataset.parquet', columns=["col_0", "col_1"]) + ``` + + Efficiently filter data, possibly skipping entire files or row groups: + + ```python + >>> filters = [("col_0", "==", 0)] + >>> ds = Dataset.from_parquet(parquet_files_list, filters=filters) + ``` + """ + # Dynamic import to avoid circular dependency + from .io.parquet import ParquetDatasetReader + + return ParquetDatasetReader( + path_or_paths, + split=split, + features=features, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + columns=columns, + num_proc=num_proc, + filters=filters, + fragment_scan_options=fragment_scan_options, + on_bad_files=on_bad_files, + **kwargs, + ).read() + + @staticmethod + def from_text( + path_or_paths: Union[PathLike, list[PathLike]], + split: Optional[NamedSplit] = None, + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + num_proc: Optional[int] = None, + keep_linebreaks: bool = False, + sample_by: Literal["line", "paragraph", "document"] = "line", + **kwargs, + ) -> "Dataset": + """Create Dataset from text file(s). + + Read the text files, cache the data in Arrow format on disk and return the Dataset from the memory-mapped Arrow data on disk. + + Args: + path_or_paths (`path-like` or list of `path-like`): + Path(s) of the text file(s). + split (`NamedSplit`, *optional*): + Split name to be assigned to the dataset. + features (`Features`, *optional*): + Dataset features. + cache_dir (`str`, *optional*, defaults to `"~/.cache/huggingface/datasets"`): + Directory to cache data. + keep_in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + num_proc (`int`, *optional*, defaults to `None`): + Number of processes when downloading and generating the dataset locally. + This is helpful if the dataset is made of multiple files. Multiprocessing is disabled by default. + + + keep_linebreaks: (`bool`, defaults to False): + Whether to keep line breaks. + sample_by (`Literal["line", "paragraph", "document"]`, defaults to "line"): + Whether to load data per line, praragraph or document. + By default one row in the dataset = one line. + **kwargs (additional keyword arguments): + Keyword arguments to be passed to [`TextConfig`]. + + Returns: + [`Dataset`] + + Example: + + ```py + >>> ds = Dataset.from_text('path/to/dataset.txt') + ``` + """ + # Dynamic import to avoid circular dependency + from .io.text import TextDatasetReader + + return TextDatasetReader( + path_or_paths, + split=split, + features=features, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + num_proc=num_proc, + keep_linebreaks=keep_linebreaks, + sample_by=sample_by, + **kwargs, + ).read() + + @staticmethod + def from_spark( + df: "pyspark.sql.DataFrame", + split: Optional[NamedSplit] = None, + features: Optional[Features] = None, + keep_in_memory: bool = False, + cache_dir: str = None, + working_dir: str = None, + load_from_cache_file: bool = True, + **kwargs, + ) -> "Dataset": + """Create a Dataset from Spark DataFrame. Dataset downloading is distributed over Spark workers. + + Read the Spark DataFrame, cache the data in Arrow format on disk and return the Dataset from the memory-mapped Arrow data on disk. + + Args: + df (`pyspark.sql.DataFrame`): + The DataFrame containing the desired data. + split (`NamedSplit`, *optional*): + Split name to be assigned to the dataset. + features (`Features`, *optional*): + Dataset features. + cache_dir (`str`, *optional*, defaults to `"~/.cache/huggingface/datasets"`): + Directory to cache data. When using a multi-node Spark cluster, the cache_dir must be accessible to both + workers and the driver. + keep_in_memory (`bool`): + Whether to copy the data in-memory. + working_dir (`str`, *optional*) + Intermediate directory for each Spark worker to write data to before moving it to `cache_dir`. Setting + a non-NFS intermediate directory may improve performance. + load_from_cache_file (`bool`): + Whether to load the dataset from the cache if possible. + + Returns: + [`Dataset`] + + Example: + + ```py + >>> df = spark.createDataFrame( + >>> data=[[1, "Elia"], [2, "Teo"], [3, "Fang"]], + >>> columns=["id", "name"], + >>> ) + >>> ds = Dataset.from_spark(df) + ``` + """ + # Dynamic import to avoid circular dependency + from .io.spark import SparkDatasetReader + + if sys.platform == "win32": + raise OSError("Dataset.from_spark is not currently supported on Windows") + + return SparkDatasetReader( + df, + split=split, + features=features, + streaming=False, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + working_dir=working_dir, + load_from_cache_file=load_from_cache_file, + **kwargs, + ).read() + + @staticmethod + def from_sql( + sql: Union[str, "sqlalchemy.sql.Selectable"], + con: Union[str, "sqlalchemy.engine.Connection", "sqlalchemy.engine.Engine", "sqlite3.Connection"], + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + **kwargs, + ) -> "Dataset": + """Create Dataset from SQL query or database table. + + Query the SQL database, cache the data in Arrow format on disk and return the Dataset from the memory-mapped Arrow data on disk. + + Args: + sql (`str` or `sqlalchemy.sql.Selectable`): + SQL query to be executed or a table name. + con (`str` or `sqlite3.Connection` or `sqlalchemy.engine.Connection` or `sqlalchemy.engine.Connection`): + A [URI string](https://docs.sqlalchemy.org/en/13/core/engines.html#database-urls) used to instantiate a database connection or a SQLite3/SQLAlchemy connection object. + features ([`Features`], *optional*): + Dataset features. + cache_dir (`str`, *optional*, defaults to `"~/.cache/huggingface/datasets"`): + Directory to cache data. + keep_in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + **kwargs (additional keyword arguments): + Keyword arguments to be passed to [`SqlConfig`]. + + Returns: + [`Dataset`] + + Example: + + ```py + >>> # Fetch a database table + >>> ds = Dataset.from_sql("test_data", "postgres:///db_name") + >>> # Execute a SQL query on the table + >>> ds = Dataset.from_sql("SELECT sentence FROM test_data", "postgres:///db_name") + >>> # Use a Selectable object to specify the query + >>> from sqlalchemy import select, text + >>> stmt = select([text("sentence")]).select_from(text("test_data")) + >>> ds = Dataset.from_sql(stmt, "postgres:///db_name") + ``` + + > [!TIP] + > The returned dataset can only be cached if `con` is specified as URI string. + """ + from .io.sql import SqlDatasetReader + + return SqlDatasetReader( + sql, + con, + features=features, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + **kwargs, + ).read() + + def __setstate__(self, state): + self.__dict__.update(state) + maybe_register_dataset_for_temp_dir_deletion(self) + return self + + def __del__(self): + if hasattr(self, "_data"): + del self._data + if hasattr(self, "_indices"): + del self._indices + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + # Here `del` is used to del the pyarrow tables. This properly closes the files used for memory mapped tables + self.__del__() + + def save_to_disk( + self, + dataset_path: PathLike, + max_shard_size: Optional[Union[str, int]] = None, + num_shards: Optional[int] = None, + num_proc: Optional[int] = None, + storage_options: Optional[dict] = None, + ): + """ + Saves a dataset to a dataset directory, or in a filesystem using any implementation of `fsspec.spec.AbstractFileSystem`. + + For [`Image`], [`Audio`] and [`Video`] data: + + All the Image(), Audio() and Video() data are stored in the arrow files. + If you want to store paths or urls, please use the Value("string") type. + + Args: + dataset_path (`path-like`): + Path (e.g. `dataset/train`) or remote URI (e.g. `s3://my-bucket/dataset/train`) + of the dataset directory where the dataset will be saved to. + max_shard_size (`int` or `str`, *optional*, defaults to `"500MB"`): + The maximum size of the dataset shards to be saved to the filesystem. If expressed as a string, needs to be digits followed by a unit + (like `"50MB"`). + num_shards (`int`, *optional*): + Number of shards to write. By default the number of shards depends on `max_shard_size` and `num_proc`. + + + num_proc (`int`, *optional*): + Number of processes when downloading and generating the dataset locally. + Multiprocessing is disabled by default. + + + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the file-system backend, if any. + + + + Example: + + ```py + >>> ds.save_to_disk("path/to/dataset/directory") + >>> ds.save_to_disk("path/to/dataset/directory", max_shard_size="1GB") + >>> ds.save_to_disk("path/to/dataset/directory", num_shards=1024) + ``` + """ + if max_shard_size is not None and num_shards is not None: + raise ValueError( + "Failed to push_to_hub: please specify either max_shard_size or num_shards, but not both." + ) + if self.list_indexes(): + raise ValueError("please remove all the indexes using `dataset.drop_index` before saving a dataset") + + if num_shards is None: + dataset_nbytes = self._estimate_nbytes() + max_shard_size = convert_file_size_to_int(max_shard_size or config.MAX_SHARD_SIZE) + num_shards = int(dataset_nbytes / max_shard_size) + 1 + num_shards = max(num_shards, num_proc or 1) + # if we have only a few large samples, we should only create as many shards as samples + num_shards = min(len(self.data), num_shards) + + fs: fsspec.AbstractFileSystem + fs, _ = url_to_fs(dataset_path, **(storage_options or {})) + + if not is_remote_filesystem(fs): + parent_cache_files_paths = { + Path(cache_filename["filename"]).resolve().parent for cache_filename in self.cache_files + } + # Check that the dataset doesn't overwrite itself. It can cause a permission error on Windows and a segfault on linux. + if Path(dataset_path).expanduser().resolve() in parent_cache_files_paths: + raise PermissionError( + f"Tried to overwrite {Path(dataset_path).expanduser().resolve()} but a dataset can't overwrite itself." + ) + + fs.makedirs(dataset_path, exist_ok=True) + + # Get json serializable state + state = { + key: self.__dict__[key] + for key in [ + "_fingerprint", + "_format_columns", + "_format_kwargs", + "_format_type", + "_output_all_columns", + ] + } + state["_split"] = str(self.split) if self.split is not None else self.split + state["_data_files"] = [ + {"filename": f"data-{shard_idx:05d}-of-{num_shards:05d}.arrow"} for shard_idx in range(num_shards) + ] + for k in state["_format_kwargs"].keys(): + try: + json.dumps(state["_format_kwargs"][k]) + except TypeError as e: + raise TypeError( + str(e) + f"\nThe format kwargs must be JSON serializable, but key '{k}' isn't." + ) from None + # Get json serializable dataset info + dataset_info = asdict(self._info) + + shards_done = 0 + pbar = hf_tqdm( + unit=" examples", + total=len(self), + desc=f"Saving the dataset ({shards_done}/{num_shards} shards)", + ) + kwargs_per_job = ( + { + "job_id": shard_idx, + "shard": self.shard(num_shards=num_shards, index=shard_idx, contiguous=True), + "fpath": posixpath.join(dataset_path, f"data-{shard_idx:05d}-of-{num_shards:05d}.arrow"), + "storage_options": storage_options, + } + for shard_idx in range(num_shards) + ) + shard_lengths = [None] * num_shards + shard_sizes = [None] * num_shards + if num_proc is not None and num_proc >= 1: + with mp.get_context("spawn").Pool(num_proc) as pool: + with pbar: + for job_id, done, content in iflatmap_unordered( + pool, Dataset._save_to_disk_single, kwargs_iterable=kwargs_per_job + ): + if done: + shards_done += 1 + pbar.set_description(f"Saving the dataset ({shards_done}/{num_shards} shards)") + logger.debug(f"Finished writing shard number {job_id} of {num_shards}.") + shard_lengths[job_id], shard_sizes[job_id] = content + else: + pbar.update(content) + else: + with pbar: + for kwargs in kwargs_per_job: + for job_id, done, content in Dataset._save_to_disk_single(**kwargs): + if done: + shards_done += 1 + pbar.set_description(f"Saving the dataset ({shards_done}/{num_shards} shards)") + logger.debug(f"Finished writing shard number {job_id} of {num_shards}.") + shard_lengths[job_id], shard_sizes[job_id] = content + else: + pbar.update(content) + with fs.open( + posixpath.join(dataset_path, config.DATASET_STATE_JSON_FILENAME), "w", encoding="utf-8" + ) as state_file: + json.dump(state, state_file, indent=2, sort_keys=True) + with fs.open( + posixpath.join(dataset_path, config.DATASET_INFO_FILENAME), "w", encoding="utf-8" + ) as dataset_info_file: + # Sort only the first level of keys, or we might shuffle fields of nested features if we use sort_keys=True + sorted_keys_dataset_info = {key: dataset_info[key] for key in sorted(dataset_info)} + json.dump(sorted_keys_dataset_info, dataset_info_file, indent=2) + + @staticmethod + def _save_to_disk_single(job_id: int, shard: "Dataset", fpath: str, storage_options: Optional[dict]): + batch_size = config.DEFAULT_MAX_BATCH_SIZE + + num_examples_progress_update = 0 + writer = ArrowWriter( + features=shard.features, + path=fpath, + storage_options=storage_options, + embed_local_files=True, + ) + try: + _time = time.time() + for pa_table in shard.with_format("arrow").iter(batch_size): + writer.write_table(pa_table) + num_examples_progress_update += len(pa_table) + if time.time() > _time + config.PBAR_REFRESH_TIME_INTERVAL: + _time = time.time() + yield job_id, False, num_examples_progress_update + num_examples_progress_update = 0 + finally: + yield job_id, False, num_examples_progress_update + num_examples, num_bytes = writer.finalize() + writer.close() + + yield job_id, True, (num_examples, num_bytes) + + @staticmethod + def _build_local_temp_path(uri_or_path: str) -> Path: + """ + Builds and returns a Path concatenating a local temporary dir with the dir path (or absolute/relative + path extracted from the uri) passed. + + Args: + uri_or_path (`str`): Path (e.g. `"dataset/train"`) or remote URI (e.g. + `"s3://my-bucket/dataset/train"`) to concatenate. + + Returns: + :class:`Path`: the concatenated path (temp dir + path) + """ + src_dataset_path = Path(uri_or_path) + tmp_dir = get_temporary_cache_files_directory() + return Path(tmp_dir, src_dataset_path.relative_to(src_dataset_path.anchor)) + + @staticmethod + def load_from_disk( + dataset_path: PathLike, + keep_in_memory: Optional[bool] = None, + storage_options: Optional[dict] = None, + ) -> "Dataset": + """ + Loads a dataset that was previously saved using [`save_to_disk`] from a dataset directory, or from a + filesystem using any implementation of `fsspec.spec.AbstractFileSystem`. + + Args: + dataset_path (`path-like`): + Path (e.g. `"dataset/train"`) or remote URI (e.g. `"s3//my-bucket/dataset/train"`) + of the dataset directory where the dataset will be loaded from. + keep_in_memory (`bool`, defaults to `None`): + Whether to copy the dataset in-memory. If `None`, the + dataset will not be copied in-memory unless explicitly enabled by setting + `datasets.config.IN_MEMORY_MAX_SIZE` to nonzero. See more details in the + [improve performance](../cache#improve-performance) section. + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the file-system backend, if any. + + + + Returns: + [`Dataset`] or [`DatasetDict`]: + - If `dataset_path` is a path of a dataset directory, the dataset requested. + - If `dataset_path` is a path of a dataset dict directory, a `datasets.DatasetDict` with each split. + + Example: + + ```py + >>> ds = load_from_disk("path/to/dataset/directory") + ``` + """ + fs: fsspec.AbstractFileSystem + fs, dataset_path = url_to_fs(dataset_path, **(storage_options or {})) + + dest_dataset_path = dataset_path + dataset_dict_json_path = posixpath.join(dest_dataset_path, config.DATASETDICT_JSON_FILENAME) + dataset_state_json_path = posixpath.join(dest_dataset_path, config.DATASET_STATE_JSON_FILENAME) + dataset_info_path = posixpath.join(dest_dataset_path, config.DATASET_INFO_FILENAME) + + dataset_dict_is_file = fs.isfile(dataset_dict_json_path) + dataset_info_is_file = fs.isfile(dataset_info_path) + dataset_state_is_file = fs.isfile(dataset_state_json_path) + if not dataset_info_is_file and not dataset_state_is_file: + if dataset_dict_is_file: + raise FileNotFoundError( + f"No such files: '{dataset_info_path}', nor '{dataset_state_json_path}' found. Expected to load a `Dataset` object, but got a `DatasetDict`. Please use either `datasets.load_from_disk` or `DatasetDict.load_from_disk` instead." + ) + raise FileNotFoundError( + f"No such files: '{dataset_info_path}', nor '{dataset_state_json_path}' found. Expected to load a `Dataset` object but provided path is not a `Dataset`." + ) + if not dataset_info_is_file: + if dataset_dict_is_file: + raise FileNotFoundError( + f"No such file: '{dataset_info_path}' found. Expected to load a `Dataset` object, but got a `DatasetDict`. Please use either `datasets.load_from_disk` or `DatasetDict.load_from_disk` instead." + ) + raise FileNotFoundError( + f"No such file: '{dataset_info_path}'. Expected to load a `Dataset` object but provided path is not a `Dataset`." + ) + if not dataset_state_is_file: + if dataset_dict_is_file: + raise FileNotFoundError( + f"No such file: '{dataset_state_json_path}' found. Expected to load a `Dataset` object, but got a `DatasetDict`. Please use either `datasets.load_from_disk` or `DatasetDict.load_from_disk` instead." + ) + raise FileNotFoundError( + f"No such file: '{dataset_state_json_path}'. Expected to load a `Dataset` object but provided path is not a `Dataset`." + ) + + # copies file from filesystem if it is remote filesystem to local filesystem and modifies dataset_path to temp directory containing local copies + if is_remote_filesystem(fs): + src_dataset_path = dest_dataset_path + dest_dataset_path = Dataset._build_local_temp_path(src_dataset_path) + fs.download(src_dataset_path, dest_dataset_path.as_posix(), recursive=True) + dataset_state_json_path = posixpath.join(dest_dataset_path, config.DATASET_STATE_JSON_FILENAME) + dataset_info_path = posixpath.join(dest_dataset_path, config.DATASET_INFO_FILENAME) + + with open(dataset_state_json_path, encoding="utf-8") as state_file: + state = json.load(state_file) + with open(dataset_info_path, encoding="utf-8") as dataset_info_file: + dataset_info = DatasetInfo.from_dict(json.load(dataset_info_file)) + + dataset_size = estimate_dataset_size( + Path(dest_dataset_path, data_file["filename"]) for data_file in state["_data_files"] + ) + keep_in_memory = keep_in_memory if keep_in_memory is not None else is_small_dataset(dataset_size) + table_cls = InMemoryTable if keep_in_memory else MemoryMappedTable + + arrow_table = concat_tables( + thread_map( + table_cls.from_file, + [posixpath.join(dest_dataset_path, data_file["filename"]) for data_file in state["_data_files"]], + tqdm_class=hf_tqdm, + desc="Loading dataset from disk", + # set `disable=None` rather than `disable=False` by default to disable progress bar when no TTY attached + disable=len(state["_data_files"]) <= 16 or None, + ) + ) + + split = state["_split"] + split = Split(split) if split is not None else split + + dataset = Dataset( + arrow_table=arrow_table, + info=dataset_info, + split=split, + fingerprint=state["_fingerprint"], + ) + + format = { + "type": state["_format_type"], + "format_kwargs": state["_format_kwargs"], + "columns": state["_format_columns"], + "output_all_columns": state["_output_all_columns"], + } + dataset = dataset.with_format(**format) + + return dataset + + @property + def data(self) -> Table: + """The Apache Arrow table backing the dataset. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds.data + MemoryMappedTable + text: string + label: int64 + ---- + text: [["compassionately explores the seemingly irreconcilable situation between conservative christian parents and their estranged gay and lesbian children .","the soundtrack alone is worth the price of admission .","rodriguez does a splendid job of racial profiling hollywood style--casting excellent latin actors of all ages--a trend long overdue .","beneath the film's obvious determination to shock at any cost lies considerable skill and determination , backed by sheer nerve .","bielinsky is a filmmaker of impressive talent .","so beautifully acted and directed , it's clear that washington most certainly has a new career ahead of him if he so chooses .","a visual spectacle full of stunning images and effects .","a gentle and engrossing character study .","it's enough to watch huppert scheming , with her small , intelligent eyes as steady as any noir villain , and to enjoy the perfectly pitched web of tension that chabrol spins .","an engrossing portrait of uncompromising artists trying to create something original against the backdrop of a corporate music industry that only seems to care about the bottom line .",...,"ultimately , jane learns her place as a girl , softens up and loses some of the intensity that made her an interesting character to begin with .","ah-nuld's action hero days might be over .","it's clear why deuces wild , which was shot two years ago , has been gathering dust on mgm's shelf .","feels like nothing quite so much as a middle-aged moviemaker's attempt to surround himself with beautiful , half-naked women .","when the precise nature of matthew's predicament finally comes into sharp focus , the revelation fails to justify the build-up .","this picture is murder by numbers , and as easy to be bored by as your abc's , despite a few whopping shootouts .","hilarious musical comedy though stymied by accents thick as mud .","if you are into splatter movies , then you will probably have a reasonably good time with the salton sea .","a dull , simple-minded and stereotypical tale of drugs , death and mind-numbing indifference on the inner-city streets .","the feature-length stretch . . . strains the show's concept ."]] + label: [[1,1,1,1,1,1,1,1,1,1,...,0,0,0,0,0,0,0,0,0,0]] + ``` + """ + return self._data + + @property + def cache_files(self) -> list[dict]: + """The cache files containing the Apache Arrow table backing the dataset. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds.cache_files + [{'filename': '/root/.cache/huggingface/datasets/rotten_tomatoes_movie_review/default/1.0.0/40d411e45a6ce3484deed7cc15b82a53dad9a72aafd9f86f8f227134bec5ca46/rotten_tomatoes_movie_review-validation.arrow'}] + ``` + """ + cache_files = list_table_cache_files(self._data) + if self._indices is not None: + cache_files += list_table_cache_files(self._indices) + return [{"filename": cache_filename} for cache_filename in cache_files] + + @property + def num_columns(self) -> int: + """Number of columns in the dataset. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds.num_columns + 2 + ``` + """ + return self._data.num_columns + + @property + def num_rows(self) -> int: + """Number of rows in the dataset (same as [`Dataset.__len__`]). + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds.num_rows + 1066 + ``` + """ + if self._indices is not None: + return self._indices.num_rows + return self._data.num_rows + + @property + def column_names(self) -> list[str]: + """Names of the columns in the dataset. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds.column_names + ['text', 'label'] + ``` + """ + return self._data.column_names + + @property + def shape(self) -> tuple[int, int]: + """Shape of the dataset (number of columns, number of rows). + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds.shape + (1066, 2) + ``` + """ + if self._indices is not None: + return (self._indices.num_rows, self._data.num_columns) + return self._data.shape + + def unique(self, column: str) -> list: + """Return a list of the unique elements in a column. + + This is implemented in the low-level backend and as such, very fast. + + Args: + column (`str`): + Column name (list all the column names with [`~datasets.Dataset.column_names`]). + + Returns: + `list`: List of unique elements in the given column. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds.unique('label') + [1, 0] + ``` + """ + if column not in self._data.column_names: + raise ValueError(f"Column ({column}) not in table columns ({self._data.column_names}).") + + if self._indices is not None and self._indices.num_rows != self._data.num_rows: + dataset = self.flatten_indices() + else: + dataset = self + + return dataset._data.column(column).unique().to_pylist() + + def class_encode_column(self, column: str, include_nulls: bool = False) -> "Dataset": + """Casts the given column as [`~datasets.features.ClassLabel`] and updates the table. + + Args: + column (`str`): + The name of the column to cast (list all the column names with [`~datasets.Dataset.column_names`]) + include_nulls (`bool`, defaults to `False`): + Whether to include null values in the class labels. If `True`, the null values will be encoded as the `"None"` class label. + + + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("google/boolq", split="validation") + >>> ds.features + {'answer': Value('bool'), + 'passage': Value('string'), + 'question': Value('string')} + >>> ds = ds.class_encode_column('answer') + >>> ds.features + {'answer': ClassLabel(num_classes=2, names=['False', 'True']), + 'passage': Value('string'), + 'question': Value('string')} + ``` + """ + # Sanity checks + if column not in self._data.column_names: + raise ValueError(f"Column ({column}) not in table columns ({self._data.column_names}).") + src_feat = self._info.features[column] + if not isinstance(src_feat, Value): + raise ValueError( + f"Class encoding is only supported for {Value.__name__} column, and column {column} is {type(src_feat).__name__}." + ) + + if src_feat.dtype != "string" or (include_nulls and None in self.unique(column)): + + def stringify_column(batch): + batch[column] = [ + str(sample) if include_nulls or sample is not None else None for sample in batch[column] + ] + return batch + + dset = self.map( + stringify_column, + batched=True, + desc="Stringifying the column", + ) + else: + dset = self + + # Create the new feature + class_names = sorted(str(sample) for sample in dset.unique(column) if include_nulls or sample is not None) + dst_feat = ClassLabel(names=class_names) + + def cast_to_class_labels(batch): + batch[column] = [ + dst_feat.str2int(str(sample)) if include_nulls or sample is not None else None + for sample in batch[column] + ] + return batch + + new_features = dset.features.copy() + new_features[column] = dst_feat + + dset = dset.map( + cast_to_class_labels, + batched=True, + features=new_features, + desc="Casting to class labels", + ) + + return dset + + @fingerprint_transform(inplace=False) + def flatten(self, new_fingerprint: Optional[str] = None, max_depth=16) -> "Dataset": + """Flatten the table. + Each column with a struct type is flattened into one column per struct field. + Other columns are left unchanged. + + Args: + new_fingerprint (`str`, *optional*): + The new fingerprint of the dataset after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments. + + Returns: + [`Dataset`]: A copy of the dataset with flattened columns. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("rajpurkar/squad", split="train") + >>> ds.features + {'id': Value('string'), + 'title': Value('string'), + 'context': Value('string'), + 'question': Value('string'), + 'answers': {'text': List(Value('string')), + 'answer_start': List(Value('int32'))}} + >>> ds = ds.flatten() + >>> ds + Dataset({ + features: ['id', 'title', 'context', 'question', 'answers.text', 'answers.answer_start'], + num_rows: 87599 + }) + ``` + """ + dataset = copy.deepcopy(self) + for depth in range(1, max_depth): + if any(isinstance(field.type, pa.StructType) for field in dataset._data.schema): + dataset._data = dataset._data.flatten() + else: + break + dataset.info.features = self._info.features.flatten(max_depth=max_depth) + dataset.info.features = Features({col: dataset.info.features[col] for col in dataset.data.column_names}) + dataset._data = update_metadata_with_features(dataset._data, dataset.features) + logger.info(f"Flattened dataset from depth {depth} to depth {1 if depth + 1 < max_depth else 'unknown'}.") + dataset._fingerprint = new_fingerprint + return dataset + + def cast( + self, + features: Features, + batch_size: Optional[int] = 1000, + keep_in_memory: bool = False, + load_from_cache_file: Optional[bool] = None, + cache_file_name: Optional[str] = None, + writer_batch_size: Optional[int] = 1000, + num_proc: Optional[int] = None, + ) -> "Dataset": + """ + Cast the dataset to a new set of features. + + Args: + features ([`Features`]): + New features to cast the dataset to. + The name of the fields in the features must match the current column names. + The type of the data must also be convertible from one type to the other. + For non-trivial conversion, e.g. `str` <-> `ClassLabel` you should use [`~datasets.Dataset.map`] to update the Dataset. + batch_size (`int`, defaults to `1000`): + Number of examples per batch provided to cast. + If `batch_size <= 0` or `batch_size == None` then provide the full dataset as a single batch to cast. + keep_in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + load_from_cache_file (`bool`, defaults to `True` if caching is enabled): + If a cache file storing the current computation from `function` + can be identified, use it instead of recomputing. + cache_file_name (`str`, *optional*, defaults to `None`): + Provide the name of a path for the cache file. It is used to store the + results of the computation instead of the automatically generated cache file name. + writer_batch_size (`int`, defaults to `1000`): + Number of rows per write operation for the cache file writer. + This value is a good trade-off between memory usage during the processing, and processing speed. + Higher value makes the processing do fewer lookups, lower value consume less temporary memory while running [`~datasets.Dataset.map`]. + num_proc (`int`, *optional*, defaults to `None`): + Number of processes for multiprocessing. By default it doesn't + use multiprocessing. + + Returns: + [`Dataset`]: A copy of the dataset with casted features. + + Example: + + ```py + >>> from datasets import load_dataset, ClassLabel, Value + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds.features + {'label': ClassLabel(names=['neg', 'pos']), + 'text': Value('string')} + >>> new_features = ds.features.copy() + >>> new_features['label'] = ClassLabel(names=['bad', 'good']) + >>> new_features['text'] = Value('large_string') + >>> ds = ds.cast(new_features) + >>> ds.features + {'label': ClassLabel(names=['bad', 'good']), + 'text': Value('large_string')} + ``` + """ + if sorted(features) != sorted(self._data.column_names): + raise ValueError( + f"The columns in features ({list(features)}) must be identical " + f"as the columns in the dataset: {self._data.column_names}" + ) + + features = _fix_for_backward_compatible_features(features) + schema = features.arrow_schema + format = self.format + dataset = self.with_format("arrow") + # capture the PyArrow version here to make the lambda serializable on Windows + dataset = dataset.map( + partial(table_cast, schema=schema), + batched=True, + batch_size=batch_size, + keep_in_memory=keep_in_memory, + load_from_cache_file=load_from_cache_file, + cache_file_name=cache_file_name, + writer_batch_size=writer_batch_size, + num_proc=num_proc, + features=features, + desc="Casting the dataset", + ) + dataset = dataset.with_format(**format) + return dataset + + @fingerprint_transform(inplace=False) + def cast_column(self, column: str, feature: FeatureType, new_fingerprint: Optional[str] = None) -> "Dataset": + """Cast column to feature for decoding. + + Args: + column (`str`): + Column name. + feature (`FeatureType`): + Target feature. + new_fingerprint (`str`, *optional*): + The new fingerprint of the dataset after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments. + + Returns: + [`Dataset`] + + Example: + + ```py + >>> from datasets import load_dataset, ClassLabel + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds.features + {'label': ClassLabel(names=['neg', 'pos']), + 'text': Value('string')} + >>> ds = ds.cast_column('label', ClassLabel(names=['bad', 'good'])) + >>> ds.features + {'label': ClassLabel(names=['bad', 'good']), + 'text': Value('string')} + ``` + """ + feature = _fix_for_backward_compatible_features(feature) + if hasattr(feature, "decode_example"): + dataset = copy.deepcopy(self) + dataset._info.features[column] = feature + dataset._fingerprint = new_fingerprint + dataset._data = dataset._data.cast(dataset.features.arrow_schema) + dataset._data = update_metadata_with_features(dataset._data, dataset.features) + return dataset + else: + features = self.features + features[column] = feature + return self.cast(features) + + @transmit_format + @fingerprint_transform(inplace=False) + def remove_columns(self, column_names: Union[str, list[str]], new_fingerprint: Optional[str] = None) -> "Dataset": + """ + Remove one or several column(s) in the dataset and the features associated to them. + + You can also remove a column using [`~datasets.Dataset.map`] with `remove_columns` but the present method + doesn't copy the data of the remaining columns and is thus faster. + + Args: + column_names (`Union[str, List[str]]`): + Name of the column(s) to remove. + new_fingerprint (`str`, *optional*): + The new fingerprint of the dataset after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments. + + Returns: + [`Dataset`]: A copy of the dataset object without the columns to remove. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds = ds.remove_columns('label') + Dataset({ + features: ['text'], + num_rows: 1066 + }) + >>> ds = ds.remove_columns(column_names=ds.column_names) # Removing all the columns returns an empty dataset with the `num_rows` property set to 0 + Dataset({ + features: [], + num_rows: 0 + }) + ``` + """ + dataset = copy.deepcopy(self) + if isinstance(column_names, str): + column_names = [column_names] + + missing_columns = set(column_names) - set(self._data.column_names) + if missing_columns: + raise ValueError( + f"Column name {list(missing_columns)} not in the dataset. " + f"Current columns in the dataset: {dataset._data.column_names}" + ) + + for column_name in column_names: + del dataset._info.features[column_name] + + dataset._data = dataset._data.drop(column_names) + dataset._data = update_metadata_with_features(dataset._data, dataset.features) + dataset._fingerprint = new_fingerprint + return dataset + + @fingerprint_transform(inplace=False) + def rename_column( + self, original_column_name: str, new_column_name: str, new_fingerprint: Optional[str] = None + ) -> "Dataset": + """ + Rename a column in the dataset, and move the features associated to the original column under the new column + name. + + Args: + original_column_name (`str`): + Name of the column to rename. + new_column_name (`str`): + New name for the column. + new_fingerprint (`str`, *optional*): + The new fingerprint of the dataset after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments. + + Returns: + [`Dataset`]: A copy of the dataset with a renamed column. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds = ds.rename_column('label', 'label_new') + Dataset({ + features: ['text', 'label_new'], + num_rows: 1066 + }) + ``` + """ + dataset = copy.deepcopy(self) + if original_column_name not in dataset._data.column_names: + raise ValueError( + f"Original column name {original_column_name} not in the dataset. " + f"Current columns in the dataset: {dataset._data.column_names}" + ) + if new_column_name in dataset._data.column_names: + raise ValueError( + f"New column name {new_column_name} already in the dataset. " + f"Please choose a column name which is not already in the dataset. " + f"Current columns in the dataset: {dataset._data.column_names}" + ) + if not new_column_name: + raise ValueError("New column name is empty.") + + def rename(columns): + return [new_column_name if col == original_column_name else col for col in columns] + + new_column_names = rename(self._data.column_names) + if self._format_columns is not None: + dataset._format_columns = rename(self._format_columns) + + dataset._info.features = Features( + { + new_column_name if col == original_column_name else col: feature + for col, feature in self._info.features.items() + } + ) + + dataset._data = dataset._data.rename_columns(new_column_names) + dataset._data = update_metadata_with_features(dataset._data, dataset.features) + dataset._fingerprint = new_fingerprint + return dataset + + @fingerprint_transform(inplace=False) + def rename_columns(self, column_mapping: dict[str, str], new_fingerprint: Optional[str] = None) -> "Dataset": + """ + Rename several columns in the dataset, and move the features associated to the original columns under + the new column names. + + Args: + column_mapping (`Dict[str, str]`): + A mapping of columns to rename to their new names + new_fingerprint (`str`, *optional*): + The new fingerprint of the dataset after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments. + + Returns: + [`Dataset`]: A copy of the dataset with renamed columns + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds = ds.rename_columns({'text': 'text_new', 'label': 'label_new'}) + Dataset({ + features: ['text_new', 'label_new'], + num_rows: 1066 + }) + ``` + """ + dataset = copy.deepcopy(self) + + extra_columns = set(column_mapping.keys()) - set(dataset.column_names) + if extra_columns: + raise ValueError( + f"Original column names {extra_columns} not in the dataset. " + f"Current columns in the dataset: {dataset._data.column_names}" + ) + + number_of_duplicates_in_new_columns = len(column_mapping.values()) - len(set(column_mapping.values())) + if number_of_duplicates_in_new_columns != 0: + raise ValueError( + "New column names must all be different, but this column mapping " + f"has {number_of_duplicates_in_new_columns} duplicates" + ) + + empty_new_columns = [new_col for new_col in column_mapping.values() if not new_col] + if empty_new_columns: + raise ValueError(f"New column names {empty_new_columns} are empty.") + + def rename(columns): + return [column_mapping[col] if col in column_mapping else col for col in columns] + + new_column_names = rename(self._data.column_names) + if self._format_columns is not None: + dataset._format_columns = rename(self._format_columns) + + dataset._info.features = Features( + { + column_mapping[col] if col in column_mapping else col: feature + for col, feature in (self._info.features or {}).items() + } + ) + + dataset._data = dataset._data.rename_columns(new_column_names) + dataset._data = update_metadata_with_features(dataset._data, dataset.features) + dataset._fingerprint = new_fingerprint + return dataset + + @transmit_format + @fingerprint_transform(inplace=False) + def select_columns(self, column_names: Union[str, list[str]], new_fingerprint: Optional[str] = None) -> "Dataset": + """Select one or several column(s) in the dataset and the features + associated to them. + + Args: + column_names (`Union[str, List[str]]`): + Name of the column(s) to keep. + new_fingerprint (`str`, *optional*): + The new fingerprint of the dataset after transform. If `None`, + the new fingerprint is computed using a hash of the previous + fingerprint, and the transform arguments. + + Returns: + [`Dataset`]: A copy of the dataset object which only consists of + selected columns. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds = ds.select_columns(['text']) + >>> ds + Dataset({ + features: ['text'], + num_rows: 1066 + }) + ``` + """ + if isinstance(column_names, str): + column_names = [column_names] + + missing_columns = set(column_names) - set(self._data.column_names) + if missing_columns: + raise ValueError( + f"Column name {list(missing_columns)} not in the " + "dataset. Current columns in the dataset: " + f"{self._data.column_names}." + ) + + dataset = copy.deepcopy(self) + dataset._data = dataset._data.select(column_names) + dataset._info.features = Features({col: self._info.features[col] for col in dataset._data.column_names}) + dataset._data = update_metadata_with_features(dataset._data, dataset.features) + dataset._fingerprint = new_fingerprint + return dataset + + @transmit_format + def _fast_select_column(self, column_name: str) -> "Dataset": + dataset = copy.copy(self) + dataset._data = dataset._data.select([column_name]) + dataset._info = DatasetInfo(features=Features({column_name: self._info.features[column_name]})) + return dataset + + def __len__(self): + """Number of rows in the dataset. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds.__len__ + + ``` + """ + return self.num_rows + + def __iter__(self): + """Iterate through the examples. + + If a formatting is set with [`Dataset.set_format`] rows will be returned with the + selected format. + """ + if self._indices is None: + # Fast iteration + # Benchmark: https://gist.github.com/mariosasko/0248288a2e3a7556873969717c1fe52b (fast_iter_batch) + format_kwargs = self._format_kwargs if self._format_kwargs is not None else {} + formatter = get_formatter(self._format_type, features=self._info.features, **format_kwargs) + batch_size = config.ARROW_READER_BATCH_SIZE_IN_DATASET_ITER + for pa_subtable in table_iter(self.data, batch_size=batch_size): + for i in range(pa_subtable.num_rows): + pa_subtable_ex = pa_subtable.slice(i, 1) + formatted_output = format_table( + pa_subtable_ex, + 0, + formatter=formatter, + format_columns=self._format_columns, + output_all_columns=self._output_all_columns, + ) + yield formatted_output + else: + for i in range(self.num_rows): + yield self._getitem( + i, + ) + + def iter(self, batch_size: int, drop_last_batch: bool = False): + """Iterate through the batches of size `batch_size`. + + If a formatting is set with [`~datasets.Dataset.set_format`] rows will be returned with the + selected format. + + Args: + batch_size (:obj:`int`): size of each batch to yield. + drop_last_batch (:obj:`bool`, default `False`): Whether a last batch smaller than the batch_size should be + dropped + """ + if self._indices is None: + # Fast iteration + # Benchmark: https://gist.github.com/mariosasko/0248288a2e3a7556873969717c1fe52b (fast_iter_batch) + format_kwargs = self._format_kwargs if self._format_kwargs is not None else {} + formatter = get_formatter(self._format_type, features=self._info.features, **format_kwargs) + for pa_subtable in table_iter(self.data, batch_size=batch_size, drop_last_batch=drop_last_batch): + formatted_batch = format_table( + pa_subtable, + range(pa_subtable.num_rows), + formatter=formatter, + format_columns=self._format_columns, + output_all_columns=self._output_all_columns, + ) + yield formatted_batch + else: + num_rows = self.num_rows if not drop_last_batch else self.num_rows // batch_size * batch_size + for i in range(0, num_rows, batch_size): + yield self._getitem( + slice(i, i + batch_size), + ) + + def __repr__(self): + return f"Dataset({{\n features: {list(self._info.features.keys())},\n num_rows: {self.num_rows}\n}})" + + @property + def format(self): + return { + "type": self._format_type, + "format_kwargs": self._format_kwargs, + "columns": self.column_names if self._format_columns is None else self._format_columns, + "output_all_columns": self._output_all_columns, + } + + @contextlib.contextmanager + def formatted_as( + self, + type: Optional[str] = None, + columns: Optional[list] = None, + output_all_columns: bool = False, + **format_kwargs, + ): + """To be used in a `with` statement. Set `__getitem__` return format (type and columns). + + Args: + type (`str`, *optional*): + Either output type selected in `[None, 'numpy', 'torch', 'tensorflow', 'jax', 'arrow', 'pandas', 'polars']`. + `None` means `__getitem__`` returns python objects (default). + columns (`List[str]`, *optional*): + Columns to format in the output. + `None` means `__getitem__` returns all columns (default). + output_all_columns (`bool`, defaults to `False`): + Keep un-formatted columns as well in the output (as python objects). + **format_kwargs (additional keyword arguments): + Keywords arguments passed to the convert function like `np.array`, `torch.tensor` or `tensorflow.ragged.constant`. + """ + old_format_type = self._format_type + old_format_kwargs = self._format_kwargs + old_format_columns = self._format_columns + old_output_all_columns = self._output_all_columns + try: + self.set_format(type, columns, output_all_columns, **format_kwargs) + yield + finally: + self.set_format(old_format_type, old_format_columns, old_output_all_columns, **old_format_kwargs) + + @fingerprint_transform(inplace=True) + def set_format( + self, + type: Optional[str] = None, + columns: Optional[list] = None, + output_all_columns: bool = False, + **format_kwargs, + ): + """Set `__getitem__` return format (type and columns). The data formatting is applied on-the-fly. + The format `type` (for example "numpy") is used to format batches when using `__getitem__`. + It's also possible to use custom transforms for formatting using [`~datasets.Dataset.set_transform`]. + + Args: + type (`str`, *optional*): + Either output type selected in `[None, 'numpy', 'torch', 'tensorflow', 'jax', 'arrow', 'pandas', 'polars']`. + `None` means `__getitem__` returns python objects (default). + columns (`List[str]`, *optional*): + Columns to format in the output. + `None` means `__getitem__` returns all columns (default). + output_all_columns (`bool`, defaults to `False`): + Keep un-formatted columns as well in the output (as python objects). + **format_kwargs (additional keyword arguments): + Keywords arguments passed to the convert function like `np.array`, `torch.tensor` or `tensorflow.ragged.constant`. + + It is possible to call [`~datasets.Dataset.map`] after calling `set_format`. Since `map` may add new columns, then the list of formatted columns + gets updated. In this case, if you apply `map` on a dataset to add a new column, then this column will be formatted as: + + ``` + new formatted columns = (all columns - previously unformatted columns) + ``` + + Example: + + ```py + >>> from datasets import load_dataset + >>> from transformers import AutoTokenizer + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") + >>> ds = ds.map(lambda x: tokenizer(x['text'], truncation=True, padding=True), batched=True) + >>> ds.set_format(type='numpy', columns=['text', 'label']) + >>> ds.format + {'type': 'numpy', + 'format_kwargs': {}, + 'columns': ['text', 'label'], + 'output_all_columns': False} + ``` + """ + format_kwargs.update(format_kwargs.pop("format_kwargs", {})) # allow to use self.set_format(**self.format) + + # Check that the format_type and format_kwargs are valid and make it possible to have a Formatter + type = get_format_type_from_alias(type) + get_formatter(type, features=self._info.features, **format_kwargs) + + # Check filter column + if isinstance(columns, str): + columns = [columns] + if isinstance(columns, tuple): + columns = list(columns) + if columns is not None: + missing_columns = set(columns) - set(self._data.column_names) + if missing_columns: + raise ValueError( + f"Columns {list(missing_columns)} not in the dataset. Current columns in the dataset: {self._data.column_names}" + ) + if columns is not None: + columns = columns.copy() # Ensures modifications made to the list after this call don't cause bugs + + self._format_type = type + self._format_kwargs = format_kwargs + self._format_columns = columns + self._output_all_columns = output_all_columns + logger.debug( + "Set __getitem__(key) output type to %s for %s columns " + " (when key is int or slice) and %s output other (un-formatted) columns.", + "python objects" if type is None else type, + "no" if columns is None else str(columns), + "do" if output_all_columns else "don't", + ) + + def reset_format(self): + """Reset `__getitem__` return format to python objects and all columns. + + Same as `self.set_format()` + + Example: + + ```py + >>> from datasets import load_dataset + >>> from transformers import AutoTokenizer + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") + >>> ds = ds.map(lambda x: tokenizer(x['text'], truncation=True, padding=True), batched=True) + >>> ds.set_format(type='numpy', columns=['input_ids', 'token_type_ids', 'attention_mask', 'label']) + >>> ds.format + {'columns': ['input_ids', 'token_type_ids', 'attention_mask', 'label'], + 'format_kwargs': {}, + 'output_all_columns': False, + 'type': 'numpy'} + >>> ds.reset_format() + >>> ds.format + {'columns': ['text', 'label', 'input_ids', 'token_type_ids', 'attention_mask'], + 'format_kwargs': {}, + 'output_all_columns': False, + 'type': None} + ``` + """ + self.set_format() + + def set_transform( + self, + transform: Optional[Callable], + columns: Optional[list] = None, + output_all_columns: bool = False, + ): + """Set `__getitem__` return format using this transform. The transform is applied on-the-fly on batches when `__getitem__` is called. + As [`~datasets.Dataset.set_format`], this can be reset using [`~datasets.Dataset.reset_format`]. + + Args: + transform (`Callable`, *optional*): + User-defined formatting transform, replaces the format defined by [`~datasets.Dataset.set_format`]. + A formatting function is a callable that takes a batch (as a `dict`) as input and returns a batch. + This function is applied right before returning the objects in `__getitem__`. + columns (`List[str]`, *optional*): + Columns to format in the output. + If specified, then the input batch of the transform only contains those columns. + output_all_columns (`bool`, defaults to `False`): + Keep un-formatted columns as well in the output (as python objects). + If set to True, then the other un-formatted columns are kept with the output of the transform. + + Example: + + ```py + >>> from datasets import load_dataset + >>> from transformers import AutoTokenizer + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased') + >>> def encode(batch): + ... return tokenizer(batch['text'], padding=True, truncation=True, return_tensors='pt') + >>> ds.set_transform(encode) + >>> ds[0] + {'attention_mask': tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1]), + 'input_ids': tensor([ 101, 29353, 2135, 15102, 1996, 9428, 20868, 2890, 8663, 6895, + 20470, 2571, 3663, 2090, 4603, 3017, 3008, 1998, 2037, 24211, + 5637, 1998, 11690, 2336, 1012, 102]), + 'token_type_ids': tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0])} + ``` + """ + self.set_format("custom", columns=columns, output_all_columns=output_all_columns, transform=transform) + + def with_format( + self, + type: Optional[str] = None, + columns: Optional[list] = None, + output_all_columns: bool = False, + **format_kwargs, + ): + """Set `__getitem__` return format (type and columns). The data formatting is applied on-the-fly. + The format `type` (for example "numpy") is used to format batches when using `__getitem__`. + + It's also possible to use custom transforms for formatting using [`~datasets.Dataset.with_transform`]. + + Contrary to [`~datasets.Dataset.set_format`], `with_format` returns a new [`Dataset`] object. + + Args: + type (`str`, *optional*): + Either output type selected in `[None, 'numpy', 'torch', 'tensorflow', 'jax', 'arrow', 'pandas', 'polars']`. + `None` means `__getitem__` returns python objects (default). + columns (`List[str]`, *optional*): + Columns to format in the output. + `None` means `__getitem__` returns all columns (default). + output_all_columns (`bool`, defaults to `False`): + Keep un-formatted columns as well in the output (as python objects). + **format_kwargs (additional keyword arguments): + Keywords arguments passed to the convert function like `np.array`, `torch.tensor` or `tensorflow.ragged.constant`. + + Example: + + ```py + >>> from datasets import load_dataset + >>> from transformers import AutoTokenizer + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") + >>> ds = ds.map(lambda x: tokenizer(x['text'], truncation=True, padding=True), batched=True) + >>> ds.format + {'columns': ['text', 'label', 'input_ids', 'token_type_ids', 'attention_mask'], + 'format_kwargs': {}, + 'output_all_columns': False, + 'type': None} + >>> ds = ds.with_format("torch") + >>> ds.format + {'columns': ['text', 'label', 'input_ids', 'token_type_ids', 'attention_mask'], + 'format_kwargs': {}, + 'output_all_columns': False, + 'type': 'torch'} + >>> ds[0] + {'text': 'compassionately explores the seemingly irreconcilable situation between conservative christian parents and their estranged gay and lesbian children .', + 'label': tensor(1), + 'input_ids': tensor([ 101, 18027, 16310, 16001, 1103, 9321, 178, 11604, 7235, 6617, + 1742, 2165, 2820, 1206, 6588, 22572, 12937, 1811, 2153, 1105, + 1147, 12890, 19587, 6463, 1105, 15026, 1482, 119, 102, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0]), + 'token_type_ids': tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), + 'attention_mask': tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])} + ``` + """ + dataset = copy.deepcopy(self) + dataset.set_format(type=type, columns=columns, output_all_columns=output_all_columns, **format_kwargs) + return dataset + + def with_transform( + self, + transform: Optional[Callable], + columns: Optional[list] = None, + output_all_columns: bool = False, + ): + """Set `__getitem__` return format using this transform. The transform is applied on-the-fly on batches when `__getitem__` is called. + + As [`~datasets.Dataset.set_format`], this can be reset using [`~datasets.Dataset.reset_format`]. + + Contrary to [`~datasets.Dataset.set_transform`], `with_transform` returns a new [`Dataset`] object. + + Args: + transform (`Callable`, `optional`): + User-defined formatting transform, replaces the format defined by [`~datasets.Dataset.set_format`]. + A formatting function is a callable that takes a batch (as a `dict`) as input and returns a batch. + This function is applied right before returning the objects in `__getitem__`. + columns (`List[str]`, `optional`): + Columns to format in the output. + If specified, then the input batch of the transform only contains those columns. + output_all_columns (`bool`, defaults to `False`): + Keep un-formatted columns as well in the output (as python objects). + If set to `True`, then the other un-formatted columns are kept with the output of the transform. + + Example: + + ```py + >>> from datasets import load_dataset + >>> from transformers import AutoTokenizer + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") + >>> def encode(example): + ... return tokenizer(example["text"], padding=True, truncation=True, return_tensors='pt') + >>> ds = ds.with_transform(encode) + >>> ds[0] + {'attention_mask': tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1]), + 'input_ids': tensor([ 101, 18027, 16310, 16001, 1103, 9321, 178, 11604, 7235, 6617, + 1742, 2165, 2820, 1206, 6588, 22572, 12937, 1811, 2153, 1105, + 1147, 12890, 19587, 6463, 1105, 15026, 1482, 119, 102]), + 'token_type_ids': tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0])} + ``` + """ + dataset = copy.deepcopy(self) + dataset.set_transform(transform=transform, columns=columns, output_all_columns=output_all_columns) + return dataset + + def _getitem(self, key: Union[int, slice, str, ListLike[int]], **kwargs) -> Union[dict, list]: + """ + Can be used to index columns (by string names) or rows (by integer, slice, or list-like of integer indices) + """ + if isinstance(key, bool): + raise TypeError("dataset index must be int, str, slice or collection of int, not bool") + format_type = kwargs["format_type"] if "format_type" in kwargs else self._format_type + format_columns = kwargs["format_columns"] if "format_columns" in kwargs else self._format_columns + output_all_columns = ( + kwargs["output_all_columns"] if "output_all_columns" in kwargs else self._output_all_columns + ) + format_kwargs = kwargs["format_kwargs"] if "format_kwargs" in kwargs else self._format_kwargs + format_kwargs = format_kwargs if format_kwargs is not None else {} + formatter = get_formatter(format_type, features=self._info.features, **format_kwargs) + pa_subtable = query_table(self._data, key, indices=self._indices) + formatted_output = format_table( + pa_subtable, key, formatter=formatter, format_columns=format_columns, output_all_columns=output_all_columns + ) + return formatted_output + + @overload + def __getitem__(self, key: Union[int, slice, Iterable[int]]) -> dict: # noqa: F811 + ... + + @overload + def __getitem__(self, key: str) -> list: # noqa: F811 + ... + + def __getitem__(self, key): # noqa: F811 + """Can be used to index columns (by string names) or rows (by integer index or iterable of indices or bools).""" + if isinstance(key, str): + if self._format_type is None or self._format_type not in ("arrow", "pandas", "polars"): + return Column(self, key) + return self._getitem(key) + + def __getitems__(self, keys: list) -> list: + """Can be used to get a batch using a list of integers indices.""" + batch = self.__getitem__(keys) + n_examples = len(batch[next(iter(batch))]) + return [{col: array[i] for col, array in batch.items()} for i in range(n_examples)] + + def cleanup_cache_files(self) -> int: + """Clean up all cache files in the dataset cache directory, excepted the currently used cache file if there is + one. + + Be careful when running this command that no other process is currently using other cache files. + + Returns: + `int`: Number of removed files. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds.cleanup_cache_files() + 10 + ``` + """ + current_cache_files = [os.path.abspath(cache_file["filename"]) for cache_file in self.cache_files] + if not current_cache_files: + return 0 + cache_directory = os.path.dirname(current_cache_files[0]) + logger.info(f"Listing files in {cache_directory}") + files: list[str] = os.listdir(cache_directory) + files_to_remove = [] + for f_name in files: + full_name = os.path.abspath(os.path.join(cache_directory, f_name)) + if f_name.startswith("cache-") and f_name.endswith(".arrow"): + if full_name in current_cache_files: + logger.info(f"Keeping currently used cache file at {full_name}") + continue + files_to_remove.append(full_name) + for file_path in files_to_remove: + logger.info(f"Removing {file_path}") + os.remove(file_path) + return len(files_to_remove) + + def _get_cache_file_path(self, fingerprint): + if is_caching_enabled() and self.cache_files: + cache_file_name = "cache-" + fingerprint + ".arrow" + cache_directory = os.path.dirname(self.cache_files[0]["filename"]) + else: + cache_file_name = "cache-" + generate_random_fingerprint() + ".arrow" + cache_directory = get_temporary_cache_files_directory() + cache_file_path = os.path.join(cache_directory, cache_file_name) + return cache_file_path + + @transmit_format + def map( + self, + function: Optional[Callable] = None, + with_indices: bool = False, + with_rank: bool = False, + input_columns: Optional[Union[str, list[str]]] = None, + batched: bool = False, + batch_size: Optional[int] = 1000, + drop_last_batch: bool = False, + remove_columns: Optional[Union[str, list[str]]] = None, + keep_in_memory: bool = False, + load_from_cache_file: Optional[bool] = None, + cache_file_name: Optional[str] = None, + writer_batch_size: Optional[int] = 1000, + features: Optional[Features] = None, + disable_nullable: bool = False, + fn_kwargs: Optional[dict] = None, + num_proc: Optional[int] = None, + suffix_template: str = "_{rank:05d}_of_{num_proc:05d}", + new_fingerprint: Optional[str] = None, + desc: Optional[str] = None, + try_original_type: Optional[bool] = True, + on_mixed_types: Optional[Literal["use_json"]] = "use_json", + ) -> "Dataset": + """ + Apply a function to all the examples in the table (individually or in batches) and update the table. + If your function returns a column that already exists, then it overwrites it. + + You can specify whether the function should be batched or not with the `batched` parameter: + + - If batched is `False`, then the function takes 1 example in and should return 1 example. + An example is a dictionary, e.g. `{"text": "Hello there !"}`. + - If batched is `True` and `batch_size` is 1, then the function takes a batch of 1 example as input and can return a batch with 1 or more examples. + A batch is a dictionary, e.g. a batch of 1 example is `{"text": ["Hello there !"]}`. + - If batched is `True` and `batch_size` is `n > 1`, then the function takes a batch of `n` examples as input and can return a batch with `n` examples, or with an arbitrary number of examples. + Note that the last batch may have less than `n` examples. + A batch is a dictionary, e.g. a batch of `n` examples is `{"text": ["Hello there !"] * n}`. + + If the function is asynchronous, then `map` will run your function in parallel, with up to one thousand simultaneous calls. + It is recommended to use a `asyncio.Semaphore` in your function if you want to set a maximum number of operations that can run at the same time. + + Args: + function (`Callable`): Function with one of the following signatures: + + - `function(example: Dict[str, Any]) -> Dict[str, Any]` if `batched=False` and `with_indices=False` and `with_rank=False` + - `function(example: Dict[str, Any], *extra_args) -> Dict[str, Any]` if `batched=False` and `with_indices=True` and/or `with_rank=True` (one extra arg for each) + - `function(batch: Dict[str, List]) -> Dict[str, List]` if `batched=True` and `with_indices=False` and `with_rank=False` + - `function(batch: Dict[str, List], *extra_args) -> Dict[str, List]` if `batched=True` and `with_indices=True` and/or `with_rank=True` (one extra arg for each) + + For advanced usage, the function can also return a `pyarrow.Table`. + If the function is asynchronous, then `map` will run your function in parallel. + Moreover if your function returns nothing (`None`), then `map` will run your function and return the dataset unchanged. + If no function is provided, default to identity function: `lambda x: x`. + with_indices (`bool`, defaults to `False`): + Provide example indices to `function`. Note that in this case the + signature of `function` should be `def function(example, idx[, rank]): ...`. + with_rank (`bool`, defaults to `False`): + Provide process rank to `function`. Note that in this case the + signature of `function` should be `def function(example[, idx], rank): ...`. + input_columns (`Optional[Union[str, List[str]]]`, defaults to `None`): + The columns to be passed into `function` + as positional arguments. If `None`, a `dict` mapping to all formatted columns is passed as one argument. + batched (`bool`, defaults to `False`): + Provide batch of examples to `function`. + batch_size (`int`, *optional*, defaults to `1000`): + Number of examples per batch provided to `function` if `batched=True`. + If `batch_size <= 0` or `batch_size == None`, provide the full dataset as a single batch to `function`. + drop_last_batch (`bool`, defaults to `False`): + Whether a last batch smaller than the batch_size should be + dropped instead of being processed by the function. + remove_columns (`Optional[Union[str, List[str]]]`, defaults to `None`): + Remove a selection of columns while doing the mapping. + Columns will be removed before updating the examples with the output of `function`, i.e. if `function` is adding + columns with names in `remove_columns`, these columns will be kept. + keep_in_memory (`bool`, defaults to `False`): + Keep the dataset in memory instead of writing it to a cache file. + load_from_cache_file (`Optional[bool]`, defaults to `True` if caching is enabled): + If a cache file storing the current computation from `function` + can be identified, use it instead of recomputing. + cache_file_name (`str`, *optional*, defaults to `None`): + Provide the name of a path for the cache file. It is used to store the + results of the computation instead of the automatically generated cache file name. + writer_batch_size (`int`, defaults to `1000`): + Number of rows per write operation for the cache file writer. + This value is a good trade-off between memory usage during the processing, and processing speed. + Higher value makes the processing do fewer lookups, lower value consume less temporary memory while running `map`. + features (`Optional[datasets.Features]`, defaults to `None`): + Use a specific Features to store the cache file + instead of the automatically generated one. + disable_nullable (`bool`, defaults to `False`): + Disallow null values in the table. + fn_kwargs (`Dict`, *optional*, defaults to `None`): + Keyword arguments to be passed to `function`. + num_proc (`int`, *optional*, defaults to `None`): + The number of processes to use for multiprocessing. + - If `None` or `0`, no multiprocessing is used and the operation runs in the main process. + - If greater than `1`, one or multiple worker processes are used to process data in parallel. + Note: The function passed to `map()` must be picklable for multiprocessing to work correctly + (i.e., prefer functions defined at the top level of a module, not inside another function or class). + suffix_template (`str`): + If `cache_file_name` is specified, then this suffix + will be added at the end of the base name of each. Defaults to `"_{rank:05d}_of_{num_proc:05d}"`. For example, if `cache_file_name` is "processed.arrow", then for + `rank=1` and `num_proc=4`, the resulting file would be `"processed_00001_of_00004.arrow"` for the default suffix. + new_fingerprint (`str`, *optional*, defaults to `None`): + The new fingerprint of the dataset after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments. + desc (`str`, *optional*, defaults to `None`): + Meaningful description to be displayed alongside with the progress bar while mapping examples. + try_original_type (`Optional[bool]`, defaults to `True`): + Try to keep the types of the original columns (e.g. int32 -> int32). + Set to False if you want to always infer new types. + on_mixed_types (`Literal["use_json"]`, *optional*, defaults to `None`): + If "use_json", use the Json() type for mixed-types fields, + i.e. unstructured fields that contain data without a predefined schema. + In this case, a field with mixed type is set to Json(). + + This allow loading lists with a mix of strings/integers/floats + for example, or dictionaries with arbitrary value types. + + + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> def add_prefix(example): + ... example["text"] = "Review: " + example["text"] + ... return example + >>> ds = ds.map(add_prefix) + >>> ds[0:3]["text"] + ['Review: compassionately explores the seemingly irreconcilable situation between conservative christian parents and their estranged gay and lesbian children .', + 'Review: the soundtrack alone is worth the price of admission .', + 'Review: rodriguez does a splendid job of racial profiling hollywood style--casting excellent latin actors of all ages--a trend long overdue .'] + + # process a batch of examples + >>> ds = ds.map(lambda example: tokenizer(example["text"]), batched=True) + # set number of processors + >>> ds = ds.map(add_prefix, num_proc=4) + ``` + """ + if keep_in_memory and cache_file_name is not None: + raise ValueError("Please use either `keep_in_memory` or `cache_file_name` but not both.") + + if num_proc == 0: + num_proc = None + elif num_proc is not None and num_proc < 0: + raise ValueError("num_proc must be >= 0 or None.") + + string_formatter = string.Formatter() + fields = {field_name for _, field_name, _, _ in string_formatter.parse(suffix_template) if field_name} + if fields != {"rank", "num_proc"}: + raise ValueError(f"suffix_template must contain exactly the fields 'rank' and 'num_proc', got: {fields}") + + # If the array is empty we do nothing (but we make sure to handle an empty indices mapping and remove the requested columns anyway) + if len(self) == 0: + if self._indices is not None: # empty indices mapping + self = Dataset( + self.data.slice(0, 0), + info=self.info.copy(), + split=self.split, + fingerprint=new_fingerprint, + ) + if remove_columns: + return self.remove_columns(remove_columns) + else: + return self + + if function is None: + function = lambda x: x # noqa: E731 + + if isinstance(input_columns, str): + input_columns = [input_columns] + + if input_columns is not None: + missing_columns = set(input_columns) - set(self._data.column_names) + if missing_columns: + raise ValueError( + f"Input column {list(missing_columns)} not in the dataset. Current columns in the dataset: {self._data.column_names}" + ) + + if isinstance(remove_columns, str): + remove_columns = [remove_columns] + + if remove_columns is not None: + missing_columns = set(remove_columns) - set(self._data.column_names) + if missing_columns: + raise ValueError( + f"Column to remove {list(missing_columns)} not in the dataset. Current columns in the dataset: {self._data.column_names}" + ) + + load_from_cache_file = load_from_cache_file if load_from_cache_file is not None else is_caching_enabled() + + if fn_kwargs is None: + fn_kwargs = {} + + if features is not None: + features = _fix_for_backward_compatible_features(features) + + if num_proc is not None and num_proc > len(self): + num_proc = len(self) + logger.warning( + f"num_proc must be <= {len(self)}. Reducing num_proc to {num_proc} for dataset of size {len(self)}." + ) + + dataset_kwargs = { + "shard": self, + "function": function, + "with_indices": with_indices, + "with_rank": with_rank, + "input_columns": input_columns, + "batched": batched, + "batch_size": batch_size, + "drop_last_batch": drop_last_batch, + "remove_columns": remove_columns, + "keep_in_memory": keep_in_memory, + "writer_batch_size": writer_batch_size, + "features": features, + "disable_nullable": disable_nullable, + "fn_kwargs": fn_kwargs, + "try_original_type": try_original_type, + "on_mixed_types": on_mixed_types, + } + + if new_fingerprint is None: + # we create a unique hash from the function, + # current dataset file and the mapping args + transform = format_transform_for_fingerprint(Dataset._map_single) + kwargs_for_fingerprint = format_kwargs_for_fingerprint(Dataset._map_single, (), dataset_kwargs) + kwargs_for_fingerprint["fingerprint_name"] = "new_fingerprint" + new_fingerprint = update_fingerprint(self._fingerprint, transform, kwargs_for_fingerprint) + else: + validate_fingerprint(new_fingerprint) + dataset_kwargs["new_fingerprint"] = new_fingerprint + + if self.cache_files: + if cache_file_name is None: + cache_file_name = self._get_cache_file_path(new_fingerprint) + dataset_kwargs["cache_file_name"] = cache_file_name + + if cache_file_name is not None: + cache_file_prefix, cache_file_ext = os.path.splitext(cache_file_name) + if not cache_file_ext: + raise ValueError(f"Expected cache_file_name to have an extension, but got: {cache_file_name}") + else: + cache_file_prefix = cache_file_ext = None + + def load_processed_shard_from_cache(shard_kwargs: dict[str, Any]) -> Dataset: + """Load a processed shard from cache if it exists, otherwise throw an error.""" + shard = shard_kwargs["shard"] + # Check if we've already cached this computation (indexed by a hash) + if shard_kwargs["cache_file_name"] is not None: + if os.path.exists(shard_kwargs["cache_file_name"]) and load_from_cache_file: + info = shard.info.copy() + info.features = features + return Dataset.from_file(shard_kwargs["cache_file_name"], info=info, split=shard.split) + raise NonExistentDatasetError + + existing_cache_file_map: dict[int, list[str]] = defaultdict(list) + if cache_file_name is not None: + if os.path.exists(cache_file_name): + existing_cache_file_map[1] = [cache_file_name] + + assert cache_file_prefix is not None and cache_file_ext is not None + cache_file_with_suffix_pattern = cache_file_prefix + suffix_template + cache_file_ext + + for cache_file in glob.iglob(f"{cache_file_prefix}*{cache_file_ext}"): + suffix_variable_map = string_to_dict( + Path(cache_file).as_posix(), Path(cache_file_with_suffix_pattern).as_posix() + ) + if suffix_variable_map is not None: + file_num_proc = int(suffix_variable_map["num_proc"]) + existing_cache_file_map[file_num_proc].append(cache_file) + + num_shards = num_proc or 1 + if existing_cache_file_map: + # to avoid remapping when a different num_proc is given than when originally cached, update num_shards to + # what was used originally + + def select_existing_cache_files(mapped_num_proc: int) -> tuple[float, ...]: + percent_missing = (mapped_num_proc - len(existing_cache_file_map[mapped_num_proc])) / mapped_num_proc + num_shards_diff = abs(mapped_num_proc - num_shards) + return ( + percent_missing, # choose the most complete set of existing cache files + num_shards_diff, # then choose the mapped_num_proc closest to the current num_proc + mapped_num_proc, # finally, choose whichever mapped_num_proc is lower + ) + + num_shards = min(existing_cache_file_map, key=select_existing_cache_files) + + def format_cache_file_name( + cache_file_name: Optional[str], + rank: Union[int, Literal["*"]], # noqa: F722 + ) -> Optional[str]: + if not cache_file_name: + return cache_file_name + + assert cache_file_prefix is not None and cache_file_ext is not None + + if isinstance(rank, int): + cache_file_name = ( + cache_file_prefix + suffix_template.format(rank=rank, num_proc=num_shards) + cache_file_ext + ) + if not os.path.exists(cache_file_name): + process_name = ( + "Main process" if num_proc is None or num_proc == 1 else f"Process #{rank % num_shards + 1}" + ) + logger.info(f"{process_name} will write at {cache_file_name}") + else: + # TODO: this assumes the format_spec of rank in suffix_template + cache_file_name = ( + cache_file_prefix + + suffix_template.replace("{rank:05d}", "{rank}").format(rank=rank, num_proc=num_shards) + + cache_file_ext + ) + return cache_file_name + + def format_new_fingerprint(new_fingerprint: str, rank: int) -> str: + new_fingerprint = new_fingerprint + suffix_template.format(rank=rank, num_proc=num_shards) + validate_fingerprint(new_fingerprint) + return new_fingerprint + + if num_proc is not None and num_proc >= 1: + prev_env = deepcopy(os.environ) + # check if parallelism if off + # from https://github.com/huggingface/tokenizers/blob/bb668bc439dc34389b71dbb8ce0c597f15707b53/tokenizers/src/utils/parallelism.rs#L22 + if prev_env.get("TOKENIZERS_PARALLELISM", "false").lower() not in ( + "", + "off", + "false", + "f", + "no", + "n", + "0", + ): + logger.warning("Setting TOKENIZERS_PARALLELISM=false for forked processes.") + os.environ["TOKENIZERS_PARALLELISM"] = "false" + else: + prev_env = os.environ + + kwargs_per_job: list[Optional[dict[str, Any]]] + if num_shards == 1: + shards = [self] + kwargs_per_job = [dataset_kwargs] + else: + shards = [ + self.shard(num_shards=num_shards, index=rank, contiguous=True, keep_in_memory=keep_in_memory) + for rank in range(num_shards) + ] + kwargs_per_job = [ + { + **dataset_kwargs, + "shard": shards[rank], + "cache_file_name": format_cache_file_name(cache_file_name, rank), + "rank": rank, + "offset": sum(len(s) for s in shards[:rank]), + "new_fingerprint": format_new_fingerprint(new_fingerprint, rank), + } + for rank in range(num_shards) + ] + + transformed_shards: list[Optional[Dataset]] = [None] * num_shards + for rank in range(num_shards): + try: + job_kwargs = kwargs_per_job[rank] + assert job_kwargs is not None + transformed_shards[rank] = load_processed_shard_from_cache(job_kwargs) + kwargs_per_job[rank] = None + except NonExistentDatasetError: + pass + + if unprocessed_kwargs_per_job := [kwargs for kwargs in kwargs_per_job if kwargs is not None]: + if len(unprocessed_kwargs_per_job) != num_shards: + logger.info( + f"Reprocessing {len(unprocessed_kwargs_per_job)}/{num_shards} shards because some of them were " + "missing from the cache." + ) + + pbar_total = len(self) + num_shards_done = num_shards - len(unprocessed_kwargs_per_job) + pbar_initial = num_shards_done * pbar_total // num_shards + if batched and drop_last_batch: + batch_size = batch_size or 1 + pbar_initial = pbar_initial // num_shards // batch_size * num_shards * batch_size + pbar_total = pbar_total // num_shards // batch_size * num_shards * batch_size + + with hf_tqdm( + unit=" examples", + initial=pbar_initial, + total=pbar_total, + desc=(desc or "Map") + (f" (num_proc={num_proc})" if num_proc is not None and num_proc >= 1 else ""), + ) as pbar: + shards_done = 0 + + def check_if_shard_done(rank: Optional[int], done: bool, content: Union[Dataset, int]) -> None: + nonlocal shards_done + if done: + shards_done += 1 + logger.debug(f"Finished processing shard number {rank} of {num_shards}.") + assert isinstance(content, Dataset) + transformed_shards[rank or 0] = content + else: + assert isinstance(content, int) + pbar.update(content) + + if num_proc is not None and num_proc >= 1: + with mp.Pool(num_proc) as pool: + os.environ = prev_env + logger.info(f"Spawning {num_proc} processes") + + for rank, done, content in iflatmap_unordered( + pool, Dataset._map_single, kwargs_iterable=unprocessed_kwargs_per_job + ): + check_if_shard_done(rank, done, content) + + pool.close() + pool.join() + else: + for unprocessed_kwargs in unprocessed_kwargs_per_job: + for rank, done, content in Dataset._map_single(**unprocessed_kwargs): + check_if_shard_done(rank, done, content) + + # Avoids PermissionError on Windows (the error: https://github.com/huggingface/datasets/actions/runs/4026734820/jobs/6921621805) + for job_kwargs in unprocessed_kwargs_per_job: + if "shard" in job_kwargs: + del job_kwargs["shard"] + else: + logger.info(f"Loading cached processed dataset at {format_cache_file_name(cache_file_name, '*')}") + + all_transformed_shards = [shard for shard in transformed_shards if shard is not None] + if len(transformed_shards) != len(all_transformed_shards): + raise ValueError( + f"Failed to retrieve results from map: result list {transformed_shards} still contains None - " + "at least one worker failed to return its results" + ) + + if num_shards == 1: + result = all_transformed_shards[0] + else: + logger.info(f"Concatenating {num_shards} shards") + result = _concatenate_map_style_datasets(all_transformed_shards) + + # update fingerprint if the dataset changed + result._fingerprint = ( + new_fingerprint + if any( + transformed_shard._fingerprint != shard._fingerprint + for transformed_shard, shard in zip(all_transformed_shards, shards) + ) + else self._fingerprint + ) + + return result + + @staticmethod + def _map_single( + shard: "Dataset", + function: Optional[Callable] = None, + with_indices: bool = False, + with_rank: bool = False, + input_columns: Optional[list[str]] = None, + batched: bool = False, + batch_size: Optional[int] = 1000, + drop_last_batch: bool = False, + remove_columns: Optional[list[str]] = None, + keep_in_memory: bool = False, + cache_file_name: Optional[str] = None, + writer_batch_size: Optional[int] = 1000, + features: Optional[Features] = None, + disable_nullable: bool = False, + fn_kwargs: Optional[dict] = None, + new_fingerprint: Optional[str] = None, + rank: Optional[int] = None, + offset: int = 0, + try_original_type: Optional[bool] = True, + on_mixed_types: Optional[Literal["use_json"]] = "use_json", + ) -> Iterable[tuple[Optional[int], bool, Union[int, "Dataset"]]]: + """Apply a function to all the elements in the table (individually or in batches) + and update the table (if function does update examples). + + Args: + shard (`datasets.Dataset`): Dataset to map the transform on. + function (`Callable`): with one of the following signature: + - `function(example: Dict[str, Any]) -> Dict[str, Any]` if `batched=False` and `with_indices=False` and `with_rank=False` + - `function(example: Dict[str, Any], *extra_args) -> Dict[str, Any]` if `batched=False` and `with_indices=True` and/or `with_rank=True` (one extra arg for each) + - `function(batch: Dict[str, List]) -> Dict[str, List]` if `batched=True` and `with_indices=False` and `with_rank=False` + - `function(batch: Dict[str, List], *extra_args) -> Dict[str, List]` if `batched=True` and `with_indices=True` and/or `with_rank=True` (one extra arg for each) + + For advanced usage, the function can also return a `pyarrow.Table`. + Moreover if your function returns nothing (`None`), then `map` will run your function and return the dataset unchanged. + If no function is provided, default to identity function: lambda x: x + with_indices (`bool`, defaults to `False`): Provide example indices to `function`. Note that in this case the signature of `function` should be `def function(example, idx[, rank]): ...`. + with_rank (`bool`, default `False`): Provide process rank to `function`. Note that in this case the signature of `function` should be `def function(example[, idx], rank): ...`. + input_columns (`Optional[List[str]]`, defaults to `None`): The columns to be passed into `function` as + positional arguments. If `None`, a dict mapping to all formatted columns is passed as one argument. + batched (`bool`, defaults to `False`): Provide batch of examples to `function` + batch_size (`int`, optional, defaults to `1000`): Number of examples per batch provided to `function` if `batched=True` + `batch_size <= 0` or `batch_size == None`: Provide the full dataset as a single batch to `function` + drop_last_batch (`bool`, default: `False`): Whether a last batch smaller than the batch_size should be + dropped instead of being processed by the function. + remove_columns (`Optional[List[str]]`, defaults to `None`): Remove a selection of columns while doing the mapping. + Columns will be removed before updating the examples with the output of `function`, i.e. if `function` is adding + columns with names in `remove_columns`, these columns will be kept. + keep_in_memory (`bool`, defaults to `False`): Keep the dataset in memory instead of writing it to a cache file. + cache_file_name (`str`, optional, defaults to `None`): Provide the name of a path for the cache file. It is used to store the + results of the computation instead of the automatically generated cache file name. + writer_batch_size (`int`, default `1000`): Number of rows per write operation for the cache file writer. + This value is a good trade-off between memory usage during the processing, and processing speed. + Higher value makes the processing do fewer lookups, lower value consume less temporary memory while running `.map()`. + features (`Optional[datasets.Features]`, defaults to `None`): Use a specific Features to store the cache file + instead of the automatically generated one. + disable_nullable (`bool`, defaults to `False`): Disallow null values in the table. + fn_kwargs (`Dict`, optional, defaults to `None`): Keyword arguments to be passed to `function` + new_fingerprint (`str`, optional, defaults to `None`): the new fingerprint of the dataset after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments + rank: (`int`, optional, defaults to `None`): If specified, this is the process rank when doing multiprocessing + offset: (`int`, defaults to 0): If specified, this is an offset applied to the indices passed to `function` if `with_indices=True`. + try_original_type: (`Optional[bool]`, defaults to `True`): + Try to keep the types of the original columns (e.g. int32 -> int32). + Set to False if you want to always infer new types. + on_mixed_types (`Literal["use_json"]`, *optional*, defaults to `None`): + If "use_json", use the Json() type for mixed-types fields, + i.e. unstructured fields that contain data without a predefined schema. + In this case, a field with mixed type is set to Json(). + + This allow loading lists with a mix of strings/integers/floats + for example, or dictionaries with arbitrary value types. + + + """ + if fn_kwargs is None: + fn_kwargs = {} + + # If we do batch computation but no batch size is provided, default to the full dataset + if batched and (batch_size is None or batch_size <= 0): + batch_size = shard.num_rows + + # We set this variable to True after processing the first example/batch in + # `apply_function_on_filtered_inputs` if the map function returns a dict. + # If set to False, no new arrow table will be created + + update_data = None + + format_kwargs = shard._format_kwargs.copy() + # Lazy formatting is only available for the default format (None/python) + if not input_columns and shard._format_type is None: + format_kwargs["lazy"] = True + input_formatter = get_formatter( + shard._format_type, + features=shard.features, + **format_kwargs, + ) + + check_same_num_examples = batched and len(shard.list_indexes()) > 0 + + def validate_function_output(processed_inputs): + """Validate output of the map function.""" + allowed_processed_inputs_types = (Mapping, pa.Table, pd.DataFrame) + if config.POLARS_AVAILABLE and "polars" in sys.modules: + import polars as pl + + allowed_processed_inputs_types += (pl.DataFrame,) + if processed_inputs is not None and not isinstance(processed_inputs, allowed_processed_inputs_types): + raise TypeError( + f"Provided `function` which is applied to all elements of table returns a variable of type {type(processed_inputs)}. Make sure provided `function` returns a variable of type `dict` (or a pyarrow table) to update the dataset or `None` if you are only interested in side effects." + ) + if batched and isinstance(processed_inputs, Mapping): + allowed_batch_return_types = (list, np.ndarray, pd.Series) + if config.POLARS_AVAILABLE and "polars" in sys.modules: + import polars as pl + + allowed_batch_return_types += (pl.Series, pl.DataFrame) + if config.TF_AVAILABLE and "tensorflow" in sys.modules: + import tensorflow as tf + + allowed_batch_return_types += (tf.Tensor,) + if config.TORCH_AVAILABLE and "torch" in sys.modules: + import torch + + allowed_batch_return_types += (torch.Tensor,) + if config.JAX_AVAILABLE and "jax" in sys.modules: + import jax.numpy as jnp + + allowed_batch_return_types += (jnp.ndarray,) + all_dict_values_are_lists = all( + isinstance(value, allowed_batch_return_types) for value in processed_inputs.values() + ) + if all_dict_values_are_lists is False: + raise TypeError( + f"Provided `function` which is applied to all elements of table returns a `dict` of types {[type(x) for x in processed_inputs.values()]}. When using `batched=True`, make sure provided `function` returns a `dict` of types like `{allowed_batch_return_types}`." + ) + + def prepare_inputs(pa_inputs, indices, offset=0): + """Utility to apply the function on a selection of columns.""" + inputs = format_table( + pa_inputs, + 0 if not batched else range(pa_inputs.num_rows), + format_columns=input_columns, + formatter=input_formatter, + ) + fn_args = [inputs] if input_columns is None else [inputs[col] for col in input_columns] + if offset == 0: + effective_indices = indices + else: + effective_indices = [i + offset for i in indices] if isinstance(indices, list) else indices + offset + additional_args = () + if with_indices: + additional_args += (effective_indices,) + if with_rank: + additional_args += (rank,) + return inputs, fn_args, additional_args, fn_kwargs + + def prepare_outputs(pa_inputs, inputs, processed_inputs): + nonlocal update_data + if not (update_data := (processed_inputs is not None)): + return None + if isinstance(processed_inputs, LazyDict): + processed_inputs = { + k: v for k, v in processed_inputs.data.items() if k not in processed_inputs.keys_to_format + } + returned_lazy_dict = True + else: + returned_lazy_dict = False + validate_function_output(processed_inputs) + if shard._format_type or input_columns: + # TODO(QL, MS): ideally the behavior should be the same even if the dataset is formatted (may require major release) + inputs_to_merge = dict(zip(pa_inputs.column_names, pa_inputs.itercolumns())) + elif isinstance(inputs, LazyDict): + inputs_to_merge = { + k: (v if k not in inputs.keys_to_format else pa_inputs[k]) for k, v in inputs.data.items() + } + else: + inputs_to_merge = inputs + if remove_columns is not None: + for column in remove_columns: + # `function` can modify input in-place causing column to be already removed. + if column in inputs_to_merge: + inputs_to_merge.pop(column) + if returned_lazy_dict and column in processed_inputs: + processed_inputs.pop(column) + if check_same_num_examples: + input_num_examples = len(pa_inputs) + processed_inputs_num_examples = len(processed_inputs[next(iter(processed_inputs.keys()))]) + if input_num_examples != processed_inputs_num_examples: + raise DatasetTransformationNotAllowedError( + "Using `.map` in batched mode on a dataset with attached indexes is allowed only if it doesn't create or remove existing examples. You can first run `.drop_index() to remove your index and then re-add it." + ) from None + if isinstance(inputs, Mapping) and isinstance(processed_inputs, Mapping): + # The .map() transform *updates* the dataset: + # the output dictionary contains both the input data and the output data. + # The output dictionary may contain Arrow values from `inputs_to_merge` so that we can re-write them efficiently. + return {**inputs_to_merge, **processed_inputs} + else: + return processed_inputs + + def apply_function(pa_inputs, indices, offset=0): + """Utility to apply the function on a selection of columns.""" + inputs, fn_args, additional_args, fn_kwargs = prepare_inputs(pa_inputs, indices, offset=offset) + processed_inputs = function(*fn_args, *additional_args, **fn_kwargs) + return prepare_outputs(pa_inputs, inputs, processed_inputs) + + async def async_apply_function(pa_inputs, indices, offset=0): + """Utility to apply the function on a selection of columns. Same code but async""" + inputs, fn_args, additional_args, fn_kwargs = prepare_inputs(pa_inputs, indices, offset=offset) + processed_inputs = await function(*fn_args, *additional_args, **fn_kwargs) + return prepare_outputs(pa_inputs, inputs, processed_inputs) + + def init_buffer_and_writer(): + # Prepare output buffer and batched writer in memory or on file if we update the table + writer_features = features + if writer_features is None: + writer_features = shard.features + update_features = True + else: + update_features = False + if keep_in_memory or cache_file_name is None: + buf_writer = pa.BufferOutputStream() + tmp_file = None + writer = ArrowWriter( + features=writer_features, + stream=buf_writer, + writer_batch_size=writer_batch_size, + update_features=update_features, + fingerprint=new_fingerprint, + disable_nullable=disable_nullable, + on_mixed_types=on_mixed_types, + ) + else: + buf_writer = None + logger.info(f"Caching processed dataset at {cache_file_name}") + cache_dir = os.path.dirname(cache_file_name) + os.makedirs(cache_dir, exist_ok=True) + tmp_file = tempfile.NamedTemporaryFile("wb", dir=cache_dir, delete=False) + writer = ArrowWriter( + features=writer_features, + path=tmp_file.name, + writer_batch_size=writer_batch_size, + update_features=update_features, + fingerprint=new_fingerprint, + disable_nullable=disable_nullable, + on_mixed_types=on_mixed_types, + ) + return buf_writer, writer, tmp_file + + tasks: list[asyncio.Task] = [] + if inspect.iscoroutinefunction(function): + try: + loop = asyncio.get_running_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + else: + loop = None + + def iter_outputs(shard_iterable): + nonlocal tasks, loop + if inspect.iscoroutinefunction(function): + indices: Union[list[int], list[list[int]]] = [] + for i, example in shard_iterable: + indices.append(i) + tasks.append(loop.create_task(async_apply_function(example, i, offset=offset))) + # keep the total active tasks under a certain number + if len(tasks) >= config.MAX_NUM_RUNNING_ASYNC_MAP_FUNCTIONS_IN_PARALLEL: + done, pending = loop.run_until_complete( + asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) + ) + while tasks and len(pending) >= config.MAX_NUM_RUNNING_ASYNC_MAP_FUNCTIONS_IN_PARALLEL: + done, pending = loop.run_until_complete( + asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) + ) + # yield finished tasks + while tasks and tasks[0].done(): + yield indices.pop(0), tasks.pop(0).result() + while tasks: + yield indices[0], loop.run_until_complete(tasks[0]) + indices.pop(0), tasks.pop(0) + else: + for i, example in shard_iterable: + yield i, apply_function(example, i, offset=offset) + + num_examples_progress_update = 0 + # If `update_data` is True after processing the first example/batch, initialize these resources with `init_buffer_and_writer` + buf_writer, writer, tmp_file = None, None, None + + # Optionally initialize the writer as a context manager + with contextlib.ExitStack() as stack: + try: + arrow_formatted_shard = shard.with_format("arrow") + + # Loop over single examples or batches and write to buffer/file if examples are to be updated + if not batched: + shard_iterable = enumerate(arrow_formatted_shard) + else: + num_rows = len(shard) if not drop_last_batch else len(shard) // batch_size * batch_size + shard_iterable = zip( + (list(range(i, min(i + batch_size, num_rows))) for i in range(0, num_rows, batch_size)), + arrow_formatted_shard.iter(batch_size, drop_last_batch=drop_last_batch), + ) + if not batched: + _time = time.time() + for i, example in iter_outputs(shard_iterable): + if update_data: + if i == 0: + buf_writer, writer, tmp_file = init_buffer_and_writer() + stack.enter_context(writer) + if isinstance(example, pa.Table): + writer.write_row(example) + elif isinstance(example, pd.DataFrame): + writer.write_row(pa.Table.from_pandas(example)) + elif config.POLARS_AVAILABLE and "polars" in sys.modules: + import polars as pl + + if isinstance(example, pl.DataFrame): + writer.write_row(example.to_arrow()) + else: + writer.write(example) + else: + writer.write(example) + num_examples_progress_update += 1 + if time.time() > _time + config.PBAR_REFRESH_TIME_INTERVAL: + _time = time.time() + yield rank, False, num_examples_progress_update + num_examples_progress_update = 0 + else: + _time = time.time() + for i, batch in iter_outputs(shard_iterable): + num_examples_in_batch = len(i) + if update_data: + if i and i[0] == 0: + buf_writer, writer, tmp_file = init_buffer_and_writer() + stack.enter_context(writer) + if isinstance(batch, pa.Table): + writer.write_table(batch) + elif isinstance(batch, pd.DataFrame): + writer.write_table(pa.Table.from_pandas(batch)) + elif config.POLARS_AVAILABLE and "polars" in sys.modules: + import polars as pl + + if isinstance(batch, pl.DataFrame): + writer.write_table(batch.to_arrow()) + else: + writer.write_batch(batch, try_original_type=try_original_type) + else: + writer.write_batch(batch, try_original_type=try_original_type) + num_examples_progress_update += num_examples_in_batch + if time.time() > _time + config.PBAR_REFRESH_TIME_INTERVAL: + _time = time.time() + yield rank, False, num_examples_progress_update + num_examples_progress_update = 0 + if update_data and writer is not None: + writer.finalize() # close_stream=bool(buf_writer is None)) # We only close if we are writing in a file + except (Exception, KeyboardInterrupt): + yield rank, False, num_examples_progress_update + if update_data: + if writer is not None: + writer.finalize() + if tmp_file is not None: + tmp_file.close() + if os.path.exists(tmp_file.name): + os.remove(tmp_file.name) + if loop: + logger.debug(f"Canceling {len(tasks)} async tasks.") + for task in tasks: + task.cancel(msg="KeyboardInterrupt") + try: + loop.run_until_complete(asyncio.gather(*tasks)) + except (asyncio.CancelledError, ValueError): + logger.debug("Tasks canceled.") + raise + + yield rank, False, num_examples_progress_update + if update_data and tmp_file is not None: + tmp_file.close() + shutil.move(tmp_file.name, cache_file_name) + umask = os.umask(0o666) + os.umask(umask) + os.chmod(cache_file_name, 0o666 & ~umask) + + if update_data: + # Create new Dataset from buffer or file + info = shard.info.copy() + info.features = writer._features + if buf_writer is None: + yield rank, True, Dataset.from_file(cache_file_name, info=info, split=shard.split) + else: + yield rank, True, Dataset.from_buffer(buf_writer.getvalue(), info=info, split=shard.split) + else: + yield rank, True, shard + + @transmit_format + @fingerprint_transform(inplace=False) + def batch( + self, + batch_size: Optional[int] = None, + by_column: Optional[Union[str, list[str]]] = None, + drop_last_batch: bool = False, + num_proc: Optional[int] = None, + new_fingerprint: Optional[str] = None, + ) -> "Dataset": + """ + Group samples from the dataset into batches. + + Specify either `batch_size` to make batches of `batch_size` examples. + + Or use `by_column=column_name` to make batches of successive examples that share + the same value in column `column_name`. + + Args: + batch_size (`int`, optional): + The number of samples in each batch. + by_column (`Union[str, list[str]`, optional): + The column used to batch examples together. + Successive examples with the same value for that column are in grouped the same batch. + This can also be a list of columns if you want to batch by multiple columns. + If batching by column, the batch_size is only used to control the size of the batches + to group together or slice during acculumation. + + + drop_last_batch (`bool`, defaults to `False`): + Whether to drop the last incomplete batch. + num_proc (`int`, *optional*, defaults to `None`): + Max number of processes when generating cache. Already cached shards are loaded sequentially. + new_fingerprint (`str`, *optional*, defaults to `None`): + The new fingerprint of the dataset after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments. + + Returns: + [`Dataset`]: A new Dataset where each item is a batch of multiple samples from the original dataset. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train") + >>> batched_ds = ds.batch(batch_size=4) + >>> batched_ds[0] + {'text': ['compassionately explores the seemingly irreconcilable situation...', ...], # 4 items + 'label': [1, 1, 1, 1]} + ``` + """ + if batch_size is None and by_column is None: + raise ValueError("IterableDataset.batch() misses `batch_size` or `by_column` argument.") + if by_column is not None: + if num_proc: + raise NotImplementedError("Multiprocessed batching by column is not implemented yet") + columns = [by_column] if isinstance(by_column, str) else by_column + _batch_fn = partial( + _batch_accumulate_arrow_table_by_columns, columns=columns, tables_accumulator=[], length=len(self) + ) + with_indices = True + else: + _batch_fn = _batch_arrow_table + with_indices = False + + return self.with_format("arrow").map( + _batch_fn, + with_indices=with_indices, + batched=True, + batch_size=batch_size, + drop_last_batch=drop_last_batch, + num_proc=num_proc, + new_fingerprint=new_fingerprint, + desc="Batching examples", + features=Features({col: List(feature) for col, feature in self.features.items()}), + ) + + @transmit_format + @fingerprint_transform( + inplace=False, ignore_kwargs=["load_from_cache_file", "cache_file_name", "desc"], version="2.0.1" + ) + def filter( + self, + function: Optional[Callable] = None, + with_indices: bool = False, + with_rank: bool = False, + input_columns: Optional[Union[str, list[str]]] = None, + batched: bool = False, + batch_size: Optional[int] = 1000, + keep_in_memory: bool = False, + load_from_cache_file: Optional[bool] = None, + cache_file_name: Optional[str] = None, + writer_batch_size: Optional[int] = 1000, + fn_kwargs: Optional[dict] = None, + num_proc: Optional[int] = None, + suffix_template: str = "_{rank:05d}_of_{num_proc:05d}", + new_fingerprint: Optional[str] = None, + desc: Optional[str] = None, + ) -> "Dataset": + """Apply a filter function to all the elements in the table in batches + and update the table so that the dataset only includes examples according to the filter function. + + If the function is asynchronous, then `filter` will run your function in parallel, with up to one thousand simultaneous calls (configurable). + It is recommended to use a `asyncio.Semaphore` in your function if you want to set a maximum number of operations that can run at the same time. + + Args: + function (`Callable`): Callable with one of the following signatures: + + - `function(example: Dict[str, Any]) -> bool` if `batched=False` and `with_indices=False` and `with_rank=False` + - `function(example: Dict[str, Any], *extra_args) -> bool` if `batched=False` and `with_indices=True` and/or `with_rank=True` (one extra arg for each) + - `function(batch: Dict[str, List]) -> List[bool]` if `batched=True` and `with_indices=False` and `with_rank=False` + - `function(batch: Dict[str, List], *extra_args) -> List[bool]` if `batched=True` and `with_indices=True` and/or `with_rank=True` (one extra arg for each) + + If the function is asynchronous, then `filter` will run your function in parallel. + If no function is provided, defaults to an always `True` function: `lambda x: True`. + with_indices (`bool`, defaults to `False`): + Provide example indices to `function`. Note that in this case the + signature of `function` should be `def function(example, idx[, rank]): ...`. + with_rank (`bool`, defaults to `False`): + Provide process rank to `function`. Note that in this case the + signature of `function` should be `def function(example[, idx], rank): ...`. + input_columns (`str` or `List[str]`, *optional*): + The columns to be passed into `function` as + positional arguments. If `None`, a `dict` mapping to all formatted columns is passed as one argument. + batched (`bool`, defaults to `False`): + Provide batch of examples to `function`. + batch_size (`int`, *optional*, defaults to `1000`): + Number of examples per batch provided to `function` if + `batched = True`. If `batched = False`, one example per batch is passed to `function`. + If `batch_size <= 0` or `batch_size == None`, provide the full dataset as a single batch to `function`. + keep_in_memory (`bool`, defaults to `False`): + Keep the dataset in memory instead of writing it to a cache file. + load_from_cache_file (`Optional[bool]`, defaults to `True` if caching is enabled): + If a cache file storing the current computation from `function` + can be identified, use it instead of recomputing. + cache_file_name (`str`, *optional*): + Provide the name of a path for the cache file. It is used to store the + results of the computation instead of the automatically generated cache file name. + writer_batch_size (`int`, defaults to `1000`): + Number of rows per write operation for the cache file writer. + This value is a good trade-off between memory usage during the processing, and processing speed. + Higher value makes the processing do fewer lookups, lower value consume less temporary memory while running `map`. + fn_kwargs (`dict`, *optional*): + Keyword arguments to be passed to `function`. + num_proc (`int`, *optional*, defaults to `None`): + The number of processes to use for multiprocessing. + - If `None` or `0`, no multiprocessing is used and the operation runs in the main process. + - If greater than `1`, one or multiple worker processes are used to process data in parallel. + Note: The function passed to `map()` must be picklable for multiprocessing to work correctly + (i.e., prefer functions defined at the top level of a module, not inside another function or class). + suffix_template (`str`): + If `cache_file_name` is specified, then this suffix will be added at the end of the base name of each. + For example, if `cache_file_name` is `"processed.arrow"`, then for `rank = 1` and `num_proc = 4`, + the resulting file would be `"processed_00001_of_00004.arrow"` for the default suffix (default + `_{rank:05d}_of_{num_proc:05d}`). + new_fingerprint (`str`, *optional*): + The new fingerprint of the dataset after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments. + desc (`str`, *optional*, defaults to `None`): + Meaningful description to be displayed alongside with the progress bar while filtering examples. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds = ds.filter(lambda x: x["label"] == 1) + >>> ds + Dataset({ + features: ['text', 'label'], + num_rows: 533 + }) + ``` + + """ + if len(self.list_indexes()) > 0: + raise DatasetTransformationNotAllowedError( + "Using `.filter` on a dataset with attached indexes is not allowed. You can first run `.drop_index() to remove your index and then re-add it.`" + ) + + if function is None: + function = lambda x: True # noqa: E731 + + if len(self) == 0: + return self + + # We generally batch the underlying map() to get faster throughput, + # but in case of async we force batch_size=1 to enable parallelism + if inspect.iscoroutinefunction(function) and not batched: + batch_size = 1 + + indices = self.map( + function=partial( + async_get_indices_from_mask_function + if inspect.iscoroutinefunction(function) + else get_indices_from_mask_function, + function, + batched, + with_indices, + with_rank, + input_columns, + self._indices, + ), + with_indices=True, + with_rank=True, + features=Features({"indices": Value("uint64")}), + batched=True, + batch_size=batch_size, + remove_columns=self.column_names, + keep_in_memory=keep_in_memory, + load_from_cache_file=load_from_cache_file, + cache_file_name=cache_file_name, + writer_batch_size=writer_batch_size, + fn_kwargs=fn_kwargs, + num_proc=num_proc, + suffix_template=suffix_template, + new_fingerprint=new_fingerprint, + input_columns=input_columns, + desc=desc or "Filter", + ) + new_dataset = copy.deepcopy(self) + new_dataset._indices = indices.data + new_dataset._fingerprint = new_fingerprint + return new_dataset + + @transmit_format + @fingerprint_transform(inplace=False, ignore_kwargs=["cache_file_name"]) + def flatten_indices( + self, + keep_in_memory: bool = False, + cache_file_name: Optional[str] = None, + writer_batch_size: Optional[int] = 1000, + features: Optional[Features] = None, + disable_nullable: bool = False, + num_proc: Optional[int] = None, + new_fingerprint: Optional[str] = None, + ) -> "Dataset": + """Create and cache a new Dataset by flattening the indices mapping. + + Args: + keep_in_memory (`bool`, defaults to `False`): + Keep the dataset in memory instead of writing it to a cache file. + cache_file_name (`str`, *optional*, default `None`): + Provide the name of a path for the cache file. It is used to store the + results of the computation instead of the automatically generated cache file name. + writer_batch_size (`int`, defaults to `1000`): + Number of rows per write operation for the cache file writer. + This value is a good trade-off between memory usage during the processing, and processing speed. + Higher value makes the processing do fewer lookups, lower value consume less temporary memory while running `map`. + features (`Optional[datasets.Features]`, defaults to `None`): + Use a specific [`Features`] to store the cache file + instead of the automatically generated one. + disable_nullable (`bool`, defaults to `False`): + Allow null values in the table. + num_proc (`int`, optional, default `None`): + Max number of processes when generating cache. Already cached shards are loaded sequentially + new_fingerprint (`str`, *optional*, defaults to `None`): + The new fingerprint of the dataset after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments + """ + + return self.map( + batched=True, # for speed + keep_in_memory=keep_in_memory, + cache_file_name=cache_file_name, + writer_batch_size=writer_batch_size, + features=features, + disable_nullable=disable_nullable, + new_fingerprint=new_fingerprint, + desc="Flattening the indices", + num_proc=num_proc, + ) + + def _new_dataset_with_indices( + self, + indices_cache_file_name: Optional[str] = None, + indices_buffer: Optional[pa.Buffer] = None, + fingerprint: Optional[str] = None, + ) -> "Dataset": + """Return a new Dataset obtained by adding indices (provided in indices_cache_file_name or in a buffer) to the + current Dataset. + """ + + if indices_cache_file_name is None and indices_buffer is None: + raise ValueError("At least one of indices_cache_file_name or indices_buffer must be provided.") + + if fingerprint is None: + raise ValueError("please specify a fingerprint for the dataset with indices") + + if indices_cache_file_name is not None: + indices_table = MemoryMappedTable.from_file(indices_cache_file_name) + else: + indices_table = InMemoryTable.from_buffer(indices_buffer) + + # Return new Dataset object + # don't forget to copy the objects + return Dataset( + self._data, + info=self.info.copy(), + split=self.split, + indices_table=indices_table, + fingerprint=fingerprint, + ) + + @transmit_format + @fingerprint_transform(inplace=False, ignore_kwargs=["indices_cache_file_name"]) + def select( + self, + indices: Iterable, + keep_in_memory: bool = False, + indices_cache_file_name: Optional[str] = None, + writer_batch_size: Optional[int] = 1000, + new_fingerprint: Optional[str] = None, + ) -> "Dataset": + """Create a new dataset with rows selected following the list/array of indices. + + Args: + indices (`range`, `list`, `iterable`, `ndarray` or `Series`): + Range, list or 1D-array of integer indices for indexing. + If the indices correspond to a contiguous range, the Arrow table is simply sliced. + However passing a list of indices that are not contiguous creates indices mapping, which is much less efficient, + but still faster than recreating an Arrow table made of the requested rows. + keep_in_memory (`bool`, defaults to `False`): + Keep the indices mapping in memory instead of writing it to a cache file. + indices_cache_file_name (`str`, *optional*, defaults to `None`): + Provide the name of a path for the cache file. It is used to store the + indices mapping instead of the automatically generated cache file name. + writer_batch_size (`int`, defaults to `1000`): + Number of rows per write operation for the cache file writer. + This value is a good trade-off between memory usage during the processing, and processing speed. + Higher value makes the processing do fewer lookups, lower value consume less temporary memory while running `map`. + new_fingerprint (`str`, *optional*, defaults to `None`): + The new fingerprint of the dataset after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds = ds.select(range(4)) + >>> ds + Dataset({ + features: ['text', 'label'], + num_rows: 4 + }) + ``` + """ + if keep_in_memory and indices_cache_file_name is not None: + raise ValueError("Please use either `keep_in_memory` or `indices_cache_file_name` but not both.") + + if len(self.list_indexes()) > 0: + raise DatasetTransformationNotAllowedError( + "Using `.select` on a dataset with attached indexes is not allowed. You can first run `.drop_index() to remove your index and then re-add it." + ) + + # If the array is empty we do nothing + if len(self) == 0: + return self + + # If indices is a PyArrow array, we convert to NumPy + if isinstance(indices, (pa.Array, pa.ChunkedArray)): + indices = indices.to_numpy().astype(np.int64) + + # Convert generator objects to lists + if isinstance(indices, Iterator): + indices = list(indices) + + # If the indices are contiguous, simply slice the arrow table + if isinstance(indices, range): + if _is_range_contiguous(indices) and indices.start >= 0: + start, length = indices.start, indices.stop - indices.start + return self._select_contiguous(start, length, new_fingerprint=new_fingerprint) + else: + try: + start = next(iter(indices)) + except StopIteration: + # if `indices` is an empty iterable, we return an empty dataset + return self._select_contiguous(0, 0, new_fingerprint=new_fingerprint) + if start >= 0: + counter_from_start = itertools.count(start=start) + if all(i == j for i, j in zip(indices, counter_from_start)): + length = next(counter_from_start) - start + return self._select_contiguous(start, length, new_fingerprint=new_fingerprint) + + # If not contiguous, we need to create a new indices mapping + return self._select_with_indices_mapping( + indices, + keep_in_memory=keep_in_memory, + indices_cache_file_name=indices_cache_file_name, + writer_batch_size=writer_batch_size, + new_fingerprint=new_fingerprint, + ) + + @transmit_format + @fingerprint_transform(inplace=False) + def _select_contiguous( + self, + start: int, + length: int, + new_fingerprint: Optional[str] = None, + ) -> "Dataset": + """Create a new dataset with rows from a contiguous slice of data. + The slice is defined by that start index and its length. + + Args: + start (`int`): start index. + length (`int`): length of the slice to select. + new_fingerprint (`str`, optional, default `None`): the new fingerprint of the dataset after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds._select_contiguous(0, 4) + Dataset({ + features: ['text', 'label'], + num_rows: 4 + }) + ``` + """ + if len(self.list_indexes()) > 0: + raise DatasetTransformationNotAllowedError( + "Using `.select` on a dataset with attached indexes is not allowed. You can first run `.drop_index() to remove your index and then re-add it." + ) + + # If the array is empty we do nothing + if len(self) == 0: + return self + + _check_valid_indices_value(start, len(self)) + _check_valid_indices_value(start + length - 1, len(self)) + if self._indices is None or length == 0: + return Dataset( + self.data.slice(start, length), + info=self.info.copy(), + split=self.split, + fingerprint=new_fingerprint, + ) + else: + return Dataset( + self.data, + info=self.info.copy(), + split=self.split, + indices_table=self._indices.slice(start, length), + fingerprint=new_fingerprint, + ) + + @transmit_format + @fingerprint_transform(inplace=False, ignore_kwargs=["indices_cache_file_name"]) + def _select_with_indices_mapping( + self, + indices: Iterable, + keep_in_memory: bool = False, + indices_cache_file_name: Optional[str] = None, + writer_batch_size: Optional[int] = 1000, + new_fingerprint: Optional[str] = None, + ) -> "Dataset": + """Create a new dataset with rows selected following the list/array of indices. + The new dataset is made by creating a new indices mapping on top of the main arrow table. + + Args: + indices (sequence, iterable, range, ndarray or Series): List or 1D-array of integer indices for indexing. + keep_in_memory (`bool`, default `False`): Keep the indices mapping in memory instead of writing it to a cache file. + indices_cache_file_name (`str`, optional, default `None`): Provide the name of a path for the cache file. It is used to store the + indices mapping instead of the automatically generated cache file name. + writer_batch_size (`int`, default `1000`): Number of rows per write operation for the cache file writer. + This value is a good trade-off between memory usage during the processing, and processing speed. + Higher value makes the processing do fewer lookups, lower value consume less temporary memory while running `.map()`. + new_fingerprint (`str`, optional, default `None`): the new fingerprint of the dataset after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds._select_with_indices_mapping(range(4)) + Dataset({ + features: ['text', 'label'], + num_rows: 4 + }) + ``` + """ + if keep_in_memory and indices_cache_file_name is not None: + raise ValueError("Please use either `keep_in_memory` or `indices_cache_file_name` but not both.") + + if len(self.list_indexes()) > 0: + raise DatasetTransformationNotAllowedError( + "Using `.select` on a dataset with attached indexes is not allowed. You can first run `.drop_index() to remove your index and then re-add it." + ) + + # If the array is empty we do nothing + if len(self) == 0: + return self + + # Prepare the writer for our indices arrow table + if keep_in_memory or indices_cache_file_name is None: + buf_writer = pa.BufferOutputStream() + tmp_file = None + writer = ArrowWriter( + stream=buf_writer, writer_batch_size=writer_batch_size, fingerprint=new_fingerprint, unit="indices" + ) + else: + buf_writer = None + logger.info(f"Caching indices mapping at {indices_cache_file_name}") + cache_dir = os.path.dirname(indices_cache_file_name) + os.makedirs(cache_dir, exist_ok=True) + tmp_file = tempfile.NamedTemporaryFile("wb", dir=cache_dir, delete=False) + writer = ArrowWriter( + path=tmp_file.name, writer_batch_size=writer_batch_size, fingerprint=new_fingerprint, unit="indices" + ) + + indices = indices if isinstance(indices, list) else list(indices) + + size = len(self) + if indices: + _check_valid_indices_value(int(max(indices)), size=size) + _check_valid_indices_value(int(min(indices)), size=size) + else: + return self._select_contiguous(0, 0, new_fingerprint=new_fingerprint) + + indices_array = pa.array(indices, type=pa.uint64()) + # Check if we need to convert indices + if self._indices is not None: + indices_array = self._indices.column(0).take(indices_array) + + indices_table = pa.Table.from_arrays([indices_array], names=["indices"]) + + with writer: + try: + writer.write_table(indices_table) + writer.finalize() # close_stream=bool(buf_writer is None)) We only close if we are writing in a file + except (Exception, KeyboardInterrupt): + if tmp_file is not None: + tmp_file.close() + if os.path.exists(tmp_file.name): + os.remove(tmp_file.name) + raise + + if tmp_file is not None: + tmp_file.close() + shutil.move(tmp_file.name, indices_cache_file_name) + umask = os.umask(0o666) + os.umask(umask) + os.chmod(indices_cache_file_name, 0o666 & ~umask) + + # Return new Dataset object + if buf_writer is None: + return self._new_dataset_with_indices( + indices_cache_file_name=indices_cache_file_name, fingerprint=new_fingerprint + ) + else: + return self._new_dataset_with_indices(indices_buffer=buf_writer.getvalue(), fingerprint=new_fingerprint) + + def skip(self, n: int) -> "Dataset": + """ + Create a new [`Dataset`] that skips the first `n` elements. + + Args: + n (`int`): + Number of elements to skip. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train") + >>> list(ds.take(3)) + [{'label': 1, + 'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'}, + {'label': 1, + 'text': 'the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .'}, + {'label': 1, 'text': 'effective but too-tepid biopic'}] + >>> ds = ds.skip(1) + >>> list(ds.take(3)) + [{'label': 1, + 'text': 'the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .'}, + {'label': 1, 'text': 'effective but too-tepid biopic'}, + {'label': 1, + 'text': 'if you sometimes like to go to the movies to have fun , wasabi is a good place to start .'}] + ``` + """ + return self.select(range(n, len(self))) + + def repeat(self, num_times: int) -> "Dataset": + """ + Create a new [`Dataset`] that repeats the underlying dataset `num_times` times. + + Like itertools.repeat, repeating once just returns the full dataset. + + Args: + num_times (`int`): + Number of times to repeat the dataset. + + Example: + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train") + >>> ds = ds.take(2).repeat(2) + >>> list(ds) + [{'label': 1, + 'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'}, + {'label': 1, + 'text': 'the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .'}, + {'label': 1, 'text': 'effective but too-tepid biopic'}, + {'label': 1, + 'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'}, + {'label': 1, + 'text': 'the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .'}, + {'label': 1, 'text': 'effective but too-tepid biopic'}] + ``` + """ + if num_times is None: + raise ValueError("Map style datasets do not support indefinite repetition.") + return _concatenate_map_style_datasets([self] * num_times) if num_times > 0 else self.select([]) + + def take(self, n: int) -> "Dataset": + """ + Create a new [`Dataset`] with only the first `n` elements. + + Args: + n (`int`): + Number of elements to take. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train") + >>> small_ds = ds.take(2) + >>> list(small_ds) + [{'label': 1, + 'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'}, + {'label': 1, + 'text': 'the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .'}] + ``` + """ + return self.select(range(n)) + + @transmit_format + @fingerprint_transform(inplace=False, ignore_kwargs=["load_from_cache_file", "indices_cache_file_name"]) + def sort( + self, + column_names: Union[str, Sequence_[str]], + reverse: Union[bool, Sequence_[bool]] = False, + null_placement: str = "at_end", + keep_in_memory: bool = False, + load_from_cache_file: Optional[bool] = None, + indices_cache_file_name: Optional[str] = None, + writer_batch_size: Optional[int] = 1000, + new_fingerprint: Optional[str] = None, + ) -> "Dataset": + """Create a new dataset sorted according to a single or multiple columns. + + Args: + column_names (`Union[str, Sequence[str]]`): + Column name(s) to sort by. + reverse (`Union[bool, Sequence[bool]]`, defaults to `False`): + If `True`, sort by descending order rather than ascending. If a single bool is provided, + the value is applied to the sorting of all column names. Otherwise a list of bools with the + same length and order as column_names must be provided. + null_placement (`str`, defaults to `at_end`): + Put `None` values at the beginning if `at_start` or `first` or at the end if `at_end` or `last` + + + keep_in_memory (`bool`, defaults to `False`): + Keep the sorted indices in memory instead of writing it to a cache file. + load_from_cache_file (`Optional[bool]`, defaults to `True` if caching is enabled): + If a cache file storing the sorted indices + can be identified, use it instead of recomputing. + indices_cache_file_name (`str`, *optional*, defaults to `None`): + Provide the name of a path for the cache file. It is used to store the + sorted indices instead of the automatically generated cache file name. + writer_batch_size (`int`, defaults to `1000`): + Number of rows per write operation for the cache file writer. + Higher value gives smaller cache files, lower value consume less temporary memory. + new_fingerprint (`str`, *optional*, defaults to `None`): + The new fingerprint of the dataset after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset('cornell-movie-review-data/rotten_tomatoes', split='validation') + >>> ds['label'][:10] + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + >>> sorted_ds = ds.sort('label') + >>> sorted_ds['label'][:10] + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + >>> another_sorted_ds = ds.sort(['label', 'text'], reverse=[True, False]) + >>> another_sorted_ds['label'][:10] + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ``` + """ + if len(self.list_indexes()) > 0: + raise DatasetTransformationNotAllowedError( + "Using `.sort` on a dataset with attached indexes is not allowed. You can first run `.drop_index() to remove your index and then re-add it." + ) + # If the array is empty we do nothing + if len(self) == 0: + return self + + # Check proper format of and for duplicates in column_names + if isinstance(column_names, str): + column_names = [column_names] + + # Check proper format and length of reverse + if not isinstance(reverse, bool): + if len(reverse) != len(column_names): + raise ValueError( + "Parameter 'reverse' should be either a boolean or a list of booleans with the same length as 'column_names'." + ) + else: + reverse = [reverse] * len(column_names) + + # Check whether column name(s) exist in dataset + for column in column_names: + if not isinstance(column, str) or column not in self._data.column_names: + raise ValueError( + f"Column '{column}' not found in the dataset. Please provide a column selected in: {self._data.column_names}" + ) + + # Change null_placement to conform to pyarrow's sort_indices() while ensuring backwards compatibility + if null_placement not in ["at_start", "at_end"]: + if null_placement == "first": + null_placement = "at_start" + elif null_placement == "last": + null_placement = "at_end" + else: + raise ValueError( + f"null_placement '{null_placement}' is an invalid parameter value. Must be either 'last', 'at_end', 'first' or 'at_start'." + ) + + load_from_cache_file = load_from_cache_file if load_from_cache_file is not None else is_caching_enabled() + + # Check if we've already cached this computation (indexed by a hash) + if self.cache_files: + if indices_cache_file_name is None: + # we create a unique hash from the function, current dataset file and the mapping args + indices_cache_file_name = self._get_cache_file_path(new_fingerprint) + if os.path.exists(indices_cache_file_name) and load_from_cache_file: + logger.info(f"Loading cached sorted indices for dataset at {indices_cache_file_name}") + return self._new_dataset_with_indices( + fingerprint=new_fingerprint, indices_cache_file_name=indices_cache_file_name + ) + + sort_table = query_table( + table=self._data, + key=slice(0, len(self)), + indices=self._indices, + ) + + sort_keys = [ + (col, "ascending" if not col_reverse else "descending") for col, col_reverse in zip(column_names, reverse) + ] + + indices = pc.sort_indices(sort_table, sort_keys=sort_keys, null_placement=null_placement) + + return self.select( + indices=indices, + keep_in_memory=keep_in_memory, + indices_cache_file_name=indices_cache_file_name, + writer_batch_size=writer_batch_size, + new_fingerprint=new_fingerprint, + ) + + @transmit_format + @fingerprint_transform( + inplace=False, randomized_function=True, ignore_kwargs=["load_from_cache_file", "indices_cache_file_name"] + ) + def shuffle( + self, + seed: Optional[int] = None, + generator: Optional[np.random.Generator] = None, + keep_in_memory: bool = False, + load_from_cache_file: Optional[bool] = None, + indices_cache_file_name: Optional[str] = None, + writer_batch_size: Optional[int] = 1000, + new_fingerprint: Optional[str] = None, + ) -> "Dataset": + """Create a new Dataset where the rows are shuffled. + + Currently shuffling uses numpy random generators. + You can either supply a NumPy BitGenerator to use, or a seed to initiate NumPy's default random generator (PCG64). + + Shuffling takes the list of indices `[0:len(my_dataset)]` and shuffles it to create an indices mapping. + However as soon as your [`Dataset`] has an indices mapping, the speed can become 10x slower. + This is because there is an extra step to get the row index to read using the indices mapping, and most importantly, you aren't reading contiguous chunks of data anymore. + To restore the speed, you'd need to rewrite the entire dataset on your disk again using [`Dataset.flatten_indices`], which removes the indices mapping. + This may take a lot of time depending of the size of your dataset though: + + ```python + my_dataset[0] # fast + my_dataset = my_dataset.shuffle(seed=42) + my_dataset[0] # up to 10x slower + my_dataset = my_dataset.flatten_indices() # rewrite the shuffled dataset on disk as contiguous chunks of data + my_dataset[0] # fast again + ``` + + In this case, we recommend switching to an [`IterableDataset`] and leveraging its fast approximate shuffling method [`IterableDataset.shuffle`]. + It only shuffles the shards order and adds a shuffle buffer to your dataset, which keeps the speed of your dataset optimal: + + ```python + my_iterable_dataset = my_dataset.to_iterable_dataset(num_shards=128) + for example in enumerate(my_iterable_dataset): # fast + pass + + shuffled_iterable_dataset = my_iterable_dataset.shuffle(seed=42, buffer_size=100) + + for example in enumerate(shuffled_iterable_dataset): # as fast as before + pass + ``` + + Args: + seed (`int`, *optional*): + A seed to initialize the default BitGenerator if `generator=None`. + If `None`, then fresh, unpredictable entropy will be pulled from the OS. + If an `int` or `array_like[ints]` is passed, then it will be passed to SeedSequence to derive the initial BitGenerator state. + generator (`numpy.random.Generator`, *optional*): + Numpy random Generator to use to compute the permutation of the dataset rows. + If `generator=None` (default), uses `np.random.default_rng` (the default BitGenerator (PCG64) of NumPy). + keep_in_memory (`bool`, default `False`): + Keep the shuffled indices in memory instead of writing it to a cache file. + load_from_cache_file (`Optional[bool]`, defaults to `True` if caching is enabled): + If a cache file storing the shuffled indices + can be identified, use it instead of recomputing. + indices_cache_file_name (`str`, *optional*): + Provide the name of a path for the cache file. It is used to store the + shuffled indices instead of the automatically generated cache file name. + writer_batch_size (`int`, defaults to `1000`): + Number of rows per write operation for the cache file writer. + This value is a good trade-off between memory usage during the processing, and processing speed. + Higher value makes the processing do fewer lookups, lower value consume less temporary memory while running `map`. + new_fingerprint (`str`, *optional*, defaults to `None`): + The new fingerprint of the dataset after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds['label'][:10] + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + + # set a seed + >>> shuffled_ds = ds.shuffle(seed=42) + >>> shuffled_ds['label'][:10] + [1, 0, 1, 1, 0, 0, 0, 0, 0, 0] + ``` + """ + if len(self.list_indexes()) > 0: + raise DatasetTransformationNotAllowedError( + "Using `.shuffle` on a dataset with attached indexes is not allowed. You can first run `.drop_index() to remove your index and then re-add it." + ) + # If the array is empty we do nothing + if len(self) == 0: + return self + + if keep_in_memory and indices_cache_file_name is not None: + raise ValueError("Please use either `keep_in_memory` or `indices_cache_file_name` but not both.") + + if seed is not None and generator is not None: + raise ValueError("Both `seed` and `generator` were provided. Please specify just one of them.") + + if generator is not None and not isinstance(generator, np.random.Generator): + raise ValueError("The provided generator must be an instance of numpy.random.Generator") + + load_from_cache_file = load_from_cache_file if load_from_cache_file is not None else is_caching_enabled() + + if generator is None: + if seed is None: + _, seed, pos, *_ = np.random.get_state() + seed = seed[pos] if pos < 624 else seed[0] + _ = np.random.random() # do 1 step of rng + generator = np.random.default_rng(seed) + + # Check if we've already cached this computation (indexed by a hash) + if self.cache_files: + if indices_cache_file_name is None: + # we create a unique hash from the function, current dataset file and the mapping args + indices_cache_file_name = self._get_cache_file_path(new_fingerprint) + if os.path.exists(indices_cache_file_name) and load_from_cache_file: + logger.info(f"Loading cached shuffled indices for dataset at {indices_cache_file_name}") + return self._new_dataset_with_indices( + fingerprint=new_fingerprint, indices_cache_file_name=indices_cache_file_name + ) + + permutation = generator.permutation(len(self)) + + return self.select( + indices=permutation, + keep_in_memory=keep_in_memory, + indices_cache_file_name=indices_cache_file_name if not keep_in_memory else None, + writer_batch_size=writer_batch_size, + new_fingerprint=new_fingerprint, + ) + + @transmit_format + @fingerprint_transform( + inplace=False, + randomized_function=True, + fingerprint_names=["train_new_fingerprint", "test_new_fingerprint"], + ignore_kwargs=["load_from_cache_file", "train_indices_cache_file_name", "test_indices_cache_file_name"], + ) + def train_test_split( + self, + test_size: Union[float, int, None] = None, + train_size: Union[float, int, None] = None, + shuffle: bool = True, + stratify_by_column: Optional[str] = None, + seed: Optional[int] = None, + generator: Optional[np.random.Generator] = None, + keep_in_memory: bool = False, + load_from_cache_file: Optional[bool] = None, + train_indices_cache_file_name: Optional[str] = None, + test_indices_cache_file_name: Optional[str] = None, + writer_batch_size: Optional[int] = 1000, + train_new_fingerprint: Optional[str] = None, + test_new_fingerprint: Optional[str] = None, + ) -> "DatasetDict": + """Return a dictionary ([`datasets.DatasetDict`]) with two random train and test subsets (`train` and `test` `Dataset` splits). + Splits are created from the dataset according to `test_size`, `train_size` and `shuffle`. + + This method is similar to scikit-learn `train_test_split`. + + Args: + test_size (`Union[float, int, None]`, *optional*): + Size of the test split + If `float`, should be between `0.0` and `1.0` and represent the proportion of the dataset to include in the test split. + If `int`, represents the absolute number of test samples. + If `None`, the value is set to the complement of the train size. + If `train_size` is also `None`, it will be set to `0.25`. + train_size (`Union[float, int, None]`, *optional*): + Size of the train split + If `float`, should be between `0.0` and `1.0` and represent the proportion of the dataset to include in the train split. + If `int`, represents the absolute number of train samples. + If `None`, the value is automatically set to the complement of the test size. + shuffle (`bool`, *optional*, defaults to `True`): + Whether or not to shuffle the data before splitting. + stratify_by_column (`str`, *optional*, defaults to `None`): + The column name of labels to be used to perform stratified split of data. + seed (`int`, *optional*): + A seed to initialize the default BitGenerator if `generator=None`. + If `None`, then fresh, unpredictable entropy will be pulled from the OS. + If an `int` or `array_like[ints]` is passed, then it will be passed to SeedSequence to derive the initial BitGenerator state. + generator (`numpy.random.Generator`, *optional*): + Numpy random Generator to use to compute the permutation of the dataset rows. + If `generator=None` (default), uses `np.random.default_rng` (the default BitGenerator (PCG64) of NumPy). + keep_in_memory (`bool`, defaults to `False`): + Keep the splits indices in memory instead of writing it to a cache file. + load_from_cache_file (`Optional[bool]`, defaults to `True` if caching is enabled): + If a cache file storing the splits indices + can be identified, use it instead of recomputing. + train_cache_file_name (`str`, *optional*): + Provide the name of a path for the cache file. It is used to store the + train split indices instead of the automatically generated cache file name. + test_cache_file_name (`str`, *optional*): + Provide the name of a path for the cache file. It is used to store the + test split indices instead of the automatically generated cache file name. + writer_batch_size (`int`, defaults to `1000`): + Number of rows per write operation for the cache file writer. + This value is a good trade-off between memory usage during the processing, and processing speed. + Higher value makes the processing do fewer lookups, lower value consume less temporary memory while running `map`. + train_new_fingerprint (`str`, *optional*, defaults to `None`): + The new fingerprint of the train set after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments + test_new_fingerprint (`str`, *optional*, defaults to `None`): + The new fingerprint of the test set after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds = ds.train_test_split(test_size=0.2, shuffle=True) + DatasetDict({ + train: Dataset({ + features: ['text', 'label'], + num_rows: 852 + }) + test: Dataset({ + features: ['text', 'label'], + num_rows: 214 + }) + }) + + # set a seed + >>> ds = ds.train_test_split(test_size=0.2, seed=42) + + # stratified split + >>> ds = load_dataset("stanfordnlp/imdb",split="train") + Dataset({ + features: ['text', 'label'], + num_rows: 25000 + }) + >>> ds = ds.train_test_split(test_size=0.2, stratify_by_column="label") + DatasetDict({ + train: Dataset({ + features: ['text', 'label'], + num_rows: 20000 + }) + test: Dataset({ + features: ['text', 'label'], + num_rows: 5000 + }) + }) + ``` + """ + from .dataset_dict import DatasetDict # import here because of circular dependency + + if len(self.list_indexes()) > 0: + raise DatasetTransformationNotAllowedError( + "Using `.train_test_split` on a dataset with attached indexes is not allowed. You can first run `.drop_index() to remove your index and then re-add it." + ) + # If the array is empty we do nothing + if len(self) == 0: + return DatasetDict({"train": self, "test": self}) + + if test_size is None and train_size is None: + test_size = 0.25 + + # Safety checks similar to scikit-learn's ones. + # (adapted from https://github.com/scikit-learn/scikit-learn/blob/fd237278e895b42abe8d8d09105cbb82dc2cbba7/sklearn/model_selection/_split.py#L1750) + n_samples = len(self) + if ( + isinstance(test_size, int) + and (test_size >= n_samples or test_size <= 0) + or isinstance(test_size, float) + and (test_size <= 0 or test_size >= 1) + ): + raise ValueError( + f"test_size={test_size} should be either positive and smaller " + f"than the number of samples {n_samples} or a float in the (0, 1) range" + ) + + if ( + isinstance(train_size, int) + and (train_size >= n_samples or train_size <= 0) + or isinstance(train_size, float) + and (train_size <= 0 or train_size >= 1) + ): + raise ValueError( + f"train_size={train_size} should be either positive and smaller " + f"than the number of samples {n_samples} or a float in the (0, 1) range" + ) + + if train_size is not None and not isinstance(train_size, (int, float)): + raise ValueError(f"Invalid value for train_size: {train_size} of type {type(train_size)}") + if test_size is not None and not isinstance(test_size, (int, float)): + raise ValueError(f"Invalid value for test_size: {test_size} of type {type(test_size)}") + + if isinstance(train_size, float) and isinstance(test_size, float) and train_size + test_size > 1: + raise ValueError( + f"The sum of test_size and train_size = {train_size + test_size}, should be in the (0, 1)" + " range. Reduce test_size and/or train_size." + ) + + if isinstance(test_size, float): + n_test = ceil(test_size * n_samples) + elif isinstance(test_size, int): + n_test = float(test_size) + + if isinstance(train_size, float): + n_train = floor(train_size * n_samples) + elif isinstance(train_size, int): + n_train = float(train_size) + + if train_size is None: + n_train = n_samples - n_test + elif test_size is None: + n_test = n_samples - n_train + + if n_train + n_test > n_samples: + raise ValueError( + f"The sum of train_size and test_size = {n_train + n_test}, " + "should be smaller than the number of " + f"samples {n_samples}. Reduce test_size and/or " + "train_size." + ) + + n_train, n_test = int(n_train), int(n_test) + + if n_train == 0: + raise ValueError( + f"With n_samples={n_samples}, test_size={test_size} and train_size={train_size}, the " + "resulting train set will be empty. Adjust any of the " + "aforementioned parameters." + ) + + load_from_cache_file = load_from_cache_file if load_from_cache_file is not None else is_caching_enabled() + + if generator is None and shuffle is True: + if seed is None: + _, seed, pos, *_ = np.random.get_state() + seed = seed[pos] if pos < 624 else seed[0] + _ = np.random.random() # do 1 step of rng + generator = np.random.default_rng(seed) + + # Check if we've already cached this computation (indexed by a hash) + if self.cache_files: + if train_indices_cache_file_name is None or test_indices_cache_file_name is None: + # we create a unique hash from the function, current dataset file and the mapping args + + if train_indices_cache_file_name is None: + train_indices_cache_file_name = self._get_cache_file_path(train_new_fingerprint) + if test_indices_cache_file_name is None: + test_indices_cache_file_name = self._get_cache_file_path(test_new_fingerprint) + if ( + os.path.exists(train_indices_cache_file_name) + and os.path.exists(test_indices_cache_file_name) + and load_from_cache_file + ): + logger.info( + f"Loading cached split indices for dataset at {train_indices_cache_file_name} and {test_indices_cache_file_name}" + ) + return DatasetDict( + { + "train": self._new_dataset_with_indices( + fingerprint=train_new_fingerprint, indices_cache_file_name=train_indices_cache_file_name + ), + "test": self._new_dataset_with_indices( + fingerprint=test_new_fingerprint, indices_cache_file_name=test_indices_cache_file_name + ), + } + ) + if not shuffle: + if stratify_by_column is not None: + raise ValueError("Stratified train/test split is not implemented for `shuffle=False`") + train_indices = np.arange(n_train) + test_indices = np.arange(n_train, n_train + n_test) + else: + # stratified partition + if stratify_by_column is not None: + if stratify_by_column not in self._info.features.keys(): + raise ValueError(f"Key {stratify_by_column} not found in {self._info.features.keys()}") + if not isinstance(self._info.features[stratify_by_column], ClassLabel): + raise ValueError( + f"Stratifying by column is only supported for {ClassLabel.__name__} column, and column {stratify_by_column} is {type(self._info.features[stratify_by_column]).__name__}." + ) + try: + train_indices, test_indices = next( + stratified_shuffle_split_generate_indices( + np.asarray(self.with_format("numpy")[stratify_by_column]), n_train, n_test, rng=generator + ) + ) + except Exception as error: + if str(error) == "Minimum class count error": + raise ValueError( + f"The least populated class in {stratify_by_column} column has only 1" + " member, which is too few. The minimum" + " number of groups for any class cannot" + " be less than 2." + ) + else: + raise error + + # random partition + else: + permutation = generator.permutation(len(self)) + test_indices = permutation[:n_test] + train_indices = permutation[n_test : (n_test + n_train)] + + train_split = self.select( + indices=train_indices, + keep_in_memory=keep_in_memory, + indices_cache_file_name=train_indices_cache_file_name, + writer_batch_size=writer_batch_size, + new_fingerprint=train_new_fingerprint, + ) + test_split = self.select( + indices=test_indices, + keep_in_memory=keep_in_memory, + indices_cache_file_name=test_indices_cache_file_name, + writer_batch_size=writer_batch_size, + new_fingerprint=test_new_fingerprint, + ) + + return DatasetDict({"train": train_split, "test": test_split}) + + def shard( + self, + num_shards: int, + index: int, + contiguous: bool = True, + keep_in_memory: bool = False, + indices_cache_file_name: Optional[str] = None, + writer_batch_size: Optional[int] = 1000, + ) -> "Dataset": + """Return the `index`-nth shard from dataset split into `num_shards` pieces. + + This shards deterministically. `dataset.shard(n, i)` splits the dataset into contiguous chunks, + so it can be easily concatenated back together after processing. If `len(dataset) % n == l`, then the + first `l` dataset each have length `(len(dataset) // n) + 1`, and the remaining dataset have length `(len(dataset) // n)`. + `datasets.concatenate_datasets([dset.shard(n, i) for i in range(n)])` returns a dataset with the same order as the original. + + Note: n should be less or equal to the number of elements in the dataset `len(dataset)`. + + On the other hand, `dataset.shard(n, i, contiguous=False)` contains all elements of the dataset whose index mod `n = i`. + + Be sure to shard before using any randomizing operator (such as `shuffle`). + It is best if the shard operator is used early in the dataset pipeline. + + Args: + num_shards (`int`): + How many shards to split the dataset into. + index (`int`): + Which shard to select and return. + contiguous: (`bool`, defaults to `True`): + Whether to select contiguous blocks of indices for shards. + keep_in_memory (`bool`, defaults to `False`): + Keep the dataset in memory instead of writing it to a cache file. + indices_cache_file_name (`str`, *optional*): + Provide the name of a path for the cache file. It is used to store the + indices of each shard instead of the automatically generated cache file name. + writer_batch_size (`int`, defaults to `1000`): + This only concerns the indices mapping. + Number of indices per write operation for the cache file writer. + This value is a good trade-off between memory usage during the processing, and processing speed. + Higher value makes the processing do fewer lookups, lower value consume less temporary memory while running `map`. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds + Dataset({ + features: ['text', 'label'], + num_rows: 1066 + }) + >>> ds = ds.shard(num_shards=2, index=0) + >>> ds + Dataset({ + features: ['text', 'label'], + num_rows: 533 + }) + ``` + """ + if not 0 <= index < num_shards: + raise ValueError("index should be in [0, num_shards-1]") + if contiguous: + div = len(self) // num_shards + mod = len(self) % num_shards + start = div * index + min(index, mod) + end = start + div + (1 if index < mod else 0) + indices = range(start, end) + else: + indices = np.arange(index, len(self), num_shards) + + return self.select( + indices=indices, + keep_in_memory=keep_in_memory, + indices_cache_file_name=indices_cache_file_name, + writer_batch_size=writer_batch_size, + ) + + def to_csv( + self, + path_or_buf: Union[PathLike, BinaryIO], + batch_size: Optional[int] = None, + num_proc: Optional[int] = None, + storage_options: Optional[dict] = None, + **to_csv_kwargs, + ) -> int: + """Exports the dataset to csv + + Args: + path_or_buf (`PathLike` or `FileOrBuffer`): + Either a path to a file (e.g. `file.csv`), a remote URI (e.g. `hf://datasets/username/my_dataset_name/data.csv`), + or a BinaryIO, where the dataset will be saved to in the specified format. + batch_size (`int`, *optional*): + Size of the batch to load in memory and write at once. + Defaults to `datasets.config.DEFAULT_MAX_BATCH_SIZE`. + num_proc (`int`, *optional*): + Number of processes for multiprocessing. By default it doesn't + use multiprocessing. `batch_size` in this case defaults to + `datasets.config.DEFAULT_MAX_BATCH_SIZE` but feel free to make it 5x or 10x of the default + value if you have sufficient compute power. + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the file-system backend, if any. + + + **to_csv_kwargs (additional keyword arguments): + Parameters to pass to pandas's [`pandas.DataFrame.to_csv`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_csv.html). + + + + Now, `index` defaults to `False` if not specified. + + If you would like to write the index, pass `index=True` and also set a name for the index column by + passing `index_label`. + + + + Returns: + `int`: The number of characters or bytes written. + + Example: + + ```py + >>> ds.to_csv("path/to/dataset/directory") + ``` + """ + # Dynamic import to avoid circular dependency + from .io.csv import CsvDatasetWriter + + return CsvDatasetWriter( + self, + path_or_buf, + batch_size=batch_size, + num_proc=num_proc, + storage_options=storage_options, + **to_csv_kwargs, + ).write() + + def to_dict(self, batch_size: Optional[int] = None, batched: bool = False) -> Union[dict, Iterator[dict]]: + """Returns the dataset as a Python dict. Can also return a generator for large datasets. + + Args: + batch_size (`int`, *optional*): The size (number of rows) of the batches if `batched` is `True`. + Defaults to `datasets.config.DEFAULT_MAX_BATCH_SIZE`. + batched (`bool`): + Set to `True` to return a generator that yields the dataset as batches + of `batch_size` rows. Defaults to `False` (returns the whole datasets once). + + Returns: + `dict` or `Iterator[dict]` + + Example: + + ```py + >>> ds.to_dict() + ``` + """ + result = query_table( + table=self._data, + key=slice(0, len(self)), + indices=self._indices, + ).to_pydict() + from .utils.json import get_json_field_paths_from_feature, json_decode_field + + for json_field_path in get_json_field_paths_from_feature(self.features): + col, *json_field_subpath = json_field_path + result[col] = [json_decode_field(row, json_field_subpath) for row in result[col]] + return result + + def to_list(self) -> list: + """Returns the dataset as a Python list. + + Returns: + `list` + + Example: + + ```py + >>> ds.to_list() + ``` + """ + result = query_table( + table=self._data, + key=slice(0, len(self)), + indices=self._indices, + ).to_pylist() + from .utils.json import get_json_field_paths_from_feature, json_decode_field + + for json_field_path in get_json_field_paths_from_feature(self.features): + col, *json_field_subpath = json_field_path + for row in result: + row[col] = json_decode_field(row[col], json_field_subpath) + return result + + def to_json( + self, + path_or_buf: Union[PathLike, BinaryIO], + batch_size: Optional[int] = None, + num_proc: Optional[int] = None, + storage_options: Optional[dict] = None, + **to_json_kwargs, + ) -> int: + """Export the dataset to JSON Lines or JSON. + + The default output format is [JSON Lines](https://jsonlines.org/). + To export to [JSON](https://www.json.org), pass `lines=False` argument and the desired `orient`. + + Args: + path_or_buf (`PathLike` or `FileOrBuffer`): + Either a path to a file (e.g. `file.json`), a remote URI (e.g. `hf://datasets/username/my_dataset_name/data.json`), + or a BinaryIO, where the dataset will be saved to in the specified format. + batch_size (`int`, *optional*): + Size of the batch to load in memory and write at once. + Defaults to `datasets.config.DEFAULT_MAX_BATCH_SIZE`. + num_proc (`int`, *optional*): + Number of processes for multiprocessing. By default, it doesn't + use multiprocessing. `batch_size` in this case defaults to + `datasets.config.DEFAULT_MAX_BATCH_SIZE` but feel free to make it 5x or 10x of the default + value if you have sufficient compute power. + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the file-system backend, if any. + + + **to_json_kwargs (additional keyword arguments): + Parameters to pass to pandas's [`pandas.DataFrame.to_json`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_json.html). + Default arguments are `lines=True` and `orient="records". + + + + The parameter `index` defaults to `False` if `orient` is `"split"` or `"table"`. + + If you would like to write the index, pass `index=True`. + + + + Returns: + `int`: The number of characters or bytes written. + + Example: + + ```py + >>> ds.to_json("path/to/dataset/directory/filename.jsonl") + ``` + """ + # Dynamic import to avoid circular dependency + from .io.json import JsonDatasetWriter + + return JsonDatasetWriter( + self, + path_or_buf, + batch_size=batch_size, + num_proc=num_proc, + storage_options=storage_options, + **to_json_kwargs, + ).write() + + def to_pandas( + self, batch_size: Optional[int] = None, batched: bool = False + ) -> Union[pd.DataFrame, Iterator[pd.DataFrame]]: + """Returns the dataset as a `pandas.DataFrame`. Can also return a generator for large datasets. + + Args: + batch_size (`int`, *optional*): + The size (number of rows) of the batches if `batched` is `True`. + Defaults to `datasets.config.DEFAULT_MAX_BATCH_SIZE`. + batched (`bool`): + Set to `True` to return a generator that yields the dataset as batches + of `batch_size` rows. Defaults to `False` (returns the whole datasets once). + + Returns: + `pandas.DataFrame` or `Iterator[pandas.DataFrame]` + + Example: + + ```py + >>> ds.to_pandas() + ``` + """ + if not batched: + return query_table( + table=self._data, + key=slice(0, len(self)), + indices=self._indices, + ).to_pandas(types_mapper=pandas_types_mapper) + else: + batch_size = batch_size if batch_size else config.DEFAULT_MAX_BATCH_SIZE + return ( + query_table( + table=self._data, + key=slice(offset, offset + batch_size), + indices=self._indices, + ).to_pandas(types_mapper=pandas_types_mapper) + for offset in range(0, len(self), batch_size) + ) + + def to_polars( + self, + batch_size: Optional[int] = None, + batched: bool = False, + schema_overrides: Optional[dict] = None, + rechunk: bool = True, + ) -> Union["pl.DataFrame", Iterator["pl.DataFrame"]]: + """Returns the dataset as a `polars.DataFrame`. Can also return a generator for large datasets. + + Args: + batch_size (`int`, *optional*): + The size (number of rows) of the batches if `batched` is `True`. + Defaults to `datasets.config.DEFAULT_MAX_BATCH_SIZE`. + batched (`bool`): + Set to `True` to return a generator that yields the dataset as batches + of `batch_size` rows. Defaults to `False` (returns the whole datasets once). + schema_overrides (`dict`, *optional*): + Support type specification or override of one or more columns; note that + any dtypes inferred from the schema param will be overridden. + rechunk (`bool`): + Make sure that all data is in contiguous memory. Defaults to `True`. + Returns: + `polars.DataFrame` or `Iterator[polars.DataFrame]` + + Example: + + ```py + >>> ds.to_polars() + ``` + """ + if config.POLARS_AVAILABLE: + import polars as pl + + if not batched: + return pl.from_arrow( + query_table( + table=self._data, + key=slice(0, len(self)), + indices=self._indices if self._indices is not None else None, + ), + schema_overrides=schema_overrides, + rechunk=rechunk, + ) + else: + batch_size = batch_size if batch_size else config.DEFAULT_MAX_BATCH_SIZE + return ( + pl.from_arrow( + query_table( + table=self._data, + key=slice(offset, offset + batch_size), + indices=self._indices if self._indices is not None else None, + ), + schema_overrides=schema_overrides, + rechunk=rechunk, + ) + for offset in range(0, len(self), batch_size) + ) + else: + raise ValueError("Polars needs to be installed to be able to return Polars dataframes.") + + def to_parquet( + self, + path_or_buf: Union[PathLike, BinaryIO], + batch_size: Optional[int] = None, + storage_options: Optional[dict] = None, + **parquet_writer_kwargs, + ) -> int: + """Exports the dataset to parquet + + Args: + path_or_buf (`PathLike` or `FileOrBuffer`): + Either a path to a file (e.g. `file.parquet`), a remote URI (e.g. `hf://datasets/username/my_dataset_name/data.parquet`), + or a BinaryIO, where the dataset will be saved to in the specified format. + batch_size (`int`, *optional*): + Size of the batch to load in memory and write at once. + By default it aims for row groups with maximum uncompressed byte size of "100MB", + defined by `datasets.config.MAX_ROW_GROUP_SIZE`. + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the file-system backend, if any. + + + **parquet_writer_kwargs (additional keyword arguments): + Parameters to pass to PyArrow's `pyarrow.parquet.ParquetWriter`. + + Returns: + `int`: The number of characters or bytes written. + + Example: + + ```py + >>> ds.to_parquet("path/to/dataset/directory") + ``` + """ + # Dynamic import to avoid circular dependency + from .io.parquet import ParquetDatasetWriter + + return ParquetDatasetWriter( + self, path_or_buf, batch_size=batch_size, storage_options=storage_options, **parquet_writer_kwargs + ).write() + + def to_sql( + self, + name: str, + con: Union[str, "sqlalchemy.engine.Connection", "sqlalchemy.engine.Engine", "sqlite3.Connection"], + batch_size: Optional[int] = None, + num_proc: Optional[int] = None, + **sql_writer_kwargs, + ) -> int: + """Exports the dataset to a SQL database. + + Args: + name (`str`): + Name of SQL table. + con (`str` or `sqlite3.Connection` or `sqlalchemy.engine.Connection` or `sqlalchemy.engine.Connection`): + A [URI string](https://docs.sqlalchemy.org/en/13/core/engines.html#database-urls) or a SQLite3/SQLAlchemy connection object used to write to a database. + batch_size (`int`, *optional*): + Size of the batch to load in memory and write at once. + Defaults to `datasets.config.DEFAULT_MAX_BATCH_SIZE`. + num_proc (`int`, *optional*): + Number of processes for multiprocessing. By default, it doesn't + use multiprocessing. `batch_size` in this case defaults to + `datasets.config.DEFAULT_MAX_BATCH_SIZE` but feel free to make it 5x or 10x of the default + value if you have sufficient compute power. + **sql_writer_kwargs (additional keyword arguments): + Parameters to pass to pandas's [`pandas.DataFrame.to_sql`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_sql.html). + + + + Now, `index` defaults to `False` if not specified. + + If you would like to write the index, pass `index=True` and also set a name for the index column by + passing `index_label`. + + + + Returns: + `int`: The number of records written. + + Example: + + ```py + >>> # con provided as a connection URI string + >>> ds.to_sql("data", "sqlite:///my_own_db.sql") + >>> # con provided as a sqlite3 connection object + >>> import sqlite3 + >>> con = sqlite3.connect("my_own_db.sql") + >>> with con: + ... ds.to_sql("data", con) + ``` + """ + # Dynamic import to avoid circular dependency + from .io.sql import SqlDatasetWriter + + return SqlDatasetWriter(self, name, con, batch_size=batch_size, num_proc=num_proc, **sql_writer_kwargs).write() + + def _estimate_nbytes(self) -> int: + dataset_nbytes = self.data.nbytes + + # Find decodable columns, because if there are any, we need to + # adjust the dataset size computation (needed for sharding) to account for possible external files + decodable_columns = [ + k for k, v in self._info.features.items() if require_decoding(v, ignore_decode_attribute=True) + ] + + if decodable_columns: + # Approximate the space needed to store the bytes from the external files by analyzing the first 1000 examples + extra_nbytes = 0 + + def extra_nbytes_visitor(array, feature): + nonlocal extra_nbytes + if isinstance(feature, (Audio, Image, Video)): + for x in array.to_pylist(): + if x is not None and x["bytes"] is None and x["path"] is not None: + size = xgetsize(x["path"]) + extra_nbytes += size + extra_nbytes -= array.field("path").nbytes + + table = self.with_format("arrow")[:1000] + table_visitor(table, extra_nbytes_visitor) + + extra_nbytes = extra_nbytes * len(self.data) // len(table) + dataset_nbytes = dataset_nbytes + extra_nbytes + + if self._indices is not None: + dataset_nbytes = dataset_nbytes * len(self._indices) // len(self.data) + return dataset_nbytes + + @staticmethod + def _generate_tables_from_shards(shards: list["Dataset"], batch_size: int): + for shard_idx, shard in enumerate(shards): + for pa_table in shard.with_format("arrow").iter(batch_size): + yield shard_idx, pa_table + + @staticmethod + def _generate_tables_from_cache_file(filename: str): + for batch_idx, batch in enumerate(_memory_mapped_record_batch_reader_from_file(filename)): + yield batch_idx, pa.Table.from_batches([batch]) + + def to_iterable_dataset(self, num_shards: Optional[int] = 1) -> "IterableDataset": + """Get an [`datasets.IterableDataset`] from a map-style [`datasets.Dataset`]. + This is equivalent to loading a dataset in streaming mode with [`datasets.load_dataset`], but much faster since the data is streamed from local files. + + Contrary to map-style datasets, iterable datasets are lazy and can only be iterated over (e.g. using a for loop). + Since they are read sequentially in training loops, iterable datasets are much faster than map-style datasets. + All the transformations applied to iterable datasets like filtering or processing are done on-the-fly when you start iterating over the dataset. + + Still, it is possible to shuffle an iterable dataset using [`datasets.IterableDataset.shuffle`]. + This is a fast approximate shuffling that works best if you have multiple shards and if you specify a buffer size that is big enough. + + To get the best speed performance, make sure your dataset doesn't have an indices mapping. + If this is the case, the data are not read contiguously, which can be slow sometimes. + You can use `ds = ds.flatten_indices()` to write your dataset in contiguous chunks of data and have optimal speed before switching to an iterable dataset. + + Args: + num_shards (`int`, default to `1`): + Number of shards to define when instantiating the iterable dataset. This is especially useful for big datasets to be able to shuffle properly, + and also to enable fast parallel loading using a PyTorch DataLoader or in distributed setups for example. + Shards are defined using [`datasets.Dataset.shard`]: it simply slices the data without writing anything on disk. + + Returns: + [`datasets.IterableDataset`] + + Example: + + Basic usage: + ```python + >>> ids = ds.to_iterable_dataset() + >>> for example in ids: + ... pass + ``` + + With lazy filtering and processing: + ```python + >>> ids = ds.to_iterable_dataset() + >>> ids = ids.filter(filter_fn).map(process_fn) # will filter and process on-the-fly when you start iterating over the iterable dataset + >>> for example in ids: + ... pass + ``` + + With sharding to enable efficient shuffling: + ```python + >>> ids = ds.to_iterable_dataset(num_shards=64) # the dataset is split into 64 shards to be iterated over + >>> ids = ids.shuffle(buffer_size=10_000) # will shuffle the shards order and use a shuffle buffer for fast approximate shuffling when you start iterating + >>> for example in ids: + ... pass + ``` + + With a PyTorch DataLoader: + ```python + >>> import torch + >>> ids = ds.to_iterable_dataset(num_shards=64) + >>> ids = ids.filter(filter_fn).map(process_fn) + >>> dataloader = torch.utils.data.DataLoader(ids, num_workers=4) # will assign 64 / 4 = 16 shards to each worker to load, filter and process when you start iterating + >>> for example in ids: + ... pass + ``` + + With a PyTorch DataLoader and shuffling: + ```python + >>> import torch + >>> ids = ds.to_iterable_dataset(num_shards=64) + >>> ids = ids.shuffle(buffer_size=10_000) # will shuffle the shards order and use a shuffle buffer when you start iterating + >>> dataloader = torch.utils.data.DataLoader(ids, num_workers=4) # will assign 64 / 4 = 16 shards from the shuffled list of shards to each worker when you start iterating + >>> for example in ids: + ... pass + ``` + + In a distributed setup like PyTorch DDP with a PyTorch DataLoader and shuffling + ```python + >>> from datasets.distributed import split_dataset_by_node + >>> ids = ds.to_iterable_dataset(num_shards=512) + >>> ids = ids.shuffle(buffer_size=10_000, seed=42) # will shuffle the shards order and use a shuffle buffer when you start iterating + >>> ids = split_dataset_by_node(ds, world_size=8, rank=0) # will keep only 512 / 8 = 64 shards from the shuffled lists of shards when you start iterating + >>> dataloader = torch.utils.data.DataLoader(ids, num_workers=4) # will assign 64 / 4 = 16 shards from this node's list of shards to each worker when you start iterating + >>> for example in ids: + ... pass + ``` + + With shuffling and multiple epochs: + ```python + >>> ids = ds.to_iterable_dataset(num_shards=64) + >>> ids = ids.shuffle(buffer_size=10_000, seed=42) # will shuffle the shards order and use a shuffle buffer when you start iterating + >>> for epoch in range(n_epochs): + ... ids.set_epoch(epoch) # will use effective_seed = seed + epoch to shuffle the shards and for the shuffle buffer when you start iterating + ... for example in ids: + ... pass + ``` + Feel free to also use [`IterableDataset.set_epoch`] when using a PyTorch DataLoader or in distributed setups. + """ + from .iterable_dataset import ArrowExamplesIterable, IterableDataset + + if self._format_type is not None: + if self._format_kwargs or ( + self._format_columns is not None and set(self._format_columns) != set(self.column_names) + ): + raise NotImplementedError( + "Converting a formatted dataset with kwargs or selected columns to a formatted iterable dataset is not implemented yet. Please run `my_dataset = my_dataset.with_format(None)` before calling to_iterable_dataset" + ) + if num_shards > len(self): + raise ValueError( + f"Unable to shard a dataset of size {len(self)} into {num_shards} shards (the number of shards exceeds the number of samples)." + ) + if self._indices is not None: + logger.info( + "Converting an Arrow dataset to iterable but it has an indices mapping that can make it slower. " + "You can use `ds = ds.flatten_indices()` to write your dataset in contiguous chunks of data and have optimal speed." + ) + shards = ( + [copy.deepcopy(self)] + if num_shards == 1 + else [ + self.shard(num_shards=num_shards, index=shard_idx, contiguous=True) for shard_idx in range(num_shards) + ] + ) + ex_iterable = ArrowExamplesIterable( + Dataset._generate_tables_from_shards, + kwargs={"shards": shards, "batch_size": config.DEFAULT_MAX_BATCH_SIZE}, + ) + ds = IterableDataset(ex_iterable, info=DatasetInfo(features=self.features)) + if self._format_type: + ds = ds.with_format(self._format_type) + return ds + + def _push_parquet_shards_to_hub_single( + self, + job_id: int, + num_jobs: int, + resolved_output_path: HfFileSystemResolvedPath, + data_dir: str, + split: str, + token: Optional[str], + create_pr: Optional[bool], + num_shards: int, + embed_external_files: bool, + writer_batch_size: int, + ): + div = num_shards // num_jobs + mod = num_shards % num_jobs + start = div * job_id + min(job_id, mod) + end = start + div + (1 if job_id < mod else 0) + + index_shards = ( + (start + i, self.shard(num_shards=end - start, index=i, contiguous=True)) for i in range(end - start) + ) + + api = HfApi(endpoint=config.HF_ENDPOINT, token=token, library_name="datasets", library_version=__version__) + + additions: list[CommitOperationAdd] = [] + new_parquet_paths: list[str] = [] + uploaded_size = 0 + for index, shard in index_shards: + if embed_external_files: + format = shard.format + shard = shard.with_format("arrow") + shard = shard.map( + embed_table_storage, + batched=True, + batch_size=writer_batch_size, + keep_in_memory=True, + ) + shard = shard.with_format(**format) + shard_path_in_repo = f"{data_dir}/{split}-{index:05d}-of-{num_shards:05d}.parquet" + tmp_file = tempfile.NamedTemporaryFile(suffix=".parquet", delete=False) + try: + shard.to_parquet(tmp_file, batch_size=writer_batch_size) + uploaded_size += tmp_file.tell() + tmp_file.close() + new_parquet_paths.append(shard_path_in_repo) + if ( + isinstance(resolved_output_path, HfFileSystemResolvedRepositoryPath) + and not resolved_output_path.path_in_repo + ): + shard_addition = CommitOperationAdd(path_in_repo=shard_path_in_repo, path_or_fileobj=tmp_file.name) + api.preupload_lfs_files( + repo_id=resolved_output_path.repo_id, + additions=[shard_addition], + repo_type=resolved_output_path.repo_type, + revision=resolved_output_path.revision, + create_pr=create_pr, + ) + additions.append(shard_addition) + elif isinstance(resolved_output_path, HfFileSystemResolvedBucketPath): + if resolved_output_path.path: + shard_path_in_repo = resolved_output_path.path + "/" + shard_path_in_repo + api.batch_bucket_files( + bucket_id=resolved_output_path.bucket_id, add=[(tmp_file.name, shard_path_in_repo)] + ) + else: + raise NotImplementedError(f"Bad HF path: {resolved_output_path}") + except (Exception, KeyboardInterrupt): + tmp_file.close() + Path(tmp_file.name).unlink() + raise + tmp_file.close() + Path(tmp_file.name).unlink() + yield job_id, False, 1 + + yield job_id, True, (additions, new_parquet_paths, uploaded_size) + + def _push_parquet_shards_to_hub( + self, + resolved_output_path: HfFileSystemResolvedPath, + data_dir: str, + split: str, + token: Optional[str], + create_pr: Optional[bool], + max_shard_size: Optional[Union[int, str]], + num_shards: Optional[int], + embed_external_files: bool, + num_proc: Optional[int], + ) -> tuple[list[CommitOperationAdd], list[str], int, SplitInfo]: + """Pushes the dataset shards as Parquet files to the hub. + + Returns: + additions (`List[CommitOperation]`): list of the `CommitOperationAdd` of the uploaded shards + new_parquet_paths (`List[str]`): list of paths of the new files uploaded to the output path, + relative to output path + features (`features`): features of the uploaded dataset + split_info (`int`): info of the uploaded split, including the approximate size in bytes of + the uploaded dataset after uncompression + uploaded_size (`int`): number of uploaded bytes to the repository or bucket + """ + from .arrow_writer import get_writer_batch_size_from_data_size, get_writer_batch_size_from_features + + dataset_nbytes = self._estimate_nbytes() + writer_batch_size = get_writer_batch_size_from_features(self.features) or get_writer_batch_size_from_data_size( + len(self), dataset_nbytes + ) + + # Find decodable columns, because if there are any, we need to: + # embed the bytes from the files in the shards + decodable_columns = ( + [k for k, v in self._info.features.items() if require_decoding(v, ignore_decode_attribute=True)] + if embed_external_files + else [] + ) + embed_external_files = embed_external_files and bool(decodable_columns) + + if num_shards is None: + max_shard_size = convert_file_size_to_int(max_shard_size or config.MAX_SHARD_SIZE) + num_shards = int(dataset_nbytes / max_shard_size) + 1 + num_shards = max(num_shards, num_proc or 1) + + additions: list[CommitOperationAdd] = [] + new_parquet_paths: list[str] = [] + uploaded_size = 0 + + num_jobs = num_proc or 1 + if num_shards <= 1: + logger.warning( + f"Setting num_proc from {num_jobs} back to 1 for the {split} split to disable multiprocessing as it only contains one shard." + ) + num_jobs = 1 + elif num_shards < num_jobs: + logger.warning( + f"Setting num_proc from {num_jobs} to {num_shards} for the {split} split as it only contains {num_shards} shards." + ) + num_proc = num_shards + kwargs_iterable = [ + { + "self": self.shard(num_shards=num_jobs, index=job_id, contiguous=True), + "job_id": job_id, + "num_jobs": num_jobs, + "resolved_output_path": resolved_output_path, + "data_dir": data_dir, + "split": split, + "token": token, + "create_pr": create_pr, + "num_shards": num_shards, + "embed_external_files": embed_external_files, + "writer_batch_size": writer_batch_size, + } + for job_id in range(num_jobs) + ] + desc = "Uploading the dataset shards" + desc += f" (num_proc={num_proc})" if num_proc is not None and num_proc >= 1 else "" + pbar = hf_tqdm( + unit=" shards", + total=num_shards, + desc=desc, + ) + with ( + contextlib.nullcontext() + if num_proc is None or num_proc < 1 + else mp.get_context("spawn").Pool(num_proc) as pool + ): + update_stream = ( + Dataset._push_parquet_shards_to_hub_single(**kwargs_iterable[0]) + if pool is None + else iflatmap_unordered( + pool, + Dataset._push_parquet_shards_to_hub_single, + kwargs_iterable=kwargs_iterable, + ) + ) + for job_id, done, content in update_stream: + if not done: + pbar.update(content) + else: + job_additions, job_new_parquet_paths, job_uploaded_size = content + additions += job_additions + new_parquet_paths += job_new_parquet_paths + uploaded_size += job_uploaded_size + + split_info = SplitInfo(name=split, num_bytes=dataset_nbytes, num_examples=len(self)) + return additions, new_parquet_paths, self.features, split_info, uploaded_size + + def push_to_hub( + self, + repo_id: str, + config_name: str = "default", + set_default: Optional[bool] = None, + split: Optional[str] = None, + data_dir: Optional[str] = None, + commit_message: Optional[str] = None, + commit_description: Optional[str] = None, + private: Optional[bool] = None, + token: Optional[str] = None, + revision: Optional[str] = None, + create_pr: Optional[bool] = False, + max_shard_size: Optional[Union[int, str]] = None, + num_shards: Optional[int] = None, + embed_external_files: bool = True, + num_proc: Optional[int] = None, + ) -> CommitInfo: + """Pushes the dataset to the hub as a Parquet dataset. + The dataset is pushed using HTTP requests and does not need to have neither git or git-lfs installed. + + The resulting Parquet files are self-contained by default. If your dataset contains [`Image`], [`Audio`] or [`Video`] + data, the Parquet files will store the bytes of your images or audio files. + You can disable this by setting `embed_external_files` to `False`. + + Args: + repo_id (`str`): + The ID of the repository to push to in the following format: `/` or + `/`. Also accepts ``, which will default to the namespace + of the logged-in user. + + It could also be a location inside a bucket, e.g. `buckets///...` + config_name (`str`, defaults to "default"): + The configuration name (or subset) of a dataset. Defaults to "default". + set_default (`bool`, *optional*): + Whether to set this configuration as the default one. Otherwise, the default configuration is the one + named "default". + split (`str`, *optional*): + The name of the split that will be given to that dataset. Defaults to `self.split`. + data_dir (`str`, *optional*): + Directory name that will contain the uploaded data files. Defaults to the `config_name` if different + from "default", else "data". + + + commit_message (`str`, *optional*): + Message to commit while pushing. Will default to `"Upload dataset"`. + commit_description (`str`, *optional*): + Description of the commit that will be created. + Additionally, description of the PR if a PR is created (`create_pr` is True). + + + private (`bool`, *optional*): + Whether to make the repo private. If `None` (default), the repo will be public unless the + organization's default is private. This value is ignored if the repo already exists. + token (`str`, *optional*): + An optional authentication token for the Hugging Face Hub. If no token is passed, will default + to the token saved locally when logging in with `huggingface-cli login`. Will raise an error + if no token is passed and the user is not logged-in. + revision (`str`, *optional*): + Branch to push the uploaded files to. Defaults to the `"main"` branch. + + + create_pr (`bool`, *optional*, defaults to `False`): + Whether to create a PR with the uploaded files or directly commit. + + + max_shard_size (`int` or `str`, *optional*, defaults to `"500MB"`): + The maximum size of the dataset shards to be uploaded to the hub. If expressed as a string, needs to be digits followed by + a unit (like `"5MB"`). + num_shards (`int`, *optional*): + Number of shards to write. By default, the number of shards depends on `max_shard_size`. + + + embed_external_files (`bool`, defaults to `True`): + Whether to embed file bytes in the shards. + In particular, this will do the following before the push for the fields of type: + + - [`Audio`] and [`Image`]: remove local path information and embed file content in the Parquet files. + num_proc (`int`, *optional*, defaults to `None`): + Number of processes when preparing and uploading the dataset. + This is helpful if the dataset is made of many samples or media files to embed. + I uses "spawn" context to work with hf_xet, the rust client for fast uploads to HF. + Multiprocessing is disabled by default. + + + + Return: + huggingface_hub.CommitInfo + + Example: + + ```python + >>> dataset.push_to_hub("/") + >>> dataset_dict.push_to_hub("/", private=True) + >>> dataset.push_to_hub("/", max_shard_size="1GB") + >>> dataset.push_to_hub("/", num_shards=1024) + ``` + + If your dataset has multiple splits (e.g. train/validation/test): + + ```python + >>> train_dataset.push_to_hub("/", split="train") + >>> val_dataset.push_to_hub("/", split="validation") + >>> # later + >>> dataset = load_dataset("/") + >>> train_dataset = dataset["train"] + >>> val_dataset = dataset["validation"] + ``` + + If you want to add a new configuration (or subset) to a dataset (e.g. if the dataset has multiple tasks/versions/languages): + + ```python + >>> english_dataset.push_to_hub("/", "en") + >>> french_dataset.push_to_hub("/", "fr") + >>> # later + >>> english_dataset = load_dataset("/", "en") + >>> french_dataset = load_dataset("/", "fr") + ``` + """ + if config_name == "data": + raise ValueError("`config_name` cannot be 'data'. Please, choose another name for configuration.") + + if max_shard_size is not None and num_shards is not None: + raise ValueError( + "Failed to push_to_hub: please specify either max_shard_size or num_shards, but not both." + ) + + if split is None: + split = str(self.split) if self.split is not None else "train" + + if not re.match(_split_re, split): + raise ValueError(f"Split name should match '{_split_re}' but got '{split}'.") + + if not data_dir: + data_dir = config_name if config_name != "default" else "data" # for backward compatibility + + api = HfApi(endpoint=config.HF_ENDPOINT, token=token, library_name="datasets", library_version=__version__) + if repo_id.startswith("buckets/"): + if BucketNotFoundError is None: + raise ImportError("Pushing datasets to buckets requires huggingface_hub>=1.6.0") + _, _namespace, _bucket_name, *_path_segments = repo_id.split("/") + try: + bucket_id = api.bucket_info(_namespace + "/" + _bucket_name).id + except BucketNotFoundError: + bucket_url = api.create_bucket(_namespace + "/" + _bucket_name, private=private, exist_ok=True) + bucket_id = bucket_url.bucket_id + path = "/".join(s for s in _path_segments if s) + return _push_to_bucket( + self, + bucket_id=bucket_id, + path=path, + config_name=config_name, + set_default=set_default, + split=split, + data_dir=data_dir, + token=token, + max_shard_size=max_shard_size, + num_shards=num_shards, + embed_external_files=embed_external_files, + num_proc=num_proc, + ) + else: + try: + repo_id = api.repo_info(repo_id, repo_type="dataset").id + except RepositoryNotFoundError: + repo_url = api.create_repo( + repo_id, + repo_type="dataset", + private=private, + exist_ok=True, + ) + repo_id = repo_url.repo_id + + if revision is not None and not revision.startswith("refs/pr/"): + # We do not call create_branch for a PR reference: 400 Bad Request + api.create_branch(repo_id, branch=revision, repo_type="dataset", exist_ok=True) + return _push_to_repo( + self, + repo_id=repo_id, + config_name=config_name, + set_default=set_default, + split=split, + data_dir=data_dir, + commit_message=commit_message, + commit_description=commit_description, + token=token, + revision=revision, + create_pr=create_pr, + max_shard_size=max_shard_size, + num_shards=num_shards, + embed_external_files=embed_external_files, + num_proc=num_proc, + ) + + @transmit_format + @fingerprint_transform(inplace=False) + def add_column( + self, + name: str, + column: Union[list, np.ndarray], + new_fingerprint: Optional[str] = None, + feature: Optional[FeatureType] = None, + ): + """Add column to Dataset. + + + + Args: + name (`str`): + Column name. + column (`list` or `np.array`): + Column data to be added. + feature (`FeatureType` or `None`, defaults to `None`): + Column datatype. + + Returns: + [`Dataset`] + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> more_text = ds["text"] + >>> ds = ds.add_column(name="text_2", column=more_text) + >>> ds + Dataset({ + features: ['text', 'label', 'text_2'], + num_rows: 1066 + }) + ``` + """ + + if feature: + pyarrow_schema = Features({name: feature}).arrow_schema + else: + pyarrow_schema = None + + column_table = InMemoryTable.from_pydict({name: column}, schema=pyarrow_schema) + _check_column_names(self._data.column_names + column_table.column_names) + dataset = self.flatten_indices() if self._indices is not None else self + # Concatenate tables horizontally + table = concat_tables([dataset._data, column_table], axis=1) + # Update features + info = dataset.info.copy() + info.features.update(Features.from_arrow_schema(column_table.schema)) + table = update_metadata_with_features(table, info.features) + return Dataset(table, info=info, split=self.split, indices_table=None, fingerprint=new_fingerprint) + + def add_faiss_index( + self, + column: str, + index_name: Optional[str] = None, + device: Optional[int] = None, + string_factory: Optional[str] = None, + metric_type: Optional[int] = None, + custom_index: Optional["faiss.Index"] = None, # noqa: F821 + batch_size: int = 1000, + train_size: Optional[int] = None, + faiss_verbose: bool = False, + dtype=np.float32, + ): + """Add a dense index using Faiss for fast retrieval. + By default the index is done over the vectors of the specified column. + You can specify `device` if you want to run it on GPU (`device` must be the GPU index). + You can find more information about Faiss here: + + - For [string factory](https://github.com/facebookresearch/faiss/wiki/The-index-factory) + + Args: + column (`str`): + The column of the vectors to add to the index. + index_name (`str`, *optional*): + The `index_name`/identifier of the index. + This is the `index_name` that is used to call [`~datasets.Dataset.get_nearest_examples`] or [`~datasets.Dataset.search`]. + By default it corresponds to `column`. + device (`Union[int, List[int]]`, *optional*): + If positive integer, this is the index of the GPU to use. If negative integer, use all GPUs. + If a list of positive integers is passed in, run only on those GPUs. By default it uses the CPU. + string_factory (`str`, *optional*): + This is passed to the index factory of Faiss to create the index. + Default index class is `IndexFlat`. + metric_type (`int`, *optional*): + Type of metric. Ex: `faiss.METRIC_INNER_PRODUCT` or `faiss.METRIC_L2`. + custom_index (`faiss.Index`, *optional*): + Custom Faiss index that you already have instantiated and configured for your needs. + batch_size (`int`): + Size of the batch to use while adding vectors to the `FaissIndex`. Default value is `1000`. + + train_size (`int`, *optional*): + If the index needs a training step, specifies how many vectors will be used to train the index. + faiss_verbose (`bool`, defaults to `False`): + Enable the verbosity of the Faiss index. + dtype (`data-type`): + The dtype of the numpy arrays that are indexed. + Default is `np.float32`. + + Example: + + ```python + >>> ds = datasets.load_dataset('community-datasets/crime_and_punish', split='train') + >>> ds_with_embeddings = ds.map(lambda example: {'embeddings': embed(example['line']})) + >>> ds_with_embeddings.add_faiss_index(column='embeddings') + >>> # query + >>> scores, retrieved_examples = ds_with_embeddings.get_nearest_examples('embeddings', embed('my new query'), k=10) + >>> # save index + >>> ds_with_embeddings.save_faiss_index('embeddings', 'my_index.faiss') + + >>> ds = datasets.load_dataset('community-datasets/crime_and_punish', split='train') + >>> # load index + >>> ds.load_faiss_index('embeddings', 'my_index.faiss') + >>> # query + >>> scores, retrieved_examples = ds.get_nearest_examples('embeddings', embed('my new query'), k=10) + ``` + """ + with self.formatted_as(type="numpy", columns=[column], dtype=dtype): + super().add_faiss_index( + column=column, + index_name=index_name, + device=device, + string_factory=string_factory, + metric_type=metric_type, + custom_index=custom_index, + batch_size=batch_size, + train_size=train_size, + faiss_verbose=faiss_verbose, + ) + return self + + def add_faiss_index_from_external_arrays( + self, + external_arrays: np.array, + index_name: str, + device: Optional[int] = None, + string_factory: Optional[str] = None, + metric_type: Optional[int] = None, + custom_index: Optional["faiss.Index"] = None, # noqa: F821 + batch_size: int = 1000, + train_size: Optional[int] = None, + faiss_verbose: bool = False, + dtype=np.float32, + ): + """Add a dense index using Faiss for fast retrieval. + The index is created using the vectors of `external_arrays`. + You can specify `device` if you want to run it on GPU (`device` must be the GPU index). + You can find more information about Faiss here: + + - For [string factory](https://github.com/facebookresearch/faiss/wiki/The-index-factory) + + Args: + external_arrays (`np.array`): + If you want to use arrays from outside the lib for the index, you can set `external_arrays`. + It will use `external_arrays` to create the Faiss index instead of the arrays in the given `column`. + index_name (`str`): + The `index_name`/identifier of the index. + This is the `index_name` that is used to call [`~datasets.Dataset.get_nearest_examples`] or [`~datasets.Dataset.search`]. + device (Optional `Union[int, List[int]]`, *optional*): + If positive integer, this is the index of the GPU to use. If negative integer, use all GPUs. + If a list of positive integers is passed in, run only on those GPUs. By default it uses the CPU. + string_factory (`str`, *optional*): + This is passed to the index factory of Faiss to create the index. + Default index class is `IndexFlat`. + metric_type (`int`, *optional*): + Type of metric. Ex: `faiss.faiss.METRIC_INNER_PRODUCT` or `faiss.METRIC_L2`. + custom_index (`faiss.Index`, *optional*): + Custom Faiss index that you already have instantiated and configured for your needs. + batch_size (`int`, *optional*): + Size of the batch to use while adding vectors to the FaissIndex. Default value is 1000. + + train_size (`int`, *optional*): + If the index needs a training step, specifies how many vectors will be used to train the index. + faiss_verbose (`bool`, defaults to False): + Enable the verbosity of the Faiss index. + dtype (`numpy.dtype`): + The dtype of the numpy arrays that are indexed. Default is np.float32. + """ + super().add_faiss_index_from_external_arrays( + external_arrays=external_arrays.astype(dtype), + index_name=index_name, + device=device, + string_factory=string_factory, + metric_type=metric_type, + custom_index=custom_index, + batch_size=batch_size, + train_size=train_size, + faiss_verbose=faiss_verbose, + ) + + def add_elasticsearch_index( + self, + column: str, + index_name: Optional[str] = None, + host: Optional[str] = None, + port: Optional[int] = None, + es_client: Optional["elasticsearch.Elasticsearch"] = None, # noqa: F821 + es_index_name: Optional[str] = None, + es_index_config: Optional[dict] = None, + ): + """Add a text index using ElasticSearch for fast retrieval. This is done in-place. + + Args: + column (`str`): + The column of the documents to add to the index. + index_name (`str`, *optional*): + The `index_name`/identifier of the index. + This is the index name that is used to call [`~Dataset.get_nearest_examples`] or [`~Dataset.search`]. + By default it corresponds to `column`. + host (`str`, *optional*, defaults to `localhost`): + Host of where ElasticSearch is running. + port (`str`, *optional*, defaults to `9200`): + Port of where ElasticSearch is running. + es_client (`elasticsearch.Elasticsearch`, *optional*): + The elasticsearch client used to create the index if host and port are `None`. + es_index_name (`str`, *optional*): + The elasticsearch index name used to create the index. + es_index_config (`dict`, *optional*): + The configuration of the elasticsearch index. + Default config is: + ``` + { + "settings": { + "number_of_shards": 1, + "analysis": {"analyzer": {"stop_standard": {"type": "standard", " stopwords": "_english_"}}}, + }, + "mappings": { + "properties": { + "text": { + "type": "text", + "analyzer": "standard", + "similarity": "BM25" + }, + } + }, + } + ``` + Example: + + ```python + >>> es_client = elasticsearch.Elasticsearch() + >>> ds = datasets.load_dataset('community-datasets/crime_and_punish', split='train') + >>> ds.add_elasticsearch_index(column='line', es_client=es_client, es_index_name="my_es_index") + >>> scores, retrieved_examples = ds.get_nearest_examples('line', 'my new query', k=10) + ``` + """ + with self.formatted_as(type=None, columns=[column]): + super().add_elasticsearch_index( + column=column, + index_name=index_name, + host=host, + port=port, + es_client=es_client, + es_index_name=es_index_name, + es_index_config=es_index_config, + ) + return self + + @transmit_format + @fingerprint_transform(inplace=False) + def add_item(self, item: dict, new_fingerprint: Optional[str] = None): + """Add item to Dataset. + + + + Args: + item (`dict`): + Item data to be added. + + Returns: + [`Dataset`] + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> new_review = {'label': 0, 'text': 'this movie is the absolute worst thing I have ever seen'} + >>> ds = ds.add_item(new_review) + >>> ds[-1] + {'label': 0, 'text': 'this movie is the absolute worst thing I have ever seen'} + ``` + """ + item_table = InMemoryTable.from_pydict({k: [v] for k, v in item.items()}) + # We don't call _check_if_features_can_be_aligned here so this cast is "unsafe" + dset_features, item_features = _align_features( + [self._info.features, Features.from_arrow_schema(item_table.schema)] + ) + # Cast to align the schemas of the tables and concatenate the tables + table = concat_tables( + [ + self._data.cast(dset_features.arrow_schema) if self._info.features != dset_features else self._data, + item_table.cast(item_features.arrow_schema), + ] + ) + if self._indices is None: + indices_table = None + else: + item_indices_array = pa.array([len(self._data)], type=pa.uint64()) + item_indices_table = InMemoryTable.from_arrays([item_indices_array], names=["indices"]) + indices_table = concat_tables([self._indices, item_indices_table]) + info = self.info.copy() + info.features.update(item_features) + table = update_metadata_with_features(table, info.features) + return Dataset( + table, + info=info, + split=self.split, + indices_table=indices_table, + fingerprint=new_fingerprint, + ) + + def align_labels_with_mapping(self, label2id: dict, label_column: str) -> "Dataset": + """Align the dataset's label ID and label name mapping to match an input `label2id` mapping. + This is useful when you want to ensure that a model's predicted labels are aligned with the dataset. + The alignment in done using the lowercase label names. + + Args: + label2id (`dict`): + The label name to ID mapping to align the dataset with. + label_column (`str`): + The column name of labels to align on. + + Example: + + ```python + >>> # dataset with mapping {'entailment': 0, 'neutral': 1, 'contradiction': 2} + >>> ds = load_dataset("nyu-mll/glue", "mnli", split="train") + >>> # mapping to align with + >>> label2id = {'CONTRADICTION': 0, 'NEUTRAL': 1, 'ENTAILMENT': 2} + >>> ds_aligned = ds.align_labels_with_mapping(label2id, "label") + ``` + + """ + # Sanity checks + if label_column not in self._data.column_names: + raise ValueError(f"Column ({label_column}) not in table columns ({self._data.column_names}).") + + label_feature = self._info.features[label_column] + if not ( + isinstance(label_feature, ClassLabel) + or (isinstance(label_feature, Sequence) and isinstance(label_feature.feature, ClassLabel)) + ): + raise ValueError( + f"Aligning labels with a mapping is only supported for {ClassLabel.__name__} column or {Sequence.__name__} column with the inner type {ClassLabel.__name__}, and column {label_feature} is of type {type(label_feature).__name__}." + ) + + # Sort input mapping by ID value to ensure the label names are aligned + label2id = dict(sorted(label2id.items(), key=lambda item: item[1])) + label_names = list(label2id.keys()) + # Some label mappings use uppercase label names so we lowercase them during alignment + label2id = {k.lower(): v for k, v in label2id.items()} + int2str_function = ( + label_feature.int2str if isinstance(label_feature, ClassLabel) else label_feature.feature.int2str + ) + + if isinstance(label_feature, ClassLabel): + + def process_label_ids(batch): + dset_label_names = [ + int2str_function(label_id).lower() if label_id is not None else None + for label_id in batch[label_column] + ] + batch[label_column] = [ + label2id[label_name] if label_name is not None else None for label_name in dset_label_names + ] + return batch + + else: + + def process_label_ids(batch): + dset_label_names = [ + [int2str_function(label_id).lower() if label_id is not None else None for label_id in seq] + for seq in batch[label_column] + ] + batch[label_column] = [ + [label2id[label_name] if label_name is not None else None for label_name in seq] + for seq in dset_label_names + ] + return batch + + features = self.features + features[label_column] = ( + ClassLabel(num_classes=len(label_names), names=label_names) + if isinstance(label_feature, ClassLabel) + else List(ClassLabel(num_classes=len(label_names), names=label_names)) + ) + return self.map(process_label_ids, features=features, batched=True, desc="Aligning the labels") + + +def _push_to_repo( + dset: Union["Dataset", "IterableDataset"], + repo_id: str, + config_name: str = "default", + set_default: Optional[bool] = None, + split: Optional[str] = None, + data_dir: Optional[str] = None, + commit_message: Optional[str] = None, + commit_description: Optional[str] = None, + token: Optional[str] = None, + revision: Optional[str] = None, + create_pr: Optional[bool] = False, + max_shard_size: Optional[Union[int, str]] = None, + num_shards: Optional[int] = None, + embed_external_files: bool = True, + num_proc: Optional[int] = None, +) -> CommitInfo: + api = HfApi(endpoint=config.HF_ENDPOINT, token=token, library_name="datasets", library_version=__version__) + resolved_output_path = HfFileSystemResolvedRepositoryPath( + repo_id=repo_id, repo_type="dataset", revision=revision or "main", path_in_repo="" + ) + + additions, new_parquet_paths, features, split_info, uploaded_size = dset._push_parquet_shards_to_hub( + resolved_output_path=resolved_output_path, + data_dir=data_dir, + split=split, + token=token, + max_shard_size=max_shard_size, + num_shards=num_shards, + create_pr=create_pr, + embed_external_files=embed_external_files, + num_proc=num_proc, + ) + + commit_message = commit_message if commit_message is not None else "Upload dataset" + if len(additions) > config.UPLOADS_MAX_NUMBER_PER_COMMIT: + logger.info( + f"Number of files to upload is larger than {config.UPLOADS_MAX_NUMBER_PER_COMMIT}. Splitting the push into multiple commits." + ) + num_commits = math.ceil(len(additions) / config.UPLOADS_MAX_NUMBER_PER_COMMIT) + for i in range(0, num_commits): + operations = additions[ + i * config.UPLOADS_MAX_NUMBER_PER_COMMIT : (i + 1) * config.UPLOADS_MAX_NUMBER_PER_COMMIT + ] + for retry, sleep_time in enumerate(itertools.chain(range(10), itertools.repeat(30)), start=1): + # We need to retry if another commit happens at the same time + sleep_time *= 1 + random.random() + try: + commit_info = api.create_commit( + repo_id, + operations=operations, + commit_message=commit_message + f" (part {i:05d}-of-{num_commits:05d})", + commit_description=commit_description, + repo_type="dataset", + revision=revision, + create_pr=create_pr, + ) + except HfHubHTTPError as err: + if ( + err.__context__ + and isinstance(err.__context__, HfHubHTTPError) + and err.__context__.response.status_code == 409 + ): + # 409 is Conflict (another commit is in progress) + time.sleep(sleep_time) + logger.info( + f"Retrying intermediate commit for {repo_id}, {config_name} ({retry}/n with status_code {err.__context__.response.status_code})" + ) + continue + else: + raise + break + logger.info( + f"Commit #{i + 1} completed" + + (f" (still {num_commits - i - 1} to go)" if num_commits - i - 1 else "") + + "." + ) + last_commit_additions = [] + else: + last_commit_additions = additions + + for retry, sleep_time in enumerate(itertools.chain(range(10), itertools.repeat(30)), start=1): + # We need to retry if there was a commit in between in case it touched the dataset card data + sleep_time *= 1 + random.random() + + # We make sure to get info from this commit + parent_commit = api.repo_info(repo_id, repo_type="dataset", revision=revision).sha + hf_path = HfFileSystemResolvedRepositoryPath( + repo_type=resolved_output_path.repo_type, + repo_id=resolved_output_path.repo_id, + revision=parent_commit, + path_in_repo=resolved_output_path.path_in_repo, + ).unresolve() + hffs = HfFileSystem(endpoint=config.HF_ENDPOINT, token=token) + dirfs = DirFileSystem(fs=hffs, path=hf_path) + + # Check the files to delete + try: + files_to_delete = dirfs.glob(f"{data_dir}/{split}-*", detail=True) + except EntryNotFoundError: # needed for huggingface_hub<=1.7.1 + files_to_delete = {} + + # Don't delete the new files + deletions = [ + CommitOperationDelete(path_in_repo=file_to_delete) + for file_to_delete in files_to_delete + if file_to_delete not in new_parquet_paths + ] + deleted_size = sum(file_info["size"] for file_info in files_to_delete.values()) + + # Update the dataset card + new_dataset_card, new_legacy_dataset_infos = _get_updated_dataset_card( + fs=dirfs, + config_name=config_name, + splits_info=[split_info], + features=features, + data_dir=data_dir, + set_default=set_default, + uploaded_sizes=[uploaded_size], + deleted_sizes=[deleted_size], + remove_other_splits=False, + ) + dataset_card_additions = [ + CommitOperationAdd(path_in_repo=config.REPOCARD_FILENAME, path_or_fileobj=str(new_dataset_card).encode()) + ] + if new_legacy_dataset_infos: + dataset_card_additions.append( + CommitOperationAdd( + path_in_repo=config.DATASETDICT_INFOS_FILENAME, + path_or_fileobj=json.dumps(new_legacy_dataset_infos).encode("utf-8"), + ) + ) + operations = last_commit_additions + dataset_card_additions + deletions + + try: + commit_info = api.create_commit( + repo_id, + operations=operations, + commit_message=commit_message, + commit_description=commit_description, + repo_type="dataset", + revision=revision, + create_pr=create_pr, + parent_commit=parent_commit, + ) + except HfHubHTTPError as err: + if ( + err.__context__ + and isinstance(err.__context__, HfHubHTTPError) + and err.__context__.response.status_code in (412, 409) + ): + # 412 is Precondition failed (parent_commit isn't satisfied) + # 409 is Conflict (another commit is in progress) + time.sleep(sleep_time) + logger.info( + f"Retrying commit for {repo_id}, {config_name} ({retry}/n with status_code {err.__context__.response.status_code})" + ) + continue + else: + raise + break + + return commit_info + + +def _push_to_bucket( + dset: Union["Dataset", "IterableDataset"], + bucket_id: str, + path: str, + config_name: str = "default", + set_default: Optional[bool] = None, + split: Optional[str] = None, + data_dir: Optional[str] = None, + token: Optional[str] = None, + create_pr: Optional[bool] = False, + max_shard_size: Optional[Union[int, str]] = None, + num_shards: Optional[int] = None, + embed_external_files: bool = True, + num_proc: Optional[int] = None, +) -> None: + api = HfApi(endpoint=config.HF_ENDPOINT, token=token, library_name="datasets", library_version=__version__) + resolved_output_path = HfFileSystemResolvedBucketPath(bucket_id=bucket_id, path=path) + hf_path = resolved_output_path.unresolve() + hffs = HfFileSystem(endpoint=config.HF_ENDPOINT, token=token) + dirfs = DirFileSystem(fs=hffs, path=hf_path) + + # Check the files to delete before uploading + try: + files_to_delete = dirfs.glob(f"{data_dir}/{split}-*", detail=True) + except EntryNotFoundError: # needed for huggingface_hub<=1.7.1 + files_to_delete = {} + + # Upload the Parquet files + _, new_parquet_paths, features, split_info, uploaded_size = dset._push_parquet_shards_to_hub( + resolved_output_path=resolved_output_path, + data_dir=data_dir, + split=split, + token=token, + max_shard_size=max_shard_size, + num_shards=num_shards, + create_pr=create_pr, + embed_external_files=embed_external_files, + num_proc=num_proc, + ) + + # Don't delete the new files + new_parquet_paths = set(new_parquet_paths) + delete = [file_to_delete for file_to_delete in files_to_delete if file_to_delete not in new_parquet_paths] + deleted_size = sum(file_info["size"] for file_info in files_to_delete.values()) + + # Update the dataset card + new_dataset_card, new_legacy_dataset_infos = _get_updated_dataset_card( + fs=dirfs, + config_name=config_name, + splits_info=[split_info], + features=features, + data_dir=data_dir, + set_default=set_default, + uploaded_sizes=[uploaded_size], + deleted_sizes=[deleted_size], + remove_other_splits=False, + ) + path_prefix = (path + "/") if path else "" + add = [(str(new_dataset_card).encode(), path_prefix + config.REPOCARD_FILENAME)] + if new_legacy_dataset_infos: + add.append( + (json.dumps(new_legacy_dataset_infos).encode("utf-8"), path_prefix + config.DATASETDICT_INFOS_FILENAME) + ) + + # Upload dataset card and delete old files + api.batch_bucket_files( + bucket_id=bucket_id, + add=add, + delete=delete, + ) + + +def _get_updated_dataset_card( + fs: DirFileSystem, + config_name: str, + splits_info: list[SplitInfo], + features: Features, + data_dir: str, + set_default: Optional[bool], + uploaded_sizes: list[int], + deleted_sizes: list[int], + remove_other_splits: bool, +) -> tuple[DatasetCard, Optional[dict]]: + """Update a dataset card in push_to_hub""" + # get the deprecated dataset_infos.json to update them + try: + legacy_dataset_info: dict = json.loads(fs.read_text(config.DATASETDICT_INFOS_FILENAME, encoding="utf-8")).get( + config_name, None + ) + repo_info = DatasetInfo.from_dict(legacy_dataset_info) if legacy_dataset_info else None + except FileNotFoundError: + legacy_dataset_info = None + repo_info = None + # get the info from the README to update them + try: + dataset_card = DatasetCard(fs.read_text(config.REPOCARD_FILENAME, newline="", encoding="utf-8")) + dataset_card_data = dataset_card.data + metadata_configs = MetadataConfigs.from_dataset_card_data(dataset_card_data) + dataset_infos: DatasetInfosDict = DatasetInfosDict.from_dataset_card_data(dataset_card_data) + if dataset_infos and config_name in dataset_infos: + repo_info = dataset_infos[config_name] + else: + repo_info = None + except FileNotFoundError: + dataset_card = None + dataset_card_data = DatasetCardData() + metadata_configs = MetadataConfigs() + # update the total info to dump from existing info + if repo_info is not None and not remove_other_splits: + logger.info("Updating downloaded metadata with the new split" + ("s." if len(splits_info) > 1 else ".")) + for split_info, deleted_size, uploaded_size in zip(splits_info, deleted_sizes, uploaded_sizes): + split = split_info.name + if repo_info.splits and any(s != split for s in repo_info.splits): + if features != repo_info.features: + raise ValueError( + f"Features of the new split don't match the features of the existing splits on the hub: {features} != {repo_info.features}" + ) + + if split in repo_info.splits: + repo_info.download_size -= deleted_size + repo_info.dataset_size -= repo_info.splits.get(split, SplitInfo()).num_bytes or 0 + + repo_info.download_checksums = None + repo_info.download_size = (repo_info.download_size or 0) + uploaded_size + repo_info.dataset_size = (repo_info.dataset_size or 0) + split_info.num_bytes + repo_info.size_in_bytes = repo_info.download_size + repo_info.dataset_size + repo_info.splits.pop(split, None) + repo_info.splits[split] = split_info + info_to_dump = repo_info + else: + info_to_dump = DatasetInfo( + config_name=config_name, features=features, splits=SplitDict(), download_size=0, dataset_size=0 + ) + for split_info, uploaded_size in zip(splits_info, uploaded_sizes): + info_to_dump.splits.add(split_info) + info_to_dump.download_size += uploaded_size + info_to_dump.dataset_size += split_info.num_bytes + info_to_dump.size_in_bytes = info_to_dump.download_size + info_to_dump.dataset_size + # create the metadata configs if it was uploaded with push_to_hub before metadata configs existed + repo_splits: list[str] = [] + pattern = glob_pattern_to_regex(PUSH_TO_HUB_WITHOUT_METADATA_CONFIGS_SPLIT_PATTERN_SHARDED) + for file_path in fs.glob(PUSH_TO_HUB_WITHOUT_METADATA_CONFIGS_SPLIT_PATTERN_SHARDED.replace("{split}", "*")): + split_pattern_fields = string_to_dict(file_path, pattern) + assert split_pattern_fields is not None + repo_split = split_pattern_fields["split"] + if repo_split not in repo_splits: + repo_splits.append(repo_split) + if not metadata_configs and repo_splits: + default_metadata_configs_to_dump = { + "data_files": [{"split": split, "path": f"data/{split}-*"} for split in repo_splits] + } + MetadataConfigs({"default": default_metadata_configs_to_dump}).to_dataset_card_data(dataset_card_data) + # update the metadata configs + if config_name in metadata_configs: + metadata_config = metadata_configs[config_name] + if "data_files" in metadata_config: + data_files_to_dump = sanitize_patterns(metadata_config["data_files"]) + else: + data_files_to_dump = {} + # add the new splits + for split_info in splits_info: + split = split_info.name + data_files_to_dump[split] = [f"{data_dir}/{split}-*"] + metadata_config_to_dump = { + "data_files": [ + { + "split": _split, + "path": _pattern[0] if len(_pattern) == 1 else _pattern, + } + for _split, _pattern in data_files_to_dump.items() + ] + } + else: + metadata_config_to_dump = { + "data_files": [ + {"split": split_info.name, "path": f"{data_dir}/{split_info.name}-*"} for split_info in splits_info + ] + } + configs_to_dump = {config_name: metadata_config_to_dump} + if set_default and config_name != "default": + if metadata_configs: + current_default_config_name = metadata_configs.get_default_config_name() + if current_default_config_name == "default": + raise ValueError( + "There exists a configuration named 'default'. To set a different configuration as default, " + "rename the 'default' one first." + ) + if current_default_config_name: + _ = metadata_configs[current_default_config_name].pop("default") + configs_to_dump[current_default_config_name] = metadata_configs[current_default_config_name] + metadata_config_to_dump["default"] = True + # push to the deprecated dataset_infos.json + if legacy_dataset_info: + legacy_dataset_infos: dict = json.loads(fs.read_text(config.DATASETDICT_INFOS_FILENAME, encoding="utf-8")) + legacy_dataset_infos[config_name] = asdict(info_to_dump) + new_legacy_dataset_infos = json.dumps(dataset_infos, indent=4) + else: + new_legacy_dataset_infos = None + # push to README + DatasetInfosDict({config_name: info_to_dump}).to_dataset_card_data(dataset_card_data) + MetadataConfigs(configs_to_dump).to_dataset_card_data(dataset_card_data) + new_dataset_card = DatasetCard(f"---\n{dataset_card_data}\n---\n") if dataset_card is None else dataset_card + return new_dataset_card, new_legacy_dataset_infos + + +def _concatenate_map_style_datasets( + dsets: list[Dataset], + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + axis: int = 0, +): + """ + Converts a list of :class:`Dataset` with the same schema into a single :class:`Dataset`. + When you concatenate on axis 0, missing data are filled with None values. + + Args: + dsets (`List[datasets.Dataset]`): List of Datasets to concatenate. + info (:class:`DatasetInfo`, optional): Dataset information, like description, citation, etc. + split (:class:`NamedSplit`, optional): Name of the dataset split. + axis (``{0, 1}``, default ``0``, meaning over rows): + Axis to concatenate over, where ``0`` means over rows (vertically) and ``1`` means over columns + (horizontally). + + *New in version 1.6.0* + + Example: + + ```py + >>> ds3 = _concatenate_map_style_datasets([ds1, ds2]) + ``` + """ + # Ignore datasets with no rows + if any(dset.num_rows > 0 for dset in dsets): + dsets = [dset for dset in dsets if dset.num_rows > 0] + else: + # Return first dataset if all datasets are empty + return dsets[0] + + # Perform checks (and a potential cast if axis=0) + if axis == 0: + _check_if_features_can_be_aligned([dset.features for dset in dsets]) + else: + if not all(dset.num_rows == dsets[0].num_rows for dset in dsets): + raise ValueError("Number of rows must match for all datasets") + _check_column_names([col_name for dset in dsets for col_name in dset._data.column_names]) + + # Find common format or reset format + format = dsets[0].format + if any(dset.format != format for dset in dsets): + format = {} + logger.info("Some of the datasets have disparate format. Resetting the format of the concatenated dataset.") + + def apply_offset_to_indices_table(table, offset): + if offset == 0: + return table + else: + array = table["indices"] + new_array = pc.add(array, pa.scalar(offset, type=pa.uint64())) + return InMemoryTable.from_arrays([new_array], names=["indices"]) + + # Concatenate indices if they exist + if any(dset._indices is not None for dset in dsets): + if axis == 0: + # Datasets with no indices tables are replaced with a dataset with an indices table in memory. + # Applying an offset to an indices table also brings the table in memory. + indices_tables = [] + for i in range(len(dsets)): + if dsets[i]._indices is None: + dsets[i] = dsets[i]._select_with_indices_mapping(range(len(dsets[i]))) + indices_tables.append(dsets[i]._indices) + + # An offset needs to be applied to the indices before concatenating + offset = 0 + for i in range(len(dsets)): + indices_tables[i] = apply_offset_to_indices_table(indices_tables[i], offset) + offset += len(dsets[i]._data) + + # Concatenate indices + indices_tables = [t for t in indices_tables if len(t) > 0] + if indices_tables: + indices_table = concat_tables(indices_tables) + else: + indices_table = InMemoryTable.from_batches([], schema=pa.schema({"indices": pa.int64()})) + else: + if len(dsets) == 1: + indices_table = dsets[0]._indices + else: + for i in range(len(dsets)): + dsets[i] = dsets[i].flatten_indices() + indices_table = None + else: + indices_table = None + + table = concat_tables([dset._data for dset in dsets], axis=axis) + if axis == 0: + features_list = _align_features([dset.features for dset in dsets]) + else: + features_list = [dset.features for dset in dsets] + table = update_metadata_with_features(table, {k: v for features in features_list for k, v in features.items()}) + + # Concatenate infos + if info is None: + info = DatasetInfo.from_merge([dset.info for dset in dsets]) + fingerprint = update_fingerprint( + "".join(dset._fingerprint for dset in dsets), _concatenate_map_style_datasets, {"info": info, "split": split} + ) + + # Make final concatenated dataset + concatenated_dataset = Dataset( + table, + info=info, + split=split, + indices_table=indices_table, + fingerprint=fingerprint, + ) + concatenated_dataset.set_format(**format) + return concatenated_dataset + + +def _interleave_map_style_datasets( + datasets: list["Dataset"], + probabilities: Optional[list[float]] = None, + seed: Optional[int] = None, + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + stopping_strategy: Literal[ + "first_exhausted", "all_exhausted", "all_exhausted_without_replacement" + ] = "first_exhausted", + **kwargs, +) -> "Dataset": + """ + Interleave several map-style datasets (sources) into a single map-style dataset. + The new dataset is constructed by alternating between the sources to get the examples. + If `probabilities = None` (default) the new dataset is constructed by cycling between each source to get the examples. + If `probabilities` is not `None, the new dataset is constructed by getting examples from a random source at a time according to the provided probabilities. + + Args: + datasets (`List[Dataset]`): list of datasets to interleave + probabilities (`List[float]`, optional, default None): If specified, the new dataset is constructed by sampling + examples from one source at a time according to these probabilities. + seed (`int`, optional, default None): The random seed used to choose a source for each example. + info (:class:`DatasetInfo`, optional): Dataset information, like description, citation, etc. + split (:class:`NamedSplit`, optional): Name of the dataset split. + stopping_strategy (`str`, defaults to `first_exhausted`): + Two strategies are proposed right now. + By default, `first_exhausted` is an undersampling strategy, i.e the dataset construction is stopped as soon as one dataset has ran out of samples. + If the strategy is `all_exhausted`, we use an oversampling strategy, i.e the dataset construction is stopped as soon as every samples of every dataset has been added at least once. + When strategy is `all_exhausted_without_replacement` we make sure that each sample in each dataset is sampled only once. + Note that if the strategy is `all_exhausted`, the interleaved dataset size can get enormous: + - with no probabilities, the resulting dataset will have max_length_datasets*nb_dataset samples. + - with given probabilities, the resulting dataset will have more samples if some datasets have really low probability of visiting. + **kwargs (additional keyword arguments): Keyword arguments to be passed to :meth:`datasets.Datasets.select` when selecting the indices used to interleave the datasets. + + Output: + :class:`datasets.Dataset` + """ + if stopping_strategy not in ["first_exhausted", "all_exhausted", "all_exhausted_without_replacement"]: + raise ValueError( + f"{stopping_strategy} stopping strategy in `interleave_datasets` is not implemented yet with a list of {type(datasets[0])}" + ) + + # To interleave the datasets, we concatenate them and then we re-order the indices + concatenated_datasets = _concatenate_map_style_datasets(datasets, info=info, split=split) + + # Let's now build the indices to pass to .select() + lengths = [len(dset) for dset in datasets] + offsets = np.cumsum([0] + lengths[:-1]) + + # if stopping_strategy is "first_exhausted", it is an undersampling situation whereas it is an oversampling situation if it is "all_exhausted" + oversampling = stopping_strategy == "all_exhausted" + + if probabilities is None and stopping_strategy == "all_exhausted_without_replacement": + # Without replacement situation with cycling between each sources + # Example: If lengths of the datasets are [3, 4, 3] + # Then the resulting indices should be [0, 3, 7, 1, 4, 8, 2, 5, 9, 6] + # We cycle through datasets until all are exhausted, but skip exhausted datasets + + # Reasoning behind the following operation: keeping the first indices of each dataset + # while offsetting in order to correspond to the right indices of the concatenated dataset + # and flattening to effectively interleave the datasets. Then we remove the exausted datasets + # and we continue with the following indices, until all datasets are exhausted + chunks_boundaries = [0] + sorted(set(lengths)) + chunks = zip(chunks_boundaries[:-1], chunks_boundaries[1:]) + indices_chunks = [] + for start, end in chunks: + indices_chunks.append((np.array(offsets).reshape(1, -1) + np.arange(start, end).reshape(-1, 1)).flatten()) + exhausted_indices = [i for i in range(len(lengths)) if lengths[i] == end] + lengths = np.delete(lengths, exhausted_indices).tolist() + offsets = np.delete(offsets, exhausted_indices) + indices = np.concatenate(indices_chunks).tolist() + + elif probabilities is None and not oversampling: + # Undersampling situation with cycling between each sources + # Example:: If lengths of the datasets are [3, 4, 5] + # Then the resulting indices should be [0, 3, 7, 1, 4, 8, 2, 5, 9] + # Note that we only have 3 examples per dataset since the first dataset ran out of examples + + # Reasoning behind the following operation: keeping the min_length first indices of each dataset + # while offsetting in order to correspond to the right indices of the concatenated dataset + # and flattening to effectively interleave the datasets + indices = (offsets.reshape(1, -1) + np.arange(min(lengths)).reshape(-1, 1)).flatten().tolist() + elif probabilities is None: + # Oversampling situation with cycling between each sources + # Then the resulting indices should be [0, 3, 7, 1, 4, 8, 2, 5, 9, 0, 6, 10, 1, 3, 11] + # Note that we have 5 examples per dataset with a rolling window since the longest dataset has 5 samples + + # Reasoning behind the following operation: for each dataset indices (i.e column) repeat the indices to have max_length indices per dataset + # For example, if the max_length is 5 and the i-th dataset has 3 samples, the i-th column will be [0,1,2,0,1] + indices = np.mod(np.arange(max(lengths)).reshape(-1, 1), np.array(lengths).reshape(1, -1)) + + # We have to keep the indices to their respective dataset offsets and to flatten to effectively interleave the datasets + indices = (indices + offsets).flatten().tolist() + + else: + # boolean array indicating if at index i if the dataset_i has been fully exhausted + is_exhausted = np.full(len(lengths), False) + + # if undersampling ("first_exhausted"), we stop as soon as one dataset is exhausted + # if oversampling ("all_exhausted"), we stop as soons as every dataset is exhausted, i.e as soon as every samples of every dataset has been visited at least once + bool_strategy_func = ( + np.all if (oversampling or stopping_strategy == "all_exhausted_without_replacement") else np.any + ) + + def iter_random_indices(): + """Get an infinite iterator that randomly samples the index of the source to pick examples from.""" + rng = np.random.default_rng(seed) + while True: + yield from (int(i) for i in rng.choice(len(datasets), size=1000, p=probabilities)) + + current_index = [0] * len(datasets) + indices = [] + for source_idx in iter_random_indices(): + # If no oversampling, we stop as soon as a dataset has ran out of examples (np.any) + # Otherwise, we stop as soon as every dataset has ran out of examples (np.all) + if bool_strategy_func(is_exhausted): + # the stopping condition was reached, let's stop + break + + # let's add the example at the current index of the `source_idx`-th dataset + # For without replacement sampling we additionally need to make sure the current source is not exhausted to not oversample. + if stopping_strategy != "all_exhausted_without_replacement" or not is_exhausted[source_idx]: + indices.append(current_index[source_idx] + offsets[source_idx]) + current_index[source_idx] += 1 + + # we've ran out of examples for the current dataset, let's update our boolean array and bring the current_index back to 0 + if current_index[source_idx] >= lengths[source_idx]: + is_exhausted[source_idx] = True + # We don't want to reset the iterator when stopping strategy is without replacement. + if stopping_strategy != "all_exhausted_without_replacement": + current_index[source_idx] = 0 + + return concatenated_datasets.select(indices, **kwargs) + + +def _split_by_node_map_style_dataset(dataset: Dataset, rank: int, world_size: int) -> Dataset: + """ + Split a dataset for the node at rank `rank` in a pool of nodes of size `world_size`. + Each node is assigned a chunk of data, e.g. rank 0 is given the first chunk of the dataset. + To maximize data loading throughput, chunks are made of contiguous data on disk if possible. + + Args: + dataset ([`Dataset`]): + The dataset to split by node. + rank (`int`): + Rank of the current node. + world_size (`int`): + Total number of nodes. + + Returns: + [`Dataset`]: The dataset to be used on the node at rank `rank`. + """ + return dataset.shard(num_shards=world_size, index=rank, contiguous=True) + + +# This is outside Dataset.filter as it needs to be picklable for multiprocessing + + +def get_indices_from_mask_function( + function: Callable, + batched: bool, + with_indices: bool, + with_rank: bool, + input_columns: Optional[Union[str, list[str]]], + indices_mapping: Optional[Table] = None, + *args, + **fn_kwargs, +): + if batched: + # we extract indices and rank from args + *inputs, indices, rank = args + additional_args = () + if with_indices: + additional_args += (indices,) + if with_rank: + additional_args += (rank,) + mask = function(*inputs, *additional_args, **fn_kwargs) + if isinstance(mask, (pa.Array, pa.ChunkedArray)): + mask = mask.to_pylist() + else: + # we get batched data (to return less data than input) but `function` only accepts one example + # therefore we need to call `function` on each example of the batch to get the mask + *inputs, indices, rank = args + mask = [] + if input_columns is None: + # inputs only contains a batch of examples + batch: dict = inputs[0] + num_examples = len(batch[next(iter(batch.keys()))]) + for i in range(num_examples): + example = {key: batch[key][i] for key in batch} + additional_args = () + if with_indices: + additional_args += (indices[i],) + if with_rank: + additional_args += (rank,) + mask.append(function(example, *additional_args, **fn_kwargs)) + else: + # inputs is a list of columns + columns: list[list] = inputs + num_examples = len(columns[0]) + for i in range(num_examples): + input = [column[i] for column in columns] + additional_args = () + if with_indices: + additional_args += (indices[i],) + if with_rank: + additional_args += (rank,) + mask.append(function(*input, *additional_args, **fn_kwargs)) + indices_array = [i for i, to_keep in zip(indices, mask) if to_keep] + if indices_mapping is not None: + indices_array = pa.array(indices_array, type=pa.uint64()) + indices_array = indices_mapping.column(0).take(indices_array) + indices_array = indices_array.to_pylist() + return {"indices": indices_array} + + +async def async_get_indices_from_mask_function( + function: Callable, + batched: bool, + with_indices: bool, + with_rank: bool, + input_columns: Optional[Union[str, list[str]]], + indices_mapping: Optional[Table] = None, + *args, + **fn_kwargs, +): + """same function but async""" + if batched: + # we extract indices and rank from args + *inputs, indices, rank = args + additional_args = () + if with_indices: + additional_args += (indices,) + if with_rank: + additional_args += (rank,) + mask = await function(*inputs, *additional_args, **fn_kwargs) + if isinstance(mask, (pa.Array, pa.ChunkedArray)): + mask = mask.to_pylist() + else: + # we get batched data (to return less data than input) but `function` only accepts one example + # therefore we need to call `function` on each example of the batch to get the mask + *inputs, indices, rank = args + mask = [] + if input_columns is None: + # inputs only contains a batch of examples + batch: dict = inputs[0] + num_examples = len(batch[next(iter(batch.keys()))]) + for i in range(num_examples): + example = {key: batch[key][i] for key in batch} + additional_args = () + if with_indices: + additional_args += (indices[i],) + if with_rank: + additional_args += (rank,) + mask.append(await function(example, *additional_args, **fn_kwargs)) + else: + # inputs is a list of columns + columns: list[list] = inputs + num_examples = len(columns[0]) + for i in range(num_examples): + input = [column[i] for column in columns] + additional_args = () + if with_indices: + additional_args += (indices[i],) + if with_rank: + additional_args += (rank,) + mask.append(await function(*input, *additional_args, **fn_kwargs)) + indices_array = [i for i, to_keep in zip(indices, mask) if to_keep] + if indices_mapping is not None: + indices_array = pa.array(indices_array, type=pa.uint64()) + indices_array = indices_mapping.column(0).take(indices_array) + indices_array = indices_array.to_pylist() + return {"indices": indices_array} diff --git a/src/datasets/arrow_reader.py b/src/datasets/arrow_reader.py new file mode 100644 index 0000000..d9cf2cf --- /dev/null +++ b/src/datasets/arrow_reader.py @@ -0,0 +1,620 @@ +# Copyright 2020 The HuggingFace Datasets Authors and the TensorFlow Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""Arrow ArrowReader.""" + +import copy +import math +import os +import re +from dataclasses import dataclass +from functools import partial +from typing import TYPE_CHECKING, Optional, Union + +import pyarrow as pa +import pyarrow.parquet as pq +from tqdm.contrib.concurrent import thread_map + +from .download.download_config import DownloadConfig # noqa: F401 +from .naming import _split_re, filenames_for_dataset_split +from .table import InMemoryTable, MemoryMappedTable, Table, concat_tables +from .utils import logging +from .utils import tqdm as hf_tqdm + + +if TYPE_CHECKING: + from .info import DatasetInfo # noqa: F401 + from .splits import Split, SplitInfo # noqa: F401 + + +logger = logging.get_logger(__name__) + +HF_GCP_BASE_URL = "https://storage.googleapis.com/huggingface-nlp/cache/datasets" + +_SUB_SPEC_RE = re.compile( + rf""" +^ + (?P{_split_re[1:-1]}) + (\[ + ((?P-?[\d_]+) + (?P%)?)? + : + ((?P-?[\d_]+) + (?P%)?)? + \])?(\((?P[^\)]*)\))? +$ +""", # remove ^ and $ + re.X, +) + +_ADDITION_SEP_RE = re.compile(r"\s*\+\s*") + + +class DatasetNotOnHfGcsError(ConnectionError): + """When you can't get the dataset from the Hf google cloud storage""" + + pass + + +class MissingFilesOnHfGcsError(ConnectionError): + """When some files are missing on the Hf oogle cloud storage""" + + pass + + +@dataclass(frozen=True) +class FileInstructions: + """The file instructions associated with a split ReadInstruction. + + Attributes: + num_examples: `int`, The total number of examples + file_instructions: List[dict(filename, skip, take)], the files information. + The filenames contains the relative path, not absolute. + skip/take indicates which example read in the file: `ds.slice(skip, take)` + """ + + num_examples: int + file_instructions: list[dict] + + +def make_file_instructions( + name: str, + split_infos: list["SplitInfo"], + instruction: Union[str, "ReadInstruction"], + filetype_suffix: Optional[str] = None, + prefix_path: Optional[str] = None, +) -> FileInstructions: + """Returns instructions of the split dict. + + Args: + name (`str`): Name of the dataset. + split_infos (`list` of `[SplitInfo]`): Dataset splits information. + instruction ([`ReadInstruction`] or `str`): Reading instruction for a dataset. + filetype_suffix (`str`, *optional*): Suffix of dataset files, e.g. 'arrow' or 'parquet'. + prefix_path (`str`, *optional*): Prefix of dataset files, e.g. directory name. + + Returns: + [`FileInstructions`] + """ + if not isinstance(name, str): + raise TypeError(f"Expected str 'name', but got: {type(name).__name__}") + elif not name: + raise ValueError("Expected non-empty str 'name'") + name2len = {info.name: info.num_examples for info in split_infos} + name2shard_lengths = {info.name: info.shard_lengths for info in split_infos} + name2filenames = { + info.name: filenames_for_dataset_split( + path=prefix_path, + dataset_name=name, + split=info.name, + filetype_suffix=filetype_suffix, + shard_lengths=name2shard_lengths[info.name], + ) + for info in split_infos + } + if not isinstance(instruction, ReadInstruction): + instruction = ReadInstruction.from_spec(instruction) + # Create the absolute instruction (per split) + absolute_instructions = instruction.to_absolute(name2len) + + # For each split, return the files instruction (skip/take) + file_instructions = [] + num_examples = 0 + for abs_instr in absolute_instructions: + split_length = name2len[abs_instr.splitname] + filenames = name2filenames[abs_instr.splitname] + shard_lengths = name2shard_lengths[abs_instr.splitname] + from_ = 0 if abs_instr.from_ is None else abs_instr.from_ + to = split_length if abs_instr.to is None else abs_instr.to + if shard_lengths is None: # not sharded + for filename in filenames: + take = to - from_ + if take == 0: + continue + num_examples += take + file_instructions.append({"filename": filename, "skip": from_, "take": take}) + else: # sharded + index_start = 0 # Beginning (included) of moving window. + index_end = 0 # End (excluded) of moving window. + for filename, shard_length in zip(filenames, shard_lengths): + index_end += shard_length + if from_ < index_end and to > index_start: # There is something to take. + skip = from_ - index_start if from_ > index_start else 0 + take = to - index_start - skip if to < index_end else -1 + if take == 0: + continue + file_instructions.append({"filename": filename, "skip": skip, "take": take}) + num_examples += shard_length - skip if take == -1 else take + index_start += shard_length + return FileInstructions( + num_examples=num_examples, + file_instructions=file_instructions, + ) + + +class BaseReader: + """ + Build a Dataset object out of Instruction instance(s). + """ + + def __init__(self, path: str, info: Optional["DatasetInfo"]): + """Initializes ArrowReader. + + Args: + path (str): path where tfrecords are stored. + info (DatasetInfo): info about the dataset. + """ + self._path: str = path + self._info: Optional["DatasetInfo"] = info + self._filetype_suffix: Optional[str] = None + + def _get_table_from_filename(self, filename_skip_take, in_memory=False) -> Table: + """Returns a Dataset instance from given (filename, skip, take).""" + raise NotImplementedError + + def _read_files(self, files, in_memory=False) -> Table: + """Returns Dataset for given file instructions. + + Args: + files: List[dict(filename, skip, take)], the files information. + The filenames contain the absolute path, not relative. + skip/take indicates which example read in the file: `ds.slice(skip, take)` + in_memory (bool, default False): Whether to copy the data in-memory. + """ + if len(files) == 0 or not all(isinstance(f, dict) for f in files): + raise ValueError("please provide valid file informations") + files = copy.deepcopy(files) + for f in files: + f["filename"] = os.path.join(self._path, f["filename"]) + + pa_tables = thread_map( + partial(self._get_table_from_filename, in_memory=in_memory), + files, + tqdm_class=hf_tqdm, + desc="Loading dataset shards", + # set `disable=None` rather than `disable=False` by default to disable progress bar when no TTY attached + disable=len(files) <= 16 or None, + ) + pa_tables = [t for t in pa_tables if len(t) > 0] + if not pa_tables and (self._info is None or self._info.features is None): + raise ValueError( + "Tried to read an empty table. Please specify at least info.features to create an empty table with the right type." + ) + pa_tables = pa_tables or [InMemoryTable.from_batches([], schema=pa.schema(self._info.features.type))] + pa_table = concat_tables(pa_tables) if len(pa_tables) != 1 else pa_tables[0] + return pa_table + + def get_file_instructions(self, name, instruction, split_infos): + """Return list of dict {'filename': str, 'skip': int, 'take': int}""" + file_instructions = make_file_instructions( + name, split_infos, instruction, filetype_suffix=self._filetype_suffix, prefix_path=self._path + ) + files = file_instructions.file_instructions + return files + + def read( + self, + name, + instructions, + split_infos, + in_memory=False, + ): + """Returns Dataset instance(s). + + Args: + name (str): name of the dataset. + instructions (ReadInstruction): instructions to read. + Instruction can be string and will then be passed to the Instruction + constructor as it. + split_infos (list of SplitInfo proto): the available splits for dataset. + in_memory (bool, default False): Whether to copy the data in-memory. + + Returns: + kwargs to build a single Dataset instance. + """ + + files = self.get_file_instructions(name, instructions, split_infos) + if not files: + msg = f'Instruction "{instructions}" corresponds to no data!' + raise ValueError(msg) + return self.read_files(files=files, original_instructions=instructions, in_memory=in_memory) + + def read_files( + self, + files: list[dict], + original_instructions: Union[None, "ReadInstruction", "Split"] = None, + in_memory=False, + ): + """Returns single Dataset instance for the set of file instructions. + + Args: + files: List[dict(filename, skip, take)], the files information. + The filenames contains the relative path, not absolute. + skip/take indicates which example read in the file: `ds.skip().take()` + original_instructions: store the original instructions used to build the dataset split in the dataset. + in_memory (bool, default False): Whether to copy the data in-memory. + + Returns: + kwargs to build a Dataset instance. + """ + # Prepend path to filename + pa_table = self._read_files(files, in_memory=in_memory) + # If original_instructions is not None, convert it to a human-readable NamedSplit + if original_instructions is not None: + from .splits import Split # noqa + + split = Split(str(original_instructions)) + else: + split = None + dataset_kwargs = {"arrow_table": pa_table, "info": self._info, "split": split} + return dataset_kwargs + + +class ArrowReader(BaseReader): + """ + Build a Dataset object out of Instruction instance(s). + This Reader uses either memory mapping or file descriptors (in-memory) on arrow files. + """ + + def __init__(self, path: str, info: Optional["DatasetInfo"]): + """Initializes ArrowReader. + + Args: + path (str): path where Arrow files are stored. + info (DatasetInfo): info about the dataset. + """ + super().__init__(path, info) + self._filetype_suffix = "arrow" + + def _get_table_from_filename(self, filename_skip_take, in_memory=False) -> Table: + """Returns a Dataset instance from given (filename, skip, take).""" + filename, skip, take = ( + filename_skip_take["filename"], + filename_skip_take["skip"] if "skip" in filename_skip_take else None, + filename_skip_take["take"] if "take" in filename_skip_take else None, + ) + table = ArrowReader.read_table(filename, in_memory=in_memory) + if take == -1: + take = len(table) - skip + # here we don't want to slice an empty table, or it may segfault + if skip is not None and take is not None and not (skip == 0 and take == len(table)): + table = table.slice(skip, take) + return table + + @staticmethod + def read_table(filename, in_memory=False) -> Table: + """ + Read table from file. + + Args: + filename (str): File name of the table. + in_memory (bool, default=False): Whether to copy the data in-memory. + + Returns: + pyarrow.Table + """ + table_cls = InMemoryTable if in_memory else MemoryMappedTable + return table_cls.from_file(filename) + + +class ParquetReader(BaseReader): + """ + Build a Dataset object out of Instruction instance(s). + This Reader uses memory mapping on parquet files. + """ + + def __init__(self, path: str, info: Optional["DatasetInfo"]): + """Initializes ParquetReader. + + Args: + path (str): path where tfrecords are stored. + info (DatasetInfo): info about the dataset. + """ + super().__init__(path, info) + self._filetype_suffix = "parquet" + + def _get_table_from_filename(self, filename_skip_take, **kwargs): + """Returns a Dataset instance from given (filename, skip, take).""" + filename, skip, take = ( + filename_skip_take["filename"], + filename_skip_take["skip"] if "skip" in filename_skip_take else None, + filename_skip_take["take"] if "take" in filename_skip_take else None, + ) + # Parquet read_table always loads data in memory, independently of memory_map + pa_table = pq.read_table(filename, memory_map=True) + # here we don't want to slice an empty table, or it may segfault + if skip is not None and take is not None and not (skip == 0 and take == len(pa_table)): + pa_table = pa_table.slice(skip, take) + return pa_table + + +@dataclass(frozen=True) +class _AbsoluteInstruction: + """A machine friendly slice: defined absolute positive boundaries.""" + + splitname: str + from_: int # uint (starting index). + to: int # uint (ending index). + + +@dataclass(frozen=True) +class _RelativeInstruction: + """Represents a single parsed slicing instruction, can use % and negatives.""" + + splitname: str + from_: Optional[int] = None # int (starting index) or None if no lower boundary. + to: Optional[int] = None # int (ending index) or None if no upper boundary. + unit: Optional[str] = None + rounding: Optional[str] = None + + def __post_init__(self): + if self.unit is not None and self.unit not in ["%", "abs"]: + raise ValueError("unit must be either % or abs") + if self.rounding is not None and self.rounding not in ["closest", "pct1_dropremainder"]: + raise ValueError("rounding must be either closest or pct1_dropremainder") + if self.unit != "%" and self.rounding is not None: + raise ValueError("It is forbidden to specify rounding if not using percent slicing.") + if self.unit == "%" and self.from_ is not None and abs(self.from_) > 100: + raise ValueError("Percent slice boundaries must be > -100 and < 100.") + if self.unit == "%" and self.to is not None and abs(self.to) > 100: + raise ValueError("Percent slice boundaries must be > -100 and < 100.") + # Update via __dict__ due to instance being "frozen" + self.__dict__["rounding"] = "closest" if self.rounding is None and self.unit == "%" else self.rounding + + +def _str_to_read_instruction(spec): + """Returns ReadInstruction for given string.""" + res = _SUB_SPEC_RE.match(spec) + if not res: + raise ValueError(f"Unrecognized instruction format: {spec}") + unit = "%" if res.group("from_pct") or res.group("to_pct") else "abs" + return ReadInstruction( + split_name=res.group("split"), + rounding=res.group("rounding"), + from_=int(res.group("from")) if res.group("from") else None, + to=int(res.group("to")) if res.group("to") else None, + unit=unit, + ) + + +def _pct_to_abs_pct1(boundary, num_examples): + # Using math.trunc here, since -99.5% should give -99%, not -100%. + if num_examples < 100: + msg = ( + 'Using "pct1_dropremainder" rounding on a split with less than 100 ' + "elements is forbidden: it always results in an empty dataset." + ) + raise ValueError(msg) + return boundary * math.trunc(num_examples / 100.0) + + +def _pct_to_abs_closest(boundary, num_examples): + return int(round(boundary * num_examples / 100.0)) + + +def _rel_to_abs_instr(rel_instr, name2len): + """Returns _AbsoluteInstruction instance for given RelativeInstruction. + + Args: + rel_instr: RelativeInstruction instance. + name2len: dict {split_name: num_examples}. + """ + pct_to_abs = _pct_to_abs_closest if rel_instr.rounding == "closest" else _pct_to_abs_pct1 + split = rel_instr.splitname + if split not in name2len: + raise ValueError(f'Unknown split "{split}". Should be one of {list(name2len)}.') + num_examples = name2len[split] + from_ = rel_instr.from_ + to = rel_instr.to + if rel_instr.unit == "%": + from_ = 0 if from_ is None else pct_to_abs(from_, num_examples) + to = num_examples if to is None else pct_to_abs(to, num_examples) + else: + from_ = 0 if from_ is None else from_ + to = num_examples if to is None else to + if from_ < 0: + from_ = max(num_examples + from_, 0) + if to < 0: + to = max(num_examples + to, 0) + from_ = min(from_, num_examples) + to = min(to, num_examples) + return _AbsoluteInstruction(split, from_, to) + + +class ReadInstruction: + """Reading instruction for a dataset. + + Examples:: + + # The following lines are equivalent: + ds = datasets.load_dataset('ylecun/mnist', split='test[:33%]') + ds = datasets.load_dataset('ylecun/mnist', split=datasets.ReadInstruction.from_spec('test[:33%]')) + ds = datasets.load_dataset('ylecun/mnist', split=datasets.ReadInstruction('test', to=33, unit='%')) + ds = datasets.load_dataset('ylecun/mnist', split=datasets.ReadInstruction( + 'test', from_=0, to=33, unit='%')) + + # The following lines are equivalent: + ds = datasets.load_dataset('ylecun/mnist', split='test[:33%]+train[1:-1]') + ds = datasets.load_dataset('ylecun/mnist', split=datasets.ReadInstruction.from_spec( + 'test[:33%]+train[1:-1]')) + ds = datasets.load_dataset('ylecun/mnist', split=( + datasets.ReadInstruction('test', to=33, unit='%') + + datasets.ReadInstruction('train', from_=1, to=-1, unit='abs'))) + + # The following lines are equivalent: + ds = datasets.load_dataset('ylecun/mnist', split='test[:33%](pct1_dropremainder)') + ds = datasets.load_dataset('ylecun/mnist', split=datasets.ReadInstruction.from_spec( + 'test[:33%](pct1_dropremainder)')) + ds = datasets.load_dataset('ylecun/mnist', split=datasets.ReadInstruction( + 'test', from_=0, to=33, unit='%', rounding="pct1_dropremainder")) + + # 10-fold validation: + tests = datasets.load_dataset( + 'ylecun/mnist', + [datasets.ReadInstruction('train', from_=k, to=k+10, unit='%') + for k in range(0, 100, 10)]) + trains = datasets.load_dataset( + 'ylecun/mnist', + [datasets.ReadInstruction('train', to=k, unit='%') + datasets.ReadInstruction('train', from_=k+10, unit='%') + for k in range(0, 100, 10)]) + + """ + + def _init(self, relative_instructions): + # Private initializer. + self._relative_instructions = relative_instructions + + @classmethod + def _read_instruction_from_relative_instructions(cls, relative_instructions): + """Returns ReadInstruction obj initialized with relative_instructions.""" + # Use __new__ to bypass __init__ used by public API and not conveniant here. + result = cls.__new__(cls) + result._init(relative_instructions) # pylint: disable=protected-access + return result + + def __init__(self, split_name, rounding=None, from_=None, to=None, unit=None): + """Initialize ReadInstruction. + + Args: + split_name (str): name of the split to read. Eg: 'train'. + rounding (str, optional): The rounding behaviour to use when percent slicing is + used. Ignored when slicing with absolute indices. + Possible values: + - 'closest' (default): The specified percentages are rounded to the + closest value. Use this if you want specified percents to be as + much exact as possible. + - 'pct1_dropremainder': the specified percentages are treated as + multiple of 1%. Use this option if you want consistency. Eg: + len(5%) == 5 * len(1%). + Using this option, one might not be able to use the full set of + examples, if the number of those is not a multiple of 100. + from_ (int): + to (int): alternative way of specifying slicing boundaries. If any of + {from_, to, unit} argument is used, slicing cannot be specified as + string. + unit (str): optional, one of: + '%': to set the slicing unit as percents of the split size. + 'abs': to set the slicing unit as absolute numbers. + """ + # This constructor is not always called. See factory method + # `_read_instruction_from_relative_instructions`. Common init instructions + # MUST be placed in the _init method. + self._init([_RelativeInstruction(split_name, from_, to, unit, rounding)]) + + @classmethod + def from_spec(cls, spec): + """Creates a `ReadInstruction` instance out of a string spec. + + Args: + spec (`str`): + Split(s) + optional slice(s) to read + optional rounding + if percents are used as the slicing unit. A slice can be specified, + using absolute numbers (`int`) or percentages (`int`). + + Examples: + + ``` + test: test split. + test + validation: test split + validation split. + test[10:]: test split, minus its first 10 records. + test[:10%]: first 10% records of test split. + test[:20%](pct1_dropremainder): first 10% records, rounded with the pct1_dropremainder rounding. + test[:-5%]+train[40%:60%]: first 95% of test + middle 20% of train. + ``` + + Returns: + ReadInstruction instance. + """ + spec = str(spec) # Need to convert to str in case of NamedSplit instance. + subs = _ADDITION_SEP_RE.split(spec) + if not subs: + raise ValueError(f"No instructions could be built out of {spec}") + instruction = _str_to_read_instruction(subs[0]) + return sum((_str_to_read_instruction(sub) for sub in subs[1:]), instruction) + + def to_spec(self): + rel_instr_specs = [] + for rel_instr in self._relative_instructions: + rel_instr_spec = rel_instr.splitname + if rel_instr.from_ is not None or rel_instr.to is not None: + from_ = rel_instr.from_ + to = rel_instr.to + unit = rel_instr.unit + rounding = rel_instr.rounding + unit = unit if unit == "%" else "" + from_ = str(from_) + unit if from_ is not None else "" + to = str(to) + unit if to is not None else "" + slice_str = f"[{from_}:{to}]" + rounding_str = ( + f"({rounding})" if unit == "%" and rounding is not None and rounding != "closest" else "" + ) + rel_instr_spec += slice_str + rounding_str + rel_instr_specs.append(rel_instr_spec) + return "+".join(rel_instr_specs) + + def __add__(self, other): + """Returns a new ReadInstruction obj, result of appending other to self.""" + if not isinstance(other, ReadInstruction): + msg = "ReadInstruction can only be added to another ReadInstruction obj." + raise TypeError(msg) + self_ris = self._relative_instructions + other_ris = other._relative_instructions # pylint: disable=protected-access + if ( + self_ris[0].unit != "abs" + and other_ris[0].unit != "abs" + and self._relative_instructions[0].rounding != other_ris[0].rounding + ): + raise ValueError("It is forbidden to sum ReadInstruction instances with different rounding values.") + return self._read_instruction_from_relative_instructions(self_ris + other_ris) + + def __str__(self): + return self.to_spec() + + def __repr__(self): + return f"ReadInstruction({self._relative_instructions})" + + def to_absolute(self, name2len): + """Translate instruction into a list of absolute instructions. + + Those absolute instructions are then to be added together. + + Args: + name2len (`dict`): + Associating split names to number of examples. + + Returns: + list of _AbsoluteInstruction instances (corresponds to the + in spec). + """ + return [_rel_to_abs_instr(rel_instr, name2len) for rel_instr in self._relative_instructions] diff --git a/src/datasets/arrow_writer.py b/src/datasets/arrow_writer.py new file mode 100644 index 0000000..2bd6f9f --- /dev/null +++ b/src/datasets/arrow_writer.py @@ -0,0 +1,828 @@ +# Copyright 2020 The HuggingFace Datasets Authors and the TensorFlow Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""To write records into Parquet files.""" + +import io +import json +import sys +from collections.abc import Iterable +from typing import Any, Literal, Optional + +import fsspec +import numpy as np +import pyarrow as pa +import pyarrow.json as paj +import pyarrow.parquet as pq +from fsspec.core import url_to_fs + +from . import config +from .features import Audio, Features, Image, Pdf, Value, Video +from .features.features import ( + FeatureType, + List, + _ArrayXDExtensionType, + _visit, + cast_to_python_objects, + generate_from_arrow_type, + get_nested_type, + list_of_np_array_to_pyarrow_listarray, + numpy_to_pyarrow_listarray, + require_storage_embed, + to_pyarrow_listarray, +) +from .filesystems import is_remote_filesystem +from .info import DatasetInfo +from .table import array_cast, cast_array_to_feature, embed_table_storage, table_cast +from .utils import logging +from .utils.json import ( + find_mixed_struct_types_field_paths, + get_json_field_path_from_pyarrow_json_error, + get_json_field_paths_from_feature, + insert_json_field_path, + json_encode_field, + json_encode_fields_in_json_lines, + set_json_types_in_feature, + ujson_dumps, +) +from .utils.py_utils import asdict, convert_file_size_to_int, first_non_null_non_empty_value + + +logger = logging.get_logger(__name__) + +type_ = type # keep python's type function + + +def get_arrow_writer_batch_size_from_features(features: Optional[Features]) -> Optional[int]: + """ + Get the writer_batch_size that defines the maximum record batch size in the arrow files based on configuration values. + The default value is 100 for image/audio datasets and 10 for videos. + This allows to avoid overflows in arrow buffers. + + Args: + features (`datasets.Features` or `None`): + Dataset Features from `datasets`. + Returns: + writer_batch_size (`Optional[int]`): + Writer batch size to pass to a dataset builder. + If `None`, then it will use the `datasets` default, i.e. `datasets.config.DEFAULT_MAX_BATCH_SIZE`. + """ + if not features: + return None + + batch_size = np.inf + + def set_batch_size(feature: FeatureType) -> None: + nonlocal batch_size + if isinstance(feature, Image) and config.ARROW_RECORD_BATCH_SIZE_FOR_IMAGE_DATASETS is not None: + batch_size = min(batch_size, config.ARROW_RECORD_BATCH_SIZE_FOR_IMAGE_DATASETS) + elif isinstance(feature, Audio) and config.ARROW_RECORD_BATCH_SIZE_FOR_AUDIO_DATASETS is not None: + batch_size = min(batch_size, config.ARROW_RECORD_BATCH_SIZE_FOR_AUDIO_DATASETS) + elif isinstance(feature, Video) and config.ARROW_RECORD_BATCH_SIZE_FOR_VIDEO_DATASETS is not None: + batch_size = min(batch_size, config.ARROW_RECORD_BATCH_SIZE_FOR_VIDEO_DATASETS) + elif ( + isinstance(feature, Value) + and feature.dtype == "binary" + and config.ARROW_RECORD_BATCH_SIZE_FOR_BINARY_DATASETS is not None + ): + batch_size = min(batch_size, config.ARROW_RECORD_BATCH_SIZE_FOR_BINARY_DATASETS) + + _visit(features, set_batch_size) + + return None if batch_size is np.inf else batch_size + + +def get_writer_batch_size_from_features(features: Optional[Features]) -> Optional[int]: + """ + Get the writer_batch_size that defines the maximum row group size in the parquet files based on configuration values. + By default these are not set, but it can be helpful to hard set those values in some cases. + This allows to optimize random access to parquet file, since accessing 1 row requires + to read its entire row group. + + Args: + features (`datasets.Features` or `None`): + Dataset Features from `datasets`. + Returns: + writer_batch_size (`Optional[int]`): + Writer batch size to pass to a parquet writer. + If `None`, then it will use the `datasets` default, i.e. aiming for row groups of 100MB. + """ + if not features: + return None + + batch_size = np.inf + + def set_batch_size(feature: FeatureType) -> None: + nonlocal batch_size + if isinstance(feature, Image) and config.PARQUET_ROW_GROUP_SIZE_FOR_IMAGE_DATASETS is not None: + batch_size = min(batch_size, config.PARQUET_ROW_GROUP_SIZE_FOR_IMAGE_DATASETS) + elif isinstance(feature, Audio) and config.PARQUET_ROW_GROUP_SIZE_FOR_AUDIO_DATASETS is not None: + batch_size = min(batch_size, config.PARQUET_ROW_GROUP_SIZE_FOR_AUDIO_DATASETS) + elif isinstance(feature, Video) and config.PARQUET_ROW_GROUP_SIZE_FOR_VIDEO_DATASETS is not None: + batch_size = min(batch_size, config.PARQUET_ROW_GROUP_SIZE_FOR_VIDEO_DATASETS) + elif ( + isinstance(feature, Value) + and feature.dtype == "binary" + and config.PARQUET_ROW_GROUP_SIZE_FOR_BINARY_DATASETS is not None + ): + batch_size = min(batch_size, config.PARQUET_ROW_GROUP_SIZE_FOR_BINARY_DATASETS) + + _visit(features, set_batch_size) + + return None if batch_size is np.inf else batch_size + + +def get_writer_batch_size_from_data_size(num_rows: int, num_bytes: int) -> int: + """ + Get the writer_batch_size that defines the maximum row group size in the parquet files. + The default in `datasets` is aiming for row groups of maximum 100MB uncompressed. + This allows to optimize random access to parquet file, since accessing 1 row requires + to read its entire row group. + + This can be improved to get optimized size for querying/iterating + but at least it matches the dataset viewer expectations on HF. + + Args: + num_rows (`int`): + Number of rows in the dataset. + num_bytes (`int`): + Number of bytes in the dataset. + For dataset with external files to embed (image, audio, videos), this can also be an + estimate from `dataset._estimate_nbytes()`. + Returns: + writer_batch_size (`Optional[int]`): + Writer batch size to pass to a parquet writer. + """ + return max(1, num_rows * convert_file_size_to_int(config.MAX_ROW_GROUP_SIZE) // num_bytes) if num_bytes > 0 else 1 + + +class SchemaInferenceError(ValueError): + pass + + +class TypedSequence: + """ + This data container generalizes the typing when instantiating pyarrow arrays, tables or batches. + + More specifically it adds several features: + - Support extension types like ``datasets.features.Array2DExtensionType``: + By default pyarrow arrays don't return extension arrays. One has to call + ``pa.ExtensionArray.from_storage(type, pa.array(data, type.storage_type))`` + in order to get an extension array. + - Support for ``try_type`` parameter that can be used instead of ``type``: + When an array is transformed, we like to keep the same type as before if possible. + For example when calling :func:`datasets.Dataset.map`, we don't want to change the type + of each column by default. + - Better error message when a pyarrow array overflows. + + Example:: + + from datasets.features import Array2D, Array2DExtensionType, Value + from datasets.arrow_writer import TypedSequence + import pyarrow as pa + + arr = pa.array(TypedSequence([1, 2, 3], type=Value("int32"))) + assert arr.type == pa.int32() + + arr = pa.array(TypedSequence([1, 2, 3], try_type=Value("int32"))) + assert arr.type == pa.int32() + + arr = pa.array(TypedSequence(["foo", "bar"], try_type=Value("int32"))) + assert arr.type == pa.string() + + arr = pa.array(TypedSequence([[[1, 2, 3]]], type=Array2D((1, 3), "int64"))) + assert arr.type == Array2DExtensionType((1, 3), "int64") + + table = pa.Table.from_pydict({ + "image": TypedSequence([[[1, 2, 3]]], type=Array2D((1, 3), "int64")) + }) + assert table["image"].type == Array2DExtensionType((1, 3), "int64") + + """ + + def __init__( + self, + data: Iterable, + type: Optional[FeatureType] = None, + try_type: Optional[FeatureType] = None, + optimized_int_type: Optional[FeatureType] = None, + on_mixed_types: Optional[Literal["use_json"]] = None, + ): + # assert type is None or try_type is None, + if type is not None and try_type is not None: + raise ValueError("You cannot specify both type and try_type") + # set attributes + self.data = data + self.type = type + self.try_type = try_type # is ignored if it doesn't match the data + self.optimized_int_type = optimized_int_type + self.on_mixed_types = on_mixed_types + # when trying a type (is ignored if data is not compatible) + self.trying_type = self.try_type is not None + self.trying_int_optimization = optimized_int_type is not None and type is None and try_type is None + # used to get back the inferred type after __arrow_array__() is called once + self._inferred_type = None + + def get_inferred_type(self) -> FeatureType: + """Return the inferred feature type. + This is done by converting the sequence to an Arrow array, and getting the corresponding + feature type. + + Since building the Arrow array can be expensive, the value of the inferred type is cached + as soon as pa.array is called on the typed sequence. + + Returns: + FeatureType: inferred feature type of the sequence. + """ + if self._inferred_type is None: + pa.array(self) + return self._inferred_type + + @staticmethod + def _infer_custom_type_and_encode(data: Iterable) -> tuple[Iterable, Optional[FeatureType]]: + """Implement type inference for custom objects like PIL.Image.Image -> Image type. + + This function is only used for custom python objects that can't be directly passed to build + an Arrow array. In such cases is infers the feature type to use, and it encodes the data so + that they can be passed to an Arrow array. + + Args: + data (Iterable): array of data to infer the type, e.g. a list of PIL images. + + Returns: + Tuple[Iterable, Optional[FeatureType]]: a tuple with: + - the (possibly encoded) array, if the inferred feature type requires encoding + - the inferred feature type if the array is made of supported custom objects like + PIL images, else None. + """ + if config.PIL_AVAILABLE and "PIL" in sys.modules: + import PIL.Image + + non_null_idx, non_null_value = first_non_null_non_empty_value(data) + if isinstance(non_null_value, PIL.Image.Image): + return [Image().encode_example(value) if value is not None else None for value in data], Image() + if isinstance(non_null_value, list) and isinstance(non_null_value[0], PIL.Image.Image): + return [ + [Image().encode_example(x) for x in value] if value is not None else None for value in data + ], List(Image()) + if config.PDFPLUMBER_AVAILABLE and "pdfplumber" in sys.modules: + import pdfplumber + + non_null_idx, non_null_value = first_non_null_non_empty_value(data) + if isinstance(non_null_value, pdfplumber.pdf.PDF): + return [Pdf().encode_example(value) if value is not None else None for value in data], Pdf() + if isinstance(non_null_value, list) and isinstance(non_null_value[0], pdfplumber.pdf.PDF): + return [ + [Pdf().encode_example(x) for x in value] if value is not None else None for value in data + ], List(Pdf()) + return data, None + + def __arrow_array__(self, type: Optional[pa.DataType] = None): + out = self._arrow_array(type=type) + if self._inferred_type is None: + self._inferred_type = generate_from_arrow_type(out.type) + return out + + def _arrow_array(self, type: Optional[pa.DataType] = None): + """This function is called when calling pa.array(typed_sequence)""" + + if type is not None: + raise ValueError("TypedSequence is supposed to be used with pa.array(typed_sequence, type=None)") + del type # make sure we don't use it + data = self.data + # automatic type inference for custom objects + if self.type is None and self.try_type is None: + data, self._inferred_type = self._infer_custom_type_and_encode(data) + if self._inferred_type is None: + type = self.try_type if self.trying_type else self.type + else: + type = self._inferred_type + pa_type = get_nested_type(type) if type is not None else None + optimized_int_pa_type = ( + get_nested_type(self.optimized_int_type) if self.optimized_int_type is not None else None + ) + trying_cast_to_python_objects = False + json_field_paths = [] + try: + # custom pyarrow types + if isinstance(pa_type, _ArrayXDExtensionType): + storage = to_pyarrow_listarray(data, pa_type) + return pa.ExtensionArray.from_storage(pa_type, storage) + + # efficient np array to pyarrow array + if isinstance(data, np.ndarray): + out = numpy_to_pyarrow_listarray(data) + elif isinstance(data, list) and data and isinstance(first_non_null_non_empty_value(data)[1], np.ndarray): + out = list_of_np_array_to_pyarrow_listarray(data) + else: + trying_cast_to_python_objects = True + examples = data + # find fields to json-encode + if self.on_mixed_types == "use_json" and type is None: + json_field_paths = find_mixed_struct_types_field_paths(examples, allow_root=True) + elif type is not None: + json_field_paths = get_json_field_paths_from_feature(type) + # json encode if needed + if json_field_paths: + for json_field_path in json_field_paths: + examples = [json_encode_field(examples, json_field_path) for examples in examples] + # to arrow array + out = pa.array(cast_to_python_objects(examples, only_1d_for_numpy=True)) + # cast to json type if needed + if json_field_paths: + pa_table = pa.Table.from_arrays([out], names=["obj"]) + features = Features.from_arrow_schema(pa_table.schema) + feature = set_json_types_in_feature(features["obj"], json_field_paths) + pa_table = table_cast(pa_table, Features({"obj": feature}).arrow_schema) + out = pa_table[0] # get the "obj" column + # use smaller integer precisions if possible + if self.trying_int_optimization: + if pa.types.is_int64(out.type): + out = out.cast(optimized_int_pa_type) + elif pa.types.is_list(out.type): + if pa.types.is_int64(out.type.value_type): + out = array_cast(out, pa.list_(optimized_int_pa_type)) + elif pa.types.is_list(out.type.value_type) and pa.types.is_int64(out.type.value_type.value_type): + out = array_cast(out, pa.list_(pa.list_(optimized_int_pa_type))) + # otherwise we can finally use the user's type + elif type is not None: + # We use cast_array_to_feature to support casting to custom types like Audio and Image + # Also, when trying type "string", we don't want to convert integers or floats to "string". + # We only do it if trying_type is False - since this is what the user asks for. + out = cast_array_to_feature( + out, type, allow_primitive_to_str=not self.trying_type, allow_decimal_to_str=not self.trying_type + ) + return out + except ( + TypeError, + pa.lib.ArrowTypeError, + pa.lib.ArrowInvalid, + pa.lib.ArrowNotImplementedError, + ) as e: # handle type errors and overflows + # Ignore ArrowNotImplementedError caused by trying type, otherwise re-raise + if not self.trying_type and isinstance(e, pa.lib.ArrowNotImplementedError): + raise + + if self.trying_type: + try: # second chance + if isinstance(data, np.ndarray): + return numpy_to_pyarrow_listarray(data) + elif isinstance(data, list) and data and any(isinstance(value, np.ndarray) for value in data): + return list_of_np_array_to_pyarrow_listarray(data) + else: + trying_cast_to_python_objects = True + return pa.array(cast_to_python_objects(data, only_1d_for_numpy=True)) + except pa.lib.ArrowInvalid as e: + if "overflow" in str(e): + raise OverflowError( + f"There was an overflow with type {type_(data)}. Try to reduce writer_batch_size to have batches smaller than 2GB.\n({e})" + ) from None + elif self.trying_int_optimization and "not in range" in str(e): + optimized_int_pa_type_str = np.dtype(optimized_int_pa_type.to_pandas_dtype()).name + logger.info( + f"Failed to cast a sequence to {optimized_int_pa_type_str}. Falling back to int64." + ) + return out + elif trying_cast_to_python_objects and "Could not convert" in str(e): + out = pa.array( + cast_to_python_objects(data, only_1d_for_numpy=True, optimize_list_casting=False) + ) + if type is not None: + out = cast_array_to_feature( + out, type, allow_primitive_to_str=True, allow_decimal_to_str=True + ) + return out + else: + raise + elif "overflow" in str(e): + raise OverflowError( + f"There was an overflow with type {type_(data)}. Try to reduce writer_batch_size to have batches smaller than 2GB.\n({e})" + ) from None + elif self.trying_int_optimization and "not in range" in str(e): + optimized_int_pa_type_str = np.dtype(optimized_int_pa_type.to_pandas_dtype()).name + logger.info(f"Failed to cast a sequence to {optimized_int_pa_type_str}. Falling back to int64.") + return out + elif trying_cast_to_python_objects and ( + "Could not convert" in str(e) or "cannot mix struct and non-struct" in str(e) or "Expected " in str(e) + ): + try: # third chance + out = pa.array(cast_to_python_objects(data, only_1d_for_numpy=True, optimize_list_casting=False)) + except (pa.ArrowInvalid, pa.ArrowTypeError) as ee: + # in case of mixed types, we use the JSON Lines reader in pyarrow to locate them and set them to json fields + if self.on_mixed_types == "use_json" and ( + "Could not convert " in str(ee) + or "cannot mix struct and non-struct" in str(ee) + or "Expected " in str(ee) + ): + # we use "obj" to have valid JSON Lines since data may contain lists + original_batch = "\n".join([ujson_dumps({"obj": example}) for example in data]).encode() + json_field_paths = [["obj"] + json_field_path for json_field_path in json_field_paths] + batch = json_encode_fields_in_json_lines(original_batch, json_field_paths) + pa_table = None + while True: + try: # fourth chance + pa_table = paj.read_json( + io.BytesIO(batch), read_options=paj.ReadOptions(use_threads=False) + ) + break + except pa.ArrowInvalid as eee: + if "JSON parse error: Column(" in str(eee) and ") changed from" in str(eee): + json_field_path = get_json_field_path_from_pyarrow_json_error(str(eee)) + insert_json_field_path(json_field_paths, json_field_path) + batch = json_encode_fields_in_json_lines(original_batch, json_field_paths) + else: + break + if pa_table is not None: + features = Features.from_arrow_schema(pa_table.schema) + features = set_json_types_in_feature(features, json_field_paths) + pa_table = table_cast(pa_table, features.arrow_schema) + out = pa_table[0] # get the "obj" column + return out + else: + raise + else: + raise + if type is not None: + out = cast_array_to_feature(out, type, allow_primitive_to_str=True, allow_decimal_to_str=True) + return out + else: + raise + + +class OptimizedTypedSequence(TypedSequence): + def __init__( + self, + data, + type: Optional[FeatureType] = None, + try_type: Optional[FeatureType] = None, + col: Optional[str] = None, + optimized_int_type: Optional[FeatureType] = None, + on_mixed_types: Optional[Literal["use_json"]] = None, + ): + optimized_int_type_by_col = { + "attention_mask": Value("int8"), # binary tensor + "special_tokens_mask": Value("int8"), + "input_ids": Value("int32"), # typical vocab size: 0-50k (max ~500k, never > 1M) + "token_type_ids": Value( + "int8" + ), # binary mask; some (XLNetModel) use an additional token represented by a 2 + } + if type is None and try_type is None: + optimized_int_type = optimized_int_type_by_col.get(col, None) + super().__init__( + data, type=type, try_type=try_type, optimized_int_type=optimized_int_type, on_mixed_types=on_mixed_types + ) + + +class ArrowWriter: + """Shuffles and writes Examples to Arrow files.""" + + def __init__( + self, + schema: Optional[pa.Schema] = None, + features: Optional[Features] = None, + path: Optional[str] = None, + stream: Optional[pa.NativeFile] = None, + fingerprint: Optional[str] = None, + writer_batch_size: Optional[int] = None, + disable_nullable: bool = False, + update_features: bool = False, + on_mixed_types: Optional[Literal["use_json"]] = "use_json", + with_metadata: bool = True, + unit: str = "examples", + embed_local_files: bool = False, + storage_options: Optional[dict] = None, + ): + if path is None and stream is None: + raise ValueError("At least one of path and stream must be provided.") + if features is not None: + self._features = features + self._schema = None + elif schema is not None: + self._schema: pa.Schema = schema + self._features = Features.from_arrow_schema(self._schema) + else: + self._features = None + self._schema = None + + self._disable_nullable = disable_nullable + + if stream is None: + fs, path = url_to_fs(path, **(storage_options or {})) + self._fs: fsspec.AbstractFileSystem = fs + self._path = path if not is_remote_filesystem(self._fs) else self._fs.unstrip_protocol(path) + self.stream = self._fs.open(path, "wb") + self._closable_stream = True + else: + self._fs = None + self._path = None + self.stream = stream + self._closable_stream = False + + self.fingerprint = fingerprint + self.disable_nullable = disable_nullable + self.writer_batch_size = ( + writer_batch_size + or get_arrow_writer_batch_size_from_features(self._features) + or config.DEFAULT_MAX_BATCH_SIZE + ) + self.update_features = update_features + self.on_mixed_types = on_mixed_types + self.with_metadata = with_metadata + self.unit = unit + self.embed_local_files = embed_local_files + + self._num_examples = 0 + self._num_bytes = 0 + self.current_examples: list[tuple[dict[str, Any], str]] = [] + self.current_rows: list[pa.Table] = [] + self.pa_writer: Optional[pa.RecordBatchStreamWriter] = None + self.hkey_record = [] + + def __len__(self): + """Return the number of writed and staged examples""" + return self._num_examples + len(self.current_examples) + len(self.current_rows) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + + def close(self): + # Try closing if opened; if closed: pyarrow.lib.ArrowInvalid: Invalid operation on closed file + if self.pa_writer: # it might be None + try: + self.pa_writer.close() + except Exception: # pyarrow.lib.ArrowInvalid, OSError + pass + if self._closable_stream and not self.stream.closed: + self.stream.close() # This also closes self.pa_writer if it is opened + + def _build_schema(self, inferred_schema: pa.Schema): + schema = self.schema + features = self._features + inferred_features = Features.from_arrow_schema(inferred_schema) + if self._features is not None: + if self.update_features: # keep original features it they match, or update them + fields = {field.name: field for field in self._features.type} + for inferred_field in inferred_features.type: + name = inferred_field.name + if name in fields: + if inferred_field == fields[name]: + inferred_features[name] = self._features[name] + features = inferred_features + schema: pa.Schema = inferred_schema + else: + features = inferred_features + schema: pa.Schema = inferred_features.arrow_schema + + if self.disable_nullable: + schema = pa.schema(pa.field(field.name, field.type, nullable=False) for field in schema) + if self.with_metadata: + schema = schema.with_metadata(self._build_metadata(DatasetInfo(features=features), self.fingerprint)) + else: + schema = schema.with_metadata({}) + + return schema, features + + def _build_writer(self, inferred_schema: pa.Schema): + self._schema, self._features = self._build_schema(inferred_schema) + self.pa_writer = pa.RecordBatchStreamWriter(self.stream, self._schema) + + @property + def schema(self): + _schema = ( + self._schema + if self._schema is not None + else (pa.schema(self._features.type) if self._features is not None else None) + ) + if self._disable_nullable and _schema is not None: + _schema = pa.schema(pa.field(field.name, field.type, nullable=False) for field in _schema) + return _schema if _schema is not None else [] + + @staticmethod + def _build_metadata(info: DatasetInfo, fingerprint: Optional[str] = None) -> dict[str, str]: + info_keys = ["features"] # we can add support for more DatasetInfo keys in the future + info_as_dict = asdict(info) + metadata = {} + metadata["info"] = {key: info_as_dict[key] for key in info_keys} + if fingerprint is not None: + metadata["fingerprint"] = fingerprint + return {"huggingface": json.dumps(metadata)} + + def write_examples_on_file(self): + """Write stored examples from the write-pool of examples. It makes a table out of the examples and write it.""" + if not self.current_examples: + return + # preserve the order the columns + if self.schema: + schema_cols = set(self.schema.names) + examples_cols = self.current_examples[0][0].keys() # .keys() preserves the order (unlike set) + common_cols = [col for col in self.schema.names if col in examples_cols] + extra_cols = [col for col in examples_cols if col not in schema_cols] + cols = common_cols + extra_cols + else: + cols = list(self.current_examples[0][0]) + batch_examples = {} + for col in cols: + # We use row[0][col] since current_examples contains (example, key) tuples. + # Moreover, examples could be Arrow arrays of 1 element. + # This can happen in `.map()` when we want to re-write the same Arrow data + if all(isinstance(row[0][col], (pa.Array, pa.ChunkedArray)) for row in self.current_examples): + arrays = [row[0][col] for row in self.current_examples] + arrays = [ + chunk + for array in arrays + for chunk in (array.chunks if isinstance(array, pa.ChunkedArray) else [array]) + ] + batch_examples[col] = pa.concat_arrays(arrays) + else: + batch_examples[col] = [ + row[0][col].to_pylist()[0] if isinstance(row[0][col], (pa.Array, pa.ChunkedArray)) else row[0][col] + for row in self.current_examples + ] + self._write_batch(batch_examples=batch_examples) + self.current_examples = [] + + def write_rows_on_file(self): + """Write stored rows from the write-pool of rows. It concatenates the single-row tables and it writes the resulting table.""" + if not self.current_rows: + return + table = pa.concat_tables(self.current_rows) + self._write_table(table) + self.current_rows = [] + + def write( + self, + example: dict[str, Any], + writer_batch_size: Optional[int] = None, + ): + """Add a given (Example,Key) pair to the write-pool of examples which is written to file. + + Args: + example: the Example to add. + """ + # Store example as a tuple so as to keep the structure of `self.current_examples` uniform + self.current_examples.append((example, "")) + + if writer_batch_size is None: + writer_batch_size = self.writer_batch_size + if writer_batch_size is not None and len(self.current_examples) >= writer_batch_size: + self.write_examples_on_file() + + def write_row(self, row: pa.Table, writer_batch_size: Optional[int] = None): + """Add a given single-row Table to the write-pool of rows which is written to file. + + Args: + row: the row to add. + """ + if len(row) != 1: + raise ValueError(f"Only single-row pyarrow tables are allowed but got table with {len(row)} rows.") + self.current_rows.append(row) + if writer_batch_size is None: + writer_batch_size = self.writer_batch_size + if writer_batch_size is not None and len(self.current_rows) >= writer_batch_size: + self.write_rows_on_file() + + def write_batch( + self, + batch_examples: dict[str, list], + writer_batch_size: Optional[int] = None, + try_original_type: Optional[bool] = True, + ): + """Write a batch of Example to file. + Ignores the batch if it appears to be empty, + preventing a potential schema update of unknown types. + + Args: + batch_examples: the batch of examples to add. + try_original_type: use `try_type` when instantiating OptimizedTypedSequence if `True`, otherwise `try_type = None`. + """ + self.write_examples_on_file() # in case there are buffered examples to write first + self._write_batch(batch_examples, writer_batch_size=writer_batch_size, try_original_type=try_original_type) + + def _write_batch( + self, + batch_examples: dict[str, list], + writer_batch_size: Optional[int] = None, + try_original_type: Optional[bool] = True, + ): + if batch_examples and len(next(iter(batch_examples.values()))) == 0: + return + features = None if self.pa_writer is None and self.update_features else self._features + try_features = self._features if self.pa_writer is None and self.update_features else None + arrays = [] + inferred_features = Features() + # preserve the order the columns + if self.schema: + schema_cols = set(self.schema.names) + batch_cols = batch_examples.keys() # .keys() preserves the order (unlike set) + common_cols = [col for col in self.schema.names if col in batch_cols] + extra_cols = [col for col in batch_cols if col not in schema_cols] + cols = common_cols + extra_cols + else: + cols = list(batch_examples) + for col in cols: + col_values = batch_examples[col] + col_type = features[col] if features else None + if isinstance(col_values, (pa.Array, pa.ChunkedArray)): + array = cast_array_to_feature(col_values, col_type) if col_type is not None else col_values + arrays.append(array) + inferred_features[col] = generate_from_arrow_type(col_values.type) + else: + col_try_type = ( + try_features[col] + if try_features is not None and col in try_features and try_original_type + else None + ) + typed_sequence = OptimizedTypedSequence( + col_values, type=col_type, try_type=col_try_type, col=col, on_mixed_types=self.on_mixed_types + ) + arrays.append(pa.array(typed_sequence)) + inferred_features[col] = typed_sequence.get_inferred_type() + schema = inferred_features.arrow_schema if self.pa_writer is None else self.schema + pa_table = pa.Table.from_arrays(arrays, schema=schema) + self.write_table(pa_table, writer_batch_size) + + def write_table(self, pa_table: pa.Table, writer_batch_size: Optional[int] = None): + """Write a Table to file. + + Args: + example: the Table to add. + """ + self.write_rows_on_file() # in case there are buffered rows to write first + self._write_table(pa_table, writer_batch_size=writer_batch_size) + + def _write_table(self, pa_table: pa.Table, writer_batch_size: Optional[int] = None): + if writer_batch_size is None: + writer_batch_size = self.writer_batch_size + if self.pa_writer is None: + self._build_writer(inferred_schema=pa_table.schema) + pa_table = pa_table.combine_chunks() + pa_table = table_cast(pa_table, self._schema) + if self.embed_local_files: + pa_table = embed_table_storage(pa_table, local_files=True, remote_files=False) + self._num_bytes += pa_table.nbytes + self._num_examples += pa_table.num_rows + self.pa_writer.write_table(pa_table, writer_batch_size) + + def finalize(self, close_stream=True): + self.write_rows_on_file() + # In case current_examples < writer_batch_size, but user uses finalize() + self.write_examples_on_file() + # If schema is known, infer features even if no examples were written + if self.pa_writer is None and self.schema: + self._build_writer(self.schema) + if self.pa_writer is not None: + self.pa_writer.close() + self.pa_writer = None + if close_stream: + self.stream.close() + else: + if close_stream: + self.stream.close() + raise SchemaInferenceError("Please pass `features` or at least one example when writing data") + logger.debug( + f"Done writing {self._num_examples} {self.unit} in {self._num_bytes} bytes {self._path if self._path else ''}." + ) + return self._num_examples, self._num_bytes + + +class ParquetWriter(ArrowWriter): + def __init__(self, *args, use_content_defined_chunking=True, write_page_index=True, **kwargs): + super().__init__(*args, **kwargs) + if use_content_defined_chunking is True: + use_content_defined_chunking = config.DEFAULT_CDC_OPTIONS + self.use_content_defined_chunking = use_content_defined_chunking + self.write_page_index = write_page_index + + def _build_writer(self, inferred_schema: pa.Schema): + self._schema, self._features = self._build_schema(inferred_schema) + self.pa_writer = pq.ParquetWriter( + self.stream, + self._schema, + use_content_defined_chunking=self.use_content_defined_chunking, + write_page_index=self.write_page_index, + compression={ + col: "none" if require_storage_embed(feature) else "snappy" for col, feature in self._features.items() + }, + use_dictionary=[col for col, feature in self._features.items() if not require_storage_embed(feature)], + column_encoding={ + col: "PLAIN" for col, feature in self._features.items() if require_storage_embed(feature) + }, + ) + if self.use_content_defined_chunking is not False: + self.pa_writer.add_key_value_metadata( + {"content_defined_chunking": json.dumps(self.use_content_defined_chunking)} + ) diff --git a/src/datasets/builder.py b/src/datasets/builder.py new file mode 100644 index 0000000..ab677af --- /dev/null +++ b/src/datasets/builder.py @@ -0,0 +1,1916 @@ +# Copyright 2020 The HuggingFace Datasets Authors and the TensorFlow Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""DatasetBuilder base class.""" + +import abc +import contextlib +import copy +import inspect +import os +import posixpath +import shutil +import time +import urllib +from collections.abc import Iterator +from dataclasses import dataclass +from functools import partial +from pathlib import Path +from typing import TYPE_CHECKING, Any, Optional, Union +from unittest.mock import patch + +import fsspec +import pyarrow as pa +from fsspec.core import url_to_fs +from multiprocess import Pool +from tqdm.contrib.concurrent import thread_map + +from . import config, utils +from .arrow_dataset import Dataset +from .arrow_reader import ( + ArrowReader, + ReadInstruction, +) +from .arrow_writer import ArrowWriter, ParquetWriter, SchemaInferenceError +from .data_files import DataFilesDict, DataFilesPatternsDict, sanitize_patterns +from .dataset_dict import DatasetDict, IterableDatasetDict +from .download.download_config import DownloadConfig +from .download.download_manager import DownloadManager, DownloadMode +from .download.streaming_download_manager import StreamingDownloadManager, xjoin +from .exceptions import DatasetGenerationCastError, DatasetGenerationError, FileFormatError +from .features import Features +from .filesystems import ( + is_remote_filesystem, + rename, +) +from .fingerprint import Hasher +from .info import DatasetInfo +from .iterable_dataset import ( + ArrowExamplesIterable, + ExamplesIterable, + IterableDataset, + _concatenate_iterable_datasets, +) +from .naming import INVALID_WINDOWS_CHARACTERS_IN_PATH, camelcase_to_snakecase +from .splits import Split, SplitDict, SplitGenerator, SplitInfo +from .streaming import extend_dataset_builder_for_streaming +from .table import CastError +from .utils import logging +from .utils import tqdm as hf_tqdm +from .utils._filelock import FileLock +from .utils.file_utils import is_remote_url +from .utils.info_utils import VerificationMode, verify_checksums, verify_splits +from .utils.py_utils import ( + classproperty, + convert_file_size_to_int, + has_sufficient_disk_space, + iflatmap_unordered, + map_nested, + memoize, + size_str, + temporary_assignment, +) +from .utils.sharding import _number_of_shards_in_gen_kwargs, _split_gen_kwargs +from .utils.track import tracked_list + + +if TYPE_CHECKING: + from .load import DatasetModule + + +logger = logging.get_logger(__name__) + + +class InvalidConfigName(ValueError): + pass + + +@dataclass +class BuilderConfig: + """Base class for `DatasetBuilder` data configuration. + + `DatasetBuilder` subclasses with data configuration options should subclass + `BuilderConfig` and add their own properties. + + Attributes: + name (`str`, defaults to `default`): + The name of the configuration. + version (`Version` or `str`, defaults to `0.0.0`): + The version of the configuration. + data_dir (`str`, *optional*): + Path to the directory containing the source data. + data_files (`str` or `Sequence` or `Mapping`, *optional*): + Path(s) to source data file(s). + description (`str`, *optional*): + A human description of the configuration. + """ + + name: str = "default" + version: Optional[Union[utils.Version, str]] = utils.Version("0.0.0") + data_dir: Optional[str] = None + data_files: Optional[Union[DataFilesDict, DataFilesPatternsDict]] = None + description: Optional[str] = None + + def __post_init__(self): + # The config name is used to name the cache directory. + for invalid_char in INVALID_WINDOWS_CHARACTERS_IN_PATH: + if invalid_char in self.name: + raise InvalidConfigName( + f"Bad characters from black list '{INVALID_WINDOWS_CHARACTERS_IN_PATH}' found in '{self.name}'. " + f"They could create issues when creating a directory for this config on Windows filesystem." + ) + if self.data_files is not None and not isinstance(self.data_files, (DataFilesDict, DataFilesPatternsDict)): + raise ValueError(f"Expected a DataFilesDict in data_files but got {self.data_files}") + + def __eq__(self, o): + # we need to override the default dataclass __eq__ since it doesn't check for + # other attributes that the ones of the signature. + if set(self.__dict__.keys()) != set(o.__dict__.keys()): + return False + return all((k, getattr(self, k)) == (k, getattr(o, k)) for k in self.__dict__.keys()) + + def create_config_id( + self, + config_kwargs: dict, + custom_features: Optional[Features] = None, + ) -> str: + """ + The config id is used to build the cache directory. + By default it is equal to the config name. + However the name of a config is not sufficient to have a unique identifier for the dataset being generated + since it doesn't take into account: + - the config kwargs that can be used to overwrite attributes + - the custom features used to write the dataset + - the data_files for json/text/csv/pandas datasets + + Therefore the config id is just the config name with an optional suffix based on these. + """ + # Possibly add a suffix to the name to handle custom features/data_files/config_kwargs + suffix: Optional[str] = None + config_kwargs_to_add_to_suffix = config_kwargs.copy() + # name and version are already used to build the cache directory + config_kwargs_to_add_to_suffix.pop("name", None) + config_kwargs_to_add_to_suffix.pop("version", None) + # data dir handling (when specified it points to the manually downloaded data): + # it was previously ignored before the introduction of config id because we didn't want + # to change the config name. Now it's fine to take it into account for the config id. + # config_kwargs_to_add_to_suffix.pop("data_dir", None) + if "data_dir" in config_kwargs_to_add_to_suffix: + if config_kwargs_to_add_to_suffix["data_dir"] is None: + config_kwargs_to_add_to_suffix.pop("data_dir", None) + else: + # canonicalize the data dir to avoid two paths to the same location having different + # hashes + data_dir = config_kwargs_to_add_to_suffix["data_dir"] + data_dir = os.path.normpath(data_dir) + config_kwargs_to_add_to_suffix["data_dir"] = data_dir + if config_kwargs_to_add_to_suffix: + # we don't care about the order of the kwargs + config_kwargs_to_add_to_suffix = { + k: config_kwargs_to_add_to_suffix[k] for k in sorted(config_kwargs_to_add_to_suffix) + } + if all(isinstance(v, (str, bool, int, float)) for v in config_kwargs_to_add_to_suffix.values()): + suffix = ",".join( + str(k) + "=" + urllib.parse.quote_plus(str(v)) for k, v in config_kwargs_to_add_to_suffix.items() + ) + if len(suffix) > 32: # hash if too long + suffix = Hasher.hash(config_kwargs_to_add_to_suffix) + else: + suffix = Hasher.hash(config_kwargs_to_add_to_suffix) + + if custom_features is not None: + m = Hasher() + if suffix: + m.update(suffix) + m.update(custom_features) + suffix = m.hexdigest() + + if suffix: + config_id = self.name + "-" + suffix + if len(config_id) > config.MAX_DATASET_CONFIG_ID_READABLE_LENGTH: + config_id = self.name + "-" + Hasher.hash(suffix) + return config_id + else: + return self.name + + def _resolve_data_files(self, base_path: str, download_config: DownloadConfig) -> None: + if isinstance(self.data_files, DataFilesPatternsDict): + base_path = xjoin(base_path, self.data_dir) if self.data_dir else base_path + self.data_files = self.data_files.resolve(base_path, download_config) + + +class DatasetBuilder: + """Abstract base class for all datasets. + + `DatasetBuilder` has 3 key methods: + + - [`DatasetBuilder.info`]: Documents the dataset, including feature + names, types, shapes, version, splits, citation, etc. + - [`DatasetBuilder.download_and_prepare`]: Downloads the source data + and writes it to disk. + - [`DatasetBuilder.as_dataset`]: Generates a [`Dataset`]. + + Some `DatasetBuilder`s expose multiple variants of the + dataset by defining a [`BuilderConfig`] subclass and accepting a + config object (or name) on construction. Configurable datasets expose a + pre-defined set of configurations in [`DatasetBuilder.builder_configs`]. + + Args: + cache_dir (`str`, *optional*): + Directory to cache data. Defaults to `"~/.cache/huggingface/datasets"`. + dataset_name (`str`, *optional*): + Name of the dataset, if different from the builder name. Useful for packaged builders + like csv, imagefolder, audiofolder, etc. to reflect the difference between datasets + that use the same packaged builder. + config_name (`str`, *optional*): + Name of the dataset configuration. + It affects the data generated on disk. Different configurations will have their own subdirectories and + versions. + If not provided, the default configuration is used (if it exists). + + + + Parameter `name` was renamed to `config_name`. + + + hash (`str`, *optional*): + Hash specific to the dataset builder code. Used to update the caching directory when the + dataset builder code is updated (to avoid reusing old data). + The typical caching directory (defined in `self._relative_data_dir`) is `name/version/hash/`. + base_path (`str`, *optional*): + Base path for relative paths that are used to download files. + This can be a remote URL. + features ([`Features`], *optional*): + Features types to use with this dataset. + It can be used to change the [`Features`] types of a dataset, for example. + token (`str` or `bool`, *optional*): + String or boolean to use as Bearer token for remote files on the + Datasets Hub. If `True`, will get token from `"~/.huggingface"`. + repo_id (`str`, *optional*): + ID of the dataset repository. + Used to distinguish builders with the same name but not coming from the same namespace, for example "rajpurkar/squad" + and "lhoestq/squad" repo IDs. In the latter, the builder name would be "lhoestq___squad". + data_files (`str` or `Sequence` or `Mapping`, *optional*): + Path(s) to source data file(s). + For builders like "csv" or "json" that need the user to specify data files. They can be either + local or remote files. For convenience, you can use a `DataFilesDict`. + data_dir (`str`, *optional*): + Path to directory containing source data file(s). + Use only if `data_files` is not passed, in which case it is equivalent to passing + `os.path.join(data_dir, "**")` as `data_files`. + For builders that require manual download, it must be the path to the local directory containing the + manually downloaded data. + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the dataset file-system backend, if any. + writer_batch_size (`int`, *optional*): + Batch size used by the ArrowWriter. + It defines the number of samples that are kept in memory before writing them + and also the length of the arrow chunks. + None means that the ArrowWriter will use its default value. + **config_kwargs (additional keyword arguments): Keyword arguments to be passed to the corresponding builder + configuration class, set on the class attribute [`DatasetBuilder.BUILDER_CONFIG_CLASS`]. The builder + configuration class is [`BuilderConfig`] or a subclass of it. + """ + + # Default version + VERSION = None # Default version set in BuilderConfig + + # Class for the builder config. + BUILDER_CONFIG_CLASS = BuilderConfig + + # Named configurations that modify the data generated by download_and_prepare. + BUILDER_CONFIGS = [] + + # Optional default config name to be used when name is None + DEFAULT_CONFIG_NAME = None + + # Default batch size used by the ArrowWriter + # It defines the number of samples that are kept in memory before writing them + # and also the length of the arrow chunks + # None means that the ArrowWriter will use its default value + DEFAULT_WRITER_BATCH_SIZE = None + + # Useful to make sure PyArrow threads in c++ have time to shut down before gargabe collection + SLEEP_ON_THREADS_SHUTDOWNS = False + + def __init__( + self, + cache_dir: Optional[str] = None, + dataset_name: Optional[str] = None, + config_name: Optional[str] = None, + hash: Optional[str] = None, + base_path: Optional[str] = None, + info: Optional[DatasetInfo] = None, + features: Optional[Features] = None, + token: Optional[Union[bool, str]] = None, + repo_id: Optional[str] = None, + data_files: Optional[Union[str, list, dict, DataFilesDict]] = None, + data_dir: Optional[str] = None, + storage_options: Optional[dict] = None, + writer_batch_size: Optional[int] = None, + config_id: Optional[str] = None, + **config_kwargs, + ): + # DatasetBuilder name + self.name: str = camelcase_to_snakecase(self.__module__.split(".")[-1]) + self.hash: Optional[str] = hash + self.base_path = base_path + self.token = token + self.repo_id = repo_id + self.storage_options = storage_options or {} + self.dataset_name = camelcase_to_snakecase(dataset_name) if dataset_name else self.name + self._writer_batch_size = writer_batch_size or self.DEFAULT_WRITER_BATCH_SIZE + + if data_files is not None and not isinstance(data_files, DataFilesDict): + data_files = DataFilesDict.from_patterns( + sanitize_patterns(data_files), + base_path=base_path, + download_config=DownloadConfig(token=token, storage_options=self.storage_options), + ) + + # Prepare config: DatasetConfig contains name, version and description but can be extended by each dataset + if "features" in inspect.signature(self.BUILDER_CONFIG_CLASS.__init__).parameters and features is not None: + config_kwargs["features"] = features + if data_files is not None: + config_kwargs["data_files"] = data_files + if data_dir is not None: + config_kwargs["data_dir"] = data_dir + self.config_kwargs = config_kwargs + self.config, self.config_id = self._create_builder_config( + config_name=config_name, + custom_features=features, + config_id=config_id, + **config_kwargs, + ) + + # prepare info: DatasetInfo are a standardized dataclass across all datasets + # Prefill datasetinfo + if info is None: + info = self._info() + info.builder_name = self.name + info.dataset_name = self.dataset_name + info.config_name = self.config.name + info.version = self.config.version + self.info = info + # update info with user specified infos + if features is not None: + self.info.features = features + + # Prepare data dirs: + # cache_dir can be a remote bucket on GCS or S3 + self._cache_dir_root = str(cache_dir or config.HF_DATASETS_CACHE) + self._cache_dir_root = ( + self._cache_dir_root if is_remote_url(self._cache_dir_root) else os.path.expanduser(self._cache_dir_root) + ) + self._cache_downloaded_dir = ( + posixpath.join(self._cache_dir_root, config.DOWNLOADED_DATASETS_DIR) + if cache_dir + else str(config.DOWNLOADED_DATASETS_PATH) + ) + self._cache_downloaded_dir = ( + self._cache_downloaded_dir + if is_remote_url(self._cache_downloaded_dir) + else os.path.expanduser(self._cache_downloaded_dir) + ) + + # In case there exists a legacy cache directory + self._legacy_relative_data_dir = None + + self._cache_dir = self._build_cache_dir() + if not is_remote_url(self._cache_dir_root): + os.makedirs(self._cache_dir_root, exist_ok=True) + lock_path = os.path.join( + self._cache_dir_root, Path(self._cache_dir).as_posix().replace("/", "_") + ".lock" + ) + with FileLock(lock_path): + if os.path.exists(self._cache_dir): # check if data exist + if len(os.listdir(self._cache_dir)) > 0: + if os.path.exists(os.path.join(self._cache_dir, config.DATASET_INFO_FILENAME)): + logger.debug("Overwrite dataset info from restored data version if exists.") + self.info = DatasetInfo.from_directory(self._cache_dir) + else: # dir exists but no data, remove the empty dir as data aren't available anymore + logger.warning( + f"Old caching folder {self._cache_dir} for dataset {self.dataset_name} exists but no data were found. Removing it. " + ) + os.rmdir(self._cache_dir) + + # Store in the cache by default unless the user specifies a custom output_dir to download_and_prepare + self._output_dir = self._cache_dir + self._fs: fsspec.AbstractFileSystem = fsspec.filesystem("file") + + # Set download manager + self.dl_manager = None + + # Set to True by "datasets-cli test" to generate file checksums for (deprecated) dataset_infos.json independently of verification_mode value. + self._record_checksums = False + + # Set in `.download_and_prepare` once the format of the generated dataset is known + self._file_format = None + + # Enable streaming (e.g. it patches "open" to work with remote files) + extend_dataset_builder_for_streaming(self) + + def __getstate__(self): + return self.__dict__ + + def __setstate__(self, d): + self.__dict__ = d + # Re-enable streaming, since patched functions are not kept when pickling + extend_dataset_builder_for_streaming(self) + + def _check_legacy_cache(self) -> Optional[str]: + """Check for the old cache directory template {cache_dir}/{namespace}___{builder_name} from 2.13""" + if ( + self.__module__.startswith("datasets.") + and not is_remote_url(self._cache_dir_root) + and self.config.name == "default" + ): + from .packaged_modules import _PACKAGED_DATASETS_MODULES + + namespace = self.repo_id.split("/")[0] if self.repo_id and self.repo_id.count("/") > 0 else None + config_name = self.repo_id.replace("/", "--") if self.repo_id is not None else self.dataset_name + config_id = config_name + self.config_id[len(self.config.name) :] + hash = _PACKAGED_DATASETS_MODULES.get(self.name, "missing")[1] + legacy_relative_data_dir = posixpath.join( + self.dataset_name if namespace is None else f"{namespace}___{self.dataset_name}", + config_id, + "0.0.0", + hash, + ) + legacy_cache_dir = posixpath.join(self._cache_dir_root, legacy_relative_data_dir) + if os.path.isdir(legacy_cache_dir): + return legacy_relative_data_dir + + def _check_legacy_cache2(self, dataset_module: "DatasetModule") -> Optional[str]: + """Check for the old cache directory template {cache_dir}/{namespace}___{dataset_name}/{config_name}-xxx from 2.14 and 2.15""" + if ( + self.__module__.startswith("datasets.") + and not is_remote_url(self._cache_dir_root) + and not (set(self.config_kwargs) - {"data_files", "data_dir"}) + ): + from .packaged_modules import _PACKAGED_DATASETS_MODULES_2_15_HASHES + from .utils._dill import Pickler + + def update_hash_with_config_parameters(hash: str, config_parameters: dict) -> str: + """ + Used to update hash of packaged modules which is used for creating unique cache directories to reflect + different config parameters which are passed in metadata from readme. + """ + params_to_exclude = {"config_name", "version", "description"} + params_to_add_to_hash = { + param: value + for param, value in sorted(config_parameters.items()) + if param not in params_to_exclude + } + m = Hasher() + m.update(hash) + m.update(params_to_add_to_hash) + return m.hexdigest() + + namespace = self.repo_id.split("/")[0] if self.repo_id and self.repo_id.count("/") > 0 else None + with patch.object(Pickler, "_legacy_no_dict_keys_sorting", True): + config_id = self.config.name + "-" + Hasher.hash({"data_files": self.config.data_files}) + hash = _PACKAGED_DATASETS_MODULES_2_15_HASHES.get(self.name, "missing") + if ( + dataset_module.builder_configs_parameters.metadata_configs + and self.config.name in dataset_module.builder_configs_parameters.metadata_configs + ): + hash = update_hash_with_config_parameters( + hash, dataset_module.builder_configs_parameters.metadata_configs[self.config.name] + ) + legacy_relative_data_dir = posixpath.join( + self.dataset_name if namespace is None else f"{namespace}___{self.dataset_name}", + config_id, + "0.0.0", + hash, + ) + legacy_cache_dir = posixpath.join(self._cache_dir_root, legacy_relative_data_dir) + if os.path.isdir(legacy_cache_dir): + return legacy_relative_data_dir + + def _create_builder_config( + self, config_name=None, custom_features=None, config_id=None, **config_kwargs + ) -> tuple[BuilderConfig, str]: + """Create and validate BuilderConfig object as well as a unique config id for this config. + Raises ValueError if there are multiple builder configs and config_name and DEFAULT_CONFIG_NAME are None. + config_kwargs override the defaults kwargs in config + """ + builder_config = None + + # try default config + if config_name is None and self.BUILDER_CONFIGS: + if self.DEFAULT_CONFIG_NAME is not None: + builder_config = self.builder_configs.get(self.DEFAULT_CONFIG_NAME) + logger.info(f"No config specified, defaulting to: {self.dataset_name}/{builder_config.name}") + else: + if len(self.BUILDER_CONFIGS) > 1: + if not config_kwargs: + example_of_usage = ( + f"load_dataset('{self.repo_id or self.dataset_name}', '{self.BUILDER_CONFIGS[0].name}')" + ) + raise ValueError( + "Config name is missing." + f"\nPlease pick one among the available configs: {list(self.builder_configs.keys())}" + + f"\nExample of usage:\n\t`{example_of_usage}`" + ) + else: + builder_config = self.BUILDER_CONFIGS[0] + logger.info( + f"No config specified, defaulting to the single config: {self.dataset_name}/{builder_config.name}" + ) + + # try to get config by name + if isinstance(config_name, str): + builder_config = self.builder_configs.get(config_name) + if builder_config is None and self.BUILDER_CONFIGS: + raise ValueError( + f"BuilderConfig '{config_name}' not found. Available: {list(self.builder_configs.keys())}" + ) + + # if not using an existing config, then create a new config on the fly + if not builder_config: + if config_name is not None: + config_kwargs["name"] = config_name + elif self.DEFAULT_CONFIG_NAME and not config_kwargs: + # Use DEFAULT_CONFIG_NAME only if no config_kwargs are passed + config_kwargs["name"] = self.DEFAULT_CONFIG_NAME + if "version" not in config_kwargs and hasattr(self, "VERSION") and self.VERSION: + config_kwargs["version"] = self.VERSION + builder_config = self.BUILDER_CONFIG_CLASS(**config_kwargs) + + # otherwise use the config_kwargs to overwrite the attributes + else: + builder_config = copy.deepcopy(builder_config) if config_kwargs else builder_config + for key, value in config_kwargs.items(): + if value is not None: + if not hasattr(builder_config, key): + raise ValueError(f"BuilderConfig {builder_config} doesn't have a '{key}' key.") + setattr(builder_config, key, value) + + if not builder_config.name: + raise ValueError(f"BuilderConfig must have a name, got {builder_config.name}") + + # resolve data files if needed + builder_config._resolve_data_files( + base_path=self.base_path, + download_config=DownloadConfig(token=self.token, storage_options=self.storage_options), + ) + + # compute the config id that is going to be used for caching + if config_id is None: + config_id = builder_config.create_config_id( + config_kwargs, + custom_features=custom_features, + ) + is_custom = (config_id not in self.builder_configs) and config_id != "default" + if is_custom: + logger.info(f"Using custom data configuration {config_id}") + else: + if ( + builder_config.name in self.builder_configs + and builder_config != self.builder_configs[builder_config.name] + ): + raise ValueError( + "Cannot name a custom BuilderConfig the same as an available " + f"BuilderConfig. Change the name. Available BuilderConfigs: {list(self.builder_configs.keys())}" + ) + if not builder_config.version: + raise ValueError(f"BuilderConfig {builder_config.name} must have a version") + + return builder_config, config_id + + @classproperty + @classmethod + @memoize() + def builder_configs(cls) -> dict[str, BuilderConfig]: + """Dictionary of pre-defined configurations for this builder class.""" + configs = {config.name: config for config in cls.BUILDER_CONFIGS} + if len(configs) != len(cls.BUILDER_CONFIGS): + names = [config.name for config in cls.BUILDER_CONFIGS] + raise ValueError(f"Names in BUILDER_CONFIGS must not be duplicated. Got {names}") + return configs + + @property + def cache_dir(self): + return self._cache_dir + + def _use_legacy_cache_dir_if_possible(self, dataset_module: "DatasetModule"): + # Check for the legacy cache directory template (datasets<3.0.0) + self._legacy_relative_data_dir = ( + self._check_legacy_cache2(dataset_module) or self._check_legacy_cache() or None + ) + self._cache_dir = self._build_cache_dir() + self._output_dir = self._cache_dir + + def _relative_data_dir(self, with_version=True, with_hash=True) -> str: + """Relative path of this dataset in cache_dir: + Will be: + self.dataset_name/self.config.version/self.hash/ + or if a repo_id with a namespace has been specified: + self.namespace___self.dataset_name/self.config.version/self.hash/ + If any of these element is missing or if ``with_version=False`` the corresponding subfolders are dropped. + """ + if self._legacy_relative_data_dir is not None and with_version and with_hash: + return self._legacy_relative_data_dir + + namespace = self.repo_id.split("/")[0] if self.repo_id and self.repo_id.count("/") > 0 else None + builder_data_dir = self.dataset_name if namespace is None else f"{namespace}___{self.dataset_name}" + builder_data_dir = posixpath.join(builder_data_dir, self.config_id) + if with_version: + builder_data_dir = posixpath.join(builder_data_dir, str(self.config.version)) + if with_hash and self.hash and isinstance(self.hash, str): + builder_data_dir = posixpath.join(builder_data_dir, self.hash) + return builder_data_dir + + def _build_cache_dir(self): + """Return the data directory for the current version.""" + builder_data_dir = posixpath.join(self._cache_dir_root, self._relative_data_dir(with_version=False)) + version_data_dir = posixpath.join(self._cache_dir_root, self._relative_data_dir(with_version=True)) + + def _other_versions_on_disk(): + """Returns previous versions on disk.""" + if not os.path.exists(builder_data_dir): + return [] + + version_dirnames = [] + for dir_name in os.listdir(builder_data_dir): + try: + version_dirnames.append((utils.Version(dir_name), dir_name)) + except ValueError: # Invalid version (ex: incomplete data dir) + pass + version_dirnames.sort(reverse=True) + return version_dirnames + + # Check and warn if other versions exist + if not is_remote_url(builder_data_dir): + version_dirs = _other_versions_on_disk() + if version_dirs: + other_version = version_dirs[0][0] + if other_version != self.config.version: + warn_msg = ( + f"Found a different version {str(other_version)} of dataset {self.dataset_name} in " + f"cache_dir {self._cache_dir_root}. Using currently defined version " + f"{str(self.config.version)}." + ) + logger.warning(warn_msg) + + return version_data_dir + + @abc.abstractmethod + def _info(self) -> DatasetInfo: + """Construct the DatasetInfo object. See `DatasetInfo` for details. + + Warning: This function is only called once and the result is cached for all + following .info() calls. + + Returns: + info: (DatasetInfo) The dataset information + """ + raise NotImplementedError + + @classmethod + def get_imported_module_dir(cls): + """Return the path of the module of this class or subclass.""" + return os.path.dirname(inspect.getfile(inspect.getmodule(cls))) + + def _rename(self, src: str, dst: str): + rename(self._fs, src, dst) + + def download_and_prepare( + self, + output_dir: Optional[str] = None, + download_config: Optional[DownloadConfig] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + verification_mode: Optional[Union[VerificationMode, str]] = None, + dl_manager: Optional[DownloadManager] = None, + base_path: Optional[str] = None, + file_format: str = "arrow", + max_shard_size: Optional[Union[int, str]] = None, + num_proc: Optional[int] = None, + storage_options: Optional[dict] = None, + **download_and_prepare_kwargs, + ): + """Downloads and prepares dataset for reading. + + Args: + output_dir (`str`, *optional*): + Output directory for the dataset. + Default to this builder's `cache_dir`, which is inside `~/.cache/huggingface/datasets` by default. + + + download_config (`DownloadConfig`, *optional*): + Specific download configuration parameters. + download_mode ([`DownloadMode`] or `str`, *optional*): + Select the download/generate mode, default to `REUSE_DATASET_IF_EXISTS`. + verification_mode ([`VerificationMode`] or `str`, defaults to `BASIC_CHECKS`): + Verification mode determining the checks to run on the downloaded/processed dataset information (checksums/size/splits/...). + + + dl_manager (`DownloadManager`, *optional*): + Specific `DownloadManger` to use. + base_path (`str`, *optional*): + Base path for relative paths that are used to download files. This can be a remote url. + If not specified, the value of the `base_path` attribute (`self.base_path`) will be used instead. + file_format (`str`, *optional*): + Format of the data files in which the dataset will be written. + Supported formats: "arrow", "parquet". Default to "arrow" format. + If the format is "parquet", then image and audio data are embedded into the Parquet files instead of pointing to local files. + + + max_shard_size (`Union[str, int]`, *optional*): + Maximum number of bytes written per shard, default is "500MB". + The size is based on uncompressed data size, so in practice your shard files may be smaller than + `max_shard_size` thanks to Parquet compression for example. + + + num_proc (`int`, *optional*, defaults to `None`): + Number of processes when downloading and generating the dataset locally. + Multiprocessing is disabled by default. + + + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the caching file-system backend, if any. + + + **download_and_prepare_kwargs (additional keyword arguments): Keyword arguments. + + Example: + + Download and prepare the dataset as Arrow files that can be loaded as a Dataset using `builder.as_dataset()`: + + ```py + >>> from datasets import load_dataset_builder + >>> builder = load_dataset_builder("cornell-movie-review-data/rotten_tomatoes") + >>> builder.download_and_prepare() + ``` + + Download and prepare the dataset as sharded Parquet files locally: + + ```py + >>> from datasets import load_dataset_builder + >>> builder = load_dataset_builder("cornell-movie-review-data/rotten_tomatoes") + >>> builder.download_and_prepare("./output_dir", file_format="parquet") + ``` + + Download and prepare the dataset as sharded Parquet files in a cloud storage: + + ```py + >>> from datasets import load_dataset_builder + >>> storage_options = {"key": aws_access_key_id, "secret": aws_secret_access_key} + >>> builder = load_dataset_builder("cornell-movie-review-data/rotten_tomatoes") + >>> builder.download_and_prepare("s3://my-bucket/my_rotten_tomatoes", storage_options=storage_options, file_format="parquet") + ``` + """ + output_dir = output_dir if output_dir is not None else self._cache_dir + # output_dir can be a remote bucket on GCS or S3 + fs, output_dir = url_to_fs(output_dir, **(storage_options or {})) + self._fs = fs + self._output_dir = output_dir if not is_remote_filesystem(self._fs) else self._fs.unstrip_protocol(output_dir) + + download_mode = DownloadMode(download_mode or DownloadMode.REUSE_DATASET_IF_EXISTS) + verification_mode = VerificationMode(verification_mode or VerificationMode.BASIC_CHECKS) + base_path = base_path if base_path is not None else self.base_path + + if file_format is not None and file_format not in ["arrow", "parquet"]: + raise ValueError(f"Unsupported file_format: {file_format}. Expected 'arrow' or 'parquet'") + self._file_format = file_format + + if self._fs._strip_protocol(self._output_dir) == "": + # We don't support the root directory, because it has no dirname, + # and we need a dirname to use a .incomplete directory + # when the dataset is being written + raise RuntimeError( + f"Unable to download and prepare the dataset at the root {self._output_dir}. " + f"Please specify a subdirectory, e.g. '{self._output_dir + self.dataset_name}'" + ) + + if dl_manager is None: + if download_config is None: + download_config = DownloadConfig( + cache_dir=self._cache_downloaded_dir, + force_download=download_mode == DownloadMode.FORCE_REDOWNLOAD, + force_extract=download_mode == DownloadMode.FORCE_REDOWNLOAD, + use_etag=False, + num_proc=num_proc, + token=self.token, + storage_options=self.storage_options, + ) # We don't use etag for data files to speed up the process + + dl_manager = DownloadManager( + dataset_name=self.dataset_name, + download_config=download_config, + data_dir=self.config.data_dir, + base_path=base_path, + record_checksums=self._record_checksums, + ) + + is_local = not is_remote_filesystem(self._fs) + self.dl_manager = dl_manager + + # Prevent parallel local disk operations + if is_local: + # Create parent directory of the output_dir to put the lock file in there + Path(self._output_dir).parent.mkdir(parents=True, exist_ok=True) + lock_path = self._output_dir + "_builder.lock" + + # File locking only with local paths; no file locking on GCS or S3 + with FileLock(lock_path) if is_local else contextlib.nullcontext(): + # Check if the data already exists + data_exists = self._fs.exists(posixpath.join(self._output_dir, config.DATASET_INFO_FILENAME)) + if data_exists and download_mode == DownloadMode.REUSE_DATASET_IF_EXISTS: + logger.info(f"Found cached dataset {self.dataset_name} ({self._output_dir})") + # We need to update the info in case some splits were added in the meantime + # for example when calling load_dataset from multiple workers. + self.info = self._load_info() + return + + logger.info(f"Generating dataset {self.dataset_name} ({self._output_dir})") + if is_local: # if cache dir is local, check for available space + if not has_sufficient_disk_space( + self.info.size_in_bytes or 0, directory=Path(self._output_dir).parent + ): + raise OSError( + f"Not enough disk space. Needed: {size_str(self.info.size_in_bytes or 0)} (download: {size_str(self.info.download_size or 0)}, generated: {size_str(self.info.dataset_size or 0)}" + ) + + @contextlib.contextmanager + def incomplete_dir(dirname): + """Create temporary dir for dirname and rename on exit.""" + if not is_local: + self._fs.makedirs(dirname, exist_ok=True) + yield dirname + else: + tmp_dir = dirname + ".incomplete" + os.makedirs(tmp_dir, exist_ok=True) + try: + yield tmp_dir + if os.path.isdir(dirname): + shutil.rmtree(dirname) + # LocalFileSystem.mv does copy + rm, it is more efficient to simply rename a local directory + shutil.move(tmp_dir, dirname) + finally: + if os.path.exists(tmp_dir): + shutil.rmtree(tmp_dir) + + # Print is intentional: we want this to always go to stdout so user has + # information needed to cancel download/preparation if needed. + # This comes right before the progress bar. + if self.info.size_in_bytes: + logger.info( + f"Downloading and preparing dataset {self.dataset_name}/{self.config.name} " + f"(download: {size_str(self.info.download_size)}, generated: {size_str(self.info.dataset_size)}, " + f"total: {size_str(self.info.size_in_bytes)}) to {self._output_dir}..." + ) + else: + _dest = self._fs._strip_protocol(self._output_dir) if is_local else self._output_dir + logger.info(f"Downloading and preparing dataset {self.dataset_name}/{self.config.name} to {_dest}...") + + # Create a tmp dir and rename to self._output_dir on successful exit. + with incomplete_dir(self._output_dir) as tmp_output_dir: + # Temporarily assign _output_dir to tmp_data_dir to avoid having to forward + # it to every sub function. + with temporary_assignment(self, "_output_dir", tmp_output_dir): + prepare_split_kwargs = {"file_format": file_format} + if max_shard_size is not None: + prepare_split_kwargs["max_shard_size"] = max_shard_size + if num_proc is not None: + prepare_split_kwargs["num_proc"] = num_proc + self._download_and_prepare( + dl_manager=dl_manager, + verification_mode=verification_mode, + **prepare_split_kwargs, + **download_and_prepare_kwargs, + ) + # Sync info + self.info.dataset_size = sum(split.num_bytes for split in self.info.splits.values()) + if dl_manager.record_checksums: + self.info.download_checksums = dl_manager.get_recorded_sizes_checksums() + if self.info.download_size is not None: + self.info.size_in_bytes = self.info.dataset_size + self.info.download_size + # Save info + self._save_info() + + logger.info( + f"Dataset {self.dataset_name} downloaded and prepared to {self._output_dir}. " + f"Subsequent calls will reuse this data." + ) + + def _download_and_prepare(self, dl_manager, verification_mode, **prepare_split_kwargs): + """Downloads and prepares dataset for reading. + + This is the internal implementation to overwrite called when user calls + `download_and_prepare`. It should download all required data and generate + the pre-processed datasets files. + + Args: + dl_manager ([`DownloadManager`]): + `DownloadManager` used to download and cache data. + verification_mode ([`VerificationMode`]): + if `ALL_CHECKS`, perform all the verifications including checksums. + if `BASIC_CHECKS`, do not perform checksums, only perform split tests. + if `NO_CHECKS`, do not perform any verification. + prepare_split_kwargs: Additional options, such as `file_format`, `max_shard_size` + """ + # Generating data for all splits + split_dict = SplitDict(dataset_name=self.dataset_name) + split_generators_kwargs = self._make_split_generators_kwargs(prepare_split_kwargs) + split_generators: list[SplitGenerator] = self._split_generators(dl_manager, **split_generators_kwargs) + + # Checksums verification + if verification_mode == VerificationMode.ALL_CHECKS and dl_manager.record_checksums: + verify_checksums( + self.info.download_checksums, dl_manager.get_recorded_sizes_checksums(), "dataset source files" + ) + + # Build splits + for split_generator in split_generators: + if str(split_generator.split_info.name).lower() == "all": + raise ValueError( + "`all` is a special split keyword corresponding to the " + "union of all splits, so cannot be used as key in " + "._split_generator()." + ) + + logger.info(f"Generating {split_generator.split_info.name} split") + split_dict.add(split_generator.split_info) + + try: + # Prepare split will record examples associated to the split + self._prepare_split(split_generator, **prepare_split_kwargs) + except OSError as e: + raise OSError("Cannot find data file. " + "\nOriginal error:\n" + str(e)) from None + dl_manager.manage_extracted_files() + + if verification_mode == VerificationMode.BASIC_CHECKS or verification_mode == VerificationMode.ALL_CHECKS: + verify_splits(self.info.splits, split_dict) + + # Update the info object with the splits. + self.info.splits = split_dict + self.info.download_size = dl_manager.downloaded_size + + def _load_info(self) -> DatasetInfo: + return DatasetInfo.from_directory(self._output_dir, storage_options=self._fs.storage_options) + + def _save_info(self): + file_lock = ( + FileLock(self._output_dir + "_info.lock") + if not is_remote_filesystem(self._fs) + else contextlib.nullcontext() + ) + with file_lock: + self.info.write_to_directory(self._output_dir, storage_options=self._fs.storage_options) + + def _make_split_generators_kwargs(self, prepare_split_kwargs): + """Get kwargs for `self._split_generators()` from `prepare_split_kwargs`.""" + del prepare_split_kwargs + return {} + + def as_dataset( + self, + split: Optional[Union[str, Split, list[str], list[Split]]] = None, + in_memory=False, + ) -> Union[Dataset, DatasetDict]: + """Return a Dataset for the specified split. + + Args: + split (`datasets.Split`): + Which subset of the data to return. + verification_mode ([`VerificationMode`] or `str`, defaults to `BASIC_CHECKS`): + Verification mode determining the checks to run on the + downloaded/processed dataset information (checksums/size/splits/...). + + + in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + + Returns: + datasets.Dataset + + Example: + + ```py + >>> from datasets import load_dataset_builder + >>> builder = load_dataset_builder('cornell-movie-review-data/rotten_tomatoes') + >>> builder.download_and_prepare() + >>> ds = builder.as_dataset(split='train') + >>> ds + Dataset({ + features: ['text', 'label'], + num_rows: 8530 + }) + ``` + """ + if self._file_format is not None and self._file_format != "arrow": + raise FileFormatError('Loading a dataset not written in the "arrow" format is not supported.') + if is_remote_filesystem(self._fs): + raise NotImplementedError(f"Loading a dataset cached in a {type(self._fs).__name__} is not supported.") + if not os.path.exists(self._output_dir): + raise FileNotFoundError( + f"Dataset {self.dataset_name}: could not find data in {self._output_dir}. Please make sure to call " + "builder.download_and_prepare(), or use " + "datasets.load_dataset() before trying to access the Dataset object." + ) + + logger.debug(f"Constructing Dataset for split {split or ', '.join(self.info.splits)}, from {self._output_dir}") + + # By default, return all splits + if split is None: + split = {s: s for s in self.info.splits} + + # Create a dataset for each of the given splits + datasets = map_nested( + partial( + self._build_single_dataset, + in_memory=in_memory, + ), + split, + map_tuple=True, + disable_tqdm=True, + ) + if isinstance(datasets, dict): + datasets = DatasetDict(datasets) + return datasets + + def _build_single_dataset( + self, + split: Union[str, ReadInstruction, Split], + in_memory: bool = False, + ): + """as_dataset for a single split.""" + if not isinstance(split, ReadInstruction): + split = str(split) + if split == "all": + split = "+".join(self.info.splits.keys()) + split = Split(split) + + # Build base dataset + ds = self._as_dataset( + split=split, + in_memory=in_memory, + ) + return ds + + def _as_dataset(self, split: Union[ReadInstruction, Split] = Split.TRAIN, in_memory: bool = False) -> Dataset: + """Constructs a `Dataset`. + + This is the internal implementation to overwrite called when user calls + `as_dataset`. It should read the pre-processed datasets files and generate + the `Dataset` object. + + Args: + split (`datasets.Split`): + which subset of the data to read. + in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + + Returns: + `Dataset` + """ + cache_dir = self._fs._strip_protocol(self._output_dir) + dataset_name = self.dataset_name + if self._check_legacy_cache(): + dataset_name = self.name + dataset_kwargs = ArrowReader(cache_dir, self.info).read( + name=dataset_name, + instructions=split, + split_infos=self.info.splits.values(), + in_memory=in_memory, + ) + fingerprint = self._get_dataset_fingerprint(split) + return Dataset(fingerprint=fingerprint, **dataset_kwargs) + + def _get_dataset_fingerprint(self, split: Union[ReadInstruction, Split]) -> str: + """The dataset fingerprint is the hash of the relative directory dataset_name/config_name/version/hash, as well as the split specs.""" + hasher = Hasher() + hasher.update(Path(self._relative_data_dir()).as_posix()) + hasher.update(str(split)) # for example: train, train+test, train[:10%], test[:33%](pct1_dropremainder) + fingerprint = hasher.hexdigest() + return fingerprint + + def as_streaming_dataset( + self, + split: Optional[str] = None, + base_path: Optional[str] = None, + ) -> Union[dict[str, IterableDataset], IterableDataset]: + if is_remote_filesystem(self._fs): + raise NotImplementedError( + f"Loading a streaming dataset cached in a {type(self._fs).__name__} is not supported yet." + ) + + dl_manager = StreamingDownloadManager( + base_path=base_path or self.base_path, + download_config=DownloadConfig(token=self.token, storage_options=self.storage_options), + dataset_name=self.dataset_name, + data_dir=self.config.data_dir, + ) + splits_generators = {sg.name: sg for sg in self._split_generators(dl_manager)} + # By default, return all splits + if split is None: + splits_generator = splits_generators + elif str(split) in splits_generators: + splits_generator = splits_generators[str(split)] + elif hasattr(split, "get_read_instruction"): + split_dict = SplitDict({name: sg.split_info for name, sg in splits_generators.items()}) + split_instruction = split.get_read_instruction(split_dict) + split_infos = split_instruction.get_list_sliced_split_info() + if any(split_info.slice_value is not None for split_info in split_infos): + raise ValueError(f"Bad split: {split}. Available splits: {list(splits_generators)}") + return _concatenate_iterable_datasets( + [ + self._as_streaming_dataset_single(splits_generators[split_info.split_info.name]) + for split_info in split_infos + ], + info=self.info, + split=split, + ) + elif str(split) == str(Split.ALL): + return _concatenate_iterable_datasets( + [self._as_streaming_dataset_single(sg) for sg in splits_generators.values()], + info=self.info, + split=split, + ) + elif "+" in str(split) and "[" not in str(split) and "]" not in str(split): + split_names = [split_name.strip() for split_name in str(split).split("+")] + if not all(split_name in splits_generators for split_name in split_names): + raise ValueError(f"Bad split: {split}. Available splits: {list(splits_generators)}") + return _concatenate_iterable_datasets( + [self._as_streaming_dataset_single(splits_generators[split_name]) for split_name in split_names], + info=self.info, + split=split, + ) + else: + raise ValueError(f"Bad split: {split}. Available splits: {list(splits_generators)}") + + # Create a dataset for each of the given splits + datasets = map_nested( + self._as_streaming_dataset_single, + splits_generator, + map_tuple=True, + ) + if isinstance(datasets, dict): + datasets = IterableDatasetDict(datasets) + return datasets + + def _as_streaming_dataset_single( + self, + splits_generator, + ) -> IterableDataset: + ex_iterable = self._get_examples_iterable_for_split(splits_generator) + # add auth to be able to access and decode audio/image files from private repositories. + token_per_repo_id = {self.repo_id: self.token} if self.repo_id else {} + return IterableDataset( + ex_iterable, info=self.info, split=splits_generator.name, token_per_repo_id=token_per_repo_id + ) + + @abc.abstractmethod + def _split_generators(self, dl_manager: Union[DownloadManager, StreamingDownloadManager]): + """Specify feature dictionary generators and dataset splits. + + This function returns a list of `SplitGenerator`s defining how to generate + data and what splits to use. + + Example: + + return [ + datasets.SplitGenerator( + name=datasets.Split.TRAIN, + gen_kwargs={'file': 'train_data.zip'}, + ), + datasets.SplitGenerator( + name=datasets.Split.TEST, + gen_kwargs={'file': 'test_data.zip'}, + ), + ] + + The above code will first call `_generate_examples(file='train_data.zip')` + to write the train data, then `_generate_examples(file='test_data.zip')` to + write the test data. + + Datasets are typically split into different subsets to be used at various + stages of training and evaluation. + + Note that for datasets without a `VALIDATION` split, you can use a + fraction of the `TRAIN` data for evaluation as you iterate on your model + so as not to overfit to the `TEST` data. + + For downloads and extractions, use the given `download_manager`. + Note that the `DownloadManager` caches downloads, so it is fine to have each + generator attempt to download the source data. + + A good practice is to download all data in this function, and then + distribute the relevant parts to each split with the `gen_kwargs` argument + + Args: + dl_manager (`Union[DownloadManager, StreamingDownloadManager]`): + Download manager to download the data + + Returns: + `list`. + """ + raise NotImplementedError() + + @abc.abstractmethod + def _prepare_split( + self, + split_generator: SplitGenerator, + file_format: str = "arrow", + max_shard_size: Optional[Union[str, int]] = None, + num_proc: Optional[int] = None, + **kwargs, + ): + """Generate the examples and record them on disk. + + Args: + split_generator (`SplitGenerator`): + Split generator to process + file_format (`str`, *optional*): + format of the data files in which the dataset will be written. + Supported formats: "arrow", "parquet". Default to "arrow" format. + max_shard_size (`Union[str, int]`, *optional*): + Maximum number of bytes written per shard, default is "500MB". + The size is based on uncompressed data size, so in practice your shard files may be smaller than + `max_shard_size` thanks to Parquet compression for example. + num_proc (`int`, *optional*, defaults to `None`): + Number of processes when downloading and generating the dataset locally. + Multiprocessing is disabled by default. + + + **kwargs: Additional kwargs forwarded from _download_and_prepare + """ + raise NotImplementedError() + + def _get_examples_iterable_for_split(self, split_generator: SplitGenerator) -> ExamplesIterable: + """Generate the examples on the fly. + + Args: + split_generator (`SplitGenerator`): + Split generator to process + """ + raise NotImplementedError() + + +@dataclass +class Key: + original_shard_id: int + item_or_batch_id: int + + def __str__(self): + return str((self.original_shard_id, self.item_or_batch_id)) + + +class GeneratorBasedBuilder(DatasetBuilder): + """Base class for datasets with data generation based on dict generators. + + `GeneratorBasedBuilder` is a convenience class that abstracts away much + of the data writing and reading of `DatasetBuilder`. It expects subclasses to + implement generators of feature dictionaries across the dataset splits + (`_split_generators`). See the method docstrings for details. + """ + + def _generate_shards(self, **kwargs) -> Iterator[Union[str, dict[str, Any]]]: + """Default function generating shards paths for each `SplitGenerator`. + + This function is useful to list the original shards from where the data + comes from and is either converted to Arrow or streamed to an IterableDataset. + + This is optional and only used for certain utilities, but not in Dataset + nor IterableDataset. E.g. it's used to map original shard files to Parquet + files in the Dataset Viewer after conversion. + + Args: + **kwargs (additional keyword arguments): + Arguments forwarded from the SplitGenerator.gen_kwargs + + Yields: + shard: generally a string representing the shard path, or a dict + representing the shard in case of shards spanning intra or inter-files. + """ + raise NotImplementedError() + + @abc.abstractmethod + def _generate_examples(self, **kwargs) -> Iterator[tuple[Key, dict[str, Any]]]: + """Default function generating examples for each `SplitGenerator`. + + This function preprocess the examples from the raw data to the preprocessed + dataset files. + This function is called once for each `SplitGenerator` defined in + `_split_generators`. The examples yielded here will be written on + disk. + + Args: + **kwargs (additional keyword arguments): + Arguments forwarded from the SplitGenerator.gen_kwargs + + Yields: + key: `str` or `int`, a unique deterministic example identification key. + * Unique: An error will be raised if two examples are yield with the + same key. + * Deterministic: When generating the dataset twice, the same example + should have the same key. + Good keys can be the image id, or line number if examples are extracted + from a text file. + The key will be hashed and sorted to shuffle examples deterministically, + such as generating the dataset multiple times keep examples in the + same order. + example: `dict`, a feature dictionary + ready to be encoded and written to disk. The example will be + encoded with `self.info.features.encode_example({...})`. + """ + raise NotImplementedError() + + def _prepare_split( + self, + split_generator: SplitGenerator, + file_format="arrow", + num_proc: Optional[int] = None, + max_shard_size: Optional[Union[int, str]] = None, + ): + max_shard_size = convert_file_size_to_int(max_shard_size or config.MAX_SHARD_SIZE) + + if self.info.splits is not None: + split_info = self.info.splits[split_generator.name] + else: + split_info = split_generator.split_info + + SUFFIX = "-JJJJJ-SSSSS-of-NNNNN" + fname = f"{self.dataset_name}-{split_generator.name}{SUFFIX}.{file_format}" + fpath = posixpath.join(self._output_dir, fname) + + if num_proc and num_proc > 1: + num_original_shards = _number_of_shards_in_gen_kwargs(split_generator.gen_kwargs) + if num_original_shards <= 1: + logger.warning( + f"Setting num_proc from {num_proc} back to 1 for the {split_info.name} split to disable multiprocessing as it only contains one shard." + ) + num_proc = 1 + elif num_original_shards < num_proc: + logger.warning( + f"Setting num_proc from {num_proc} to {num_original_shards} for the {split_info.name} split as it only contains {num_original_shards} shards." + ) + num_proc = num_original_shards + + pbar = hf_tqdm( + unit=" examples", + total=split_info.num_examples, + desc=f"Generating {split_info.name} split", + ) + + _prepare_split_args = { + "fpath": fpath, + "file_format": file_format, + "max_shard_size": max_shard_size, + "split_info": split_info, + } + + if num_proc is None or num_proc == 1: + result = None + gen_kwargs = split_generator.gen_kwargs + job_id = 0 + with pbar: + for job_id, done, content in self._prepare_split_single( + gen_kwargs=gen_kwargs, job_id=job_id, **_prepare_split_args + ): + if done: + result = content + else: + pbar.update(content) + # wrapping everything into lists for consistency with the multiprocessed code path + assert result is not None, "Failed to retrieve results from prepare_split" + ( + examples_per_job, + bytes_per_job, + features_per_job, + shards_per_job, + shard_lengths_per_job, + original_shards_per_job, + original_shard_lengths_per_job, + ) = ([item] for item in result) + else: + kwargs_per_job = [ + {"gen_kwargs": gen_kwargs, "job_id": job_id, **_prepare_split_args} + for job_id, gen_kwargs in enumerate( + _split_gen_kwargs(split_generator.gen_kwargs, max_num_jobs=num_proc) + ) + ] + num_jobs = len(kwargs_per_job) + + examples_per_job = [None] * num_jobs + bytes_per_job = [None] * num_jobs + features_per_job = [None] * num_jobs + shards_per_job = [None] * num_jobs + shard_lengths_per_job = [None] * num_jobs + original_shards_per_job = [None] * num_jobs + original_shard_lengths_per_job = [None] * num_jobs + + with Pool(num_proc) as pool: + with pbar: + for job_id, done, content in iflatmap_unordered( + pool, self._prepare_split_single, kwargs_iterable=kwargs_per_job + ): + if done: + # the content is the result of the job + ( + examples_per_job[job_id], + bytes_per_job[job_id], + features_per_job[job_id], + shards_per_job[job_id], + shard_lengths_per_job[job_id], + original_shards_per_job[job_id], + original_shard_lengths_per_job[job_id], + ) = content + else: + # the content is the number of examples progress update + pbar.update(content) + + assert None not in examples_per_job, ( + f"Failed to retrieve results from prepare_split: result list {examples_per_job} still contains None - at least one worker failed to return its results" + ) + + total_shards = sum(shards_per_job) + total_original_shards = sum(original_shards_per_job) + total_num_examples = sum(examples_per_job) + total_num_bytes = sum(bytes_per_job) + features = features_per_job[0] + + split_generator.split_info.num_examples = total_num_examples + split_generator.split_info.num_bytes = total_num_bytes + + # should rename everything at the end + logger.debug(f"Renaming {total_shards} shards.") + if total_shards > 1: + # use the -SSSSS-of-NNNNN pattern + + def _rename_shard(shard_and_job: tuple[int]): + shard_id, job_id = shard_and_job + global_shard_id = sum(shards_per_job[:job_id]) + shard_id + self._rename( + fpath.replace("SSSSS", f"{shard_id:05d}").replace("JJJJJ", f"{job_id:05d}"), + fpath.replace("JJJJJ-SSSSS", f"{global_shard_id:05d}").replace("NNNNN", f"{total_shards:05d}"), + ) + + shards_and_jobs = [ + (shard_id, job_id) + for job_id, num_shards in enumerate(shards_per_job) + for shard_id in range(num_shards) + ] + thread_map(_rename_shard, shards_and_jobs, disable=True, max_workers=64) + + split_generator.split_info.shard_lengths = [ + shard_length for shard_lengths in shard_lengths_per_job for shard_length in shard_lengths + ] + else: + # don't use any pattern + shard_id, job_id = 0, 0 + self._rename( + fpath.replace("SSSSS", f"{shard_id:05d}").replace("JJJJJ", f"{job_id:05d}"), + fpath.replace(SUFFIX, ""), + ) + + if total_original_shards > 1 and config.SAVE_ORIGINAL_SHARD_LENGTHS: + split_generator.split_info.original_shard_lengths = [ + original_shard_length + for original_shard_lengths in original_shard_lengths_per_job + for original_shard_length in original_shard_lengths + ] + + if self.info.features is None: + self.info.features = features + + def _prepare_split_single( + self, + gen_kwargs: dict, + fpath: str, + file_format: str, + max_shard_size: int, + split_info: SplitInfo, + job_id: int, + ) -> Iterator[tuple[int, bool, tuple[int, int, Features, int, int, int]]]: + generator = self._generate_examples(**gen_kwargs) + writer_class = ParquetWriter if file_format == "parquet" else ArrowWriter + embed_local_files = file_format == "parquet" + shard_lengths = [] + original_shard_lengths = [] + total_num_examples, total_num_bytes = 0, 0 + + shard_id = 0 + original_shard_id = 0 + num_examples_progress_update = 0 + try: + writer = writer_class( + features=self.info.features, + path=fpath.replace("SSSSS", f"{shard_id:05d}").replace("JJJJJ", f"{job_id:05d}"), + writer_batch_size=self._writer_batch_size, + storage_options=self._fs.storage_options, + embed_local_files=embed_local_files, + ) + try: + _time = time.time() + for key, record in generator: + if isinstance(key, Key): # old custom builders may not use Key + original_shard_id = key.original_shard_id + if max_shard_size is not None and writer._num_bytes > max_shard_size: + num_examples, num_bytes = writer.finalize() + writer.close() + shard_lengths.append(num_examples) + total_num_examples += num_examples + total_num_bytes += num_bytes + shard_id += 1 + writer = writer_class( + features=writer._features, + path=fpath.replace("SSSSS", f"{shard_id:05d}").replace("JJJJJ", f"{job_id:05d}"), + writer_batch_size=self._writer_batch_size, + storage_options=self._fs.storage_options, + embed_local_files=embed_local_files, + ) + example = self.info.features.encode_example(record) if self.info.features is not None else record + writer.write(example) + if len(original_shard_lengths) <= original_shard_id: + original_shard_lengths.extend([0] * (1 + original_shard_id - len(original_shard_lengths))) + original_shard_lengths[original_shard_id] += 1 + num_examples_progress_update += 1 + if time.time() > _time + config.PBAR_REFRESH_TIME_INTERVAL: + _time = time.time() + yield job_id, False, num_examples_progress_update + num_examples_progress_update = 0 + finally: + yield job_id, False, num_examples_progress_update + num_shards = shard_id + 1 + num_original_shards = original_shard_id + 1 + num_examples, num_bytes = writer.finalize() + writer.close() + shard_lengths.append(num_examples) + total_num_examples += num_examples + total_num_bytes += num_bytes + except Exception as e: + # Ignore the writer's error for no examples written to the file if this error was caused by the error in _generate_examples before the first example was yielded + if isinstance(e, SchemaInferenceError) and e.__context__ is not None: + e = e.__context__ + raise DatasetGenerationError("An error occurred while generating the dataset") from e + + yield ( + job_id, + True, + ( + total_num_examples, + total_num_bytes, + writer._features, + num_shards, + shard_lengths, + num_original_shards, + original_shard_lengths, + ), + ) + + def _download_and_prepare(self, dl_manager, verification_mode, **prepare_splits_kwargs): + super()._download_and_prepare( + dl_manager, + verification_mode, + **prepare_splits_kwargs, + ) + + def _get_examples_iterable_for_split(self, split_generator: SplitGenerator) -> ExamplesIterable: + return ExamplesIterable( + self._generate_examples, + split_generator.gen_kwargs, + generate_more_kwargs_fn=getattr(self, "_generate_more_gen_kwargs", None), + ) + + +class ArrowBasedBuilder(DatasetBuilder): + """Base class for datasets with data generation based on Arrow loading functions (CSV/JSON/Parquet).""" + + def _generate_shards(self, **kwargs) -> Iterator[Union[str, dict[str, Any]]]: + """Default function generating shards paths for each `SplitGenerator`. + + This function is useful to list the original shards from where the data + comes from and is either converted to Arrow or streamed to an IterableDataset. + + This is optional and only used for certain utilities, but not in Dataset + nor IterableDataset. E.g. it's used to map original shard files to Parquet + files in the Dataset Viewer after conversion. + + Args: + **kwargs (additional keyword arguments): + Arguments forwarded from the SplitGenerator.gen_kwargs + + Yields: + shard: generally a string representing the shard path, or a dict + representing the shard in case of shards spanning intra or inter-files. + """ + raise NotImplementedError() + + @abc.abstractmethod + def _generate_tables(self, **kwargs) -> Iterator[tuple[Key, pa.Table]]: + """Default function generating examples for each `SplitGenerator`. + + This function preprocess the examples from the raw data to the preprocessed + dataset files. + This function is called once for each `SplitGenerator` defined in + `_split_generators`. The examples yielded here will be written on + disk. + + Args: + **kwargs (additional keyword arguments): + Arguments forwarded from the SplitGenerator.gen_kwargs + + Yields: + key: tuple[int, int] original_shard_id and table_idx within that shard + example: `pyarrow.Table`, a feature table + ready to be encoded and written to disk. + """ + raise NotImplementedError() + + def _prepare_split( + self, + split_generator: SplitGenerator, + file_format: str = "arrow", + num_proc: Optional[int] = None, + max_shard_size: Optional[Union[str, int]] = None, + ): + max_shard_size = convert_file_size_to_int(max_shard_size or config.MAX_SHARD_SIZE) + + try: + split_info = self.info.splits[split_generator.name] + except Exception: + split_info = split_generator.split_info + + SUFFIX = "-JJJJJ-SSSSS-of-NNNNN" + fname = f"{self.dataset_name}-{split_generator.name}{SUFFIX}.{file_format}" + fpath = posixpath.join(self._output_dir, fname) + + if num_proc and num_proc > 1: + num_original_shards = _number_of_shards_in_gen_kwargs(split_generator.gen_kwargs) + if num_original_shards <= 1: + logger.warning( + f"Setting num_proc from {num_proc} back to 1 for the {split_info.name} split to disable multiprocessing as it only contains one shard." + ) + num_proc = 1 + elif num_original_shards < num_proc: + logger.warning( + f"Setting num_proc from {num_proc} to {num_original_shards} for the {split_info.name} split as it only contains {num_original_shards} shards." + ) + num_proc = num_original_shards + + pbar = hf_tqdm( + unit=" examples", + total=split_info.num_examples, + desc=f"Generating {split_info.name} split", + ) + + _prepare_split_args = { + "fpath": fpath, + "file_format": file_format, + "max_shard_size": max_shard_size, + } + + if num_proc is None or num_proc == 1: + result = None + gen_kwargs = split_generator.gen_kwargs + job_id = 0 + with pbar: + for job_id, done, content in self._prepare_split_single( + gen_kwargs=gen_kwargs, job_id=job_id, **_prepare_split_args + ): + if done: + result = content + else: + pbar.update(content) + # wrapping everything into lists for consistency with the multiprocessed code path + assert result is not None, "Failed to retrieve results from prepare_split" + ( + examples_per_job, + bytes_per_job, + features_per_job, + shards_per_job, + shard_lengths_per_job, + original_shards_per_job, + original_shard_lengths_per_job, + ) = ([item] for item in result) + else: + kwargs_per_job = [ + {"gen_kwargs": gen_kwargs, "job_id": job_id, **_prepare_split_args} + for job_id, gen_kwargs in enumerate( + _split_gen_kwargs(split_generator.gen_kwargs, max_num_jobs=num_proc) + ) + ] + num_jobs = len(kwargs_per_job) + + examples_per_job = [None] * num_jobs + bytes_per_job = [None] * num_jobs + features_per_job = [None] * num_jobs + shards_per_job = [None] * num_jobs + shard_lengths_per_job = [None] * num_jobs + original_shards_per_job = [None] * num_jobs + original_shard_lengths_per_job = [None] * num_jobs + + with Pool(num_proc) as pool: + with pbar: + for job_id, done, content in iflatmap_unordered( + pool, self._prepare_split_single, kwargs_iterable=kwargs_per_job + ): + if done: + # the content is the result of the job + ( + examples_per_job[job_id], + bytes_per_job[job_id], + features_per_job[job_id], + shards_per_job[job_id], + shard_lengths_per_job[job_id], + original_shards_per_job[job_id], + original_shard_lengths_per_job[job_id], + ) = content + else: + # the content is the number of examples progress update + pbar.update(content) + + assert None not in examples_per_job, ( + f"Failed to retrieve results from prepare_split: result list {examples_per_job} still contains None - at least one worker failed to return its results" + ) + + total_shards = sum(shards_per_job) + total_original_shards = sum(original_shards_per_job) + total_num_examples = sum(examples_per_job) + total_num_bytes = sum(bytes_per_job) + features = features_per_job[0] + + split_generator.split_info.num_examples = total_num_examples + split_generator.split_info.num_bytes = total_num_bytes + + # should rename everything at the end + logger.debug(f"Renaming {total_shards} shards.") + if total_shards > 1: + # use the -SSSSS-of-NNNNN pattern + + def _rename_shard(shard_id_and_job: tuple[int]): + shard_id, job_id = shard_id_and_job + global_shard_id = sum(shards_per_job[:job_id]) + shard_id + self._rename( + fpath.replace("SSSSS", f"{shard_id:05d}").replace("JJJJJ", f"{job_id:05d}"), + fpath.replace("JJJJJ-SSSSS", f"{global_shard_id:05d}").replace("NNNNN", f"{total_shards:05d}"), + ) + + shard_ids_and_jobs = [ + (shard_id, job_id) + for job_id, num_shards in enumerate(shards_per_job) + for shard_id in range(num_shards) + ] + thread_map(_rename_shard, shard_ids_and_jobs, disable=True, max_workers=64) + + split_generator.split_info.shard_lengths = [ + shard_length for shard_lengths in shard_lengths_per_job for shard_length in shard_lengths + ] + else: + # don't use any pattern + shard_id, job_id = 0, 0 + self._rename( + fpath.replace("SSSSS", f"{shard_id:05d}").replace("JJJJJ", f"{job_id:05d}"), + fpath.replace(SUFFIX, ""), + ) + + if total_original_shards > 1 and config.SAVE_ORIGINAL_SHARD_LENGTHS: + split_generator.split_info.original_shard_lengths = [ + original_shard_length + for original_shard_lengths in original_shard_lengths_per_job + for original_shard_length in original_shard_lengths + ] + + if self.info.features is None: + self.info.features = features + + def _prepare_split_single( + self, gen_kwargs: dict, fpath: str, file_format: str, max_shard_size: int, job_id: int + ) -> Iterator[tuple[int, bool, tuple[int, int, Features, int, int, int]]]: + gen_kwargs = {k: tracked_list(v) if isinstance(v, list) else v for k, v in gen_kwargs.items()} + generator = self._generate_tables(**gen_kwargs) + writer_class = ParquetWriter if file_format == "parquet" else ArrowWriter + embed_local_files = file_format == "parquet" + shard_lengths = [] + original_shard_lengths = [] + total_num_examples, total_num_bytes = 0, 0 + + shard_id = 0 + original_shard_id = 0 + num_examples_progress_update = 0 + try: + writer = writer_class( + features=self.info.features, + path=fpath.replace("SSSSS", f"{shard_id:05d}").replace("JJJJJ", f"{job_id:05d}"), + writer_batch_size=self._writer_batch_size, + storage_options=self._fs.storage_options, + embed_local_files=embed_local_files, + ) + try: + _time = time.time() + for key, table in generator: + if isinstance(key, Key): # old custom builders may not use Key + original_shard_id = key.original_shard_id + if max_shard_size is not None and writer._num_bytes > max_shard_size: + num_examples, num_bytes = writer.finalize() + writer.close() + shard_lengths.append(num_examples) + total_num_examples += num_examples + total_num_bytes += num_bytes + shard_id += 1 + writer = writer_class( + features=writer._features, + path=fpath.replace("SSSSS", f"{shard_id:05d}").replace("JJJJJ", f"{job_id:05d}"), + writer_batch_size=self._writer_batch_size, + storage_options=self._fs.storage_options, + embed_local_files=embed_local_files, + ) + try: + if len(table) == 1: + writer.write_row(table) + else: + writer.write_table(table) + except CastError as cast_error: + raise DatasetGenerationCastError.from_cast_error( + cast_error=cast_error, + builder_name=self.info.builder_name, + gen_kwargs=gen_kwargs, + token=self.token, + ) + if len(original_shard_lengths) == original_shard_id: + original_shard_lengths.append(len(table)) + else: + original_shard_lengths[original_shard_id] += len(table) + num_examples_progress_update += len(table) + if time.time() > _time + config.PBAR_REFRESH_TIME_INTERVAL: + _time = time.time() + yield job_id, False, num_examples_progress_update + num_examples_progress_update = 0 + finally: + yield job_id, False, num_examples_progress_update + num_shards = shard_id + 1 + num_original_shards = original_shard_id + 1 + num_examples, num_bytes = writer.finalize() + writer.close() + shard_lengths.append(num_examples) + total_num_examples += num_examples + total_num_bytes += num_bytes + except Exception as e: + # Ignore the writer's error for no examples written to the file if this error was caused by the error in _generate_examples before the first example was yielded + if isinstance(e, SchemaInferenceError) and e.__context__ is not None: + e = e.__context__ + if isinstance(e, DatasetGenerationError): + raise + raise DatasetGenerationError("An error occurred while generating the dataset") from e + + yield ( + job_id, + True, + ( + total_num_examples, + total_num_bytes, + writer._features, + num_shards, + shard_lengths, + num_original_shards, + original_shard_lengths, + ), + ) + + def _get_examples_iterable_for_split(self, split_generator: SplitGenerator) -> ExamplesIterable: + return ArrowExamplesIterable( + self._generate_tables, + kwargs=split_generator.gen_kwargs, + generate_more_kwargs_fn=getattr(self, "_generate_more_gen_kwargs", None), + sleep_on_threads_shutdown=self.SLEEP_ON_THREADS_SHUTDOWNS, + ) + + +class _CountableBuilderMixin(DatasetBuilder): + @abc.abstractmethod + def _generate_num_examples(self, **kwargs) -> Iterator[int]: + raise NotImplementedError() + + def count_examples(self, dl_manager: DownloadManager) -> dict[str, int]: + split_generators_kwargs = self._make_split_generators_kwargs({}) + split_generators: list[SplitGenerator] = self._split_generators(dl_manager, **split_generators_kwargs) + return {split_generator.name: self._count_examples(split_generator) for split_generator in split_generators} + + def _count_examples(self, split_generator: SplitGenerator) -> int: + max_workers = min(32, os.cpu_count() + 4) + return sum( + thread_map( + self._count_examples_single, + _split_gen_kwargs(split_generator.gen_kwargs, max_workers), + delay=5, + desc=f"Counting rows for split={split_generator.name}", + ) + ) + + def _count_examples_single(self, gen_kwargs: dict[str, Any]) -> int: + return sum(self._generate_num_examples(**gen_kwargs)) diff --git a/src/datasets/combine.py b/src/datasets/combine.py new file mode 100644 index 0000000..7b6c64b --- /dev/null +++ b/src/datasets/combine.py @@ -0,0 +1,232 @@ +from typing import Optional, TypeVar + +from .arrow_dataset import Dataset, _concatenate_map_style_datasets, _interleave_map_style_datasets +from .dataset_dict import DatasetDict, IterableDatasetDict +from .info import DatasetInfo +from .iterable_dataset import IterableDataset, _concatenate_iterable_datasets, _interleave_iterable_datasets +from .splits import NamedSplit +from .utils import logging +from .utils.py_utils import Literal + + +logger = logging.get_logger(__name__) + + +DatasetType = TypeVar("DatasetType", Dataset, IterableDataset) + + +def interleave_datasets( + datasets: list[DatasetType], + probabilities: Optional[list[float]] = None, + seed: Optional[int] = None, + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + stopping_strategy: Literal[ + "first_exhausted", "all_exhausted", "all_exhausted_without_replacement" + ] = "first_exhausted", +) -> DatasetType: + """ + Interleave several datasets (sources) into a single dataset. + The new dataset is constructed by alternating between the sources to get the examples. + + You can use this function on a list of [`Dataset`] objects, or on a list of [`IterableDataset`] objects. + + - If `probabilities` is `None` (default) the new dataset is constructed by cycling between each source to get the examples. + - If `probabilities` is not `None`, the new dataset is constructed by getting examples from a random source at a time according to the provided probabilities. + + The resulting dataset ends when one of the source datasets runs out of examples except when `oversampling` is `True`, + in which case, the resulting dataset ends when all datasets have ran out of examples at least one time. + + Note for iterable datasets: + + * The resulting dataset's `num_shards` is the minimum of each dataset's `num_shards` to ensure good parallelism. + If some of your datasets have a very low number of shards, you may use [`IterableDataset.reshard`]. + * In a distributed setup or in PyTorch DataLoader workers, the stopping strategy is applied per process. + Therefore the "first_exhausted" strategy on an sharded iterable dataset can generate less samples in total (up to 1 missing sample per subdataset per worker). + + Args: + datasets (`List[Dataset]` or `List[IterableDataset]`): + List of datasets to interleave. + probabilities (`List[float]`, *optional*, defaults to `None`): + If specified, the new dataset is constructed by sampling + examples from one source at a time according to these probabilities. + seed (`int`, *optional*, defaults to `None`): + The random seed used to choose a source for each example. + info ([`DatasetInfo`], *optional*): + Dataset information, like description, citation, etc. + + split ([`NamedSplit`], *optional*): + Name of the dataset split. + + stopping_strategy (`str`, defaults to `first_exhausted`): + Three strategies are proposed right now, `first_exhausted`, `all_exhausted` and `all_exhausted_without_replacement`. + By default, `first_exhausted` is an undersampling strategy, i.e the dataset construction is stopped as soon as one dataset has ran out of samples. + If the strategy is `all_exhausted`, we use an oversampling strategy, i.e the dataset construction is stopped as soon as every samples of every dataset has been added at least once. + When strategy is `all_exhausted_without_replacement` we make sure that each sample in each dataset is sampled only once. + Note that if the strategy is `all_exhausted`, the interleaved dataset size can get enormous: + - with no probabilities, the resulting dataset will have `max_length_datasets*nb_dataset` samples. + - with given probabilities, the resulting dataset will have more samples if some datasets have really low probability of visiting. + Returns: + [`Dataset`] or [`IterableDataset`]: Return type depends on the input `datasets` + parameter. `Dataset` if the input is a list of `Dataset`, `IterableDataset` if the input is a list of + `IterableDataset`. + + Example: + + For regular datasets (map-style): + + ```python + >>> from datasets import Dataset, interleave_datasets + >>> d1 = Dataset.from_dict({"a": [0, 1, 2]}) + >>> d2 = Dataset.from_dict({"a": [10, 11, 12]}) + >>> d3 = Dataset.from_dict({"a": [20, 21, 22]}) + >>> dataset = interleave_datasets([d1, d2, d3], probabilities=[0.7, 0.2, 0.1], seed=42, stopping_strategy="all_exhausted") + >>> dataset["a"] + [10, 0, 11, 1, 2, 20, 12, 10, 0, 1, 2, 21, 0, 11, 1, 2, 0, 1, 12, 2, 10, 0, 22] + >>> dataset = interleave_datasets([d1, d2, d3], probabilities=[0.7, 0.2, 0.1], seed=42) + >>> dataset["a"] + [10, 0, 11, 1, 2] + >>> dataset = interleave_datasets([d1, d2, d3]) + >>> dataset["a"] + [0, 10, 20, 1, 11, 21, 2, 12, 22] + >>> dataset = interleave_datasets([d1, d2, d3], stopping_strategy="all_exhausted") + >>> dataset["a"] + [0, 10, 20, 1, 11, 21, 2, 12, 22] + >>> d1 = Dataset.from_dict({"a": [0, 1, 2]}) + >>> d2 = Dataset.from_dict({"a": [10, 11, 12, 13]}) + >>> d3 = Dataset.from_dict({"a": [20, 21, 22, 23, 24]}) + >>> dataset = interleave_datasets([d1, d2, d3]) + >>> dataset["a"] + [0, 10, 20, 1, 11, 21, 2, 12, 22] + >>> dataset = interleave_datasets([d1, d2, d3], stopping_strategy="all_exhausted") + >>> dataset["a"] + [0, 10, 20, 1, 11, 21, 2, 12, 22, 0, 13, 23, 1, 10, 24] + >>> dataset = interleave_datasets([d1, d2, d3], probabilities=[0.7, 0.2, 0.1], seed=42) + >>> dataset["a"] + [10, 0, 11, 1, 2] + >>> dataset = interleave_datasets([d1, d2, d3], probabilities=[0.7, 0.2, 0.1], seed=42, stopping_strategy="all_exhausted") + >>> dataset["a"] + [10, 0, 11, 1, 2, 20, 12, 13, ..., 0, 1, 2, 0, 24] + For datasets in streaming mode (iterable): + + >>> from datasets import interleave_datasets + >>> d1 = load_dataset('allenai/c4', 'es', split='train', streaming=True) + >>> d2 = load_dataset('allenai/c4', 'fr', split='train', streaming=True) + >>> dataset = interleave_datasets([d1, d2]) + >>> iterator = iter(dataset) + >>> next(iterator) + {'text': 'Comprar Zapatillas para niña en chancla con goma por...'} + >>> next(iterator) + {'text': 'Le sacre de philippe ier, 23 mai 1059 - Compte Rendu...' + ``` + """ + from .arrow_dataset import Dataset + from .iterable_dataset import IterableDataset + + if not datasets: + raise ValueError("Unable to interleave an empty list of datasets.") + for i, dataset in enumerate(datasets): + if not isinstance(dataset, (Dataset, IterableDataset)): + if isinstance(dataset, (DatasetDict, IterableDatasetDict)): + if not dataset: + raise ValueError( + f"Expected a list of Dataset objects or a list of IterableDataset objects, but element at position {i} " + "is an empty dataset dictionary." + ) + raise ValueError( + f"Dataset at position {i} has at least one split: {list(dataset)}\n" + f"Please pick one to interleave with the other datasets, for example: dataset['{next(iter(dataset))}']" + ) + raise ValueError( + f"Expected a list of Dataset objects or a list of IterableDataset objects, but element at position {i} is a {type(dataset).__name__}." + ) + if i == 0: + dataset_type, other_type = ( + (Dataset, IterableDataset) if isinstance(dataset, Dataset) else (IterableDataset, Dataset) + ) + elif not isinstance(dataset, dataset_type): + raise ValueError( + f"Unable to interleave a {dataset_type.__name__} (at position 0) with a {other_type.__name__} (at position {i}). Expected a list of Dataset objects or a list of IterableDataset objects." + ) + if stopping_strategy not in ["first_exhausted", "all_exhausted", "all_exhausted_without_replacement"]: + raise ValueError(f"{stopping_strategy} is not supported. Please enter a valid stopping_strategy.") + if dataset_type is Dataset: + return _interleave_map_style_datasets( + datasets, probabilities, seed, info=info, split=split, stopping_strategy=stopping_strategy + ) + else: + return _interleave_iterable_datasets( + datasets, + probabilities, + seed, + info=info, + split=split, + stopping_strategy=stopping_strategy, + ) + + +def concatenate_datasets( + dsets: list[DatasetType], + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + axis: int = 0, +) -> DatasetType: + """ + Concatenate several datasets (sources) into a single dataset. + + Use axis=0 to concatenate vertically (default), or axis=1 to concatenate horizontally. + + Note for iterable datasets: + + * if axis=0, the resulting dataset's `num_shards` is the sum of each dataset's `num_shards`. + * if axis=1, the resulting dataset has one (1) shard to not misalign data. + + Args: + dsets (`List[datasets.Dataset]` or `List[datasets.IterableDataset]`): + List of Datasets to concatenate. + info (`DatasetInfo`, *optional*): + Dataset information, like description, citation, etc. + split (`NamedSplit`, *optional*): + Name of the dataset split. + axis (`{0, 1}`, defaults to `0`): + Axis to concatenate over, where `0` means over rows (vertically) and `1` means over columns + (horizontally). + + + + Example: + + ```py + >>> ds3 = concatenate_datasets([ds1, ds2]) + ``` + """ + + if not dsets: + raise ValueError("Unable to concatenate an empty list of datasets.") + for i, dataset in enumerate(dsets): + if not isinstance(dataset, (Dataset, IterableDataset)): + if isinstance(dataset, (DatasetDict, IterableDatasetDict)): + if not dataset: + raise ValueError( + f"Expected a list of Dataset objects or a list of IterableDataset objects, but element at position {i} " + "is an empty dataset dictionary." + ) + raise ValueError( + f"Dataset at position {i} has at least one split: {list(dataset)}\n" + f"Please pick one to interleave with the other datasets, for example: dataset['{next(iter(dataset))}']" + ) + raise ValueError( + f"Expected a list of Dataset objects or a list of IterableDataset objects, but element at position {i} is a {type(dataset).__name__}." + ) + if i == 0: + dataset_type, other_type = ( + (Dataset, IterableDataset) if isinstance(dataset, Dataset) else (IterableDataset, Dataset) + ) + elif not isinstance(dataset, dataset_type): + raise ValueError( + f"Unable to interleave a {dataset_type.__name__} (at position 0) with a {other_type.__name__} (at position {i}). Expected a list of Dataset objects or a list of IterableDataset objects." + ) + if dataset_type is Dataset: + return _concatenate_map_style_datasets(dsets, info=info, split=split, axis=axis) + else: + return _concatenate_iterable_datasets(dsets, info=info, split=split, axis=axis) diff --git a/src/datasets/commands/__init__.py b/src/datasets/commands/__init__.py new file mode 100644 index 0000000..905e753 --- /dev/null +++ b/src/datasets/commands/__init__.py @@ -0,0 +1,13 @@ +from abc import ABC, abstractmethod +from argparse import ArgumentParser + + +class BaseDatasetsCLICommand(ABC): + @staticmethod + @abstractmethod + def register_subcommand(parser: ArgumentParser): + raise NotImplementedError() + + @abstractmethod + def run(self): + raise NotImplementedError() diff --git a/src/datasets/commands/datasets_cli.py b/src/datasets/commands/datasets_cli.py new file mode 100644 index 0000000..1d04d87 --- /dev/null +++ b/src/datasets/commands/datasets_cli.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +from argparse import ArgumentParser + +from datasets.commands.delete_from_hub import DeleteFromHubCommand +from datasets.commands.env import EnvironmentCommand +from datasets.commands.test import TestCommand +from datasets.utils.logging import set_verbosity_info + + +def parse_unknown_args(unknown_args): + return {key.lstrip("-"): value for key, value in zip(unknown_args[::2], unknown_args[1::2])} + + +def main(): + parser = ArgumentParser( + "HuggingFace Datasets CLI tool", usage="datasets-cli []", allow_abbrev=False + ) + commands_parser = parser.add_subparsers(help="datasets-cli command helpers") + set_verbosity_info() + + # Register commands + EnvironmentCommand.register_subcommand(commands_parser) + TestCommand.register_subcommand(commands_parser) + DeleteFromHubCommand.register_subcommand(commands_parser) + + # Parse args + args, unknown_args = parser.parse_known_args() + if not hasattr(args, "func"): + parser.print_help() + exit(1) + kwargs = parse_unknown_args(unknown_args) + + # Run + service = args.func(args, **kwargs) + service.run() + + +if __name__ == "__main__": + main() diff --git a/src/datasets/commands/delete_from_hub.py b/src/datasets/commands/delete_from_hub.py new file mode 100644 index 0000000..126a029 --- /dev/null +++ b/src/datasets/commands/delete_from_hub.py @@ -0,0 +1,42 @@ +from argparse import ArgumentParser +from typing import Optional + +from datasets.commands import BaseDatasetsCLICommand +from datasets.hub import delete_from_hub + + +def _command_factory(args): + return DeleteFromHubCommand( + args.dataset_id, + args.config_name, + args.token, + args.revision, + ) + + +class DeleteFromHubCommand(BaseDatasetsCLICommand): + @staticmethod + def register_subcommand(parser): + parser: ArgumentParser = parser.add_parser("delete_from_hub", help="Delete dataset config from the Hub") + parser.add_argument( + "dataset_id", help="source dataset ID, e.g. USERNAME/DATASET_NAME or ORGANIZATION/DATASET_NAME" + ) + parser.add_argument("config_name", help="config name to delete") + parser.add_argument("--token", help="access token to the Hugging Face Hub") + parser.add_argument("--revision", help="source revision") + parser.set_defaults(func=_command_factory) + + def __init__( + self, + dataset_id: str, + config_name: str, + token: Optional[str], + revision: Optional[str], + ): + self._dataset_id = dataset_id + self._config_name = config_name + self._token = token + self._revision = revision + + def run(self) -> None: + _ = delete_from_hub(self._dataset_id, self._config_name, revision=self._revision, token=self._token) diff --git a/src/datasets/commands/env.py b/src/datasets/commands/env.py new file mode 100644 index 0000000..40b2a36 --- /dev/null +++ b/src/datasets/commands/env.py @@ -0,0 +1,41 @@ +import platform +from argparse import ArgumentParser + +import fsspec +import huggingface_hub +import pandas +import pyarrow + +from datasets import __version__ as version +from datasets.commands import BaseDatasetsCLICommand + + +def info_command_factory(_): + return EnvironmentCommand() + + +class EnvironmentCommand(BaseDatasetsCLICommand): + @staticmethod + def register_subcommand(parser: ArgumentParser): + download_parser = parser.add_parser("env", help="Print relevant system environment info.") + download_parser.set_defaults(func=info_command_factory) + + def run(self): + info = { + "`datasets` version": version, + "Platform": platform.platform(), + "Python version": platform.python_version(), + "`huggingface_hub` version": huggingface_hub.__version__, + "PyArrow version": pyarrow.__version__, + "Pandas version": pandas.__version__, + "`fsspec` version": fsspec.__version__, + } + + print("\nCopy-and-paste the text below in your GitHub issue.\n") + print(self.format_dict(info)) + + return info + + @staticmethod + def format_dict(d): + return "\n".join([f"- {prop}: {val}" for prop, val in d.items()]) + "\n" diff --git a/src/datasets/commands/test.py b/src/datasets/commands/test.py new file mode 100644 index 0000000..1aca325 --- /dev/null +++ b/src/datasets/commands/test.py @@ -0,0 +1,180 @@ +import logging +import os +from argparse import ArgumentParser +from collections.abc import Generator +from shutil import rmtree + +import datasets.config +from datasets.builder import DatasetBuilder +from datasets.commands import BaseDatasetsCLICommand +from datasets.download.download_manager import DownloadMode +from datasets.info import DatasetInfosDict +from datasets.load import dataset_module_factory, get_dataset_builder_class +from datasets.utils.info_utils import VerificationMode +from datasets.utils.logging import ERROR, get_logger + + +logger = get_logger(__name__) + + +def _test_command_factory(args): + return TestCommand( + args.dataset, + args.name, + args.cache_dir, + args.data_dir, + args.all_configs, + args.save_info or args.save_infos, + args.ignore_verifications, + args.force_redownload, + args.clear_cache, + args.num_proc, + ) + + +class TestCommand(BaseDatasetsCLICommand): + __test__ = False # to tell pytest it's not a test class + + @staticmethod + def register_subcommand(parser: ArgumentParser): + test_parser = parser.add_parser("test", help="Test dataset loading.") + test_parser.add_argument("--name", type=str, default=None, help="Dataset processing name") + test_parser.add_argument( + "--cache_dir", + type=str, + default=None, + help="Cache directory where the datasets are stored.", + ) + test_parser.add_argument( + "--data_dir", + type=str, + default=None, + help="Can be used to specify a manual directory to get the files from.", + ) + test_parser.add_argument("--all_configs", action="store_true", help="Test all dataset configurations") + test_parser.add_argument( + "--save_info", action="store_true", help="Save the dataset infos in the dataset card (README.md)" + ) + test_parser.add_argument( + "--ignore_verifications", + action="store_true", + help="Run the test without checksums and splits checks.", + ) + test_parser.add_argument("--force_redownload", action="store_true", help="Force dataset redownload") + test_parser.add_argument( + "--clear_cache", + action="store_true", + help="Remove downloaded files and cached datasets after each config test", + ) + test_parser.add_argument("--num_proc", type=int, default=None, help="Number of processes") + # aliases + test_parser.add_argument("--save_infos", action="store_true", help="alias to save_info") + test_parser.add_argument("dataset", type=str, help="Name of the dataset to download") + test_parser.set_defaults(func=_test_command_factory) + + def __init__( + self, + dataset: str, + name: str, + cache_dir: str, + data_dir: str, + all_configs: bool, + save_infos: bool, + ignore_verifications: bool, + force_redownload: bool, + clear_cache: bool, + num_proc: int, + ): + self._dataset = dataset + self._name = name + self._cache_dir = cache_dir + self._data_dir = data_dir + self._all_configs = all_configs + self._save_infos = save_infos + self._ignore_verifications = ignore_verifications + self._force_redownload = force_redownload + self._clear_cache = clear_cache + self._num_proc = num_proc + if clear_cache and not cache_dir: + print( + "When --clear_cache is used, specifying a cache directory is mandatory.\n" + "The 'download' folder of the cache directory and the dataset builder cache will be deleted after each configuration test.\n" + "Please provide a --cache_dir that will be used to test the dataset." + ) + exit(1) + if save_infos: + self._ignore_verifications = True + + def run(self): + logging.getLogger("filelock").setLevel(ERROR) + if self._name is not None and self._all_configs: + print("Both parameters `config` and `all_configs` can't be used at once.") + exit(1) + path, config_name = self._dataset, self._name + module = dataset_module_factory(path) + builder_cls = get_dataset_builder_class(module) + n_builders = len(builder_cls.BUILDER_CONFIGS) if self._all_configs and builder_cls.BUILDER_CONFIGS else 1 + + def get_builders() -> Generator[DatasetBuilder, None, None]: + if self._all_configs and builder_cls.BUILDER_CONFIGS: + for i, config in enumerate(builder_cls.BUILDER_CONFIGS): + if "config_name" in module.builder_kwargs: + yield builder_cls( + cache_dir=self._cache_dir, + data_dir=self._data_dir, + **module.builder_kwargs, + ) + else: + yield builder_cls( + config_name=config.name, + cache_dir=self._cache_dir, + data_dir=self._data_dir, + **module.builder_kwargs, + ) + else: + if "config_name" in module.builder_kwargs: + yield builder_cls(cache_dir=self._cache_dir, data_dir=self._data_dir, **module.builder_kwargs) + else: + yield builder_cls( + config_name=config_name, + cache_dir=self._cache_dir, + data_dir=self._data_dir, + **module.builder_kwargs, + ) + + for j, builder in enumerate(get_builders()): + print(f"Testing builder '{builder.config.name}' ({j + 1}/{n_builders})") + builder._record_checksums = os.path.exists( + os.path.join(builder.get_imported_module_dir(), datasets.config.DATASETDICT_INFOS_FILENAME) + ) # record checksums only if we need to update a (deprecated) dataset_infos.json + builder.download_and_prepare( + download_mode=DownloadMode.REUSE_CACHE_IF_EXISTS + if not self._force_redownload + else DownloadMode.FORCE_REDOWNLOAD, + verification_mode=VerificationMode.NO_CHECKS + if self._ignore_verifications + else VerificationMode.ALL_CHECKS, + num_proc=self._num_proc, + ) + builder.as_dataset() + + # If save_infos=True, we create the dataset card (README.md) + # The dataset_infos are saved in the YAML part of the README.md + # This is to allow the user to upload them on HF afterwards. + if self._save_infos: + save_infos_dir = os.path.basename(path) if not os.path.isdir(path) else path + os.makedirs(save_infos_dir, exist_ok=True) + DatasetInfosDict(**{builder.config.name: builder.info}).write_to_directory(save_infos_dir) + print(f"Dataset card saved at {os.path.join(save_infos_dir, datasets.config.REPOCARD_FILENAME)}") + + # If clear_cache=True, the download folder and the dataset builder cache directory are deleted + if self._clear_cache: + if os.path.isdir(builder._cache_dir): + logger.warning(f"Clearing cache at {builder._cache_dir}") + rmtree(builder._cache_dir) + download_dir = os.path.join(self._cache_dir, datasets.config.DOWNLOADED_DATASETS_DIR) + if os.path.isdir(download_dir): + logger.warning(f"Clearing cache at {download_dir}") + rmtree(download_dir) + + print("Test successful.") diff --git a/src/datasets/config.py b/src/datasets/config.py new file mode 100644 index 0000000..5bbd646 --- /dev/null +++ b/src/datasets/config.py @@ -0,0 +1,277 @@ +import importlib +import importlib.metadata +import logging +import os +import platform +from pathlib import Path +from typing import Optional + +from huggingface_hub import constants +from packaging import version + + +logger = logging.getLogger(__name__.split(".", 1)[0]) # to avoid circular import from .utils.logging + +# Datasets +S3_DATASETS_BUCKET_PREFIX = "https://s3.amazonaws.com/datasets.huggingface.co/datasets/datasets" +CLOUDFRONT_DATASETS_DISTRIB_PREFIX = "https://cdn-datasets.huggingface.co/datasets/datasets" +REPO_DATASETS_URL = "https://raw.githubusercontent.com/huggingface/datasets/{revision}/datasets/{path}/{name}" + +# Hub +HF_ENDPOINT = os.environ.get("HF_ENDPOINT", "https://huggingface.co") +HUB_DATASETS_URL = HF_ENDPOINT + "/datasets/{repo_id}/resolve/{revision}/{path}" +HUB_DATASETS_HFFS_URL = "hf://datasets/{repo_id}@{revision}/{path}" +HUB_DEFAULT_VERSION = "main" + +PY_VERSION = version.parse(platform.python_version()) + +# General environment variables accepted values for booleans +ENV_VARS_TRUE_VALUES = {"1", "ON", "YES", "TRUE"} +ENV_VARS_FALSE_VALUES = {"0", "OFF", "NO", "FALSE"} +ENV_VARS_TRUE_AND_AUTO_VALUES = ENV_VARS_TRUE_VALUES.union({"AUTO"}) +ENV_VARS_FALSE_AND_AUTO_VALUES = ENV_VARS_FALSE_VALUES.union({"AUTO"}) + + +# Imports +DILL_VERSION = version.parse(importlib.metadata.version("dill")) +FSSPEC_VERSION = version.parse(importlib.metadata.version("fsspec")) +PANDAS_VERSION = version.parse(importlib.metadata.version("pandas")) +PYARROW_VERSION = version.parse(importlib.metadata.version("pyarrow")) +HF_HUB_VERSION = version.parse(importlib.metadata.version("huggingface_hub")) + +USE_TF = os.environ.get("USE_TF", "AUTO").upper() +USE_TORCH = os.environ.get("USE_TORCH", "AUTO").upper() +USE_JAX = os.environ.get("USE_JAX", "AUTO").upper() + +TORCH_VERSION = "N/A" +TORCH_AVAILABLE = False + +if USE_TORCH in ENV_VARS_TRUE_AND_AUTO_VALUES and USE_TF not in ENV_VARS_TRUE_VALUES: + TORCH_AVAILABLE = importlib.util.find_spec("torch") is not None + if TORCH_AVAILABLE: + try: + TORCH_VERSION = version.parse(importlib.metadata.version("torch")) + logger.debug(f"PyTorch version {TORCH_VERSION} available.") + except importlib.metadata.PackageNotFoundError: + pass +else: + logger.info("Disabling PyTorch because USE_TF is set") + +POLARS_VERSION = "N/A" +POLARS_AVAILABLE = importlib.util.find_spec("polars") is not None + +if POLARS_AVAILABLE: + try: + POLARS_VERSION = version.parse(importlib.metadata.version("polars")) + logger.debug(f"Polars version {POLARS_VERSION} available.") + except importlib.metadata.PackageNotFoundError: + pass + + +DUCKDB_VERSION = "N/A" +DUCKDB_AVAILABLE = importlib.util.find_spec("duckdb") is not None + +if DUCKDB_AVAILABLE: + try: + DUCKDB_VERSION = version.parse(importlib.metadata.version("duckdb")) + logger.debug(f"Duckdb version {DUCKDB_VERSION} available.") + except importlib.metadata.PackageNotFoundError: + pass + +TF_VERSION = "N/A" +TF_AVAILABLE = False + +if USE_TF in ENV_VARS_TRUE_AND_AUTO_VALUES and USE_TORCH not in ENV_VARS_TRUE_VALUES: + TF_AVAILABLE = importlib.util.find_spec("tensorflow") is not None + if TF_AVAILABLE: + # For the metadata, we have to look for both tensorflow and tensorflow-cpu + for package in [ + "tensorflow", + "tensorflow-cpu", + "tensorflow-gpu", + "tf-nightly", + "tf-nightly-cpu", + "tf-nightly-gpu", + "intel-tensorflow", + "tensorflow-rocm", + "tensorflow-macos", + ]: + try: + TF_VERSION = version.parse(importlib.metadata.version(package)) + except importlib.metadata.PackageNotFoundError: + continue + else: + break + else: + TF_AVAILABLE = False + if TF_AVAILABLE: + if TF_VERSION.major < 2: + logger.info(f"TensorFlow found but with version {TF_VERSION}. `datasets` requires version 2 minimum.") + TF_AVAILABLE = False + else: + logger.info(f"TensorFlow version {TF_VERSION} available.") +else: + logger.info("Disabling Tensorflow because USE_TORCH is set") + + +JAX_VERSION = "N/A" +JAX_AVAILABLE = False + +if USE_JAX in ENV_VARS_TRUE_AND_AUTO_VALUES: + JAX_AVAILABLE = importlib.util.find_spec("jax") is not None and importlib.util.find_spec("jaxlib") is not None + if JAX_AVAILABLE: + try: + JAX_VERSION = version.parse(importlib.metadata.version("jax")) + logger.info(f"JAX version {JAX_VERSION} available.") + except importlib.metadata.PackageNotFoundError: + pass +else: + logger.info("Disabling JAX because USE_JAX is set to False") + + +# Optional tools for data loading +SQLALCHEMY_AVAILABLE = importlib.util.find_spec("sqlalchemy") is not None + +# Optional tools for file parsing and feature decoding +PIL_AVAILABLE = importlib.util.find_spec("PIL") is not None +IS_OPUS_SUPPORTED = True +IS_MP3_SUPPORTED = True +TORCHCODEC_AVAILABLE = importlib.util.find_spec("torchcodec") is not None +TORCHVISION_AVAILABLE = importlib.util.find_spec("torchvision") is not None +PDFPLUMBER_AVAILABLE = importlib.util.find_spec("pdfplumber") is not None +NIBABEL_AVAILABLE = importlib.util.find_spec("nibabel") is not None +TRIMESH_AVAILABLE = importlib.util.find_spec("trimesh") is not None +TEICH_AVAILABLE = importlib.util.find_spec("teich") is not None + +# Optional compression tools +RARFILE_AVAILABLE = importlib.util.find_spec("rarfile") is not None +ZSTANDARD_AVAILABLE = importlib.util.find_spec("zstandard") is not None +LZ4_AVAILABLE = importlib.util.find_spec("lz4") is not None +PY7ZR_AVAILABLE = importlib.util.find_spec("py7zr") is not None + +# Cache location +DEFAULT_XDG_CACHE_HOME = "~/.cache" +XDG_CACHE_HOME = os.getenv("XDG_CACHE_HOME", DEFAULT_XDG_CACHE_HOME) +DEFAULT_HF_CACHE_HOME = os.path.join(XDG_CACHE_HOME, "huggingface") +HF_CACHE_HOME = os.path.expanduser(os.getenv("HF_HOME", DEFAULT_HF_CACHE_HOME)) + +DEFAULT_HF_DATASETS_CACHE = os.path.join(HF_CACHE_HOME, "datasets") +HF_DATASETS_CACHE = Path(os.getenv("HF_DATASETS_CACHE", DEFAULT_HF_DATASETS_CACHE)) + +DEFAULT_HF_MODULES_CACHE = os.path.join(HF_CACHE_HOME, "modules") +HF_MODULES_CACHE = Path(os.getenv("HF_MODULES_CACHE", DEFAULT_HF_MODULES_CACHE)) + +DOWNLOADED_DATASETS_DIR = "downloads" +DEFAULT_DOWNLOADED_DATASETS_PATH = os.path.join(HF_DATASETS_CACHE, DOWNLOADED_DATASETS_DIR) +DOWNLOADED_DATASETS_PATH = Path(os.getenv("HF_DATASETS_DOWNLOADED_DATASETS_PATH", DEFAULT_DOWNLOADED_DATASETS_PATH)) + +EXTRACTED_DATASETS_DIR = "extracted" +DEFAULT_EXTRACTED_DATASETS_PATH = os.path.join(DEFAULT_DOWNLOADED_DATASETS_PATH, EXTRACTED_DATASETS_DIR) +EXTRACTED_DATASETS_PATH = Path(os.getenv("HF_DATASETS_EXTRACTED_DATASETS_PATH", DEFAULT_EXTRACTED_DATASETS_PATH)) + +# Cached dataset info options +SAVE_ORIGINAL_SHARD_LENGTHS = False + +# Download count for the website +HF_UPDATE_DOWNLOAD_COUNTS = ( + os.environ.get("HF_UPDATE_DOWNLOAD_COUNTS", "AUTO").upper() in ENV_VARS_TRUE_AND_AUTO_VALUES +) + +# For downloads and to check remote files metadata +HF_DATASETS_MULTITHREADING_MAX_WORKERS = 16 + +# Dataset viewer API +USE_PARQUET_EXPORT = True + +# Batch size constants. For more info, see: +# https://github.com/apache/arrow/blob/master/docs/source/cpp/arrays.rst#size-limitations-and-recommendations) +DEFAULT_MAX_BATCH_SIZE = 1000 + +DEFAULT_CDC_OPTIONS = {"min_chunk_size": 256 * 1024, "max_chunk_size": 1024 * 1024, "norm_level": 0} + +# Size of the preloaded record batch in `Dataset.__iter__` +ARROW_READER_BATCH_SIZE_IN_DATASET_ITER = 10 + +# Max uncompressed shard size in bytes (e.g. to shard parquet datasets in push_to_hub or download_and_prepare) +MAX_SHARD_SIZE = "500MB" + +# Max uncompressed row group size in bytes (e.g. for parquet files in push_to_hub or download_and_prepare) +MAX_ROW_GROUP_SIZE = "100MB" + +# Parquet configuration +PARQUET_ROW_GROUP_SIZE_FOR_AUDIO_DATASETS = None +PARQUET_ROW_GROUP_SIZE_FOR_IMAGE_DATASETS = None +PARQUET_ROW_GROUP_SIZE_FOR_BINARY_DATASETS = None +PARQUET_ROW_GROUP_SIZE_FOR_VIDEO_DATASETS = None + +# Arrow configuration +ARROW_RECORD_BATCH_SIZE_FOR_AUDIO_DATASETS = 100 +ARROW_RECORD_BATCH_SIZE_FOR_IMAGE_DATASETS = 100 +ARROW_RECORD_BATCH_SIZE_FOR_BINARY_DATASETS = 100 +ARROW_RECORD_BATCH_SIZE_FOR_VIDEO_DATASETS = 10 + +# Offline mode +_offline = os.environ.get("HF_DATASETS_OFFLINE") +HF_HUB_OFFLINE = constants.HF_HUB_OFFLINE if _offline is None else _offline.upper() in ENV_VARS_TRUE_VALUES +HF_DATASETS_OFFLINE = HF_HUB_OFFLINE # kept for backward-compatibility + +# Here, `True` will disable progress bars globally without possibility of enabling it +# programmatically. `False` will enable them without possibility of disabling them. +# If environment variable is not set (None), then the user is free to enable/disable +# them programmatically. +# TL;DR: env variable has priority over code +__HF_DATASETS_DISABLE_PROGRESS_BARS = os.environ.get("HF_DATASETS_DISABLE_PROGRESS_BARS") +HF_DATASETS_DISABLE_PROGRESS_BARS: Optional[bool] = ( + __HF_DATASETS_DISABLE_PROGRESS_BARS.upper() in ENV_VARS_TRUE_VALUES + if __HF_DATASETS_DISABLE_PROGRESS_BARS is not None + else None +) + +# In-memory +DEFAULT_IN_MEMORY_MAX_SIZE = 0 # Disabled +IN_MEMORY_MAX_SIZE = float(os.environ.get("HF_DATASETS_IN_MEMORY_MAX_SIZE", DEFAULT_IN_MEMORY_MAX_SIZE)) + +# File names +DATASET_ARROW_FILENAME = "dataset.arrow" +DATASET_INDICES_FILENAME = "indices.arrow" +DATASET_STATE_JSON_FILENAME = "state.json" +DATASET_INFO_FILENAME = "dataset_info.json" +DATASETDICT_INFOS_FILENAME = "dataset_infos.json" +LICENSE_FILENAME = "LICENSE" +DATASETDICT_JSON_FILENAME = "dataset_dict.json" +METADATA_CONFIGS_FIELD = "configs" +REPOCARD_FILENAME = "README.md" +REPOYAML_FILENAME = ".huggingface.yaml" + +MODULE_NAME_FOR_DYNAMIC_MODULES = "datasets_modules" + +MAX_DATASET_CONFIG_ID_READABLE_LENGTH = 255 + +# Temporary cache directory prefix +TEMP_CACHE_DIR_PREFIX = "hf_datasets-" + +# Streaming +STREAMING_READ_MAX_RETRIES = 20 +STREAMING_READ_RETRY_INTERVAL = 5 +STREAMING_READ_SERVER_UNAVAILABLE_RETRY_INTERVAL = 20 +STREAMING_READ_RATE_LIMIT_RETRY_INTERVAL = 60 +STREAMING_OPEN_MAX_RETRIES = 20 +STREAMING_OPEN_RETRY_INTERVAL = 5 + +# Datasets repositories exploration +ARCHIVES_MAX_NUMBER_FOR_MODULE_INFERENCE = 10 + +# Async map functions +MAX_NUM_RUNNING_ASYNC_MAP_FUNCTIONS_IN_PARALLEL = 1000 + +# Progress bars +PBAR_REFRESH_TIME_INTERVAL = 0.05 # 20 progress updates per sec + +# Maximum number of uploaded files per commit +UPLOADS_MAX_NUMBER_PER_COMMIT = 50 + +# Backward compatibility +MAX_TABLE_NBYTES_FOR_PICKLING = 4 << 30 + +# Time to let PyArrow close threads gracefully +SLEEP_TIME_ON_THREADS_SHUTDOWN = 5 diff --git a/src/datasets/data_files.py b/src/datasets/data_files.py new file mode 100644 index 0000000..3e63c3a --- /dev/null +++ b/src/datasets/data_files.py @@ -0,0 +1,829 @@ +import os +import re +from functools import partial +from glob import has_magic +from pathlib import Path, PurePath +from typing import Callable, Optional, Union + +import huggingface_hub +from fsspec.core import url_to_fs +from huggingface_hub import HfFileSystem +from packaging import version +from tqdm.contrib.concurrent import thread_map + +from . import config +from .download import DownloadConfig +from .naming import _split_re +from .splits import Split +from .utils import logging +from .utils import tqdm as hf_tqdm +from .utils.file_utils import _prepare_path_and_storage_options, is_local_path, is_relative_path, xbasename, xjoin +from .utils.py_utils import string_to_dict + + +SingleOriginMetadata = Union[tuple[str, str], tuple[str], tuple[()]] + + +SANITIZED_DEFAULT_SPLIT = str(Split.TRAIN) + + +logger = logging.get_logger(__name__) + + +class Url(str): + pass + + +class EmptyDatasetError(FileNotFoundError): + pass + + +SPLIT_PATTERN_SHARDED = "data/{split}-[0-9][0-9][0-9][0-9][0-9]-of-[0-9][0-9][0-9][0-9][0-9]*.*" + +SPLIT_KEYWORDS = { + Split.TRAIN: ["train", "training"], + Split.VALIDATION: ["validation", "valid", "dev", "val"], + Split.TEST: ["test", "testing", "eval", "evaluation"], +} +NON_WORDS_CHARS = "-._ 0-9" +if config.FSSPEC_VERSION < version.parse("2023.9.0"): + KEYWORDS_IN_FILENAME_BASE_PATTERNS = ["**[{sep}/]{keyword}[{sep}]*", "{keyword}[{sep}]*"] + KEYWORDS_IN_DIR_NAME_BASE_PATTERNS = [ + "{keyword}/**", + "{keyword}[{sep}]*/**", + "**[{sep}/]{keyword}/**", + "**[{sep}/]{keyword}[{sep}]*/**", + ] +elif config.FSSPEC_VERSION < version.parse("2023.12.0"): + KEYWORDS_IN_FILENAME_BASE_PATTERNS = ["**/*[{sep}/]{keyword}[{sep}]*", "{keyword}[{sep}]*"] + KEYWORDS_IN_DIR_NAME_BASE_PATTERNS = [ + "{keyword}/**/*", + "{keyword}[{sep}]*/**/*", + "**/*[{sep}/]{keyword}/**/*", + "**/*[{sep}/]{keyword}[{sep}]*/**/*", + ] +else: + KEYWORDS_IN_FILENAME_BASE_PATTERNS = ["**/{keyword}[{sep}]*", "**/*[{sep}]{keyword}[{sep}]*"] + KEYWORDS_IN_DIR_NAME_BASE_PATTERNS = [ + "**/{keyword}/**", + "**/{keyword}[{sep}]*/**", + "**/*[{sep}]{keyword}/**", + "**/*[{sep}]{keyword}[{sep}]*/**", + ] + +DEFAULT_SPLITS = [Split.TRAIN, Split.VALIDATION, Split.TEST] +DEFAULT_PATTERNS_SPLIT_IN_FILENAME = { + split: [ + pattern.format(keyword=keyword, sep=NON_WORDS_CHARS) + for keyword in SPLIT_KEYWORDS[split] + for pattern in KEYWORDS_IN_FILENAME_BASE_PATTERNS + ] + for split in DEFAULT_SPLITS +} +DEFAULT_PATTERNS_SPLIT_IN_DIR_NAME = { + split: [ + pattern.format(keyword=keyword, sep=NON_WORDS_CHARS) + for keyword in SPLIT_KEYWORDS[split] + for pattern in KEYWORDS_IN_DIR_NAME_BASE_PATTERNS + ] + for split in DEFAULT_SPLITS +} + + +DEFAULT_PATTERNS_ALL = { + Split.TRAIN: ["**"], +} + +DEFAULT_PATTERNS_LOGS = {"logs": ["**/*.eval"]} + +ALL_SPLIT_PATTERNS = [SPLIT_PATTERN_SHARDED] +ALL_DEFAULT_PATTERNS = [ + DEFAULT_PATTERNS_LOGS, + DEFAULT_PATTERNS_SPLIT_IN_DIR_NAME, + DEFAULT_PATTERNS_SPLIT_IN_FILENAME, + DEFAULT_PATTERNS_ALL, +] +WILDCARD_CHARACTERS = "*[]" +FILES_TO_IGNORE = [ + "README.md", + "config.json", + "dataset_info.json", + "dataset_infos.json", + "dummy_data.zip", + "dataset_dict.json", +] + + +def contains_wildcards(pattern: str) -> bool: + return any(wildcard_character in pattern for wildcard_character in WILDCARD_CHARACTERS) + + +def sanitize_patterns(patterns: Union[dict, list, str]) -> dict[str, Union[list[str], "DataFilesList"]]: + """ + Take the data_files patterns from the user, and format them into a dictionary. + Each key is the name of the split, and each value is a list of data files patterns (paths or urls). + The default split is "train". + + Returns: + patterns: dictionary of split_name -> list of patterns + """ + if isinstance(patterns, dict): + return {str(key): value if isinstance(value, list) else [value] for key, value in patterns.items()} + elif isinstance(patterns, str): + return {SANITIZED_DEFAULT_SPLIT: [patterns]} + elif isinstance(patterns, list): + if any(isinstance(pattern, dict) for pattern in patterns): + for pattern in patterns: + if not ( + isinstance(pattern, dict) + and len(pattern) == 2 + and "split" in pattern + and isinstance(pattern.get("path"), (str, list)) + ): + raise ValueError( + "Invalid format for data_files entry. " + "Each item must be a dictionary with the structure " + "{'split': , 'path': }.\n" + f"Received: {pattern}" + ) + splits = [pattern["split"] for pattern in patterns] + if len(set(splits)) != len(splits): + raise ValueError(f"Some splits are duplicated in data_files: {splits}") + return { + str(pattern["split"]): pattern["path"] if isinstance(pattern["path"], list) else [pattern["path"]] + for pattern in patterns + } + else: + return {SANITIZED_DEFAULT_SPLIT: patterns} + else: + return sanitize_patterns(list(patterns)) + + +def _is_inside_unrequested_special_dir(matched_rel_path: str, pattern: str) -> bool: + """ + When a path matches a pattern, we additionally check if it's inside a special directory + we ignore by default (if it starts with a double underscore). + + Users can still explicitly request a filepath inside such a directory if "__pycache__" is + mentioned explicitly in the requested pattern. + + Some examples: + + base directory: + + ./ + └── __pycache__ + └── b.txt + + >>> _is_inside_unrequested_special_dir("__pycache__/b.txt", "**") + True + >>> _is_inside_unrequested_special_dir("__pycache__/b.txt", "*/b.txt") + True + >>> _is_inside_unrequested_special_dir("__pycache__/b.txt", "__pycache__/*") + False + >>> _is_inside_unrequested_special_dir("__pycache__/b.txt", "__*/*") + False + """ + # We just need to check if every special directories from the path is present explicitly in the pattern. + # Since we assume that the path matches the pattern, it's equivalent to counting that both + # the parent path and the parent pattern have the same number of special directories. + data_dirs_to_ignore_in_path = [part for part in PurePath(matched_rel_path).parent.parts if part.startswith("__")] + data_dirs_to_ignore_in_pattern = [part for part in PurePath(pattern).parent.parts if part.startswith("__")] + return len(data_dirs_to_ignore_in_path) != len(data_dirs_to_ignore_in_pattern) + + +def _is_unrequested_hidden_file_or_is_inside_unrequested_hidden_dir(matched_rel_path: str, pattern: str) -> bool: + """ + When a path matches a pattern, we additionally check if it's a hidden file or if it's inside + a hidden directory we ignore by default, i.e. if the file name or a parent directory name starts with a dot. + + Users can still explicitly request a filepath that is hidden or is inside a hidden directory + if the hidden part is mentioned explicitly in the requested pattern. + + Some examples: + + base directory: + + ./ + └── .hidden_file.txt + + >>> _is_unrequested_hidden_file_or_is_inside_unrequested_hidden_dir(".hidden_file.txt", "**") + True + >>> _is_unrequested_hidden_file_or_is_inside_unrequested_hidden_dir(".hidden_file.txt", ".*") + False + + base directory: + + ./ + └── .hidden_dir + └── a.txt + + >>> _is_unrequested_hidden_file_or_is_inside_unrequested_hidden_dir(".hidden_dir/a.txt", "**") + True + >>> _is_unrequested_hidden_file_or_is_inside_unrequested_hidden_dir(".hidden_dir/a.txt", ".*/*") + False + >>> _is_unrequested_hidden_file_or_is_inside_unrequested_hidden_dir(".hidden_dir/a.txt", ".hidden_dir/*") + False + + base directory: + + ./ + └── .hidden_dir + └── .hidden_file.txt + + >>> _is_unrequested_hidden_file_or_is_inside_unrequested_hidden_dir(".hidden_dir/.hidden_file.txt", "**") + True + >>> _is_unrequested_hidden_file_or_is_inside_unrequested_hidden_dir(".hidden_dir/.hidden_file.txt", ".*/*") + True + >>> _is_unrequested_hidden_file_or_is_inside_unrequested_hidden_dir(".hidden_dir/.hidden_file.txt", ".*/.*") + False + >>> _is_unrequested_hidden_file_or_is_inside_unrequested_hidden_dir(".hidden_dir/.hidden_file.txt", ".hidden_dir/*") + True + >>> _is_unrequested_hidden_file_or_is_inside_unrequested_hidden_dir(".hidden_dir/.hidden_file.txt", ".hidden_dir/.*") + False + """ + # We just need to check if every hidden part from the path is present explicitly in the pattern. + # Since we assume that the path matches the pattern, it's equivalent to counting that both + # the path and the pattern have the same number of hidden parts. + hidden_directories_in_path = [ + part for part in PurePath(matched_rel_path).parts if part.startswith(".") and not set(part) == {"."} + ] + hidden_directories_in_pattern = [ + part for part in PurePath(pattern).parts if part.startswith(".") and not set(part) == {"."} + ] + return len(hidden_directories_in_path) != len(hidden_directories_in_pattern) + + +def _get_data_files_patterns(pattern_resolver: Callable[[str], list[str]]) -> dict[str, list[str]]: + """ + Get the default pattern from a directory or repository by testing all the supported patterns. + The first patterns to return a non-empty list of data files is returned. + + In order, it first tests if SPLIT_PATTERN_SHARDED works, otherwise it tests the patterns in ALL_DEFAULT_PATTERNS. + """ + # first check the split patterns like data/{split}-00000-of-00001.parquet + for split_pattern in ALL_SPLIT_PATTERNS: + pattern = split_pattern.replace("{split}", "*") + try: + data_files = pattern_resolver(pattern) + except FileNotFoundError: + continue + if len(data_files) > 0: + splits: set[str] = set() + for p in data_files: + p_parts = string_to_dict(xbasename(p), xbasename(split_pattern)) + assert p_parts is not None + splits.add(p_parts["split"]) + + if any(not re.match(_split_re, split) for split in splits): + raise ValueError(f"Split name should match '{_split_re}'' but got '{splits}'.") + sorted_splits = [str(split) for split in DEFAULT_SPLITS if split in splits] + sorted( + splits - {str(split) for split in DEFAULT_SPLITS} + ) + return {split: [split_pattern.format(split=split)] for split in sorted_splits} + # then check the default patterns based on train/valid/test splits + for patterns_dict in ALL_DEFAULT_PATTERNS: + non_empty_splits = [] + for split, patterns in patterns_dict.items(): + for pattern in patterns: + try: + data_files = pattern_resolver(pattern) + except FileNotFoundError: + continue + if len(data_files) > 0: + non_empty_splits.append(split) + break + if non_empty_splits: + return {split: patterns_dict[split] for split in non_empty_splits} + raise FileNotFoundError(f"Couldn't resolve pattern {pattern} with resolver {pattern_resolver}") + + +def resolve_pattern( + pattern: str, + base_path: str, + allowed_extensions: Optional[list[str]] = None, + download_config: Optional[DownloadConfig] = None, +) -> list[str]: + """ + Resolve the paths and URLs of the data files from the pattern passed by the user. + + You can use patterns to resolve multiple local files. Here are a few examples: + - *.csv to match all the CSV files at the first level + - **.csv to match all the CSV files at any level + - data/* to match all the files inside "data" + - data/** to match all the files inside "data" and its subdirectories + + The patterns are resolved using the fsspec glob. In fsspec>=2023.12.0 this is equivalent to + Python's glob.glob, Path.glob, Path.match and fnmatch where ** is unsupported with a prefix/suffix + other than a forward slash /. + + More generally: + - '*' matches any character except a forward-slash (to match just the file or directory name) + - '**' matches any character including a forward-slash / + + Hidden files and directories (i.e. whose names start with a dot) are ignored, unless they are explicitly requested. + The same applies to special directories that start with a double underscore like "__pycache__". + You can still include one if the pattern explicitly mentions it: + - to include a hidden file: "*/.hidden.txt" or "*/.*" + - to include a hidden directory: ".hidden/*" or ".*/*" + - to include a special directory: "__special__/*" or "__*/*" + + Example:: + + >>> from datasets.data_files import resolve_pattern + >>> base_path = "." + >>> resolve_pattern("docs/**/*.py", base_path) + [/Users/mariosasko/Desktop/projects/datasets/docs/source/_config.py'] + + Args: + pattern (str): Unix pattern or paths or URLs of the data files to resolve. + The paths can be absolute or relative to base_path. + Remote filesystems using fsspec are supported, e.g. with the hf:// protocol. + base_path (str): Base path to use when resolving relative paths. + allowed_extensions (Optional[list], optional): White-list of file extensions to use. Defaults to None (all extensions). + For example: allowed_extensions=[".csv", ".json", ".txt", ".parquet"] + download_config ([`DownloadConfig`], *optional*): Specific download configuration parameters. + Returns: + List[str]: List of paths or URLs to the local or remote files that match the patterns. + """ + if is_relative_path(pattern): + pattern = xjoin(base_path, pattern) + elif is_local_path(pattern): + base_path = os.path.splitdrive(pattern)[0] + os.sep + else: + base_path = "" + pattern, storage_options = _prepare_path_and_storage_options(pattern, download_config=download_config) + fs, fs_pattern = url_to_fs(pattern, **storage_options) + files_to_ignore = set(FILES_TO_IGNORE) - {xbasename(pattern)} + protocol = ( + pattern.split("://")[0] + if "://" in pattern + else (fs.protocol if isinstance(fs.protocol, str) else fs.protocol[0]) + ) + protocol_prefix = protocol + "://" if protocol != "file" else "" + glob_kwargs = {} + if protocol == "hf": + # 10 times faster glob with detail=True (ignores costly info like lastCommit) + glob_kwargs["expand_info"] = False + + # if the pattern contains hops like "zip://csv/*.csv::data.zip", we need to keep them after globbing + _, *rest_hops = pattern.split("::") + matched_paths = [] + for filepath, info in fs.glob(fs_pattern, detail=True, **glob_kwargs).items(): + if not (info["type"] == "file" or (info.get("islink") and os.path.isfile(os.path.realpath(filepath)))) or ( + xbasename(filepath) in files_to_ignore + ): + continue + if _is_inside_unrequested_special_dir(filepath, fs_pattern): + continue + if _is_unrequested_hidden_file_or_is_inside_unrequested_hidden_dir(filepath, fs_pattern): + continue + filepath = filepath if "://" in filepath else protocol_prefix + filepath + if rest_hops: + filepath = "::".join([filepath] + rest_hops) + matched_paths.append(filepath) + # ignore .ipynb and __pycache__, but keep /../ + if allowed_extensions is not None: + out = [ + filepath + for filepath in matched_paths + if any("." + suffix in allowed_extensions for suffix in xbasename(filepath).split(".")[1:]) + ] + if len(out) < len(matched_paths): + invalid_matched_files = list(set(matched_paths) - set(out)) + logger.info( + f"Some files matched the pattern '{pattern}' but don't have valid data file extensions: {invalid_matched_files}" + ) + else: + out = matched_paths + if not out: + error_msg = f"Unable to find '{pattern}'" + if allowed_extensions is not None: + error_msg += f" with any supported extension {list(allowed_extensions)}" + raise FileNotFoundError(error_msg) + return out + + +def get_data_patterns(base_path: str, download_config: Optional[DownloadConfig] = None) -> dict[str, list[str]]: + """ + Get the default pattern from a directory testing all the supported patterns. + The first patterns to return a non-empty list of data files is returned. + + Some examples of supported patterns: + + Input: + + my_dataset_repository/ + ├── README.md + └── dataset.csv + + Output: + + {'train': ['**']} + + Input: + + my_dataset_repository/ + ├── README.md + ├── train.csv + └── test.csv + + my_dataset_repository/ + ├── README.md + └── data/ + ├── train.csv + └── test.csv + + my_dataset_repository/ + ├── README.md + ├── train_0.csv + ├── train_1.csv + ├── train_2.csv + ├── train_3.csv + ├── test_0.csv + └── test_1.csv + + Output: + + {'train': ['**/train[-._ 0-9]*', '**/*[-._ 0-9]train[-._ 0-9]*', '**/training[-._ 0-9]*', '**/*[-._ 0-9]training[-._ 0-9]*'], + 'test': ['**/test[-._ 0-9]*', '**/*[-._ 0-9]test[-._ 0-9]*', '**/testing[-._ 0-9]*', '**/*[-._ 0-9]testing[-._ 0-9]*', ...]} + + Input: + + my_dataset_repository/ + ├── README.md + └── data/ + ├── train/ + │ ├── shard_0.csv + │ ├── shard_1.csv + │ ├── shard_2.csv + │ └── shard_3.csv + └── test/ + ├── shard_0.csv + └── shard_1.csv + + Output: + + {'train': ['**/train/**', '**/train[-._ 0-9]*/**', '**/*[-._ 0-9]train/**', '**/*[-._ 0-9]train[-._ 0-9]*/**', ...], + 'test': ['**/test/**', '**/test[-._ 0-9]*/**', '**/*[-._ 0-9]test/**', '**/*[-._ 0-9]test[-._ 0-9]*/**', ...]} + + Input: + + my_dataset_repository/ + ├── README.md + └── data/ + ├── train-00000-of-00003.csv + ├── train-00001-of-00003.csv + ├── train-00002-of-00003.csv + ├── test-00000-of-00001.csv + ├── random-00000-of-00003.csv + ├── random-00001-of-00003.csv + └── random-00002-of-00003.csv + + Output: + + {'train': ['data/train-[0-9][0-9][0-9][0-9][0-9]-of-[0-9][0-9][0-9][0-9][0-9]*.*'], + 'test': ['data/test-[0-9][0-9][0-9][0-9][0-9]-of-[0-9][0-9][0-9][0-9][0-9]*.*'], + 'random': ['data/random-[0-9][0-9][0-9][0-9][0-9]-of-[0-9][0-9][0-9][0-9][0-9]*.*']} + + In order, it first tests if SPLIT_PATTERN_SHARDED works, otherwise it tests the patterns in ALL_DEFAULT_PATTERNS. + """ + resolver = partial(resolve_pattern, base_path=base_path, download_config=download_config) + try: + return _get_data_files_patterns(resolver) + except FileNotFoundError: + raise EmptyDatasetError(f"The directory at {base_path} doesn't contain any data files") from None + + +def _get_single_origin_metadata( + data_file: str, + download_config: Optional[DownloadConfig] = None, +) -> SingleOriginMetadata: + if data_file.startswith(config.HF_ENDPOINT): + fs = HfFileSystem(endpoint=config.HF_ENDPOINT, token=download_config.token) + data_file = "hf://" + data_file[len(config.HF_ENDPOINT) + 1 :] + data_file = data_file.replace("/resolve/", "/" if data_file.startswith("hf://buckets/") else "@", 1) + fs_path = data_file + else: + data_file, storage_options = _prepare_path_and_storage_options(data_file, download_config=download_config) + fs, fs_path = url_to_fs(data_file, **storage_options) + if isinstance(fs, HfFileSystem): + resolved_path = fs.resolve_path(fs_path) + if hasattr(resolved_path, "revision"): # no revision for buckets + return resolved_path.repo_id, resolved_path.revision + info = fs.info(fs_path) + # s3fs uses "ETag", gcsfs uses "etag", and for local we simply check mtime + for key in ["ETag", "etag", "mtime"]: + if key in info: + return (str(info[key]),) + return () + + +def _get_origin_metadata( + data_files: list[str], + download_config: Optional[DownloadConfig] = None, + max_workers: Optional[int] = None, +) -> list[SingleOriginMetadata]: + max_workers = max_workers if max_workers is not None else config.HF_DATASETS_MULTITHREADING_MAX_WORKERS + if all("hf://" in data_file for data_file in data_files): + # No need for multithreading here since the origin metadata of HF files + # is (repo_id, revision) and is cached after first .info() call. + return [ + _get_single_origin_metadata(data_file, download_config=download_config) + for data_file in hf_tqdm( + data_files, + desc="Resolving data files", + # set `disable=None` rather than `disable=False` by default to disable progress bar when no TTY attached + disable=len(data_files) <= 16 or None, + ) + ] + return thread_map( + partial(_get_single_origin_metadata, download_config=download_config), + data_files, + max_workers=max_workers, + tqdm_class=hf_tqdm, + desc="Resolving data files", + # set `disable=None` rather than `disable=False` by default to disable progress bar when no TTY attached + disable=len(data_files) <= 16 or None, + ) + + +class DataFilesList(list[str]): + """ + List of data files (absolute local paths or URLs). + It has two construction methods given the user's data files patterns: + - ``from_hf_repo``: resolve patterns inside a dataset repository + - ``from_local_or_remote``: resolve patterns from a local path + + Moreover, DataFilesList has an additional attribute ``origin_metadata``. + It can store: + - the last modified time of local files + - ETag of remote files + - commit sha of a dataset repository + + Thanks to this additional attribute, it is possible to hash the list + and get a different hash if and only if at least one file changed. + This is useful for caching Dataset objects that are obtained from a list of data files. + """ + + def __init__(self, data_files: list[str], origin_metadata: list[SingleOriginMetadata]) -> None: + super().__init__(data_files) + self.origin_metadata = origin_metadata + + def __add__(self, other: "DataFilesList") -> "DataFilesList": + return DataFilesList([*self, *other], self.origin_metadata + other.origin_metadata) + + @classmethod + def from_hf_repo( + cls, + patterns: list[str], + dataset_info: huggingface_hub.hf_api.DatasetInfo, + base_path: Optional[str] = None, + allowed_extensions: Optional[list[str]] = None, + download_config: Optional[DownloadConfig] = None, + ) -> "DataFilesList": + base_path = f"hf://datasets/{dataset_info.id}@{dataset_info.sha}/{base_path or ''}".rstrip("/") + return cls.from_patterns( + patterns, base_path=base_path, allowed_extensions=allowed_extensions, download_config=download_config + ) + + @classmethod + def from_local_or_remote( + cls, + patterns: list[str], + base_path: Optional[str] = None, + allowed_extensions: Optional[list[str]] = None, + download_config: Optional[DownloadConfig] = None, + ) -> "DataFilesList": + base_path = base_path if base_path is not None else Path().resolve().as_posix() + return cls.from_patterns( + patterns, base_path=base_path, allowed_extensions=allowed_extensions, download_config=download_config + ) + + @classmethod + def from_patterns( + cls, + patterns: list[str], + base_path: Optional[str] = None, + allowed_extensions: Optional[list[str]] = None, + download_config: Optional[DownloadConfig] = None, + ) -> "DataFilesList": + base_path = base_path if base_path is not None else Path().resolve().as_posix() + data_files = [] + for pattern in patterns: + try: + data_files.extend( + resolve_pattern( + pattern, + base_path=base_path, + allowed_extensions=allowed_extensions, + download_config=download_config, + ) + ) + except FileNotFoundError: + if not has_magic(pattern): + raise + origin_metadata = _get_origin_metadata(data_files, download_config=download_config) + return cls(data_files, origin_metadata) + + def filter( + self, *, extensions: Optional[list[str]] = None, file_names: Optional[list[str]] = None + ) -> "DataFilesList": + patterns = [] + if extensions: + ext_pattern = "|".join(re.escape(ext) for ext in extensions) + patterns.append(re.compile(f".*({ext_pattern})(\\..+)?$")) + if file_names: + fn_pattern = "|".join(re.escape(fn) for fn in file_names) + patterns.append(re.compile(rf".*[\/]?({fn_pattern})$")) + if patterns: + return DataFilesList( + [data_file for data_file in self if any(pattern.match(data_file) for pattern in patterns)], + origin_metadata=self.origin_metadata, + ) + else: + return DataFilesList(list(self), origin_metadata=self.origin_metadata) + + +class DataFilesDict(dict[str, DataFilesList]): + """ + Dict of split_name -> list of data files (absolute local paths or URLs). + It has two construction methods given the user's data files patterns : + - ``from_hf_repo``: resolve patterns inside a dataset repository + - ``from_local_or_remote``: resolve patterns from a local path + + Moreover, each list is a DataFilesList. It is possible to hash the dictionary + and get a different hash if and only if at least one file changed. + For more info, see [`DataFilesList`]. + + This is useful for caching Dataset objects that are obtained from a list of data files. + + Changing the order of the keys of this dictionary also doesn't change its hash. + """ + + @classmethod + def from_local_or_remote( + cls, + patterns: dict[str, Union[list[str], DataFilesList]], + base_path: Optional[str] = None, + allowed_extensions: Optional[list[str]] = None, + download_config: Optional[DownloadConfig] = None, + ) -> "DataFilesDict": + out = cls() + for key, patterns_for_key in patterns.items(): + out[key] = ( + patterns_for_key + if isinstance(patterns_for_key, DataFilesList) + else DataFilesList.from_local_or_remote( + patterns_for_key, + base_path=base_path, + allowed_extensions=allowed_extensions, + download_config=download_config, + ) + ) + return out + + @classmethod + def from_hf_repo( + cls, + patterns: dict[str, Union[list[str], DataFilesList]], + dataset_info: huggingface_hub.hf_api.DatasetInfo, + base_path: Optional[str] = None, + allowed_extensions: Optional[list[str]] = None, + download_config: Optional[DownloadConfig] = None, + ) -> "DataFilesDict": + out = cls() + for key, patterns_for_key in patterns.items(): + out[key] = ( + patterns_for_key + if isinstance(patterns_for_key, DataFilesList) + else DataFilesList.from_hf_repo( + patterns_for_key, + dataset_info=dataset_info, + base_path=base_path, + allowed_extensions=allowed_extensions, + download_config=download_config, + ) + ) + return out + + @classmethod + def from_patterns( + cls, + patterns: dict[str, Union[list[str], DataFilesList]], + base_path: Optional[str] = None, + allowed_extensions: Optional[list[str]] = None, + download_config: Optional[DownloadConfig] = None, + ) -> "DataFilesDict": + out = cls() + for key, patterns_for_key in patterns.items(): + out[key] = ( + patterns_for_key + if isinstance(patterns_for_key, DataFilesList) + else DataFilesList.from_patterns( + patterns_for_key, + base_path=base_path, + allowed_extensions=allowed_extensions, + download_config=download_config, + ) + ) + return out + + def filter( + self, *, extensions: Optional[list[str]] = None, file_names: Optional[list[str]] = None + ) -> "DataFilesDict": + out = type(self)() + for key, data_files_list in self.items(): + out[key] = data_files_list.filter(extensions=extensions, file_names=file_names) + return out + + +class DataFilesPatternsList(list[str]): + """ + List of data files patterns (absolute local paths or URLs). + For each pattern there should also be a list of allowed extensions + to keep, or a None ot keep all the files for the pattern. + """ + + def __init__( + self, + patterns: list[str], + allowed_extensions: list[Optional[list[str]]], + ): + super().__init__(patterns) + self.allowed_extensions = allowed_extensions + + def __add__(self, other): + return DataFilesList([*self, *other], self.allowed_extensions + other.allowed_extensions) + + @classmethod + def from_patterns( + cls, patterns: list[str], allowed_extensions: Optional[list[str]] = None + ) -> "DataFilesPatternsList": + return cls(patterns, [allowed_extensions] * len(patterns)) + + def resolve( + self, + base_path: str, + download_config: Optional[DownloadConfig] = None, + ) -> "DataFilesList": + base_path = base_path if base_path is not None else Path().resolve().as_posix() + data_files = [] + for pattern, allowed_extensions in zip(self, self.allowed_extensions): + try: + data_files.extend( + resolve_pattern( + pattern, + base_path=base_path, + allowed_extensions=allowed_extensions, + download_config=download_config, + ) + ) + except FileNotFoundError: + if not has_magic(pattern): + raise + origin_metadata = _get_origin_metadata(data_files, download_config=download_config) + return DataFilesList(data_files, origin_metadata) + + def filter_extensions(self, extensions: list[str]) -> "DataFilesPatternsList": + return DataFilesPatternsList( + self, [allowed_extensions + extensions for allowed_extensions in self.allowed_extensions] + ) + + +class DataFilesPatternsDict(dict[str, DataFilesPatternsList]): + """ + Dict of split_name -> list of data files patterns (absolute local paths or URLs). + """ + + @classmethod + def from_patterns( + cls, patterns: dict[str, list[str]], allowed_extensions: Optional[list[str]] = None + ) -> "DataFilesPatternsDict": + out = cls() + for key, patterns_for_key in patterns.items(): + out[key] = ( + patterns_for_key + if isinstance(patterns_for_key, DataFilesPatternsList) + else DataFilesPatternsList.from_patterns( + patterns_for_key, + allowed_extensions=allowed_extensions, + ) + ) + return out + + def resolve( + self, + base_path: str, + download_config: Optional[DownloadConfig] = None, + ) -> "DataFilesDict": + out = DataFilesDict() + for key, data_files_patterns_list in self.items(): + out[key] = data_files_patterns_list.resolve(base_path, download_config) + return out + + def filter_extensions(self, extensions: list[str]) -> "DataFilesPatternsDict": + out = type(self)() + for key, data_files_patterns_list in self.items(): + out[key] = data_files_patterns_list.filter_extensions(extensions) + return out diff --git a/src/datasets/dataset_dict.py b/src/datasets/dataset_dict.py new file mode 100644 index 0000000..4abea0a --- /dev/null +++ b/src/datasets/dataset_dict.py @@ -0,0 +1,2774 @@ +import contextlib +import copy +import itertools +import json +import math +import posixpath +import random +import re +import time +from collections.abc import Sequence +from functools import partial +from typing import Callable, Literal, Optional, Union + +import fsspec +import numpy as np +from fsspec.core import url_to_fs +from fsspec.implementations.dirfs import DirFileSystem +from huggingface_hub import ( + CommitInfo, + CommitOperationAdd, + CommitOperationDelete, + HfApi, + HfFileSystem, + HfFileSystemResolvedPath, +) +from huggingface_hub.utils import EntryNotFoundError, HfHubHTTPError, RepositoryNotFoundError +from packaging import version + +from . import __version__, config +from .arrow_dataset import ( + Dataset, + _get_updated_dataset_card, +) +from .features import Features +from .features.features import FeatureType +from .iterable_dataset import IterableDataset +from .naming import _split_re +from .splits import NamedSplit, Split, SplitInfo +from .table import Table +from .utils import logging +from .utils.doc_utils import is_documented_by +from .utils.typing import PathLike + + +if config.HF_HUB_VERSION >= version.parse("1.6.0"): + from huggingface_hub.errors import BucketNotFoundError + from huggingface_hub.hf_file_system import HfFileSystemResolvedBucketPath, HfFileSystemResolvedRepositoryPath + +else: + BucketNotFoundError = None + HfFileSystemResolvedBucketPath = None + HfFileSystemResolvedRepositoryPath = HfFileSystemResolvedPath + + +logger = logging.get_logger(__name__) + + +class bind(partial): + def __call__(self, *fn_args, **fn_kwargs): + return self.func(*fn_args, *self.args, **fn_kwargs) + + +class DatasetDict(dict[Union[str, NamedSplit], "Dataset"]): + """A dictionary (dict of str: datasets.Dataset) with dataset transforms methods (map, filter, etc.)""" + + def _check_values_type(self): + for dataset in self.values(): + if not isinstance(dataset, Dataset): + raise TypeError(f"Values in `DatasetDict` should be of type `Dataset` but got type '{type(dataset)}'") + + def _check_values_features(self): + items = list(self.items()) + for item_a, item_b in zip(items[:-1], items[1:]): + if item_a[1].features != item_b[1].features: + raise ValueError( + f"All datasets in `DatasetDict` should have the same features but features for '{item_a[0]}' and '{item_b[0]}' don't match: {item_a[1].features} != {item_b[1].features}" + ) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + # Here `del` is used to del the pyarrow tables. This properly closes the files used for memory mapped tables + for dataset in self.values(): + if hasattr(dataset, "_data"): + del dataset._data + if hasattr(dataset, "_indices"): + del dataset._indices + + def __getitem__(self, k) -> Dataset: + if isinstance(k, (str, NamedSplit)) or len(self) == 0: + return super().__getitem__(k) + else: + available_suggested_splits = [ + split for split in (Split.TRAIN, Split.TEST, Split.VALIDATION) if split in self + ] + suggested_split = available_suggested_splits[0] if available_suggested_splits else list(self)[0] + raise KeyError( + f"Invalid key: {k}. Please first select a split. For example: " + f"`my_dataset_dictionary['{suggested_split}'][{k}]`. " + f"Available splits: {sorted(self)}" + ) + + @property + def data(self) -> dict[str, Table]: + """The Apache Arrow tables backing each split. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds.data + ``` + """ + self._check_values_type() + return {k: dataset.data for k, dataset in self.items()} + + @property + def cache_files(self) -> dict[str, dict]: + """The cache files containing the Apache Arrow table backing each split. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds.cache_files + {'test': [{'filename': '/root/.cache/huggingface/datasets/rotten_tomatoes_movie_review/default/1.0.0/40d411e45a6ce3484deed7cc15b82a53dad9a72aafd9f86f8f227134bec5ca46/rotten_tomatoes_movie_review-test.arrow'}], + 'train': [{'filename': '/root/.cache/huggingface/datasets/rotten_tomatoes_movie_review/default/1.0.0/40d411e45a6ce3484deed7cc15b82a53dad9a72aafd9f86f8f227134bec5ca46/rotten_tomatoes_movie_review-train.arrow'}], + 'validation': [{'filename': '/root/.cache/huggingface/datasets/rotten_tomatoes_movie_review/default/1.0.0/40d411e45a6ce3484deed7cc15b82a53dad9a72aafd9f86f8f227134bec5ca46/rotten_tomatoes_movie_review-validation.arrow'}]} + ``` + """ + self._check_values_type() + return {k: dataset.cache_files for k, dataset in self.items()} + + @property + def num_columns(self) -> dict[str, int]: + """Number of columns in each split of the dataset. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds.num_columns + {'test': 2, 'train': 2, 'validation': 2} + ``` + """ + self._check_values_type() + return {k: dataset.num_columns for k, dataset in self.items()} + + @property + def num_rows(self) -> dict[str, int]: + """Number of rows in each split of the dataset. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds.num_rows + {'test': 1066, 'train': 8530, 'validation': 1066} + ``` + """ + self._check_values_type() + return {k: dataset.num_rows for k, dataset in self.items()} + + @property + def column_names(self) -> dict[str, list[str]]: + """Names of the columns in each split of the dataset. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds.column_names + {'test': ['text', 'label'], + 'train': ['text', 'label'], + 'validation': ['text', 'label']} + ``` + """ + self._check_values_type() + return {k: dataset.column_names for k, dataset in self.items()} + + @property + def shape(self) -> dict[str, tuple[int]]: + """Shape of each split of the dataset (number of rows, number of columns). + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds.shape + {'test': (1066, 2), 'train': (8530, 2), 'validation': (1066, 2)} + ``` + """ + self._check_values_type() + return {k: dataset.shape for k, dataset in self.items()} + + def flatten(self, max_depth=16) -> "DatasetDict": + """Flatten the Apache Arrow Table of each split (nested features are flatten). + Each column with a struct type is flattened into one column per struct field. + Other columns are left unchanged. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("rajpurkar/squad") + >>> ds["train"].features + {'id': Value('string'), + 'title': Value('string'), + 'context': Value('string'), + 'question': Value('string'), + 'answers.text': List(Value('string')), + 'answers.answer_start': List(Value('int32'))} + >>> ds.flatten() + DatasetDict({ + train: Dataset({ + features: ['id', 'title', 'context', 'question', 'answers.text', 'answers.answer_start'], + num_rows: 87599 + }) + validation: Dataset({ + features: ['id', 'title', 'context', 'question', 'answers.text', 'answers.answer_start'], + num_rows: 10570 + }) + }) + ``` + """ + self._check_values_type() + return DatasetDict({k: dataset.flatten(max_depth=max_depth) for k, dataset in self.items()}) + + def unique(self, column: str) -> dict[str, list]: + """Return a list of the unique elements in a column for each split. + + This is implemented in the low-level backend and as such, very fast. + + Args: + column (`str`): + column name (list all the column names with [`~datasets.DatasetDict.column_names`]) + + Returns: + Dict[`str`, `list`]: Dictionary of unique elements in the given column. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds.unique("label") + {'test': [1, 0], 'train': [1, 0], 'validation': [1, 0]} + ``` + """ + self._check_values_type() + return {k: dataset.unique(column) for k, dataset in self.items()} + + def cleanup_cache_files(self) -> dict[str, int]: + """Clean up all cache files in the dataset cache directory, excepted the currently used cache file if there is one. + Be careful when running this command that no other process is currently using other cache files. + + Return: + `Dict` with the number of removed files for each split + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds.cleanup_cache_files() + {'test': 0, 'train': 0, 'validation': 0} + ``` + """ + self._check_values_type() + return {k: dataset.cleanup_cache_files() for k, dataset in self.items()} + + def __repr__(self): + repr = "\n".join([f"{k}: {v}" for k, v in self.items()]) + repr = re.sub(r"^", " " * 4, repr, count=0, flags=re.M) + return f"DatasetDict({{\n{repr}\n}})" + + def cast(self, features: Features) -> "DatasetDict": + """ + Cast the dataset to a new set of features. + The transformation is applied to all the datasets of the dataset dictionary. + + Args: + features ([`Features`]): + New features to cast the dataset to. + The name and order of the fields in the features must match the current column names. + The type of the data must also be convertible from one type to the other. + For non-trivial conversion, e.g. `string` <-> `ClassLabel` you should use [`~DatasetDict.map`] to update the dataset. + + Example: + + ```py + >>> from datasets import load_dataset, ClassLabel, Value + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds["train"].features + {'label': ClassLabel(names=['neg', 'pos']), + 'text': Value('string')} + >>> new_features = ds["train"].features.copy() + >>> new_features['label'] = ClassLabel(names=['bad', 'good']) + >>> new_features['text'] = Value('large_string') + >>> ds = ds.cast(new_features) + >>> ds["train"].features + {'label': ClassLabel(names=['bad', 'good']), + 'text': Value('large_string')} + ``` + """ + self._check_values_type() + return DatasetDict({k: dataset.cast(features=features) for k, dataset in self.items()}) + + def cast_column(self, column: str, feature) -> "DatasetDict": + """Cast column to feature for decoding. + + Args: + column (`str`): + Column name. + feature ([`Feature`]): + Target feature. + + Returns: + [`DatasetDict`] + + Example: + + ```py + >>> from datasets import load_dataset, ClassLabel + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds["train"].features + {'label': ClassLabel(names=['neg', 'pos']), + 'text': Value('string')} + >>> ds = ds.cast_column('label', ClassLabel(names=['bad', 'good'])) + >>> ds["train"].features + {'label': ClassLabel(names=['bad', 'good']), + 'text': Value('string')} + ``` + """ + self._check_values_type() + return DatasetDict({k: dataset.cast_column(column=column, feature=feature) for k, dataset in self.items()}) + + def remove_columns(self, column_names: Union[str, list[str]]) -> "DatasetDict": + """ + Remove one or several column(s) from each split in the dataset + and the features associated to the column(s). + + The transformation is applied to all the splits of the dataset dictionary. + + You can also remove a column using [`~DatasetDict.map`] with `remove_columns` but the present method + doesn't copy the data of the remaining columns and is thus faster. + + Args: + column_names (`Union[str, list[str]]`): + Name of the column(s) to remove. + + Returns: + [`DatasetDict`]: A copy of the dataset object without the columns to remove. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds = ds.remove_columns("label") + DatasetDict({ + train: Dataset({ + features: ['text'], + num_rows: 8530 + }) + validation: Dataset({ + features: ['text'], + num_rows: 1066 + }) + test: Dataset({ + features: ['text'], + num_rows: 1066 + }) + }) + ``` + """ + self._check_values_type() + return DatasetDict({k: dataset.remove_columns(column_names=column_names) for k, dataset in self.items()}) + + def rename_column(self, original_column_name: str, new_column_name: str) -> "DatasetDict": + """ + Rename a column in the dataset and move the features associated to the original column under the new column name. + The transformation is applied to all the datasets of the dataset dictionary. + + You can also rename a column using [`~DatasetDict.map`] with `remove_columns` but the present method: + - takes care of moving the original features under the new column name. + - doesn't copy the data to a new dataset and is thus much faster. + + Args: + original_column_name (`str`): + Name of the column to rename. + new_column_name (`str`): + New name for the column. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds = ds.rename_column("label", "label_new") + DatasetDict({ + train: Dataset({ + features: ['text', 'label_new'], + num_rows: 8530 + }) + validation: Dataset({ + features: ['text', 'label_new'], + num_rows: 1066 + }) + test: Dataset({ + features: ['text', 'label_new'], + num_rows: 1066 + }) + }) + ``` + """ + self._check_values_type() + return DatasetDict( + { + k: dataset.rename_column( + original_column_name=original_column_name, + new_column_name=new_column_name, + ) + for k, dataset in self.items() + } + ) + + def rename_columns(self, column_mapping: dict[str, str]) -> "DatasetDict": + """ + Rename several columns in the dataset, and move the features associated to the original columns under + the new column names. + The transformation is applied to all the datasets of the dataset dictionary. + + Args: + column_mapping (`Dict[str, str]`): + A mapping of columns to rename to their new names. + + Returns: + [`DatasetDict`]: A copy of the dataset with renamed columns. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds.rename_columns({'text': 'text_new', 'label': 'label_new'}) + DatasetDict({ + train: Dataset({ + features: ['text_new', 'label_new'], + num_rows: 8530 + }) + validation: Dataset({ + features: ['text_new', 'label_new'], + num_rows: 1066 + }) + test: Dataset({ + features: ['text_new', 'label_new'], + num_rows: 1066 + }) + }) + ``` + """ + self._check_values_type() + return DatasetDict({k: dataset.rename_columns(column_mapping=column_mapping) for k, dataset in self.items()}) + + def select_columns(self, column_names: Union[str, list[str]]) -> "DatasetDict": + """Select one or several column(s) from each split in the dataset and + the features associated to the column(s). + + The transformation is applied to all the splits of the dataset + dictionary. + + Args: + column_names (`Union[str, list[str]]`): + Name of the column(s) to keep. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds.select_columns("text") + DatasetDict({ + train: Dataset({ + features: ['text'], + num_rows: 8530 + }) + validation: Dataset({ + features: ['text'], + num_rows: 1066 + }) + test: Dataset({ + features: ['text'], + num_rows: 1066 + }) + }) + ``` + """ + self._check_values_type() + return DatasetDict({k: dataset.select_columns(column_names=column_names) for k, dataset in self.items()}) + + def class_encode_column(self, column: str, include_nulls: bool = False) -> "DatasetDict": + """Casts the given column as [`~datasets.features.ClassLabel`] and updates the tables. + + Args: + column (`str`): + The name of the column to cast. + include_nulls (`bool`, defaults to `False`): + Whether to include null values in the class labels. If `True`, the null values will be encoded as the `"None"` class label. + + + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("google/boolq") + >>> ds["train"].features + {'answer': Value('bool'), + 'passage': Value('string'), + 'question': Value('string')} + >>> ds = ds.class_encode_column("answer") + >>> ds["train"].features + {'answer': ClassLabel(num_classes=2, names=['False', 'True']), + 'passage': Value('string'), + 'question': Value('string')} + ``` + """ + self._check_values_type() + return DatasetDict( + {k: dataset.class_encode_column(column=column, include_nulls=include_nulls) for k, dataset in self.items()} + ) + + @contextlib.contextmanager + def formatted_as( + self, + type: Optional[str] = None, + columns: Optional[list] = None, + output_all_columns: bool = False, + **format_kwargs, + ): + """To be used in a `with` statement. Set `__getitem__` return format (type and columns). + The transformation is applied to all the datasets of the dataset dictionary. + + Args: + type (`str`, *optional*): + Either output type selected in `[None, 'numpy', 'torch', 'tensorflow', 'jax', 'arrow', 'pandas', 'polars']`. + `None` means `__getitem__` returns python objects (default). + columns (`list[str]`, *optional*): + Columns to format in the output. + `None` means `__getitem__` returns all columns (default). + output_all_columns (`bool`, defaults to False): + Keep un-formatted columns as well in the output (as python objects). + **format_kwargs (additional keyword arguments): + Keywords arguments passed to the convert function like `np.array`, `torch.tensor` or `tensorflow.ragged.constant`. + """ + self._check_values_type() + old_format_type = {k: dataset._format_type for k, dataset in self.items()} + old_format_kwargs = {k: dataset._format_kwargs for k, dataset in self.items()} + old_format_columns = {k: dataset._format_columns for k, dataset in self.items()} + old_output_all_columns = {k: dataset._output_all_columns for k, dataset in self.items()} + try: + self.set_format(type, columns, output_all_columns, **format_kwargs) + yield + finally: + for k, dataset in self.items(): + dataset.set_format( + old_format_type[k], + old_format_columns[k], + old_output_all_columns[k], + **old_format_kwargs[k], + ) + + def set_format( + self, + type: Optional[str] = None, + columns: Optional[list] = None, + output_all_columns: bool = False, + **format_kwargs, + ): + """Set `__getitem__` return format (type and columns). + The format is set for every dataset in the dataset dictionary. + + Args: + type (`str`, *optional*): + Either output type selected in `[None, 'numpy', 'torch', 'tensorflow', 'jax', 'arrow', 'pandas', 'polars']`. + `None` means `__getitem__` returns python objects (default). + columns (`list[str]`, *optional*): + Columns to format in the output. + `None` means `__getitem__` returns all columns (default). + output_all_columns (`bool`, defaults to False): + Keep un-formatted columns as well in the output (as python objects), + **format_kwargs (additional keyword arguments): + Keywords arguments passed to the convert function like `np.array`, `torch.tensor` or `tensorflow.ragged.constant`. + + It is possible to call `map` after calling `set_format`. Since `map` may add new columns, then the list of formatted columns + gets updated. In this case, if you apply `map` on a dataset to add a new column, then this column will be formatted: + + `new formatted columns = (all columns - previously unformatted columns)` + + Example: + + ```py + >>> from datasets import load_dataset + >>> from transformers import AutoTokenizer + >>> tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") + >>> ds = ds.map(lambda x: tokenizer(x["text"], truncation=True, padding=True), batched=True) + >>> ds.set_format(type="numpy", columns=['input_ids', 'token_type_ids', 'attention_mask', 'label']) + >>> ds["train"].format + {'columns': ['input_ids', 'token_type_ids', 'attention_mask', 'label'], + 'format_kwargs': {}, + 'output_all_columns': False, + 'type': 'numpy'} + ``` + """ + self._check_values_type() + for dataset in self.values(): + dataset.set_format( + type=type, + columns=columns, + output_all_columns=output_all_columns, + **format_kwargs, + ) + + def reset_format(self): + """Reset `__getitem__` return format to python objects and all columns. + The transformation is applied to all the datasets of the dataset dictionary. + + Same as `self.set_format()` + + Example: + + ```py + >>> from datasets import load_dataset + >>> from transformers import AutoTokenizer + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") + >>> ds = ds.map(lambda x: tokenizer(x["text"], truncation=True, padding=True), batched=True) + >>> ds.set_format(type="numpy", columns=['input_ids', 'token_type_ids', 'attention_mask', 'label']) + >>> ds["train"].format + {'columns': ['input_ids', 'token_type_ids', 'attention_mask', 'label'], + 'format_kwargs': {}, + 'output_all_columns': False, + 'type': 'numpy'} + >>> ds.reset_format() + >>> ds["train"].format + {'columns': ['text', 'label', 'input_ids', 'token_type_ids', 'attention_mask'], + 'format_kwargs': {}, + 'output_all_columns': False, + 'type': None} + ``` + """ + self._check_values_type() + for dataset in self.values(): + dataset.set_format() + + def set_transform( + self, + transform: Optional[Callable], + columns: Optional[list] = None, + output_all_columns: bool = False, + ): + """Set ``__getitem__`` return format using this transform. The transform is applied on-the-fly on batches when ``__getitem__`` is called. + The transform is set for every dataset in the dataset dictionary + As :func:`datasets.Dataset.set_format`, this can be reset using :func:`datasets.Dataset.reset_format` + + Args: + transform (`Callable`, optional): user-defined formatting transform, replaces the format defined by :func:`datasets.Dataset.set_format` + A formatting function is a callable that takes a batch (as a dict) as input and returns a batch. + This function is applied right before returning the objects in ``__getitem__``. + columns (`list[str]`, optional): columns to format in the output + If specified, then the input batch of the transform only contains those columns. + output_all_columns (`bool`, default to False): keep un-formatted columns as well in the output (as python objects) + If set to True, then the other un-formatted columns are kept with the output of the transform. + + """ + self._check_values_type() + for dataset in self.values(): + dataset.set_format( + "custom", + columns=columns, + output_all_columns=output_all_columns, + transform=transform, + ) + + def with_format( + self, + type: Optional[str] = None, + columns: Optional[list] = None, + output_all_columns: bool = False, + **format_kwargs, + ) -> "DatasetDict": + """Set `__getitem__` return format (type and columns). The data formatting is applied on-the-fly. + The format `type` (for example "numpy") is used to format batches when using `__getitem__`. + The format is set for every dataset in the dataset dictionary. + + It's also possible to use custom transforms for formatting using [`~datasets.Dataset.with_transform`]. + + Contrary to [`~datasets.DatasetDict.set_format`], `with_format` returns a new [`DatasetDict`] object with new [`Dataset`] objects. + + Args: + type (`str`, *optional*): + Either output type selected in `[None, 'numpy', 'torch', 'tensorflow', 'jax', 'arrow', 'pandas', 'polars']`. + `None` means `__getitem__` returns python objects (default). + columns (`list[str]`, *optional*): + Columns to format in the output. + `None` means `__getitem__` returns all columns (default). + output_all_columns (`bool`, defaults to `False`): + Keep un-formatted columns as well in the output (as python objects). + **format_kwargs (additional keyword arguments): + Keywords arguments passed to the convert function like `np.array`, `torch.tensor` or `tensorflow.ragged.constant`. + + Example: + + ```py + >>> from datasets import load_dataset + >>> from transformers import AutoTokenizer + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") + >>> ds = ds.map(lambda x: tokenizer(x['text'], truncation=True, padding=True), batched=True) + >>> ds["train"].format + {'columns': ['text', 'label', 'input_ids', 'token_type_ids', 'attention_mask'], + 'format_kwargs': {}, + 'output_all_columns': False, + 'type': None} + >>> ds = ds.with_format("torch") + >>> ds["train"].format + {'columns': ['text', 'label', 'input_ids', 'token_type_ids', 'attention_mask'], + 'format_kwargs': {}, + 'output_all_columns': False, + 'type': 'torch'} + >>> ds["train"][0] + {'text': 'compassionately explores the seemingly irreconcilable situation between conservative christian parents and their estranged gay and lesbian children .', + 'label': tensor(1), + 'input_ids': tensor([ 101, 18027, 16310, 16001, 1103, 9321, 178, 11604, 7235, 6617, + 1742, 2165, 2820, 1206, 6588, 22572, 12937, 1811, 2153, 1105, + 1147, 12890, 19587, 6463, 1105, 15026, 1482, 119, 102, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0]), + 'token_type_ids': tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), + 'attention_mask': tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])} + ``` + """ + dataset = copy.deepcopy(self) + dataset.set_format( + type=type, + columns=columns, + output_all_columns=output_all_columns, + **format_kwargs, + ) + return dataset + + def with_transform( + self, + transform: Optional[Callable], + columns: Optional[list] = None, + output_all_columns: bool = False, + ) -> "DatasetDict": + """Set `__getitem__` return format using this transform. The transform is applied on-the-fly on batches when `__getitem__` is called. + The transform is set for every dataset in the dataset dictionary + + As [`~datasets.Dataset.set_format`], this can be reset using [`~datasets.Dataset.reset_format`]. + + Contrary to [`~datasets.DatasetDict.set_transform`], `with_transform` returns a new [`DatasetDict`] object with new [`Dataset`] objects. + + Args: + transform (`Callable`, *optional*): + User-defined formatting transform, replaces the format defined by [`~datasets.Dataset.set_format`]. + A formatting function is a callable that takes a batch (as a dict) as input and returns a batch. + This function is applied right before returning the objects in `__getitem__`. + columns (`list[str]`, *optional*): + Columns to format in the output. + If specified, then the input batch of the transform only contains those columns. + output_all_columns (`bool`, defaults to False): + Keep un-formatted columns as well in the output (as python objects). + If set to `True`, then the other un-formatted columns are kept with the output of the transform. + + Example: + + ```py + >>> from datasets import load_dataset + >>> from transformers import AutoTokenizer + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") + >>> def encode(example): + ... return tokenizer(example['text'], truncation=True, padding=True, return_tensors="pt") + >>> ds = ds.with_transform(encode) + >>> ds["train"][0] + {'attention_mask': tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1]), + 'input_ids': tensor([ 101, 1103, 2067, 1110, 17348, 1106, 1129, 1103, 6880, 1432, + 112, 188, 1207, 107, 14255, 1389, 107, 1105, 1115, 1119, + 112, 188, 1280, 1106, 1294, 170, 24194, 1256, 3407, 1190, + 170, 11791, 5253, 188, 1732, 7200, 10947, 12606, 2895, 117, + 179, 7766, 118, 172, 15554, 1181, 3498, 6961, 3263, 1137, + 188, 1566, 7912, 14516, 6997, 119, 102]), + 'token_type_ids': tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0])} + ``` + """ + dataset = copy.deepcopy(self) + dataset.set_transform(transform=transform, columns=columns, output_all_columns=output_all_columns) + return dataset + + def map( + self, + function: Optional[Callable] = None, + with_indices: bool = False, + with_rank: bool = False, + with_split: bool = False, + input_columns: Optional[Union[str, list[str]]] = None, + batched: bool = False, + batch_size: Optional[int] = 1000, + drop_last_batch: bool = False, + remove_columns: Optional[Union[str, list[str]]] = None, + keep_in_memory: bool = False, + load_from_cache_file: Optional[bool] = None, + cache_file_names: Optional[dict[str, Optional[str]]] = None, + writer_batch_size: Optional[int] = 1000, + features: Optional[Features] = None, + disable_nullable: bool = False, + fn_kwargs: Optional[dict] = None, + num_proc: Optional[int] = None, + desc: Optional[str] = None, + try_original_type: Optional[bool] = True, + on_mixed_types: Optional[Literal["use_json"]] = None, + ) -> "DatasetDict": + """ + Apply a function to all the examples in the table (individually or in batches) and update the table. + If your function returns a column that already exists, then it overwrites it. + The transformation is applied to all the datasets of the dataset dictionary. + + You can specify whether the function should be batched or not with the `batched` parameter: + + - If batched is `False`, then the function takes 1 example in and should return 1 example. + An example is a dictionary, e.g. `{"text": "Hello there !"}`. + - If batched is `True` and `batch_size` is 1, then the function takes a batch of 1 example as input and can return a batch with 1 or more examples. + A batch is a dictionary, e.g. a batch of 1 example is `{"text": ["Hello there !"]}`. + - If batched is `True` and `batch_size` is `n > 1`, then the function takes a batch of `n` examples as input and can return a batch with `n` examples, or with an arbitrary number of examples. + Note that the last batch may have less than `n` examples. + A batch is a dictionary, e.g. a batch of `n` examples is `{"text": ["Hello there !"] * n}`. + + If the function is asynchronous, then `map` will run your function in parallel, with up to one thousand simultaneous calls. + It is recommended to use a `asyncio.Semaphore` in your function if you want to set a maximum number of operations that can run at the same time. + + Args: + function (`callable`): with one of the following signature: + - `function(example: Dict[str, Any]) -> Dict[str, Any]` if `batched=False` and `with_indices=False` + - `function(example: Dict[str, Any], indices: int) -> Dict[str, Any]` if `batched=False` and `with_indices=True` + - `function(batch: Dict[str, list]) -> Dict[str, list]` if `batched=True` and `with_indices=False` + - `function(batch: Dict[str, list], indices: list[int]) -> Dict[str, list]` if `batched=True` and `with_indices=True` + + For advanced usage, the function can also return a `pyarrow.Table`. + If the function is asynchronous, then `map` will run your function in parallel. + Moreover if your function returns nothing (`None`), then `map` will run your function and return the dataset unchanged. + If no function is provided, default to identity function: `lambda x: x`. + with_indices (`bool`, defaults to `False`): + Provide example indices to `function`. Note that in this case the signature of `function` should be `def function(example, idx): ...`. + with_rank (`bool`, defaults to `False`): + Provide process rank to `function`. Note that in this case the + signature of `function` should be `def function(example[, idx], rank): ...`. + with_split (`bool`, defaults to `False`): + Provide process split to `function`. Note that in this case the + signature of `function` should be `def function(example[, idx], split): ...`. + input_columns (`[Union[str, list[str]]]`, *optional*, defaults to `None`): + The columns to be passed into `function` as + positional arguments. If `None`, a dict mapping to all formatted columns is passed as one argument. + batched (`bool`, defaults to `False`): + Provide batch of examples to `function`. + batch_size (`int`, *optional*, defaults to `1000`): + Number of examples per batch provided to `function` if `batched=True`, + `batch_size <= 0` or `batch_size == None` then provide the full dataset as a single batch to `function`. + drop_last_batch (`bool`, defaults to `False`): + Whether a last batch smaller than the batch_size should be + dropped instead of being processed by the function. + remove_columns (`[Union[str, list[str]]]`, *optional*, defaults to `None`): + Remove a selection of columns while doing the mapping. + Columns will be removed before updating the examples with the output of `function`, i.e. if `function` is adding + columns with names in `remove_columns`, these columns will be kept. + keep_in_memory (`bool`, defaults to `False`): + Keep the dataset in memory instead of writing it to a cache file. + load_from_cache_file (`Optional[bool]`, defaults to `True` if caching is enabled): + If a cache file storing the current computation from `function` + can be identified, use it instead of recomputing. + cache_file_names (`[Dict[str, str]]`, *optional*, defaults to `None`): + Provide the name of a path for the cache file. It is used to store the + results of the computation instead of the automatically generated cache file name. + You have to provide one `cache_file_name` per dataset in the dataset dictionary. + writer_batch_size (`int`, default `1000`): + Number of rows per write operation for the cache file writer. + This value is a good trade-off between memory usage during the processing, and processing speed. + Higher value makes the processing do fewer lookups, lower value consume less temporary memory while running `map`. + features (`[datasets.Features]`, *optional*, defaults to `None`): + Use a specific [`Features`] to store the cache file + instead of the automatically generated one. + disable_nullable (`bool`, defaults to `False`): + Disallow null values in the table. + fn_kwargs (`Dict`, *optional*, defaults to `None`): + Keyword arguments to be passed to `function` + num_proc (`int`, *optional*, defaults to `None`): + The number of processes to use for multiprocessing. + - If `None` or `0`, no multiprocessing is used and the operation runs in the main process. + - If greater than `1`, one or multiple worker processes are used to process data in parallel. + Note: The function passed to `map()` must be picklable for multiprocessing to work correctly + (i.e., prefer functions defined at the top level of a module, not inside another function or class). + desc (`str`, *optional*, defaults to `None`): + Meaningful description to be displayed alongside with the progress bar while mapping examples. + try_original_type (`Optional[bool]`, defaults to `True`): + Try to keep the types of the original columns (e.g. int32 -> int32). + Set to False if you want to always infer new types. + on_mixed_types (`Literal["use_json"]`, *optional*, defaults to `None`): + If "use_json", use the Json() type for mixed-types fields, + i.e. unstructured fields that contain data without a predefined schema. + In this case, a field with mixed type is set to Json(). + + This allow loading lists with a mix of strings/integers/floats + for example, or dictionaries with arbitrary value types. + + + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> def add_prefix(example): + ... example["text"] = "Review: " + example["text"] + ... return example + >>> ds = ds.map(add_prefix) + >>> ds["train"][0:3]["text"] + ['Review: the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .', + 'Review: the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .', + 'Review: effective but too-tepid biopic'] + + # process a batch of examples + >>> ds = ds.map(lambda example: tokenizer(example["text"]), batched=True) + # set number of processors + >>> ds = ds.map(add_prefix, num_proc=4) + ``` + """ + self._check_values_type() + if cache_file_names is None: + cache_file_names = dict.fromkeys(self) + + dataset_dict = {} + for split, dataset in self.items(): + if with_split: + function = bind(function, split) + + dataset_dict[split] = dataset.map( + function=function, + with_indices=with_indices, + with_rank=with_rank, + input_columns=input_columns, + batched=batched, + batch_size=batch_size, + drop_last_batch=drop_last_batch, + remove_columns=remove_columns, + keep_in_memory=keep_in_memory, + load_from_cache_file=load_from_cache_file, + cache_file_name=cache_file_names[split], + writer_batch_size=writer_batch_size, + features=features, + disable_nullable=disable_nullable, + fn_kwargs=fn_kwargs, + num_proc=num_proc, + desc=desc, + try_original_type=try_original_type, + on_mixed_types=on_mixed_types, + ) + + if with_split: + function = function.func + + return DatasetDict(dataset_dict) + + def filter( + self, + function: Optional[Callable] = None, + with_indices: bool = False, + with_rank: bool = False, + input_columns: Optional[Union[str, list[str]]] = None, + batched: bool = False, + batch_size: Optional[int] = 1000, + keep_in_memory: bool = False, + load_from_cache_file: Optional[bool] = None, + cache_file_names: Optional[dict[str, Optional[str]]] = None, + writer_batch_size: Optional[int] = 1000, + fn_kwargs: Optional[dict] = None, + num_proc: Optional[int] = None, + desc: Optional[str] = None, + ) -> "DatasetDict": + """Apply a filter function to all the elements in the table in batches + and update the table so that the dataset only includes examples according to the filter function. + The transformation is applied to all the datasets of the dataset dictionary. + + Args: + function (`Callable`): Callable with one of the following signatures: + + - `function(example: Dict[str, Any]) -> bool` if `batched=False` and `with_indices=False` and `with_rank=False` + - `function(example: Dict[str, Any], *extra_args) -> bool` if `batched=False` and `with_indices=True` and/or `with_rank=True` (one extra arg for each) + - `function(batch: Dict[str, list]) -> list[bool]` if `batched=True` and `with_indices=False` and `with_rank=False` + - `function(batch: Dict[str, list], *extra_args) -> list[bool]` if `batched=True` and `with_indices=True` and/or `with_rank=True` (one extra arg for each) + + If no function is provided, defaults to an always `True` function: `lambda x: True`. + with_indices (`bool`, defaults to `False`): + Provide example indices to `function`. Note that in this case the + signature of `function` should be `def function(example, idx[, rank]): ...`. + with_rank (`bool`, defaults to `False`): + Provide process rank to `function`. Note that in this case the + signature of `function` should be `def function(example[, idx], rank): ...`. + input_columns (`[Union[str, list[str]]]`, *optional*, defaults to `None`): + The columns to be passed into `function` as + positional arguments. If `None`, a dict mapping to all formatted columns is passed as one argument. + batched (`bool`, defaults to `False`): + Provide batch of examples to `function`. + batch_size (`int`, *optional*, defaults to `1000`): + Number of examples per batch provided to `function` if `batched=True` + `batch_size <= 0` or `batch_size == None` then provide the full dataset as a single batch to `function`. + keep_in_memory (`bool`, defaults to `False`): + Keep the dataset in memory instead of writing it to a cache file. + load_from_cache_file (`Optional[bool]`, defaults to `True` if caching is enabled): + If a cache file storing the current computation from `function` + can be identified, use it instead of recomputing. + cache_file_names (`[Dict[str, str]]`, *optional*, defaults to `None`): + Provide the name of a path for the cache file. It is used to store the + results of the computation instead of the automatically generated cache file name. + You have to provide one `cache_file_name` per dataset in the dataset dictionary. + writer_batch_size (`int`, defaults to `1000`): + Number of rows per write operation for the cache file writer. + This value is a good trade-off between memory usage during the processing, and processing speed. + Higher value makes the processing do fewer lookups, lower value consume less temporary memory while running `map`. + fn_kwargs (`Dict`, *optional*, defaults to `None`): + Keyword arguments to be passed to `function` + num_proc (`int`, *optional*, defaults to `None`): + The number of processes to use for multiprocessing. + - If `None` or `0`, no multiprocessing is used and the operation runs in the main process. + - If greater than `1`, one or multiple worker processes are used to process data in parallel. + Note: The function passed to `map()` must be picklable for multiprocessing to work correctly + (i.e., prefer functions defined at the top level of a module, not inside another function or class). + desc (`str`, *optional*, defaults to `None`): + Meaningful description to be displayed alongside with the progress bar while filtering examples. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds.filter(lambda x: x["label"] == 1) + DatasetDict({ + train: Dataset({ + features: ['text', 'label'], + num_rows: 4265 + }) + validation: Dataset({ + features: ['text', 'label'], + num_rows: 533 + }) + test: Dataset({ + features: ['text', 'label'], + num_rows: 533 + }) + }) + ``` + """ + self._check_values_type() + if cache_file_names is None: + cache_file_names = dict.fromkeys(self) + return DatasetDict( + { + k: dataset.filter( + function=function, + with_indices=with_indices, + with_rank=with_rank, + input_columns=input_columns, + batched=batched, + batch_size=batch_size, + keep_in_memory=keep_in_memory, + load_from_cache_file=load_from_cache_file, + cache_file_name=cache_file_names[k], + writer_batch_size=writer_batch_size, + fn_kwargs=fn_kwargs, + num_proc=num_proc, + desc=desc, + ) + for k, dataset in self.items() + } + ) + + def flatten_indices( + self, + keep_in_memory: bool = False, + cache_file_names: Optional[dict[str, Optional[str]]] = None, + writer_batch_size: Optional[int] = 1000, + features: Optional[Features] = None, + disable_nullable: bool = False, + num_proc: Optional[int] = None, + new_fingerprint: Optional[str] = None, + ) -> "DatasetDict": + """Create and cache a new Dataset by flattening the indices mapping. + + Args: + keep_in_memory (`bool`, defaults to `False`): + Keep the dataset in memory instead of writing it to a cache file. + cache_file_names (`Dict[str, str]`, *optional*, default `None`): + Provide the name of a path for the cache file. It is used to store the + results of the computation instead of the automatically generated cache file name. + You have to provide one `cache_file_name` per dataset in the dataset dictionary. + writer_batch_size (`int`, defaults to `1000`): + Number of rows per write operation for the cache file writer. + This value is a good trade-off between memory usage during the processing, and processing speed. + Higher value makes the processing do fewer lookups, lower value consume less temporary memory while running `map`. + features (`Optional[datasets.Features]`, defaults to `None`): + Use a specific [`Features`] to store the cache file + instead of the automatically generated one. + disable_nullable (`bool`, defaults to `False`): + Allow null values in the table. + num_proc (`int`, optional, default `None`): + Max number of processes when generating cache. Already cached shards are loaded sequentially + new_fingerprint (`str`, *optional*, defaults to `None`): + The new fingerprint of the dataset after transform. + If `None`, the new fingerprint is computed using a hash of the previous fingerprint, and the transform arguments + """ + self._check_values_type() + if cache_file_names is None: + cache_file_names = dict.fromkeys(self) + return DatasetDict( + { + k: dataset.flatten_indices( + keep_in_memory=keep_in_memory, + cache_file_name=cache_file_names[k], + writer_batch_size=writer_batch_size, + features=features, + disable_nullable=disable_nullable, + num_proc=num_proc, + new_fingerprint=new_fingerprint, + ) + for k, dataset in self.items() + } + ) + + def sort( + self, + column_names: Union[str, Sequence[str]], + reverse: Union[bool, Sequence[bool]] = False, + null_placement: str = "at_end", + keep_in_memory: bool = False, + load_from_cache_file: Optional[bool] = None, + indices_cache_file_names: Optional[dict[str, Optional[str]]] = None, + writer_batch_size: Optional[int] = 1000, + ) -> "DatasetDict": + """Create a new dataset sorted according to a single or multiple columns. + + Args: + column_names (`Union[str, Sequence[str]]`): + Column name(s) to sort by. + reverse (`Union[bool, Sequence[bool]]`, defaults to `False`): + If `True`, sort by descending order rather than ascending. If a single bool is provided, + the value is applied to the sorting of all column names. Otherwise a list of bools with the + same length and order as column_names must be provided. + null_placement (`str`, defaults to `at_end`): + Put `None` values at the beginning if `at_start` or `first` or at the end if `at_end` or `last` + keep_in_memory (`bool`, defaults to `False`): + Keep the sorted indices in memory instead of writing it to a cache file. + load_from_cache_file (`Optional[bool]`, defaults to `True` if caching is enabled): + If a cache file storing the sorted indices + can be identified, use it instead of recomputing. + indices_cache_file_names (`[Dict[str, str]]`, *optional*, defaults to `None`): + Provide the name of a path for the cache file. It is used to store the + indices mapping instead of the automatically generated cache file name. + You have to provide one `cache_file_name` per dataset in the dataset dictionary. + writer_batch_size (`int`, defaults to `1000`): + Number of rows per write operation for the cache file writer. + Higher value gives smaller cache files, lower value consume less temporary memory. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset('cornell-movie-review-data/rotten_tomatoes') + >>> ds['train']['label'][:10] + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + >>> sorted_ds = ds.sort('label') + >>> sorted_ds['train']['label'][:10] + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + >>> another_sorted_ds = ds.sort(['label', 'text'], reverse=[True, False]) + >>> another_sorted_ds['train']['label'][:10] + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ``` + """ + self._check_values_type() + if indices_cache_file_names is None: + indices_cache_file_names = dict.fromkeys(self) + return DatasetDict( + { + k: dataset.sort( + column_names=column_names, + reverse=reverse, + null_placement=null_placement, + keep_in_memory=keep_in_memory, + load_from_cache_file=load_from_cache_file, + indices_cache_file_name=indices_cache_file_names[k], + writer_batch_size=writer_batch_size, + ) + for k, dataset in self.items() + } + ) + + def shuffle( + self, + seeds: Optional[Union[int, dict[str, Optional[int]]]] = None, + seed: Optional[int] = None, + generators: Optional[dict[str, np.random.Generator]] = None, + keep_in_memory: bool = False, + load_from_cache_file: Optional[bool] = None, + indices_cache_file_names: Optional[dict[str, Optional[str]]] = None, + writer_batch_size: Optional[int] = 1000, + ) -> "DatasetDict": + """Create a new Dataset where the rows are shuffled. + + The transformation is applied to all the datasets of the dataset dictionary. + + Currently shuffling uses numpy random generators. + You can either supply a NumPy BitGenerator to use, or a seed to initiate NumPy's default random generator (PCG64). + + Args: + seeds (`Dict[str, int]` or `int`, *optional*): + A seed to initialize the default BitGenerator if `generator=None`. + If `None`, then fresh, unpredictable entropy will be pulled from the OS. + If an `int` or `array_like[ints]` is passed, then it will be passed to SeedSequence to derive the initial BitGenerator state. + You can provide one `seed` per dataset in the dataset dictionary. + seed (`int`, *optional*): + A seed to initialize the default BitGenerator if `generator=None`. Alias for seeds (a `ValueError` is raised if both are provided). + generators (`Dict[str, *optional*, np.random.Generator]`): + Numpy random Generator to use to compute the permutation of the dataset rows. + If `generator=None` (default), uses `np.random.default_rng` (the default BitGenerator (PCG64) of NumPy). + You have to provide one `generator` per dataset in the dataset dictionary. + keep_in_memory (`bool`, defaults to `False`): + Keep the dataset in memory instead of writing it to a cache file. + load_from_cache_file (`Optional[bool]`, defaults to `True` if caching is enabled): + If a cache file storing the current computation from `function` + can be identified, use it instead of recomputing. + indices_cache_file_names (`Dict[str, str]`, *optional*): + Provide the name of a path for the cache file. It is used to store the + indices mappings instead of the automatically generated cache file name. + You have to provide one `cache_file_name` per dataset in the dataset dictionary. + writer_batch_size (`int`, defaults to `1000`): + Number of rows per write operation for the cache file writer. + This value is a good trade-off between memory usage during the processing, and processing speed. + Higher value makes the processing do fewer lookups, lower value consume less temporary memory while running `map`. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds["train"]["label"][:10] + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + + # set a seed + >>> shuffled_ds = ds.shuffle(seed=42) + >>> shuffled_ds["train"]["label"][:10] + [0, 1, 0, 1, 0, 0, 0, 0, 0, 0] + ``` + """ + self._check_values_type() + if seed is not None and seeds is not None: + raise ValueError("Please specify seed or seeds, but not both") + seeds = seed if seed is not None else seeds + if seeds is None: + seeds = dict.fromkeys(self) + elif not isinstance(seeds, dict): + seeds = dict.fromkeys(self, seeds) + if generators is None: + generators = dict.fromkeys(self) + if indices_cache_file_names is None: + indices_cache_file_names = dict.fromkeys(self) + return DatasetDict( + { + k: dataset.shuffle( + seed=seeds[k], + generator=generators[k], + keep_in_memory=keep_in_memory, + load_from_cache_file=load_from_cache_file, + indices_cache_file_name=indices_cache_file_names[k], + writer_batch_size=writer_batch_size, + ) + for k, dataset in self.items() + } + ) + + def save_to_disk( + self, + dataset_dict_path: PathLike, + max_shard_size: Optional[Union[str, int]] = None, + num_shards: Optional[dict[str, int]] = None, + num_proc: Optional[int] = None, + storage_options: Optional[dict] = None, + ): + """ + Saves a dataset dict to a filesystem using `fsspec.spec.AbstractFileSystem`. + + For [`Image`], [`Audio`] and [`Video`] data: + + All the Image(), Audio() and Video() data are stored in the arrow files. + If you want to store paths or urls, please use the Value("string") type. + + Args: + dataset_dict_path (`path-like`): + Path (e.g. `dataset/train`) or remote URI (e.g. `s3://my-bucket/dataset/train`) + of the dataset dict directory where the dataset dict will be saved to. + max_shard_size (`int` or `str`, *optional*, defaults to `"500MB"`): + The maximum size of the dataset shards to be saved to the filesystem. If expressed as a string, needs to be digits followed by a unit + (like `"50MB"`). + num_shards (`Dict[str, int]`, *optional*): + Number of shards to write. By default the number of shards depends on `max_shard_size` and `num_proc`. + You need to provide the number of shards for each dataset in the dataset dictionary. + Use a dictionary to define a different num_shards for each split. + + + num_proc (`int`, *optional*, default `None`): + Number of processes when downloading and generating the dataset locally. + Multiprocessing is disabled by default. + + + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the file-system backend, if any. + + + + Example: + + ```python + >>> dataset_dict.save_to_disk("path/to/dataset/directory") + >>> dataset_dict.save_to_disk("path/to/dataset/directory", max_shard_size="1GB") + >>> dataset_dict.save_to_disk("path/to/dataset/directory", num_shards={"train": 1024, "test": 8}) + ``` + """ + fs: fsspec.AbstractFileSystem + fs, _ = url_to_fs(dataset_dict_path, **(storage_options or {})) + + if num_shards is None: + num_shards = dict.fromkeys(self) + elif not isinstance(num_shards, dict): + raise ValueError( + "Please provide one `num_shards` per dataset in the dataset dictionary, e.g. {{'train': 128, 'test': 4}}" + ) + + fs.makedirs(dataset_dict_path, exist_ok=True) + + with fs.open( + posixpath.join(dataset_dict_path, config.DATASETDICT_JSON_FILENAME), + "w", + encoding="utf-8", + ) as f: + json.dump({"splits": list(self)}, f) + for k, dataset in self.items(): + dataset.save_to_disk( + posixpath.join(dataset_dict_path, k), + num_shards=num_shards.get(k), + max_shard_size=max_shard_size, + num_proc=num_proc, + storage_options=storage_options, + ) + + @staticmethod + def load_from_disk( + dataset_dict_path: PathLike, + keep_in_memory: Optional[bool] = None, + storage_options: Optional[dict] = None, + ) -> "DatasetDict": + """ + Load a dataset that was previously saved using [`save_to_disk`] from a filesystem using `fsspec.spec.AbstractFileSystem`. + + Args: + dataset_dict_path (`path-like`): + Path (e.g. `"dataset/train"`) or remote URI (e.g. `"s3//my-bucket/dataset/train"`) + of the dataset dict directory where the dataset dict will be loaded from. + keep_in_memory (`bool`, defaults to `None`): + Whether to copy the dataset in-memory. If `None`, the + dataset will not be copied in-memory unless explicitly enabled by setting + `datasets.config.IN_MEMORY_MAX_SIZE` to nonzero. See more details in the + [improve performance](../cache#improve-performance) section. + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the file-system backend, if any. + + + + Returns: + [`DatasetDict`] + + Example: + + ```py + >>> ds = load_from_disk('path/to/dataset/directory') + ``` + """ + fs: fsspec.AbstractFileSystem + fs, dataset_dict_path = url_to_fs(dataset_dict_path, **(storage_options or {})) + + dataset_dict_json_path = posixpath.join(dataset_dict_path, config.DATASETDICT_JSON_FILENAME) + dataset_state_json_path = posixpath.join(dataset_dict_path, config.DATASET_STATE_JSON_FILENAME) + dataset_info_path = posixpath.join(dataset_dict_path, config.DATASET_INFO_FILENAME) + if not fs.isfile(dataset_dict_json_path): + if fs.isfile(dataset_info_path) and fs.isfile(dataset_state_json_path): + raise FileNotFoundError( + f"No such file: '{dataset_dict_json_path}'. Expected to load a `DatasetDict` object, but got a `Dataset`. Please use either `datasets.load_from_disk` or `Dataset.load_from_disk` instead." + ) + raise FileNotFoundError( + f"No such file: '{dataset_dict_json_path}'. Expected to load a `DatasetDict` object, but provided path is not a `DatasetDict`." + ) + + with fs.open(dataset_dict_json_path, "r", encoding="utf-8") as f: + splits = json.load(f)["splits"] + + dataset_dict = DatasetDict() + for k in splits: + dataset_dict_split_path = posixpath.join(fs.unstrip_protocol(dataset_dict_path), k) + dataset_dict[k] = Dataset.load_from_disk( + dataset_dict_split_path, + keep_in_memory=keep_in_memory, + storage_options=storage_options, + ) + return dataset_dict + + @staticmethod + def from_csv( + path_or_paths: dict[str, PathLike], + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + **kwargs, + ) -> "DatasetDict": + """Create [`DatasetDict`] from CSV file(s). + + Args: + path_or_paths (`dict` of path-like): + Path(s) of the CSV file(s). + features ([`Features`], *optional*): + Dataset features. + cache_dir (str, *optional*, defaults to `"~/.cache/huggingface/datasets"`): + Directory to cache data. + keep_in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + **kwargs (additional keyword arguments): + Keyword arguments to be passed to [`pandas.read_csv`]. + + Returns: + [`DatasetDict`] + + Example: + + ```py + >>> from datasets import DatasetDict + >>> ds = DatasetDict.from_csv({'train': 'path/to/dataset.csv'}) + ``` + """ + # Dynamic import to avoid circular dependency + from .io.csv import CsvDatasetReader + + return CsvDatasetReader( + path_or_paths, + features=features, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + **kwargs, + ).read() + + @staticmethod + def from_json( + path_or_paths: dict[str, PathLike], + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + **kwargs, + ) -> "DatasetDict": + """Create [`DatasetDict`] from JSON Lines file(s). + + Args: + path_or_paths (`path-like` or list of `path-like`): + Path(s) of the JSON Lines file(s). + features ([`Features`], *optional*): + Dataset features. + cache_dir (str, *optional*, defaults to `"~/.cache/huggingface/datasets"`): + Directory to cache data. + keep_in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + **kwargs (additional keyword arguments): + Keyword arguments to be passed to [`JsonConfig`]. + + Returns: + [`DatasetDict`] + + Example: + + ```py + >>> from datasets import DatasetDict + >>> ds = DatasetDict.from_json({'train': 'path/to/dataset.json'}) + ``` + """ + # Dynamic import to avoid circular dependency + from .io.json import JsonDatasetReader + + return JsonDatasetReader( + path_or_paths, + features=features, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + **kwargs, + ).read() + + @staticmethod + def from_parquet( + path_or_paths: dict[str, PathLike], + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + columns: Optional[list[str]] = None, + **kwargs, + ) -> "DatasetDict": + """Create [`DatasetDict`] from Parquet file(s). + + Args: + path_or_paths (`dict` of path-like): + Path(s) of the CSV file(s). + features ([`Features`], *optional*): + Dataset features. + cache_dir (`str`, *optional*, defaults to `"~/.cache/huggingface/datasets"`): + Directory to cache data. + keep_in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + columns (`list[str]`, *optional*): + If not `None`, only these columns will be read from the file. + A column name may be a prefix of a nested field, e.g. 'a' will select + 'a.b', 'a.c', and 'a.d.e'. + **kwargs (additional keyword arguments): + Keyword arguments to be passed to [`ParquetConfig`]. + + Returns: + [`DatasetDict`] + + Example: + + ```py + >>> from datasets import DatasetDict + >>> ds = DatasetDict.from_parquet({'train': 'path/to/dataset/parquet'}) + ``` + """ + # Dynamic import to avoid circular dependency + from .io.parquet import ParquetDatasetReader + + return ParquetDatasetReader( + path_or_paths, + features=features, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + columns=columns, + **kwargs, + ).read() + + @staticmethod + def from_text( + path_or_paths: dict[str, PathLike], + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + **kwargs, + ) -> "DatasetDict": + """Create [`DatasetDict`] from text file(s). + + Args: + path_or_paths (`dict` of path-like): + Path(s) of the text file(s). + features ([`Features`], *optional*): + Dataset features. + cache_dir (`str`, *optional*, defaults to `"~/.cache/huggingface/datasets"`): + Directory to cache data. + keep_in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + **kwargs (additional keyword arguments): + Keyword arguments to be passed to [`TextConfig`]. + + Returns: + [`DatasetDict`] + + Example: + + ```py + >>> from datasets import DatasetDict + >>> ds = DatasetDict.from_text({'train': 'path/to/dataset.txt'}) + ``` + """ + # Dynamic import to avoid circular dependency + from .io.text import TextDatasetReader + + return TextDatasetReader( + path_or_paths, + features=features, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + **kwargs, + ).read() + + @is_documented_by(Dataset.align_labels_with_mapping) + def align_labels_with_mapping(self, label2id: dict, label_column: str) -> "DatasetDict": + self._check_values_type() + return DatasetDict( + { + k: dataset.align_labels_with_mapping(label2id=label2id, label_column=label_column) + for k, dataset in self.items() + } + ) + + def push_to_hub( + self, + repo_id: str, + config_name: str = "default", + set_default: Optional[bool] = None, + data_dir: Optional[str] = None, + commit_message: Optional[str] = None, + commit_description: Optional[str] = None, + private: Optional[bool] = None, + token: Optional[str] = None, + revision: Optional[str] = None, + create_pr: Optional[bool] = False, + max_shard_size: Optional[Union[int, str]] = None, + num_shards: Optional[dict[str, int]] = None, + embed_external_files: bool = True, + num_proc: Optional[int] = None, + ) -> Optional[CommitInfo]: + """Pushes the [`DatasetDict`] to the hub as a Parquet dataset. + The [`DatasetDict`] is pushed using HTTP requests and does not need to have neither git or git-lfs installed. + + Each dataset split will be pushed independently. The pushed dataset will keep the original split names. + + The resulting Parquet files are self-contained by default: if your dataset contains [`Image`] or [`Audio`] + data, the Parquet files will store the bytes of your images or audio files. + You can disable this by setting `embed_external_files` to False. + + Args: + repo_id (`str`): + The ID of the repository to push to in the following format: `/` or + `/`. Also accepts ``, which will default to the namespace + of the logged-in user. + + It could also be a location inside a bucket, e.g. `buckets///...` + config_name (`str`): + Configuration name of a dataset. Defaults to "default". + set_default (`bool`, *optional*): + Whether to set this configuration as the default one. Otherwise, the default configuration is the one + named "default". + data_dir (`str`, *optional*): + Directory name that will contain the uploaded data files. Defaults to the `config_name` if different + from "default", else "data". + + + commit_message (`str`, *optional*): + Message to commit while pushing. Will default to `"Upload dataset"`. + commit_description (`str`, *optional*): + Description of the commit that will be created. + Additionally, description of the PR if a PR is created (`create_pr` is True). + + + private (`bool`, *optional*): + Whether to make the repo private. If `None` (default), the repo will be public unless the + organization's default is private. This value is ignored if the repo already exists. + token (`str`, *optional*): + An optional authentication token for the Hugging Face Hub. If no token is passed, will default + to the token saved locally when logging in with `huggingface-cli login`. Will raise an error + if no token is passed and the user is not logged-in. + revision (`str`, *optional*): + Branch to push the uploaded files to. Defaults to the `"main"` branch. + + + create_pr (`bool`, *optional*, defaults to `False`): + Whether to create a PR with the uploaded files or directly commit. + + + max_shard_size (`int` or `str`, *optional*, defaults to `"500MB"`): + The maximum size of the dataset shards to be uploaded to the hub. If expressed as a string, needs to be digits followed by a unit + (like `"500MB"` or `"1GB"`). + num_shards (`Dict[str, int]`, *optional*): + Number of shards to write. By default, the number of shards depends on `max_shard_size`. + Use a dictionary to define a different num_shards for each split. + + + embed_external_files (`bool`, defaults to `True`): + Whether to embed file bytes in the shards. + In particular, this will do the following before the push for the fields of type: + + - [`Audio`] and [`Image`] removes local path information and embed file content in the Parquet files. + num_proc (`int`, *optional*, defaults to `None`): + Number of processes when preparing and uploading the dataset. + This is helpful if the dataset is made of many samples or media files to embed. + I uses "spawn" context to work with hf_xet, the rust client for fast uploads to HF. + Multiprocessing is disabled by default. + + + + Return: + huggingface_hub.CommitInfo + + Example: + + ```python + >>> dataset_dict.push_to_hub("/") + >>> dataset_dict.push_to_hub("/", private=True) + >>> dataset_dict.push_to_hub("/", max_shard_size="1GB") + >>> dataset_dict.push_to_hub("/", num_shards={"train": 1024, "test": 8}) + ``` + + If you want to add a new configuration (or subset) to a dataset (e.g. if the dataset has multiple tasks/versions/languages): + + ```python + >>> english_dataset.push_to_hub("/", "en") + >>> french_dataset.push_to_hub("/", "fr") + >>> # later + >>> english_dataset = load_dataset("/", "en") + >>> french_dataset = load_dataset("/", "fr") + ``` + """ + if num_shards is None: + num_shards = dict.fromkeys(self) + elif not isinstance(num_shards, dict): + raise ValueError( + "Please provide one `num_shards` per dataset in the dataset dictionary, e.g. {{'train': 128, 'test': 4}}" + ) + + self._check_values_type() + self._check_values_features() + if config_name == "data": + raise ValueError("`config_name` cannot be 'data'. Please, choose another name for configuration.") + + if max_shard_size is not None and num_shards is not None and any(x is not None for x in num_shards.values()): + raise ValueError( + "Failed to push_to_hub: please specify either max_shard_size or num_shards, but not both." + ) + + for split in self: + if not re.match(_split_re, split): + raise ValueError(f"Split name should match '{_split_re}' but got '{split}'.") + + if not data_dir: + data_dir = config_name if config_name != "default" else "data" # for backward compatibility + + api = HfApi(endpoint=config.HF_ENDPOINT, token=token, library_name="datasets", library_version=__version__) + if repo_id.startswith("buckets/"): + if BucketNotFoundError is None: + raise ImportError("Pushing datasets to buckets requires huggingface_hub>=1.6.0") + _, _namespace, _bucket_name, *_path_segments = repo_id.split("/") + try: + bucket_id = api.bucket_info(_namespace + "/" + _bucket_name).id + except BucketNotFoundError: + bucket_url = api.create_bucket(_namespace + "/" + _bucket_name, private=private, exist_ok=True) + bucket_id = bucket_url.bucket_id + path = "/".join(s for s in _path_segments if s) + return _push_to_bucket( + self, + bucket_id=bucket_id, + path=path, + config_name=config_name, + set_default=set_default, + data_dir=data_dir, + token=token, + max_shard_size=max_shard_size, + num_shards=num_shards, + embed_external_files=embed_external_files, + num_proc=num_proc, + ) + else: + try: + repo_id = api.repo_info(repo_id, repo_type="dataset").id + except RepositoryNotFoundError: + repo_url = api.create_repo( + repo_id, + repo_type="dataset", + private=private, + exist_ok=True, + ) + repo_id = repo_url.repo_id + + if revision is not None and not revision.startswith("refs/pr/"): + # We do not call create_branch for a PR reference: 400 Bad Request + api.create_branch(repo_id, branch=revision, repo_type="dataset", exist_ok=True) + return _push_to_repo( + self, + repo_id=repo_id, + config_name=config_name, + set_default=set_default, + data_dir=data_dir, + commit_message=commit_message, + commit_description=commit_description, + token=token, + revision=revision, + create_pr=create_pr, + max_shard_size=max_shard_size, + num_shards=num_shards, + embed_external_files=embed_external_files, + num_proc=num_proc, + ) + + +class IterableDatasetDict(dict[Union[str, NamedSplit], IterableDataset]): + def _check_values_type(self): + for dataset in self.values(): + if not isinstance(dataset, IterableDataset): + raise TypeError(f"Values in `DatasetDict` should be of type `Dataset` but got type '{type(dataset)}'") + + def _check_values_features(self): + items = [(key, dataset._resolve_features()) for key, dataset in self.items()] + for item_a, item_b in zip(items[:-1], items[1:]): + if item_a[1].features != item_b[1].features: + raise ValueError( + f"All datasets in `DatasetDict` should have the same features but features for '{item_a[0]}' and '{item_b[0]}' don't match: {item_a[1].features} != {item_b[1].features}" + ) + + def __repr__(self): + repr = "\n".join([f"{k}: {v}" for k, v in self.items()]) + repr = re.sub(r"^", " " * 4, repr, count=0, flags=re.M) + return f"IterableDatasetDict({{\n{repr}\n}})" + + @property + def num_columns(self) -> dict[str, Optional[int]]: + """Number of columns in each split of the dataset. + This can contain None valies if some splits have unknown features (e.g. after a map() operation). + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds.num_columns + {'test': 2, 'train': 2, 'validation': 2} + ``` + """ + self._check_values_type() + return {k: dataset.num_columns for k, dataset in self.items()} + + @property + def column_names(self) -> dict[str, Optional[list[str]]]: + """Names of the columns in each split of the dataset. + This can contain None valies if some splits have unknown features (e.g. after a map() operation). + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes") + >>> ds.column_names + {'test': ['text', 'label'], + 'train': ['text', 'label'], + 'validation': ['text', 'label']} + ``` + """ + self._check_values_type() + return {k: dataset.column_names for k, dataset in self.items()} + + def with_format( + self, + type: Optional[str] = None, + ) -> "IterableDatasetDict": + """ + Return a dataset with the specified format. + + Args: + + type (`str`, *optional*): + Either output type selected in `[None, 'numpy', 'torch', 'tensorflow', 'jax', 'arrow', 'pandas', 'polars']`. + `None` means it returns python objects (default). + + Example: + + ```py + >>> from datasets import load_dataset + >>> from transformers import AutoTokenizer + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation", streaming=True) + >>> tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") + >>> ds = ds.map(lambda x: tokenizer(x['text'], truncation=True, padding=True), batched=True) + >>> ds = ds.with_format("torch") + >>> next(iter(ds)) + {'text': 'compassionately explores the seemingly irreconcilable situation between conservative christian parents and their estranged gay and lesbian children .', + 'label': tensor(1), + 'input_ids': tensor([ 101, 18027, 16310, 16001, 1103, 9321, 178, 11604, 7235, 6617, + 1742, 2165, 2820, 1206, 6588, 22572, 12937, 1811, 2153, 1105, + 1147, 12890, 19587, 6463, 1105, 15026, 1482, 119, 102, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0]), + 'token_type_ids': tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), + 'attention_mask': tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])} + ``` + """ + return IterableDatasetDict({k: dataset.with_format(type=type) for k, dataset in self.items()}) + + def map( + self, + function: Optional[Callable] = None, + with_indices: bool = False, + with_split: bool = False, + input_columns: Optional[Union[str, list[str]]] = None, + batched: bool = False, + batch_size: int = 1000, + drop_last_batch: bool = False, + remove_columns: Optional[Union[str, list[str]]] = None, + fn_kwargs: Optional[dict] = None, + ) -> "IterableDatasetDict": + """ + Apply a function to all the examples in the iterable dataset (individually or in batches) and update them. + If your function returns a column that already exists, then it overwrites it. + The function is applied on-the-fly on the examples when iterating over the dataset. + The transformation is applied to all the datasets of the dataset dictionary. + + You can specify whether the function should be batched or not with the `batched` parameter: + + - If batched is `False`, then the function takes 1 example in and should return 1 example. + An example is a dictionary, e.g. `{"text": "Hello there !"}`. + - If batched is `True` and `batch_size` is 1, then the function takes a batch of 1 example as input and can return a batch with 1 or more examples. + A batch is a dictionary, e.g. a batch of 1 example is `{"text": ["Hello there !"]}`. + - If batched is `True` and `batch_size` is `n` > 1, then the function takes a batch of `n` examples as input and can return a batch with `n` examples, or with an arbitrary number of examples. + Note that the last batch may have less than `n` examples. + A batch is a dictionary, e.g. a batch of `n` examples is `{"text": ["Hello there !"] * n}`. + + If the function is asynchronous, then `map` will run your function in parallel, with up to one thousand simultaneous calls. + It is recommended to use a `asyncio.Semaphore` in your function if you want to set a maximum number of operations that can run at the same time. + + Args: + function (`Callable`, *optional*, defaults to `None`): + Function applied on-the-fly on the examples when you iterate on the dataset. + It must have one of the following signatures: + + - `function(example: Dict[str, Any]) -> Dict[str, Any]` if `batched=False` and `with_indices=False` + - `function(example: Dict[str, Any], idx: int) -> Dict[str, Any]` if `batched=False` and `with_indices=True` + - `function(batch: Dict[str, list]) -> Dict[str, list]` if `batched=True` and `with_indices=False` + - `function(batch: Dict[str, list], indices: list[int]) -> Dict[str, list]` if `batched=True` and `with_indices=True` + + For advanced usage, the function can also return a `pyarrow.Table`. + If the function is asynchronous, then `map` will run your function in parallel. + Moreover if your function returns nothing (`None`), then `map` will run your function and return the dataset unchanged. + If no function is provided, default to identity function: `lambda x: x`. + with_indices (`bool`, defaults to `False`): + Provide example indices to `function`. Note that in this case the signature of `function` should be `def function(example, idx[, rank]): ...`. + input_columns (`[Union[str, list[str]]]`, *optional*, defaults to `None`): + The columns to be passed into `function` + as positional arguments. If `None`, a dict mapping to all formatted columns is passed as one argument. + batched (`bool`, defaults to `False`): + Provide batch of examples to `function`. + batch_size (`int`, *optional*, defaults to `1000`): + Number of examples per batch provided to `function` if `batched=True`. + drop_last_batch (`bool`, defaults to `False`): + Whether a last batch smaller than the `batch_size` should be + dropped instead of being processed by the function. + remove_columns (`[list[str]]`, *optional*, defaults to `None`): + Remove a selection of columns while doing the mapping. + Columns will be removed before updating the examples with the output of `function`, i.e. if `function` is adding + columns with names in `remove_columns`, these columns will be kept. + fn_kwargs (`Dict`, *optional*, defaults to `None`): + Keyword arguments to be passed to `function` + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", streaming=True) + >>> def add_prefix(example): + ... example["text"] = "Review: " + example["text"] + ... return example + >>> ds = ds.map(add_prefix) + >>> next(iter(ds["train"])) + {'label': 1, + 'text': 'Review: the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'} + ``` + """ + + dataset_dict = {} + for split, dataset in self.items(): + if with_split: + function = bind(function, split) + + dataset_dict[split] = dataset.map( + function=function, + with_indices=with_indices, + input_columns=input_columns, + batched=batched, + batch_size=batch_size, + drop_last_batch=drop_last_batch, + remove_columns=remove_columns, + fn_kwargs=fn_kwargs, + ) + + if with_split: + function = function.func + + return IterableDatasetDict(dataset_dict) + + def filter( + self, + function: Optional[Callable] = None, + with_indices=False, + input_columns: Optional[Union[str, list[str]]] = None, + batched: bool = False, + batch_size: Optional[int] = 1000, + fn_kwargs: Optional[dict] = None, + ) -> "IterableDatasetDict": + """Apply a filter function to all the elements so that the dataset only includes examples according to the filter function. + The filtering is done on-the-fly when iterating over the dataset. + The filtering is applied to all the datasets of the dataset dictionary. + + Args: + function (`Callable`): + Callable with one of the following signatures: + + - `function(example: Dict[str, Any]) -> bool` if `with_indices=False, batched=False` + - `function(example: Dict[str, Any], indices: int) -> bool` if `with_indices=True, batched=False` + - `function(example: Dict[str, list]) -> list[bool]` if `with_indices=False, batched=True` + - `function(example: Dict[str, list], indices: list[int]) -> list[bool]` if `with_indices=True, batched=True` + + If no function is provided, defaults to an always True function: `lambda x: True`. + with_indices (`bool`, defaults to `False`): + Provide example indices to `function`. Note that in this case the signature of `function` should be `def function(example, idx): ...`. + input_columns (`str` or `list[str]`, *optional*): + The columns to be passed into `function` as + positional arguments. If `None`, a dict mapping to all formatted columns is passed as one argument. + batched (`bool`, defaults to `False`): + Provide batch of examples to `function` + batch_size (`int`, *optional*, defaults to `1000`): + Number of examples per batch provided to `function` if `batched=True`. + fn_kwargs (`Dict`, *optional*, defaults to `None`): + Keyword arguments to be passed to `function` + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", streaming=True) + >>> ds = ds.filter(lambda x: x["label"] == 0) + >>> list(ds["train"].take(3)) + [{'label': 0, 'text': 'Review: simplistic , silly and tedious .'}, + {'label': 0, + 'text': "Review: it's so laddish and juvenile , only teenage boys could possibly find it funny ."}, + {'label': 0, + 'text': 'Review: exploitative and largely devoid of the depth or sophistication that would make watching such a graphic treatment of the crimes bearable .'}] + ``` + """ + return IterableDatasetDict( + { + k: dataset.filter( + function=function, + with_indices=with_indices, + input_columns=input_columns, + batched=batched, + batch_size=batch_size, + fn_kwargs=fn_kwargs, + ) + for k, dataset in self.items() + } + ) + + def shuffle( + self, + seed=None, + generator: Optional[np.random.Generator] = None, + buffer_size: int = 1000, + ) -> "IterableDatasetDict": + """ + Randomly shuffles the elements of this dataset. + The shuffling is applied to all the datasets of the dataset dictionary. + + This dataset fills a buffer with buffer_size elements, then randomly samples elements from this buffer, + replacing the selected elements with new elements. For perfect shuffling, a buffer size greater than or + equal to the full size of the dataset is required. + + For instance, if your dataset contains 10,000 elements but `buffer_size` is set to 1000, then `shuffle` will + initially select a random element from only the first 1000 elements in the buffer. Once an element is + selected, its space in the buffer is replaced by the next (i.e. 1,001-st) element, + maintaining the 1000 element buffer. + + If the dataset is made of several shards, it also does `shuffle` the order of the shards. + However if the order has been fixed by using [`~datasets.IterableDataset.skip`] or [`~datasets.IterableDataset.take`] + then the order of the shards is kept unchanged. + + Args: + seed (`int`, *optional*, defaults to `None`): + Random seed that will be used to shuffle the dataset. + It is used to sample from the shuffle buffer and also to shuffle the data shards. + generator (`numpy.random.Generator`, *optional*): + Numpy random Generator to use to compute the permutation of the dataset rows. + If `generator=None` (default), uses `np.random.default_rng` (the default BitGenerator (PCG64) of NumPy). + buffer_size (`int`, defaults to `1000`): + Size of the buffer. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", streaming=True) + >>> list(ds["train"].take(3)) + [{'label': 1, + 'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'}, + {'label': 1, + 'text': 'the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .'}, + {'label': 1, 'text': 'effective but too-tepid biopic'}] + >>> ds = ds.shuffle(seed=42) + >>> list(ds["train"].take(3)) + [{'label': 1, + 'text': "a sports movie with action that's exciting on the field and a story you care about off it ."}, + {'label': 1, + 'text': 'at its best , the good girl is a refreshingly adult take on adultery . . .'}, + {'label': 1, + 'text': "sam jones became a very lucky filmmaker the day wilco got dropped from their record label , proving that one man's ruin may be another's fortune ."}] + ``` + """ + return IterableDatasetDict( + { + k: dataset.shuffle(seed=seed, generator=generator, buffer_size=buffer_size) + for k, dataset in self.items() + } + ) + + def rename_column(self, original_column_name: str, new_column_name: str) -> "IterableDatasetDict": + """ + Rename a column in the dataset, and move the features associated to the original column under the new column + name. + The renaming is applied to all the datasets of the dataset dictionary. + + Args: + original_column_name (`str`): + Name of the column to rename. + new_column_name (`str`): + New name for the column. + + Returns: + [`IterableDatasetDict`]: A copy of the dataset with a renamed column. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", streaming=True) + >>> ds = ds.rename_column("text", "movie_review") + >>> next(iter(ds["train"])) + {'label': 1, + 'movie_review': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'} + ``` + """ + return IterableDatasetDict( + { + k: dataset.rename_column( + original_column_name=original_column_name, + new_column_name=new_column_name, + ) + for k, dataset in self.items() + } + ) + + def rename_columns(self, column_mapping: dict[str, str]) -> "IterableDatasetDict": + """ + Rename several columns in the dataset, and move the features associated to the original columns under + the new column names. + The renaming is applied to all the datasets of the dataset dictionary. + + Args: + column_mapping (`Dict[str, str]`): + A mapping of columns to rename to their new names. + + Returns: + [`IterableDatasetDict`]: A copy of the dataset with renamed columns + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", streaming=True) + >>> ds = ds.rename_columns({"text": "movie_review", "label": "rating"}) + >>> next(iter(ds["train"])) + {'movie_review': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .', + 'rating': 1} + ``` + """ + return IterableDatasetDict( + {k: dataset.rename_columns(column_mapping=column_mapping) for k, dataset in self.items()} + ) + + def remove_columns(self, column_names: Union[str, list[str]]) -> "IterableDatasetDict": + """ + Remove one or several column(s) in the dataset and the features associated to them. + The removal is done on-the-fly on the examples when iterating over the dataset. + The removal is applied to all the datasets of the dataset dictionary. + + + Args: + column_names (`Union[str, list[str]]`): + Name of the column(s) to remove. + + Returns: + [`IterableDatasetDict`]: A copy of the dataset object without the columns to remove. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", streaming=True) + >>> ds = ds.remove_columns("label") + >>> next(iter(ds["train"])) + {'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'} + ``` + """ + return IterableDatasetDict({k: dataset.remove_columns(column_names) for k, dataset in self.items()}) + + def select_columns(self, column_names: Union[str, list[str]]) -> "IterableDatasetDict": + """Select one or several column(s) in the dataset and the features + associated to them. The selection is done on-the-fly on the examples + when iterating over the dataset. The selection is applied to all the + datasets of the dataset dictionary. + + + Args: + column_names (`Union[str, list[str]]`): + Name of the column(s) to keep. + + Returns: + [`IterableDatasetDict`]: A copy of the dataset object with only selected columns. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", streaming=True) + >>> ds = ds.select("text") + >>> next(iter(ds["train"])) + {'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'} + ``` + """ + return IterableDatasetDict({k: dataset.select_columns(column_names) for k, dataset in self.items()}) + + def cast_column(self, column: str, feature: FeatureType) -> "IterableDatasetDict": + """Cast column to feature for decoding. + The type casting is applied to all the datasets of the dataset dictionary. + + Args: + column (`str`): + Column name. + feature ([`Feature`]): + Target feature. + + Returns: + [`IterableDatasetDict`] + + Example: + + ```py + >>> from datasets import load_dataset, ClassLabel + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", streaming=True) + >>> ds["train"].features + {'label': ClassLabel(names=['neg', 'pos']), + 'text': Value('string')} + >>> ds = ds.cast_column('label', ClassLabel(names=['bad', 'good'])) + >>> ds["train"].features + {'label': ClassLabel(names=['bad', 'good']), + 'text': Value('string')} + ``` + """ + return IterableDatasetDict( + {k: dataset.cast_column(column=column, feature=feature) for k, dataset in self.items()} + ) + + def cast( + self, + features: Features, + ) -> "IterableDatasetDict": + """ + Cast the dataset to a new set of features. + The type casting is applied to all the datasets of the dataset dictionary. + + Args: + features (`Features`): + New features to cast the dataset to. + The name of the fields in the features must match the current column names. + The type of the data must also be convertible from one type to the other. + For non-trivial conversion, e.g. `string` <-> `ClassLabel` you should use [`map`] to update the Dataset. + + Returns: + [`IterableDatasetDict`]: A copy of the dataset with casted features. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", streaming=True) + >>> ds["train"].features + {'label': ClassLabel(names=['neg', 'pos']), + 'text': Value('string')} + >>> new_features = ds["train"].features.copy() + >>> new_features['label'] = ClassLabel(names=['bad', 'good']) + >>> new_features['text'] = Value('large_string') + >>> ds = ds.cast(new_features) + >>> ds["train"].features + {'label': ClassLabel(names=['bad', 'good']), + 'text': Value('large_string')} + ``` + """ + return IterableDatasetDict({k: dataset.cast(features=features) for k, dataset in self.items()}) + + def push_to_hub( + self, + repo_id: str, + config_name: str = "default", + set_default: Optional[bool] = None, + data_dir: Optional[str] = None, + commit_message: Optional[str] = None, + commit_description: Optional[str] = None, + private: Optional[bool] = None, + token: Optional[str] = None, + revision: Optional[str] = None, + create_pr: Optional[bool] = False, + max_shard_size: Optional[Union[int, str]] = None, + num_shards: Optional[dict[str, int]] = None, + embed_external_files: bool = True, + num_proc: Optional[int] = None, + ) -> CommitInfo: + """Pushes the [`IterableDatasetDict`] to the hub as a Parquet dataset. + The [`IterableDatasetDict`] is pushed using HTTP requests and does not need to have neither git or git-lfs installed. + + Each dataset split will be pushed independently. The pushed dataset will keep the original split names. + + The resulting Parquet files are self-contained by default: if your dataset contains [`Image`] or [`Audio`] + data, the Parquet files will store the bytes of your images or audio files. + You can disable this by setting `embed_external_files` to False. + + Args: + repo_id (`str`): + The ID of the repository to push to in the following format: `/` or + `/`. Also accepts ``, which will default to the namespace + of the logged-in user. + + It could also be a location inside a bucket, e.g. `buckets///...` + config_name (`str`): + Configuration name of a dataset. Defaults to "default". + set_default (`bool`, *optional*): + Whether to set this configuration as the default one. Otherwise, the default configuration is the one + named "default". + data_dir (`str`, *optional*): + Directory name that will contain the uploaded data files. Defaults to the `config_name` if different + from "default", else "data". + + + commit_message (`str`, *optional*): + Message to commit while pushing. Will default to `"Upload dataset"`. + commit_description (`str`, *optional*): + Description of the commit that will be created. + Additionally, description of the PR if a PR is created (`create_pr` is True). + + + private (`bool`, *optional*): + Whether to make the repo private. If `None` (default), the repo will be public unless the + organization's default is private. This value is ignored if the repo already exists. + token (`str`, *optional*): + An optional authentication token for the Hugging Face Hub. If no token is passed, will default + to the token saved locally when logging in with `huggingface-cli login`. Will raise an error + if no token is passed and the user is not logged-in. + revision (`str`, *optional*): + Branch to push the uploaded files to. Defaults to the `"main"` branch. + create_pr (`bool`, *optional*, defaults to `False`): + Whether to create a PR with the uploaded files or directly commit. + max_shard_size (`int` or `str`, *optional*): + Optional maximum size of the dataset shards to be uploaded to the hub. If expressed as a string, needs to be digits followed + by a unit (like `"500MB"` or `"1GB"`). If not provided, each split keeps its dataset-native shard count. + num_shards (`Dict[str, int]`, *optional*): + Number of shards to write. Use a dictionary to define a different `num_shards` for each split. + If `max_shard_size` is provided and a split's `num_shards` is not, then the number of shards for that split is estimated + from `max_shard_size`. + embed_external_files (`bool`, defaults to `True`): + Whether to embed file bytes in the shards. + In particular, this will do the following before the push for the fields of type: + + - [`Audio`] and [`Image`] removes local path information and embed file content in the Parquet files. + num_proc (`int`, *optional*, defaults to `None`): + Number of processes when preparing and uploading the dataset. + This is helpful if the dataset is made of many samples or media files to embed. + I uses "spawn" context to work with hf_xet, the rust client for fast uploads to HF. + Multiprocessing is disabled by default. + + + + Return: + huggingface_hub.CommitInfo + + Example: + + ```python + >>> dataset_dict.push_to_hub("/") + >>> dataset_dict.push_to_hub("/", private=True) + >>> dataset_dict.push_to_hub("/", max_shard_size="1GB") + >>> dataset_dict.push_to_hub("/", num_shards={"train": 1024, "test": 8}) + ``` + + If you want to add a new configuration (or subset) to a dataset (e.g. if the dataset has multiple tasks/versions/languages): + + ```python + >>> english_dataset.push_to_hub("/", "en") + >>> french_dataset.push_to_hub("/", "fr") + >>> # later + >>> english_dataset = load_dataset("/", "en") + >>> french_dataset = load_dataset("/", "fr") + ``` + """ + # check to make sure that the user doesnt specify the # of shards and max shard sdize at same time, since these are 2 different ways to specify the same thing + if max_shard_size is not None and num_shards is not None: + raise ValueError( + "Failed to push_to_hub: please specify either max_shard_size or num_shards, but not both." + ) + + if num_shards is None: + num_shards = dict.fromkeys(self) + elif not isinstance(num_shards, dict): + raise ValueError( + "Please provide one `num_shards` per dataset in the dataset dictionary, e.g. {{'train': 128, 'test': 4}}" + ) + + self._check_values_type() + self._check_values_features() + if config_name == "data": + raise ValueError("`config_name` cannot be 'data'. Please, choose another name for configuration.") + + # if max_shard_size is not None and num_shards is not None and any(x is not None for x in num_shards.values()): + # raise ValueError( + # "Failed to push_to_hub: please specify either max_shard_size or num_shards, but not both." + # ) + + for split in self: + if not re.match(_split_re, split): + raise ValueError(f"Split name should match '{_split_re}' but got '{split}'.") + + if not data_dir: + data_dir = config_name if config_name != "default" else "data" # for backward compatibility + + api = HfApi(endpoint=config.HF_ENDPOINT, token=token, library_name="datasets", library_version=__version__) + if repo_id.startswith("buckets/"): + if BucketNotFoundError is None: + raise ImportError("Pushing datasets to buckets requires huggingface_hub>=1.6.0") + _, _namespace, _bucket_name, *_path_segments = repo_id.split("/") + try: + bucket_id = api.bucket_info(_namespace + "/" + _bucket_name).id + except BucketNotFoundError: + bucket_url = api.create_bucket(_namespace + "/" + _bucket_name, private=private, exist_ok=True) + bucket_id = bucket_url.bucket_id + path = "/".join(s for s in _path_segments if s) + return _push_to_bucket( + self, + bucket_id=bucket_id, + path=path, + config_name=config_name, + set_default=set_default, + data_dir=data_dir, + token=token, + max_shard_size=max_shard_size, + num_shards=num_shards.get(split), + embed_external_files=embed_external_files, + num_proc=num_proc, + ) + else: + try: + repo_id = api.repo_info(repo_id, repo_type="dataset").id + except RepositoryNotFoundError: + repo_url = api.create_repo( + repo_id, + repo_type="dataset", + private=private, + exist_ok=True, + ) + repo_id = repo_url.repo_id + + if revision is not None and not revision.startswith("refs/pr/"): + # We do not call create_branch for a PR reference: 400 Bad Request + api.create_branch(repo_id, branch=revision, repo_type="dataset", exist_ok=True) + return _push_to_repo( + self, + repo_id=repo_id, + config_name=config_name, + set_default=set_default, + data_dir=data_dir, + commit_message=commit_message, + commit_description=commit_description, + token=token, + create_pr=create_pr, + revision=revision, + max_shard_size=max_shard_size, + num_shards=num_shards, + embed_external_files=embed_external_files, + num_proc=num_proc, + ) + + +def _push_to_repo( + dset_dict: Union["DatasetDict", "IterableDatasetDict"], + repo_id: str, + config_name: str = "default", + set_default: Optional[bool] = None, + data_dir: Optional[str] = None, + commit_message: Optional[str] = None, + commit_description: Optional[str] = None, + token: Optional[str] = None, + revision: Optional[str] = None, + create_pr: Optional[bool] = False, + max_shard_size: Optional[Union[int, str]] = None, + num_shards: Optional[dict[str, Optional[int]]] = None, + embed_external_files: bool = True, + num_proc: Optional[int] = None, +) -> CommitInfo: + api = HfApi(endpoint=config.HF_ENDPOINT, token=token, library_name="datasets", library_version=__version__) + resolved_output_path = HfFileSystemResolvedRepositoryPath( + repo_id=repo_id, repo_type="dataset", revision=revision or "main", path_in_repo="" + ) + + additions: list[CommitOperationAdd] = [] + new_parquet_paths: list[str] = [] + splits_info: list[SplitInfo] = [] + uploaded_sizes: list[int] = [] + + for split in dset_dict: + split_additions, split_new_parquet_paths, features, split_info, uploaded_size = dset_dict[ + split + ]._push_parquet_shards_to_hub( + resolved_output_path=resolved_output_path, + data_dir=data_dir, + split=split, + token=token, + max_shard_size=max_shard_size, + num_shards=(num_shards or {}).get(split), + create_pr=create_pr, + embed_external_files=embed_external_files, + num_proc=num_proc, + ) + additions += split_additions + new_parquet_paths += split_new_parquet_paths + splits_info.append(split_info) + uploaded_sizes.append(uploaded_size) + + commit_message = commit_message if commit_message is not None else "Upload dataset" + if len(additions) > config.UPLOADS_MAX_NUMBER_PER_COMMIT: + logger.info( + f"Number of files to upload is larger than {config.UPLOADS_MAX_NUMBER_PER_COMMIT}. Splitting the push into multiple commits." + ) + num_commits = math.ceil(len(additions) / config.UPLOADS_MAX_NUMBER_PER_COMMIT) + for i in range(0, num_commits): + operations = additions[ + i * config.UPLOADS_MAX_NUMBER_PER_COMMIT : (i + 1) * config.UPLOADS_MAX_NUMBER_PER_COMMIT + ] + for retry, sleep_time in enumerate(itertools.chain(range(10), itertools.repeat(30)), start=1): + # We need to retry if another commit happens at the same time + sleep_time *= 1 + random.random() + try: + commit_info = api.create_commit( + repo_id, + operations=operations, + commit_message=commit_message + f" (part {i:05d}-of-{num_commits:05d})", + commit_description=commit_description, + repo_type="dataset", + revision=revision, + create_pr=create_pr, + ) + except HfHubHTTPError as err: + if ( + err.__context__ + and isinstance(err.__context__, HfHubHTTPError) + and err.__context__.response.status_code == 409 + ): + # 409 is Conflict (another commit is in progress) + time.sleep(sleep_time) + logger.info( + f"Retrying intermediate commit for {repo_id}, {config_name} ({retry}/n with status_code {err.__context__.response.status_code})" + ) + continue + else: + raise + break + logger.info( + f"Commit #{i + 1} completed" + + (f" (still {num_commits - i - 1} to go)" if num_commits - i - 1 else "") + + "." + ) + last_commit_additions = [] + else: + last_commit_additions = additions + + for retry, sleep_time in enumerate(itertools.chain(range(10), itertools.repeat(30)), start=1): + # We need to retry if there was a commit in between in case it touched the dataset card data + sleep_time *= 1 + random.random() + + # We make sure to get info from this commit + parent_commit = api.repo_info(repo_id, repo_type="dataset", revision=revision).sha + hf_path = HfFileSystemResolvedRepositoryPath( + repo_type=resolved_output_path.repo_type, + repo_id=resolved_output_path.repo_id, + revision=parent_commit, + path_in_repo=resolved_output_path.path_in_repo, + ).unresolve() + hffs = HfFileSystem(endpoint=config.HF_ENDPOINT, token=token) + dirfs = DirFileSystem(fs=hffs, path=hf_path) + + # Check the files to delete + try: + files_to_delete = list(dirfs.glob(f"{data_dir}/*")) + except EntryNotFoundError: # needed for huggingface_hub<=1.7.1 + files_to_delete = [] + + # Don't delete the new files + deletions = [ + CommitOperationDelete(path_in_repo=file_to_delete) + for file_to_delete in files_to_delete + if file_to_delete not in new_parquet_paths + ] + + # Update the dataset card + new_dataset_card, new_legacy_dataset_infos = _get_updated_dataset_card( + fs=dirfs, + config_name=config_name, + splits_info=splits_info, + features=features, + data_dir=data_dir, + set_default=set_default, + uploaded_sizes=uploaded_sizes, + deleted_sizes=[], + remove_other_splits=True, + ) + dataset_card_additions = [ + CommitOperationAdd(path_in_repo=config.REPOCARD_FILENAME, path_or_fileobj=str(new_dataset_card).encode()) + ] + if new_legacy_dataset_infos: + dataset_card_additions.append( + CommitOperationAdd( + path_in_repo=config.DATASETDICT_INFOS_FILENAME, + path_or_fileobj=json.dumps(new_legacy_dataset_infos).encode("utf-8"), + ) + ) + operations = last_commit_additions + dataset_card_additions + deletions + + try: + commit_info = api.create_commit( + repo_id, + operations=operations, + commit_message=commit_message, + commit_description=commit_description, + repo_type="dataset", + revision=revision, + create_pr=create_pr, + parent_commit=parent_commit, + ) + except HfHubHTTPError as err: + if ( + err.__context__ + and isinstance(err.__context__, HfHubHTTPError) + and err.__context__.response.status_code in (412, 409) + ): + # 412 is Precondition failed (parent_commit isn't satisfied) + # 409 is Conflict (another commit is in progress) + time.sleep(sleep_time) + logger.info( + f"Retrying commit for {repo_id}, {config_name} ({retry}/n with status_code {err.__context__.response.status_code})" + ) + continue + else: + raise + break + + return commit_info + + +def _push_to_bucket( + dset_dict: Union["DatasetDict", "IterableDatasetDict"], + bucket_id: str, + path: str, + config_name: str = "default", + set_default: Optional[bool] = None, + data_dir: Optional[str] = None, + token: Optional[str] = None, + max_shard_size: Optional[Union[int, str]] = None, + num_shards: Optional[dict[str, Optional[int]]] = None, + embed_external_files: bool = True, + num_proc: Optional[int] = None, +) -> None: + api = HfApi(endpoint=config.HF_ENDPOINT, token=token, library_name="datasets", library_version=__version__) + resolved_output_path = HfFileSystemResolvedBucketPath(bucket_id=bucket_id, path=path) + hf_path = resolved_output_path.unresolve() + hffs = HfFileSystem(endpoint=config.HF_ENDPOINT, token=token) + dirfs = DirFileSystem(fs=hffs, path=hf_path) + + additions: list[CommitOperationAdd] = [] + new_parquet_paths: list[str] = [] + splits_info: list[SplitInfo] = [] + uploaded_sizes: list[int] = [] + + # Check the files to delete before uploading + try: + files_to_delete = list(dirfs.glob(f"{data_dir}/*")) + except EntryNotFoundError: # needed for huggingface_hub<=1.7.1 + files_to_delete = [] + + for split in dset_dict: + # Upload the Parquet files + split_additions, split_new_parquet_paths, features, split_info, uploaded_size = dset_dict[ + split + ]._push_parquet_shards_to_hub( + resolved_output_path=resolved_output_path, + data_dir=data_dir, + split=split, + token=token, + max_shard_size=max_shard_size, + num_shards=(num_shards or {}).get(split), + create_pr=False, + embed_external_files=embed_external_files, + num_proc=num_proc, + ) + additions += split_additions + new_parquet_paths += split_new_parquet_paths + splits_info.append(split_info) + uploaded_sizes.append(uploaded_size) + + # Don't delete the new files + new_parquet_paths = set(new_parquet_paths) + delete = [file_to_delete for file_to_delete in files_to_delete if file_to_delete not in new_parquet_paths] + + # Update the dataset card + new_dataset_card, new_legacy_dataset_infos = _get_updated_dataset_card( + fs=dirfs, + config_name=config_name, + splits_info=splits_info, + features=features, + data_dir=data_dir, + set_default=set_default, + uploaded_sizes=uploaded_sizes, + deleted_sizes=[], + remove_other_splits=True, + ) + path_prefix = (path + "/") if path else "" + add = [(str(new_dataset_card).encode(), path_prefix + config.REPOCARD_FILENAME)] + if new_legacy_dataset_infos: + add.append( + (json.dumps(new_legacy_dataset_infos).encode("utf-8"), path_prefix + config.DATASETDICT_INFOS_FILENAME) + ) + + # Upload dataset card and delete old files + api.batch_bucket_files( + bucket_id=bucket_id, + add=add, + delete=delete, + ) diff --git a/src/datasets/distributed.py b/src/datasets/distributed.py new file mode 100644 index 0000000..a9ca59c --- /dev/null +++ b/src/datasets/distributed.py @@ -0,0 +1,43 @@ +from typing import TypeVar + +from .arrow_dataset import Dataset, _split_by_node_map_style_dataset +from .iterable_dataset import IterableDataset, _split_by_node_iterable_dataset + + +DatasetType = TypeVar("DatasetType", Dataset, IterableDataset) + + +def split_dataset_by_node(dataset: DatasetType, rank: int, world_size: int) -> DatasetType: + """ + Split a dataset for the node at rank `rank` in a pool of nodes of size `world_size`. + + For map-style datasets: + + Each node is assigned a chunk of data, e.g. rank 0 is given the first chunk of the dataset. + To maximize data loading throughput, chunks are made of contiguous data on disk if possible. + + For iterable datasets: + + If the dataset has a number of shards that is a factor of `world_size` (i.e. if `dataset.num_shards % world_size == 0`), + then the shards are evenly assigned across the nodes, which is the most optimized. + Otherwise, each node keeps 1 example out of `world_size`, skipping the other examples. + + > [!WARNING] + > If you shuffle your iterable dataset in a distributed setup, make sure to set a fixed `seed` in [`IterableDataset.shuffle`] + so the same shuffled list of shards is used on every node to know which shards the node should skip. + + Args: + dataset ([`Dataset`] or [`IterableDataset`]): + The dataset to split by node. + rank (`int`): + Rank of the current node. + world_size (`int`): + Total number of nodes. + + Returns: + [`Dataset`] or [`IterableDataset`]: The dataset to be used on the node at rank `rank`. + """ + if isinstance(dataset, Dataset): + return _split_by_node_map_style_dataset(dataset, rank=rank, world_size=world_size) + else: + return _split_by_node_iterable_dataset(dataset, rank=rank, world_size=world_size) diff --git a/src/datasets/download/__init__.py b/src/datasets/download/__init__.py new file mode 100644 index 0000000..8ae0d43 --- /dev/null +++ b/src/datasets/download/__init__.py @@ -0,0 +1,10 @@ +__all__ = [ + "DownloadConfig", + "DownloadManager", + "DownloadMode", + "StreamingDownloadManager", +] + +from .download_config import DownloadConfig +from .download_manager import DownloadManager, DownloadMode +from .streaming_download_manager import StreamingDownloadManager diff --git a/src/datasets/download/download_config.py b/src/datasets/download/download_config.py new file mode 100644 index 0000000..de197da --- /dev/null +++ b/src/datasets/download/download_config.py @@ -0,0 +1,85 @@ +import copy +from dataclasses import dataclass, field +from pathlib import Path +from typing import Any, Optional, Union + +from .. import config + + +@dataclass +class DownloadConfig: + """Configuration for our cached path manager. + + Attributes: + cache_dir (`str` or `Path`, *optional*): + Specify a cache directory to save the file to (overwrite the + default cache dir). + force_download (`bool`, defaults to `False`): + If `True`, re-download the file even if it's already cached in + the cache dir. + resume_download (`bool`, defaults to `False`): + If `True`, resume the download if an incompletely received file is + found. + proxies (`dict`, *optional*): + user_agent (`str`, *optional*): + Optional string or dict that will be appended to the user-agent on remote + requests. + extract_compressed_file (`bool`, defaults to `False`): + If `True` and the path point to a zip or tar file, + extract the compressed file in a folder along the archive. + force_extract (`bool`, defaults to `False`): + If `True` when `extract_compressed_file` is `True` and the archive + was already extracted, re-extract the archive and override the folder where it was extracted. + delete_extracted (`bool`, defaults to `False`): + Whether to delete (or keep) the extracted files. + extract_on_the_fly (`bool`, defaults to `False`): + If `True`, extract compressed files while they are being read. + use_etag (`bool`, defaults to `True`): + Whether to use the ETag HTTP response header to validate the cached files. + num_proc (`int`, *optional*): + The number of processes to launch to download the files in parallel. + max_retries (`int`, default to `1`): + The number of times to retry an HTTP request if it fails. + token (`str` or `bool`, *optional*): + Optional string or boolean to use as Bearer token + for remote files on the Datasets Hub. If `True`, or not specified, will get token from `~/.huggingface`. + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the dataset file-system backend, if any. + download_desc (`str`, *optional*): + A description to be displayed alongside with the progress bar while downloading the files. + disable_tqdm (`bool`, defaults to `False`): + Whether to disable the individual files download progress bar + """ + + cache_dir: Optional[Union[str, Path]] = None + force_download: bool = False + resume_download: bool = False + local_files_only: bool = False + proxies: Optional[dict] = None + user_agent: Optional[str] = None + extract_compressed_file: bool = False + force_extract: bool = False + delete_extracted: bool = False + extract_on_the_fly: bool = False + use_etag: bool = True + num_proc: Optional[int] = None + max_retries: int = 1 + token: Optional[Union[str, bool]] = None + storage_options: dict[str, Any] = field(default_factory=dict) + download_desc: Optional[str] = None + disable_tqdm: bool = False + + def copy(self) -> "DownloadConfig": + return self.__class__(**{k: copy.deepcopy(v) for k, v in self.__dict__.items()}) + + def __setattr__(self, name, value): + if name == "token" and getattr(self, "storage_options", None) is not None: + if "hf" not in self.storage_options: + self.storage_options["hf"] = {"endpoint": config.HF_ENDPOINT, "token": value} + else: + self.storage_options["hf"]["token"] = value + super().__setattr__(name, value) + + def __post_init__(self): + # update storage_options + self.token = self.token diff --git a/src/datasets/download/download_manager.py b/src/datasets/download/download_manager.py new file mode 100644 index 0000000..b3515bc --- /dev/null +++ b/src/datasets/download/download_manager.py @@ -0,0 +1,340 @@ +# Copyright 2020 The TensorFlow Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""Download manager interface.""" + +import enum +import io +import multiprocessing +import os +from datetime import datetime +from functools import partial +from typing import Optional, Union + +import fsspec +from fsspec.core import url_to_fs +from tqdm.contrib.concurrent import thread_map + +from .. import config +from ..utils import tqdm as hf_tqdm +from ..utils.file_utils import ( + ArchiveIterable, + FilesIterable, + cached_path, + is_relative_path, + stack_multiprocessing_download_progress_bars, + url_or_path_join, +) +from ..utils.info_utils import get_size_checksum_dict +from ..utils.logging import get_logger, tqdm +from ..utils.py_utils import NestedDataStructure, map_nested +from ..utils.track import tracked_str +from .download_config import DownloadConfig + + +logger = get_logger(__name__) + + +class DownloadMode(enum.Enum): + """`Enum` for how to treat pre-existing downloads and data. + + The default mode is `REUSE_DATASET_IF_EXISTS`, which will reuse both + raw downloads and the prepared dataset if they exist. + + The generations modes: + + | | Downloads | Dataset | + |-------------------------------------|-----------|---------| + | `REUSE_DATASET_IF_EXISTS` (default) | Reuse | Reuse | + | `REUSE_CACHE_IF_EXISTS` | Reuse | Fresh | + | `FORCE_REDOWNLOAD` | Fresh | Fresh | + + """ + + REUSE_DATASET_IF_EXISTS = "reuse_dataset_if_exists" + REUSE_CACHE_IF_EXISTS = "reuse_cache_if_exists" + FORCE_REDOWNLOAD = "force_redownload" + + +class DownloadManager: + is_streaming = False + + def __init__( + self, + dataset_name: Optional[str] = None, + data_dir: Optional[str] = None, + download_config: Optional[DownloadConfig] = None, + base_path: Optional[str] = None, + record_checksums=False, + ): + """Download manager constructor. + + Args: + data_dir: + can be used to specify a manual directory to get the files from. + dataset_name (`str`): + name of dataset this instance will be used for. If + provided, downloads will contain which datasets they were used for. + download_config (`DownloadConfig`): + to specify the cache directory and other + download options + base_path (`str`): + base path that is used when relative paths are used to + download files. This can be a remote url. + record_checksums (`bool`, defaults to `False`): + Whether to record the checksums of the downloaded files. If None, the value is inferred from the builder. + """ + self._dataset_name = dataset_name + self._data_dir = data_dir + self._base_path = base_path or os.path.abspath(".") + # To record what is being used: {url: {num_bytes: int, checksum: str}} + self._recorded_sizes_checksums: dict[str, dict[str, Optional[Union[int, str]]]] = {} + self.record_checksums = record_checksums + self.download_config = download_config or DownloadConfig() + self.downloaded_paths = {} + self.extracted_paths = {} + + @property + def manual_dir(self): + return self._data_dir + + @property + def downloaded_size(self): + """Returns the total size of downloaded files.""" + return sum(checksums_dict["num_bytes"] for checksums_dict in self._recorded_sizes_checksums.values()) + + def _record_sizes_checksums(self, url_or_urls: NestedDataStructure, downloaded_path_or_paths: NestedDataStructure): + """Record size/checksum of downloaded files.""" + delay = 5 + for url, path in hf_tqdm( + list(zip(url_or_urls.flatten(), downloaded_path_or_paths.flatten())), + delay=delay, + desc="Computing checksums", + ): + # call str to support PathLike objects + self._recorded_sizes_checksums[str(url)] = get_size_checksum_dict( + path, record_checksum=self.record_checksums + ) + + def download(self, url_or_urls): + """Download given URL(s). + + By default, only one process is used for download. Pass customized `download_config.num_proc` to change this behavior. + + Args: + url_or_urls (`str` or `list` or `dict`): + URL or `list` or `dict` of URLs to download. Each URL is a `str`. + + Returns: + `str` or `list` or `dict`: + The downloaded paths matching the given input `url_or_urls`. + + Example: + + ```py + >>> downloaded_files = dl_manager.download('https://storage.googleapis.com/seldon-datasets/sentence_polarity_v1/rt-polaritydata.tar.gz') + ``` + """ + download_config = self.download_config.copy() + download_config.extract_compressed_file = False + if download_config.download_desc is None: + download_config.download_desc = "Downloading data" + + download_func = partial(self._download_batched, download_config=download_config) + + start_time = datetime.now() + with stack_multiprocessing_download_progress_bars(): + downloaded_path_or_paths = map_nested( + download_func, + url_or_urls, + map_tuple=True, + num_proc=download_config.num_proc, + desc="Downloading data files", + batched=True, + batch_size=-1, + ) + duration = datetime.now() - start_time + logger.info(f"Downloading took {duration.total_seconds() // 60} min") + url_or_urls = NestedDataStructure(url_or_urls) + downloaded_path_or_paths = NestedDataStructure(downloaded_path_or_paths) + self.downloaded_paths.update(dict(zip(url_or_urls.flatten(), downloaded_path_or_paths.flatten()))) + + start_time = datetime.now() + self._record_sizes_checksums(url_or_urls, downloaded_path_or_paths) + duration = datetime.now() - start_time + logger.info(f"Checksum Computation took {duration.total_seconds() // 60} min") + + return downloaded_path_or_paths.data + + def _download_batched( + self, + url_or_filenames: list[str], + download_config: DownloadConfig, + ) -> list[str]: + if len(url_or_filenames) >= 16: + download_config = download_config.copy() + download_config.disable_tqdm = True + download_func = partial(self._download_single, download_config=download_config) + + fs: fsspec.AbstractFileSystem + path = str(url_or_filenames[0]) + if is_relative_path(path): + # append the relative path to the base_path + path = url_or_path_join(self._base_path, path) + fs, path = url_to_fs(path, **download_config.storage_options) + size = 0 + try: + size = fs.info(path).get("size", 0) + except Exception: + pass + max_workers = ( + config.HF_DATASETS_MULTITHREADING_MAX_WORKERS if size < (20 << 20) else 1 + ) # enable multithreading if files are small + + return thread_map( + download_func, + url_or_filenames, + desc=download_config.download_desc or "Downloading", + unit="files", + position=multiprocessing.current_process()._identity[-1] # contains the ranks of subprocesses + if os.environ.get("HF_DATASETS_STACK_MULTIPROCESSING_DOWNLOAD_PROGRESS_BARS") == "1" + and multiprocessing.current_process()._identity + else None, + max_workers=max_workers, + tqdm_class=tqdm, + ) + else: + return [ + self._download_single(url_or_filename, download_config=download_config) + for url_or_filename in url_or_filenames + ] + + def _download_single(self, url_or_filename: str, download_config: DownloadConfig) -> str: + url_or_filename = str(url_or_filename) + if is_relative_path(url_or_filename): + # append the relative path to the base_path + url_or_filename = url_or_path_join(self._base_path, url_or_filename) + out = cached_path(url_or_filename, download_config=download_config) + out = tracked_str(out) + out.set_origin(url_or_filename) + return out + + def iter_archive(self, path_or_buf: Union[str, io.BufferedReader]): + """Iterate over files within an archive. + + Args: + path_or_buf (`str` or `io.BufferedReader`): + Archive path or archive binary file object. + + Yields: + `tuple[str, io.BufferedReader]`: + 2-tuple (path_within_archive, file_object). + File object is opened in binary mode. + + Example: + + ```py + >>> archive = dl_manager.download('https://storage.googleapis.com/seldon-datasets/sentence_polarity_v1/rt-polaritydata.tar.gz') + >>> files = dl_manager.iter_archive(archive) + ``` + """ + + if hasattr(path_or_buf, "read"): + return ArchiveIterable.from_buf(path_or_buf) + else: + return ArchiveIterable.from_urlpath(path_or_buf) + + def iter_files(self, paths: Union[str, list[str]]): + """Iterate over file paths. + + Args: + paths (`str` or `list` of `str`): + Root paths. + + Yields: + `str`: File path. + + Example: + + ```py + >>> files = dl_manager.download_and_extract('https://huggingface.co/datasets/AI-Lab-Makerere/beans/resolve/main/data/train.zip') + >>> files = dl_manager.iter_files(files) + ``` + """ + return FilesIterable.from_urlpaths(paths) + + def extract(self, path_or_paths): + """Extract given path(s). + + Args: + path_or_paths (path or `list` or `dict`): + Path of file to extract. Each path is a `str`. + + Returns: + extracted_path(s): `str`, The extracted paths matching the given input + path_or_paths. + + Example: + + ```py + >>> downloaded_files = dl_manager.download('https://storage.googleapis.com/seldon-datasets/sentence_polarity_v1/rt-polaritydata.tar.gz') + >>> extracted_files = dl_manager.extract(downloaded_files) + ``` + """ + download_config = self.download_config.copy() + download_config.extract_compressed_file = True + extract_func = partial(self._download_single, download_config=download_config) + extracted_paths = map_nested( + extract_func, + path_or_paths, + num_proc=download_config.num_proc, + desc="Extracting data files", + ) + path_or_paths = NestedDataStructure(path_or_paths) + extracted_paths = NestedDataStructure(extracted_paths) + self.extracted_paths.update(dict(zip(path_or_paths.flatten(), extracted_paths.flatten()))) + return extracted_paths.data + + def download_and_extract(self, url_or_urls): + """Download and extract given `url_or_urls`. + + Is roughly equivalent to: + + ``` + extracted_paths = dl_manager.extract(dl_manager.download(url_or_urls)) + ``` + + Args: + url_or_urls (`str` or `list` or `dict`): + URL or `list` or `dict` of URLs to download and extract. Each URL is a `str`. + + Returns: + extracted_path(s): `str`, extracted paths of given URL(s). + """ + return self.extract(self.download(url_or_urls)) + + def get_recorded_sizes_checksums(self): + return self._recorded_sizes_checksums.copy() + + def delete_extracted_files(self): + paths_to_delete = set(self.extracted_paths.values()) - set(self.downloaded_paths.values()) + for key, path in list(self.extracted_paths.items()): + if path in paths_to_delete and os.path.isfile(path): + os.remove(path) + del self.extracted_paths[key] + + def manage_extracted_files(self): + if self.download_config.delete_extracted: + self.delete_extracted_files() diff --git a/src/datasets/download/streaming_download_manager.py b/src/datasets/download/streaming_download_manager.py new file mode 100644 index 0000000..bef1814 --- /dev/null +++ b/src/datasets/download/streaming_download_manager.py @@ -0,0 +1,219 @@ +import io +import os +from collections.abc import Iterable +from typing import Optional, Union + +from ..utils.file_utils import ( # noqa: F401 # backward compatibility + SINGLE_FILE_COMPRESSION_PROTOCOLS, + ArchiveIterable, + FilesIterable, + _get_extraction_protocol, + _get_path_extension, + _prepare_path_and_storage_options, + is_relative_path, + url_or_path_join, + xbasename, + xdirname, + xet_parse, + xexists, + xgetsize, + xglob, + xgzip_open, + xisdir, + xisfile, + xjoin, + xlistdir, + xnumpy_load, + xopen, + xpandas_read_csv, + xpandas_read_excel, + xPath, + xpyarrow_parquet_read_table, + xrelpath, + xsio_loadmat, + xsplit, + xsplitext, + xwalk, + xxml_dom_minidom_parse, +) +from ..utils.logging import get_logger +from ..utils.py_utils import map_nested +from .download_config import DownloadConfig + + +logger = get_logger(__name__) + + +class StreamingDownloadManager: + """ + Download manager that uses the "::" separator to navigate through (possibly remote) compressed archives. + Contrary to the regular `DownloadManager`, the `download` and `extract` methods don't actually download nor extract + data, but they rather return the path or url that could be opened using the `xopen` function which extends the + built-in `open` function to stream data from remote files. + """ + + is_streaming = True + + def __init__( + self, + dataset_name: Optional[str] = None, + data_dir: Optional[str] = None, + download_config: Optional[DownloadConfig] = None, + base_path: Optional[str] = None, + ): + self._dataset_name = dataset_name + self._data_dir = data_dir + self._base_path = base_path or os.path.abspath(".") + self.download_config = download_config or DownloadConfig() + self.downloaded_size = None + self.record_checksums = False + + @property + def manual_dir(self): + return self._data_dir + + def download(self, url_or_urls): + """Normalize URL(s) of files to stream data from. + This is the lazy version of `DownloadManager.download` for streaming. + + Args: + url_or_urls (`str` or `list` or `dict`): + URL(s) of files to stream data from. Each url is a `str`. + + Returns: + url(s): (`str` or `list` or `dict`), URL(s) to stream data from matching the given input url_or_urls. + + Example: + + ```py + >>> downloaded_files = dl_manager.download('https://storage.googleapis.com/seldon-datasets/sentence_polarity_v1/rt-polaritydata.tar.gz') + ``` + """ + url_or_urls = map_nested(self._download_single, url_or_urls, map_tuple=True) + return url_or_urls + + def _download_single(self, urlpath: str) -> str: + urlpath = str(urlpath) + if is_relative_path(urlpath): + # append the relative path to the base_path + urlpath = url_or_path_join(self._base_path, urlpath) + return urlpath + + def extract(self, url_or_urls): + """Add extraction protocol for given url(s) for streaming. + + This is the lazy version of `DownloadManager.extract` for streaming. + + Args: + url_or_urls (`str` or `list` or `dict`): + URL(s) of files to stream data from. Each url is a `str`. + + Returns: + url(s): (`str` or `list` or `dict`), URL(s) to stream data from matching the given input `url_or_urls`. + + Example: + + ```py + >>> downloaded_files = dl_manager.download('https://storage.googleapis.com/seldon-datasets/sentence_polarity_v1/rt-polaritydata.tar.gz') + >>> extracted_files = dl_manager.extract(downloaded_files) + ``` + """ + urlpaths = map_nested(self._extract, url_or_urls, map_tuple=True) + return urlpaths + + def _extract(self, urlpath: str) -> str: + urlpath = str(urlpath) + # get inner file: zip://train-00000.json.gz::https://foo.bar/data.zip -> zip://train-00000.json.gz + protocol = _get_extraction_protocol(urlpath, download_config=self.download_config) + path = urlpath.split("::")[0] + extension = _get_path_extension(path) + if extension in ["tgz", "tar"] or path.endswith((".tar.gz", ".tar.bz2", ".tar.xz")): + raise NotImplementedError( + f"Extraction protocol for TAR archives like '{urlpath}' is not implemented in streaming mode. " + f"Please use `dl_manager.iter_archive` instead.\n\n" + f"Example usage:\n\n" + f"\turl = dl_manager.download(url)\n" + f"\ttar_archive_iterator = dl_manager.iter_archive(url)\n\n" + f"\tfor filename, file in tar_archive_iterator:\n" + f"\t\t..." + ) + if protocol is None: + # no extraction + return urlpath + elif protocol in SINGLE_FILE_COMPRESSION_PROTOCOLS: + # there is one single file which is the uncompressed file + inner_file = os.path.basename(urlpath.split("::")[0]) + inner_file = inner_file[: inner_file.rindex(".")] if "." in inner_file else inner_file + return f"{protocol}://{inner_file}::{urlpath}" + else: + return f"{protocol}://::{urlpath}" + + def download_and_extract(self, url_or_urls): + """Prepare given `url_or_urls` for streaming (add extraction protocol). + + This is the lazy version of `DownloadManager.download_and_extract` for streaming. + + Is equivalent to: + + ``` + urls = dl_manager.extract(dl_manager.download(url_or_urls)) + ``` + + Args: + url_or_urls (`str` or `list` or `dict`): + URL(s) to stream from data from. Each url is a `str`. + + Returns: + url(s): (`str` or `list` or `dict`), URL(s) to stream data from matching the given input `url_or_urls`. + """ + return self.extract(self.download(url_or_urls)) + + def iter_archive(self, urlpath_or_buf: Union[str, io.BufferedReader]) -> Iterable[tuple]: + """Iterate over files within an archive. + + Args: + urlpath_or_buf (`str` or `io.BufferedReader`): + Archive path or archive binary file object. + + Yields: + `tuple[str, io.BufferedReader]`: + 2-tuple (path_within_archive, file_object). + File object is opened in binary mode. + + Example: + + ```py + >>> archive = dl_manager.download('https://storage.googleapis.com/seldon-datasets/sentence_polarity_v1/rt-polaritydata.tar.gz') + >>> files = dl_manager.iter_archive(archive) + ``` + """ + + if hasattr(urlpath_or_buf, "read"): + return ArchiveIterable.from_buf(urlpath_or_buf) + else: + return ArchiveIterable.from_urlpath(urlpath_or_buf, download_config=self.download_config) + + def iter_files(self, urlpaths: Union[str, list[str]]) -> Iterable[str]: + """Iterate over files. + + Args: + urlpaths (`str` or `list` of `str`): + Root paths. + + Yields: + str: File URL path. + + Example: + + ```py + >>> files = dl_manager.download_and_extract('https://huggingface.co/datasets/AI-Lab-Makerere/beans/resolve/main/data/train.zip') + >>> files = dl_manager.iter_files(files) + ``` + """ + return FilesIterable.from_urlpaths(urlpaths, download_config=self.download_config) + + def manage_extracted_files(self): + pass + + def get_recorded_sizes_checksums(self): + pass diff --git a/src/datasets/exceptions.py b/src/datasets/exceptions.py new file mode 100644 index 0000000..7c1724f --- /dev/null +++ b/src/datasets/exceptions.py @@ -0,0 +1,119 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright 2023 The HuggingFace Authors. +from typing import Any, Optional, Union + +from huggingface_hub import HfFileSystem + +from . import config +from .table import CastError +from .utils.track import TrackedIterableFromGenerator, tracked_list, tracked_str + + +class DatasetsError(Exception): + """Base class for exceptions in this library.""" + + +class DefunctDatasetError(DatasetsError): + """The dataset has been defunct.""" + + +class FileNotFoundDatasetsError(DatasetsError, FileNotFoundError): + """FileNotFoundError raised by this library.""" + + +class DataFilesNotFoundError(FileNotFoundDatasetsError): + """No (supported) data files found.""" + + +class DatasetNotFoundError(FileNotFoundDatasetsError): + """Dataset not found. + + Raised when trying to access: + - a missing dataset, or + - a private/gated dataset and the user is not authenticated. + """ + + +class DatasetBuildError(DatasetsError): + pass + + +class ManualDownloadError(DatasetBuildError): + pass + + +class FileFormatError(DatasetBuildError): + pass + + +class DatasetGenerationError(DatasetBuildError): + pass + + +class DatasetGenerationCastError(DatasetGenerationError): + @classmethod + def from_cast_error( + cls, + cast_error: CastError, + builder_name: str, + gen_kwargs: dict[str, Any], + token: Optional[Union[bool, str]], + ) -> "DatasetGenerationCastError": + explanation_message = ( + f"\n\nAll the data files must have the same columns, but at some point {cast_error.details()}" + ) + formatted_tracked_gen_kwargs: list[str] = [] + for gen_kwarg in gen_kwargs.values(): + if not isinstance(gen_kwarg, (tracked_str, tracked_list, TrackedIterableFromGenerator)): + continue + while ( + isinstance(gen_kwarg, (tracked_list, TrackedIterableFromGenerator)) and gen_kwarg.last_item is not None + ): + gen_kwarg = gen_kwarg.last_item + if isinstance(gen_kwarg, tracked_str): + gen_kwarg = gen_kwarg.get_origin() + if isinstance(gen_kwarg, str) and gen_kwarg.startswith("hf://"): + resolved_path = HfFileSystem(endpoint=config.HF_ENDPOINT, token=token).resolve_path(gen_kwarg) + gen_kwarg = "hf://" + resolved_path.unresolve() + if "@" + resolved_path.revision in gen_kwarg: + gen_kwarg = ( + gen_kwarg.replace("@" + resolved_path.revision, "", 1) + + f" (at revision {resolved_path.revision})" + ) + formatted_tracked_gen_kwargs.append(str(gen_kwarg)) + if formatted_tracked_gen_kwargs: + explanation_message += f"\n\nThis happened while the {builder_name} dataset builder was generating data using\n\n{', '.join(formatted_tracked_gen_kwargs)}" + help_message = "\n\nPlease either edit the data files to have matching columns, or separate them into different configurations (see docs at https://hf.co/docs/hub/datasets-manual-configuration#multiple-configurations)" + return cls("An error occurred while generating the dataset" + explanation_message + help_message) + + +class ChecksumVerificationError(DatasetsError): + """Error raised during checksums verifications of downloaded files.""" + + +class UnexpectedDownloadedFileError(ChecksumVerificationError): + """Some downloaded files were not expected.""" + + +class ExpectedMoreDownloadedFilesError(ChecksumVerificationError): + """Some files were supposed to be downloaded but were not.""" + + +class NonMatchingChecksumError(ChecksumVerificationError): + """The downloaded file checksum don't match the expected checksum.""" + + +class SplitsVerificationError(DatasetsError): + """Error raised during splits verifications.""" + + +class UnexpectedSplitsError(SplitsVerificationError): + """The expected splits of the downloaded file is missing.""" + + +class ExpectedMoreSplitsError(SplitsVerificationError): + """Some recorded splits are missing.""" + + +class NonMatchingSplitsSizesError(SplitsVerificationError): + """The splits sizes don't match the expected splits sizes.""" diff --git a/src/datasets/features/__init__.py b/src/datasets/features/__init__.py new file mode 100644 index 0000000..163aaa0 --- /dev/null +++ b/src/datasets/features/__init__.py @@ -0,0 +1,29 @@ +__all__ = [ + "Audio", + "Array2D", + "Array3D", + "Array4D", + "Array5D", + "ClassLabel", + "Features", + "Json", + "LargeList", + "List", + "Sequence", + "Value", + "Image", + "Mesh", + "Translation", + "TranslationVariableLanguages", + "Video", + "Pdf", + "Nifti", +] +from .audio import Audio +from .features import Array2D, Array3D, Array4D, Array5D, ClassLabel, Features, Json, LargeList, List, Sequence, Value +from .image import Image +from .mesh import Mesh +from .nifti import Nifti +from .pdf import Pdf +from .translation import Translation, TranslationVariableLanguages +from .video import Video diff --git a/src/datasets/features/_torchcodec.py b/src/datasets/features/_torchcodec.py new file mode 100644 index 0000000..d71b415 --- /dev/null +++ b/src/datasets/features/_torchcodec.py @@ -0,0 +1,15 @@ +import numpy as np +from torchcodec.decoders import AudioDecoder as _AudioDecoder + + +class AudioDecoder(_AudioDecoder): + def __getitem__(self, key: str): + if key == "array": + y = self.get_all_samples().data.cpu().numpy() + return np.mean(y, axis=tuple(range(y.ndim - 1))) if y.ndim > 1 else y + elif key == "sampling_rate": + return self.get_samples_played_in_range(0, 0).sample_rate + elif hasattr(super(), "__getitem__"): + return super().__getitem__(key) + else: + raise TypeError("'torchcodec.decoders.AudioDecoder' object is not subscriptable") diff --git a/src/datasets/features/audio.py b/src/datasets/features/audio.py new file mode 100644 index 0000000..ac2ddee --- /dev/null +++ b/src/datasets/features/audio.py @@ -0,0 +1,365 @@ +import os +from dataclasses import dataclass, field +from io import BytesIO +from pathlib import Path +from typing import TYPE_CHECKING, Any, ClassVar, Optional, Union + +import numpy as np +import pyarrow as pa + +from .. import config +from ..download.download_config import DownloadConfig +from ..table import array_cast +from ..utils.file_utils import is_local_path, is_remote_url, xopen +from ..utils.py_utils import no_op_if_value_is_null, string_to_dict + + +if TYPE_CHECKING: + from torchcodec.decoders import AudioDecoder + + from .features import FeatureType + + +@dataclass +class Audio: + """Audio [`Feature`] to extract audio data from an audio file. + + Input: The Audio feature accepts as input: + - A `str`: Absolute path to the audio file (i.e. random access is allowed). + - A `pathlib.Path`: path to the audio file (i.e. random access is allowed). + - A `dict` with the keys: + + - `path`: String with relative path of the audio file to the archive file. + - `bytes`: Bytes content of the audio file. + + This is useful for parquet or webdataset files which embed audio files. + + - A `dict` with the keys: + + - `array`: Array containing the audio sample + - `sampling_rate`: Integer corresponding to the sampling rate of the audio sample. + + - A `torchcodec.decoders.AudioDecoder`: torchcodec audio decoder object. + + Output: The Audio features output data as `torchcodec.decoders.AudioDecoder` objects, with additional keys: + + - `array`: Array containing the audio sample + - `sampling_rate`: Integer corresponding to the sampling rate of the audio sample. + + Args: + sampling_rate (`int`, *optional*): + Target sampling rate. If `None`, the native sampling rate is used. + num_channels (`int`, *optional*): + The desired number of channels of the samples. By default, the number of channels of the source is used. + Audio decoding will return samples with shape (num_channels, num_samples) + Currently `None` (number of channels of the source, default), `1` (mono) or `2` (stereo) channels are supported. + The `num_channels` argument is passed to `torchcodec.decoders.AudioDecoder`. + + + decode (`bool`, defaults to `True`): + Whether to decode the audio data. If `False`, + returns the underlying dictionary in the format `{"path": audio_path, "bytes": audio_bytes}`. + stream_index (`int`, *optional*): + The streaming index to use from the file. If `None` defaults to the "best" index. + + Example: + + ```py + >>> from datasets import load_dataset, Audio + >>> ds = load_dataset("PolyAI/minds14", name="en-US", split="train") + >>> ds = ds.cast_column("audio", Audio(sampling_rate=44100, num_channels=2)) + >>> ds[0]["audio"] + + >>> audio = ds[0]["audio"] + >>> audio.get_samples_played_in_range(0, 10) + AudioSamples: + data (shape): torch.Size([2, 110592]) + pts_seconds: 0.0 + duration_seconds: 2.507755102040816 + sample_rate: 44100 + ``` + """ + + sampling_rate: Optional[int] = None + decode: bool = True + num_channels: Optional[int] = None + stream_index: Optional[int] = None + id: Optional[str] = field(default=None, repr=False) + # Automatically constructed + dtype: ClassVar[str] = "dict" + pa_type: ClassVar[Any] = pa.struct({"bytes": pa.binary(), "path": pa.string()}) + _type: str = field(default="Audio", init=False, repr=False) + + def __call__(self): + return self.pa_type + + def encode_example(self, value: Union[str, bytes, bytearray, dict, "AudioDecoder"]) -> dict: + """Encode example into a format for Arrow. + + Args: + value (`str`, `bytes`,`bytearray`,`dict`, `AudioDecoder`): + Data passed as input to Audio feature. + + Returns: + `dict` + """ + try: + import torch + from torchcodec.encoders import AudioEncoder # needed to write audio files + except ImportError as err: + raise ImportError("To support encoding audio data, please install 'torchcodec'.") from err + + if value is None: + raise ValueError("value must be provided") + + if config.TORCHCODEC_AVAILABLE: + from torchcodec.decoders import AudioDecoder + + else: + AudioDecoder = None + + if isinstance(value, str): + return {"bytes": None, "path": value} + elif isinstance(value, Path): + return {"bytes": None, "path": str(value.absolute())} + elif isinstance(value, (bytes, bytearray)): + return {"bytes": value, "path": None} + elif AudioDecoder is not None and isinstance(value, AudioDecoder): + return encode_torchcodec_audio(value) + elif "array" in value: + # convert the audio array to wav bytes + buffer = BytesIO() + AudioEncoder( + torch.from_numpy(value["array"].astype(np.float32)), sample_rate=value["sampling_rate"] + ).to_file_like(buffer, format="wav", num_channels=self.num_channels) + return {"bytes": buffer.getvalue(), "path": None} + elif value.get("path") is not None and os.path.isfile(value["path"]): + # we set "bytes": None to not duplicate the data if they're already available locally + if value["path"].endswith("pcm"): + # "PCM" only has raw audio bytes + if value.get("sampling_rate") is None: + # At least, If you want to convert "PCM-byte" to "WAV-byte", you have to know sampling rate + raise KeyError("To use PCM files, please specify a 'sampling_rate' in Audio object") + if value.get("bytes"): + # If we already had PCM-byte, we don`t have to make "read file, make bytes" (just use it!) + bytes_value = np.frombuffer(value["bytes"], dtype=np.int16).astype(np.float32) / 32767 + else: + bytes_value = np.memmap(value["path"], dtype="h", mode="r").astype(np.float32) / 32767 + + buffer = BytesIO() + AudioEncoder(torch.from_numpy(bytes_value), sample_rate=value["sampling_rate"]).to_file_like( + buffer, format="wav", num_channels=self.num_channels + ) + return {"bytes": buffer.getvalue(), "path": None} + else: + return {"bytes": None, "path": value.get("path")} + elif value.get("bytes") is not None or value.get("path") is not None: + # store the audio bytes, and path is used to infer the audio format using the file extension + return {"bytes": value.get("bytes"), "path": value.get("path")} + else: + raise ValueError( + f"An audio sample should have one of 'path' or 'bytes' but they are missing or None in {value}." + ) + + def decode_example( + self, value: dict, token_per_repo_id: Optional[dict[str, Union[str, bool, None]]] = None + ) -> "AudioDecoder": + """Decode example audio file into audio data. + + Args: + value (`dict`): + A dictionary with keys: + + - `path`: String with relative audio file path. + - `bytes`: Bytes of the audio file. + token_per_repo_id (`dict`, *optional*): + To access and decode + audio files from private repositories on the Hub, you can pass + a dictionary repo_id (`str`) -> token (`bool` or `str`) + + Returns: + `torchcodec.decoders.AudioDecoder` + """ + if config.TORCHCODEC_AVAILABLE: + from ._torchcodec import AudioDecoder + else: + raise ImportError("To support decoding audio data, please install 'torchcodec'.") + + if not self.decode: + raise RuntimeError("Decoding is disabled for this feature. Please use Audio(decode=True) instead.") + + path, bytes = (value["path"], value["bytes"]) if value["bytes"] is not None else (value["path"], None) + if path is None and bytes is None: + raise ValueError(f"An audio sample should have one of 'path' or 'bytes' but both are None in {value}.") + + if bytes is None and is_local_path(path): + audio = AudioDecoder( + path, stream_index=self.stream_index, sample_rate=self.sampling_rate, num_channels=self.num_channels + ) + + elif bytes is None: + token_per_repo_id = token_per_repo_id or {} + source_url = path.split("::")[-1] + pattern = ( + config.HUB_DATASETS_URL if source_url.startswith(config.HF_ENDPOINT) else config.HUB_DATASETS_HFFS_URL + ) + source_url_fields = string_to_dict(source_url, pattern) + token = token_per_repo_id.get(source_url_fields["repo_id"]) if source_url_fields is not None else None + + download_config = DownloadConfig(token=token) + f = xopen(path, "rb", download_config=download_config) + audio = AudioDecoder( + f, stream_index=self.stream_index, sample_rate=self.sampling_rate, num_channels=self.num_channels + ) + + else: + audio = AudioDecoder( + bytes, stream_index=self.stream_index, sample_rate=self.sampling_rate, num_channels=self.num_channels + ) + audio._hf_encoded = {"path": path, "bytes": bytes} + audio.metadata.path = path + return audio + + def flatten(self) -> Union["FeatureType", dict[str, "FeatureType"]]: + """If in the decodable state, raise an error, otherwise flatten the feature into a dictionary.""" + from .features import Value + + if self.decode: + raise ValueError("Cannot flatten a decoded Audio feature.") + return { + "bytes": Value("binary"), + "path": Value("string"), + } + + def cast_storage(self, storage: Union[pa.StringArray, pa.StructArray]) -> pa.StructArray: + """Cast an Arrow array to the Audio arrow storage type. + The Arrow types that can be converted to the Audio pyarrow storage type are: + + - `pa.string()` - it must contain the "path" data + - `pa.binary()` - it must contain the audio bytes + - `pa.struct({"bytes": pa.binary()})` + - `pa.struct({"path": pa.string()})` + - `pa.struct({"bytes": pa.binary(), "path": pa.string()})` - order doesn't matter + + Args: + storage (`Union[pa.StringArray, pa.StructArray]`): + PyArrow array to cast. + + Returns: + `pa.StructArray`: Array in the Audio arrow storage type, that is + `pa.struct({"bytes": pa.binary(), "path": pa.string()})` + """ + if pa.types.is_string(storage.type): + bytes_array = pa.array([None] * len(storage), type=pa.binary()) + storage = pa.StructArray.from_arrays([bytes_array, storage], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_large_binary(storage.type): + storage = array_cast( + storage, pa.binary() + ) # this can fail in case of big audios, paths should be used instead + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays([storage, path_array], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_binary(storage.type): + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays([storage, path_array], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_struct(storage.type) and storage.type.get_all_field_indices("array"): + storage = pa.array( + [Audio().encode_example(x) if x is not None else None for x in storage.to_numpy(zero_copy_only=False)] + ) + elif pa.types.is_struct(storage.type): + if storage.type.get_field_index("bytes") >= 0: + bytes_array = storage.field("bytes") + else: + bytes_array = pa.array([None] * len(storage), type=pa.binary()) + if storage.type.get_field_index("path") >= 0: + path_array = storage.field("path") + else: + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays([bytes_array, path_array], ["bytes", "path"], mask=storage.is_null()) + return array_cast(storage, self.pa_type) + + def embed_storage( + self, storage: pa.StructArray, token_per_repo_id=None, local_files: bool = True, remote_files: bool = True + ) -> pa.StructArray: + """Embed audio files into the Arrow array. + + Args: + storage (`pa.StructArray`): + PyArrow array to embed. + token_per_repo_id (`dict`, optional): + Dictionary repo_id -> token to fetch the files bytes. + local_files (`bool`, defaults to `True`) + Whether to embed local files data in the array + + + remote_files (`bool`, defaults to `True`) + Whether to embed remote files data in the array. + E.g. files with paths that start with hf:// or https:// + + + + Returns: + `pa.StructArray`: Array in the Audio arrow storage type, that is + `pa.struct({"bytes": pa.binary(), "path": pa.string()})`. + """ + if token_per_repo_id is None: + token_per_repo_id = {} + + @no_op_if_value_is_null + def path_to_bytes(path): + source_url = path.split("::")[-1] + pattern = ( + config.HUB_DATASETS_URL if source_url.startswith(config.HF_ENDPOINT) else config.HUB_DATASETS_HFFS_URL + ) + source_url_fields = string_to_dict(source_url, pattern) + token = token_per_repo_id.get(source_url_fields["repo_id"]) if source_url_fields is not None else None + download_config = DownloadConfig(token=token) + with xopen(path, "rb", download_config=download_config) as f: + return f.read() + + bytes_array = pa.array( + [ + ( + path_to_bytes(x["path"]) + if x["bytes"] is None + and ((local_files and is_local_path(x["path"])) or (remote_files and is_remote_url(x["path"]))) + else x["bytes"] + ) + if x is not None + else None + for x in storage.to_pylist() + ], + type=pa.binary(), + ) + path_array = pa.array( + [ + ( + os.path.basename(path) + if (local_files and is_local_path(path)) or (remote_files and is_remote_url(path)) + else path + ) + if path is not None + else None + for path in storage.field("path").to_pylist() + ], + type=pa.string(), + ) + storage = pa.StructArray.from_arrays([bytes_array, path_array], ["bytes", "path"], mask=storage.is_null()) + return array_cast(storage, self.pa_type) + + +def encode_torchcodec_audio(audio: "AudioDecoder") -> dict: + if hasattr(audio, "_hf_encoded"): + return audio._hf_encoded + else: + try: + from torchcodec.encoders import AudioEncoder # needed to write audio files + except ImportError as err: + raise ImportError("To support encoding audio data, please install 'torchcodec'.") from err + + samples = audio.get_all_samples() + buffer = BytesIO() + num_channels = samples.data.shape[0] + AudioEncoder(samples.data.cpu(), sample_rate=samples.sample_rate).to_file_like( + buffer, format="wav", num_channels=num_channels + ) + return {"bytes": buffer.getvalue(), "path": None} diff --git a/src/datasets/features/features.py b/src/datasets/features/features.py new file mode 100644 index 0000000..17b3d44 --- /dev/null +++ b/src/datasets/features/features.py @@ -0,0 +1,2449 @@ +# Copyright 2020 The HuggingFace Datasets Authors and the TensorFlow Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""This class handle features definition in datasets and some utilities to display table type.""" + +import copy +import json +import re +import sys +from collections.abc import Iterable, Mapping +from collections.abc import Sequence as SequenceABC +from collections.abc import Sequence as Sequence_ +from dataclasses import InitVar, dataclass, field, fields +from functools import reduce, wraps +from operator import mul +from typing import Any, Callable, ClassVar, Literal, Optional, Union + +import numpy as np +import pandas as pd +import pyarrow as pa +import pyarrow.compute as pc +import pyarrow.types +from pandas.api.extensions import ExtensionArray as PandasExtensionArray +from pandas.api.extensions import ExtensionDtype as PandasExtensionDtype + +from .. import config +from ..naming import camelcase_to_snakecase, snakecase_to_camelcase +from ..table import array_cast +from ..utils import experimental, logging +from ..utils.json import ujson_dumps, ujson_loads +from ..utils.py_utils import asdict, first_non_null_value, zip_dict +from .audio import Audio +from .image import Image, encode_pil_image +from .mesh import Mesh +from .nifti import Nifti, encode_nibabel_image +from .pdf import Pdf, encode_pdfplumber_pdf +from .translation import Translation, TranslationVariableLanguages +from .video import Video + + +logger = logging.get_logger(__name__) + + +def _arrow_to_datasets_dtype(arrow_type: pa.DataType) -> str: + """ + _arrow_to_datasets_dtype takes a pyarrow.DataType and converts it to a datasets string dtype. + In effect, `dt == string_to_arrow(_arrow_to_datasets_dtype(dt))` + """ + if pyarrow.types.is_null(arrow_type): + return "null" + elif pyarrow.types.is_boolean(arrow_type): + return "bool" + elif pyarrow.types.is_int8(arrow_type): + return "int8" + elif pyarrow.types.is_int16(arrow_type): + return "int16" + elif pyarrow.types.is_int32(arrow_type): + return "int32" + elif pyarrow.types.is_int64(arrow_type): + return "int64" + elif pyarrow.types.is_uint8(arrow_type): + return "uint8" + elif pyarrow.types.is_uint16(arrow_type): + return "uint16" + elif pyarrow.types.is_uint32(arrow_type): + return "uint32" + elif pyarrow.types.is_uint64(arrow_type): + return "uint64" + elif pyarrow.types.is_float16(arrow_type): + return "float16" # pyarrow dtype is "halffloat" + elif pyarrow.types.is_float32(arrow_type): + return "float32" # pyarrow dtype is "float" + elif pyarrow.types.is_float64(arrow_type): + return "float64" # pyarrow dtype is "double" + elif pyarrow.types.is_time32(arrow_type): + return f"time32[{pa.type_for_alias(str(arrow_type)).unit}]" + elif pyarrow.types.is_time64(arrow_type): + return f"time64[{pa.type_for_alias(str(arrow_type)).unit}]" + elif pyarrow.types.is_timestamp(arrow_type): + if arrow_type.tz is None: + return f"timestamp[{arrow_type.unit}]" + elif arrow_type.tz: + return f"timestamp[{arrow_type.unit}, tz={arrow_type.tz}]" + else: + raise ValueError(f"Unexpected timestamp object {arrow_type}.") + elif pyarrow.types.is_date32(arrow_type): + return "date32" # pyarrow dtype is "date32[day]" + elif pyarrow.types.is_date64(arrow_type): + return "date64" # pyarrow dtype is "date64[ms]" + elif pyarrow.types.is_duration(arrow_type): + return f"duration[{arrow_type.unit}]" + elif pyarrow.types.is_decimal128(arrow_type): + return f"decimal128({arrow_type.precision}, {arrow_type.scale})" + elif pyarrow.types.is_decimal256(arrow_type): + return f"decimal256({arrow_type.precision}, {arrow_type.scale})" + elif pyarrow.types.is_binary(arrow_type): + return "binary" + elif pyarrow.types.is_large_binary(arrow_type): + return "large_binary" + elif pyarrow.types.is_binary_view(arrow_type): + return "binary_view" + elif pyarrow.types.is_string(arrow_type): + return "string" + elif pyarrow.types.is_large_string(arrow_type): + return "large_string" + elif pyarrow.types.is_string_view(arrow_type): + return "string_view" + elif pyarrow.types.is_dictionary(arrow_type): + return _arrow_to_datasets_dtype(arrow_type.value_type) + else: + raise ValueError(f"Arrow type {arrow_type} does not have a datasets dtype equivalent.") + + +def string_to_arrow(datasets_dtype: str) -> pa.DataType: + """ + string_to_arrow takes a datasets string dtype and converts it to a pyarrow.DataType. + + In effect, `dt == string_to_arrow(_arrow_to_datasets_dtype(dt))` + + This is necessary because the datasets.Value() primitive type is constructed using a string dtype + + Value(dtype=str) + + But Features.type (via `get_nested_type()` expects to resolve Features into a pyarrow Schema, + which means that each Value() must be able to resolve into a corresponding pyarrow.DataType, which is the + purpose of this function. + """ + if datasets_dtype == "json": + raise ValueError("'json' is not a valid dtype, use the Json() feature instead") + + def _dtype_error_msg(dtype, pa_dtype, examples=None, urls=None): + msg = f"{dtype} is not a validly formatted string representation of the pyarrow {pa_dtype} type." + if examples: + examples = ", ".join(examples[:-1]) + " or " + examples[-1] if len(examples) > 1 else examples[0] + msg += f"\nValid examples include: {examples}." + if urls: + urls = ", ".join(urls[:-1]) + " and " + urls[-1] if len(urls) > 1 else urls[0] + msg += f"\nFor more insformation, see: {urls}." + return msg + + if datasets_dtype in pa.__dict__: + return pa.__dict__[datasets_dtype]() + + if (datasets_dtype + "_") in pa.__dict__: + return pa.__dict__[datasets_dtype + "_"]() + + timestamp_matches = re.search(r"^timestamp\[(.*)\]$", datasets_dtype) + if timestamp_matches: + timestamp_internals = timestamp_matches.group(1) + internals_matches = re.search(r"^(s|ms|us|ns),\s*tz=([a-zA-Z0-9/_+\-:]*)$", timestamp_internals) + if timestamp_internals in ["s", "ms", "us", "ns"]: + return pa.timestamp(timestamp_internals) + elif internals_matches: + return pa.timestamp(internals_matches.group(1), internals_matches.group(2)) + else: + raise ValueError( + _dtype_error_msg( + datasets_dtype, + "timestamp", + examples=["timestamp[us]", "timestamp[us, tz=America/New_York"], + urls=["https://arrow.apache.org/docs/python/generated/pyarrow.timestamp.html"], + ) + ) + + duration_matches = re.search(r"^duration\[(.*)\]$", datasets_dtype) + if duration_matches: + duration_internals = duration_matches.group(1) + if duration_internals in ["s", "ms", "us", "ns"]: + return pa.duration(duration_internals) + else: + raise ValueError( + _dtype_error_msg( + datasets_dtype, + "duration", + examples=["duration[s]", "duration[us]"], + urls=["https://arrow.apache.org/docs/python/generated/pyarrow.duration.html"], + ) + ) + + time_matches = re.search(r"^time(.*)\[(.*)\]$", datasets_dtype) + if time_matches: + time_internals_bits = time_matches.group(1) + if time_internals_bits == "32": + time_internals_unit = time_matches.group(2) + if time_internals_unit in ["s", "ms"]: + return pa.time32(time_internals_unit) + else: + raise ValueError( + f"{time_internals_unit} is not a valid unit for the pyarrow time32 type. Supported units: s (second) and ms (millisecond)." + ) + elif time_internals_bits == "64": + time_internals_unit = time_matches.group(2) + if time_internals_unit in ["us", "ns"]: + return pa.time64(time_internals_unit) + else: + raise ValueError( + f"{time_internals_unit} is not a valid unit for the pyarrow time64 type. Supported units: us (microsecond) and ns (nanosecond)." + ) + else: + raise ValueError( + _dtype_error_msg( + datasets_dtype, + "time", + examples=["time32[s]", "time64[us]"], + urls=[ + "https://arrow.apache.org/docs/python/generated/pyarrow.time32.html", + "https://arrow.apache.org/docs/python/generated/pyarrow.time64.html", + ], + ) + ) + + decimal_matches = re.search(r"^decimal(.*)\((.*)\)$", datasets_dtype) + if decimal_matches: + decimal_internals_bits = decimal_matches.group(1) + if decimal_internals_bits == "128": + decimal_internals_precision_and_scale = re.search(r"^(\d+),\s*(-?\d+)$", decimal_matches.group(2)) + if decimal_internals_precision_and_scale: + precision = decimal_internals_precision_and_scale.group(1) + scale = decimal_internals_precision_and_scale.group(2) + return pa.decimal128(int(precision), int(scale)) + else: + raise ValueError( + _dtype_error_msg( + datasets_dtype, + "decimal128", + examples=["decimal128(10, 2)", "decimal128(4, -2)"], + urls=["https://arrow.apache.org/docs/python/generated/pyarrow.decimal128.html"], + ) + ) + elif decimal_internals_bits == "256": + decimal_internals_precision_and_scale = re.search(r"^(\d+),\s*(-?\d+)$", decimal_matches.group(2)) + if decimal_internals_precision_and_scale: + precision = decimal_internals_precision_and_scale.group(1) + scale = decimal_internals_precision_and_scale.group(2) + return pa.decimal256(int(precision), int(scale)) + else: + raise ValueError( + _dtype_error_msg( + datasets_dtype, + "decimal256", + examples=["decimal256(30, 2)", "decimal256(38, -4)"], + urls=["https://arrow.apache.org/docs/python/generated/pyarrow.decimal256.html"], + ) + ) + else: + raise ValueError( + _dtype_error_msg( + datasets_dtype, + "decimal", + examples=["decimal128(12, 3)", "decimal256(40, 6)"], + urls=[ + "https://arrow.apache.org/docs/python/generated/pyarrow.decimal128.html", + "https://arrow.apache.org/docs/python/generated/pyarrow.decimal256.html", + ], + ) + ) + + raise ValueError( + f"Neither {datasets_dtype} nor {datasets_dtype + '_'} seems to be a pyarrow data type. " + f"Please make sure to use a correct data type, see: " + f"https://arrow.apache.org/docs/python/api/datatypes.html#factory-functions" + ) + + +def _cast_to_python_objects(obj: Any, only_1d_for_numpy: bool, optimize_list_casting: bool) -> tuple[Any, bool]: + """ + Cast pytorch/tensorflow/pandas objects to python numpy array/lists. + It works recursively. + + If `optimize_list_casting` is True, to avoid iterating over possibly long lists, it first checks (recursively) if the first element that is not None or empty (if it is a sequence) has to be casted. + If the first element needs to be casted, then all the elements of the list will be casted, otherwise they'll stay the same. + This trick allows to cast objects that contain tokenizers outputs without iterating over every single token for example. + + Args: + obj: the object (nested struct) to cast. + only_1d_for_numpy (bool): whether to keep the full multi-dim tensors as multi-dim numpy arrays, or convert them to + nested lists of 1-dimensional numpy arrays. This can be useful to keep only 1-d arrays to instantiate Arrow arrays. + Indeed Arrow only support converting 1-dimensional array values. + optimize_list_casting (bool): whether to optimize list casting by checking the first non-null element to see if it needs to be casted + and if it doesn't, not checking the rest of the list elements. + + Returns: + casted_obj: the casted object + has_changed (bool): True if the object has been changed, False if it is identical + """ + + if config.TF_AVAILABLE and "tensorflow" in sys.modules: + import tensorflow as tf + + if config.TORCH_AVAILABLE and "torch" in sys.modules: + import torch + + if config.JAX_AVAILABLE and "jax" in sys.modules: + import jax.numpy as jnp + + if config.PIL_AVAILABLE and "PIL" in sys.modules: + import PIL.Image + + if config.PDFPLUMBER_AVAILABLE and "pdfplumber" in sys.modules: + import pdfplumber + + if config.NIBABEL_AVAILABLE and "nibabel" in sys.modules: + import nibabel as nib + + if config.TORCHCODEC_AVAILABLE and "torchcodec" in sys.modules: + from torchcodec.decoders import AudioDecoder, VideoDecoder + + if isinstance(obj, np.ndarray): + if obj.ndim == 0: + return obj[()], True + elif not only_1d_for_numpy or obj.ndim == 1: + return obj, False + else: + return ( + [ + _cast_to_python_objects( + x, only_1d_for_numpy=only_1d_for_numpy, optimize_list_casting=optimize_list_casting + )[0] + for x in obj + ], + True, + ) + elif config.TORCH_AVAILABLE and "torch" in sys.modules and isinstance(obj, torch.Tensor): + if obj.dtype == torch.bfloat16: + return _cast_to_python_objects( + obj.detach().to(torch.float).cpu().numpy(), + only_1d_for_numpy=only_1d_for_numpy, + optimize_list_casting=optimize_list_casting, + )[0], True + if obj.ndim == 0: + return obj.detach().cpu().numpy()[()], True + elif not only_1d_for_numpy or obj.ndim == 1: + return obj.detach().cpu().numpy(), True + else: + return ( + [ + _cast_to_python_objects( + x, only_1d_for_numpy=only_1d_for_numpy, optimize_list_casting=optimize_list_casting + )[0] + for x in obj.detach().cpu().numpy() + ], + True, + ) + elif config.TF_AVAILABLE and "tensorflow" in sys.modules and isinstance(obj, tf.Tensor): + if obj.ndim == 0: + return obj.numpy()[()], True + elif not only_1d_for_numpy or obj.ndim == 1: + return obj.numpy(), True + else: + return ( + [ + _cast_to_python_objects( + x, only_1d_for_numpy=only_1d_for_numpy, optimize_list_casting=optimize_list_casting + )[0] + for x in obj.numpy() + ], + True, + ) + elif config.JAX_AVAILABLE and "jax" in sys.modules and isinstance(obj, jnp.ndarray): + if obj.ndim == 0: + return np.asarray(obj)[()], True + elif not only_1d_for_numpy or obj.ndim == 1: + return np.asarray(obj), True + else: + return ( + [ + _cast_to_python_objects( + x, only_1d_for_numpy=only_1d_for_numpy, optimize_list_casting=optimize_list_casting + )[0] + for x in np.asarray(obj) + ], + True, + ) + elif config.PIL_AVAILABLE and "PIL" in sys.modules and isinstance(obj, PIL.Image.Image): + return encode_pil_image(obj), True + elif config.PDFPLUMBER_AVAILABLE and "pdfplumber" in sys.modules and isinstance(obj, pdfplumber.pdf.PDF): + return encode_pdfplumber_pdf(obj), True + elif config.NIBABEL_AVAILABLE and "nibabel" in sys.modules and isinstance(obj, nib.analyze.AnalyzeImage): + return encode_nibabel_image(obj, force_bytes=True), True + elif isinstance(obj, pd.Series): + return ( + _cast_to_python_objects( + obj.tolist(), only_1d_for_numpy=only_1d_for_numpy, optimize_list_casting=optimize_list_casting + )[0], + True, + ) + elif isinstance(obj, pd.DataFrame): + return ( + { + key: _cast_to_python_objects( + value, only_1d_for_numpy=only_1d_for_numpy, optimize_list_casting=optimize_list_casting + )[0] + for key, value in obj.to_dict("series").items() + }, + True, + ) + elif isinstance(obj, pd.Timestamp): + return obj.to_pydatetime(), True + elif isinstance(obj, pd.Timedelta): + return obj.to_pytimedelta(), True + elif isinstance(obj, Mapping): + has_changed = not isinstance(obj, dict) + output = {} + for k, v in obj.items(): + casted_v, has_changed_v = _cast_to_python_objects( + v, only_1d_for_numpy=only_1d_for_numpy, optimize_list_casting=optimize_list_casting + ) + has_changed |= has_changed_v + output[k] = casted_v + return output if has_changed else obj, has_changed + elif hasattr(obj, "__array__"): + if np.isscalar(obj): + return obj, False + else: + return ( + _cast_to_python_objects( + obj.__array__(), only_1d_for_numpy=only_1d_for_numpy, optimize_list_casting=optimize_list_casting + )[0], + True, + ) + elif isinstance(obj, (list, tuple)): + if len(obj) > 0: + for first_elmt in obj: + if _check_non_null_non_empty_recursive(first_elmt): + break + casted_first_elmt, has_changed_first_elmt = _cast_to_python_objects( + first_elmt, only_1d_for_numpy=only_1d_for_numpy, optimize_list_casting=optimize_list_casting + ) + if has_changed_first_elmt or not optimize_list_casting: + return ( + [ + _cast_to_python_objects( + elmt, only_1d_for_numpy=only_1d_for_numpy, optimize_list_casting=optimize_list_casting + )[0] + for elmt in obj + ], + True, + ) + else: + if isinstance(obj, (list, tuple)): + return obj, False + else: + return list(obj), True + else: + return obj, False + elif config.TORCHCODEC_AVAILABLE and "torchcodec" in sys.modules and isinstance(obj, VideoDecoder): + v = Video() + return v.encode_example(obj), True + elif config.TORCHCODEC_AVAILABLE and "torchcodec" in sys.modules and isinstance(obj, AudioDecoder): + a = Audio() + return a.encode_example(obj), True + else: + return obj, False + + +def cast_to_python_objects(obj: Any, only_1d_for_numpy=False, optimize_list_casting=True) -> Any: + """ + Cast numpy/pytorch/tensorflow/pandas objects to python lists. + It works recursively. + + If `optimize_list_casting` is True, To avoid iterating over possibly long lists, it first checks (recursively) if the first element that is not None or empty (if it is a sequence) has to be casted. + If the first element needs to be casted, then all the elements of the list will be casted, otherwise they'll stay the same. + This trick allows to cast objects that contain tokenizers outputs without iterating over every single token for example. + + Args: + obj: the object (nested struct) to cast + only_1d_for_numpy (bool, default ``False``): whether to keep the full multi-dim tensors as multi-dim numpy arrays, or convert them to + nested lists of 1-dimensional numpy arrays. This can be useful to keep only 1-d arrays to instantiate Arrow arrays. + Indeed Arrow only support converting 1-dimensional array values. + optimize_list_casting (bool, default ``True``): whether to optimize list casting by checking the first non-null element to see if it needs to be casted + and if it doesn't, not checking the rest of the list elements. + + Returns: + casted_obj: the casted object + """ + return _cast_to_python_objects( + obj, only_1d_for_numpy=only_1d_for_numpy, optimize_list_casting=optimize_list_casting + )[0] + + +@dataclass(repr=False) +class Value: + """ + Scalar feature value of a particular data type. + + The possible dtypes of `Value` are as follows: + - `null` + - `bool` + - `int8` + - `int16` + - `int32` + - `int64` + - `uint8` + - `uint16` + - `uint32` + - `uint64` + - `float16` + - `float32` (alias float) + - `float64` (alias double) + - `time32[(s|ms)]` + - `time64[(us|ns)]` + - `timestamp[(s|ms|us|ns)]` + - `timestamp[(s|ms|us|ns), tz=(tzstring)]` + - `date32` + - `date64` + - `duration[(s|ms|us|ns)]` + - `decimal128(precision, scale)` + - `decimal256(precision, scale)` + - `binary` + - `large_binary` + - `binary_view` + - `string` + - `large_string` + - `string_view` + + Args: + dtype (`str`): + Name of the data type. + + Example: + + ```py + >>> from datasets import Features + >>> features = Features({'stars': Value('int32')}) + >>> features + {'stars': Value('int32')} + ``` + """ + + dtype: str + id: Optional[str] = field(default=None, repr=False) + # Automatically constructed + pa_type: ClassVar[Any] = None + _type: str = field(default="Value", init=False, repr=False) + + def __post_init__(self): + if self.dtype == "double": # fix inferred type + self.dtype = "float64" + if self.dtype == "float": # fix inferred type + self.dtype = "float32" + self.pa_type = string_to_arrow(self.dtype) + + def __call__(self): + return self.pa_type + + def encode_example(self, value): + if pa.types.is_boolean(self.pa_type): + return bool(value) + elif pa.types.is_integer(self.pa_type): + return int(value) + elif pa.types.is_floating(self.pa_type): + return float(value) + elif pa.types.is_string(self.pa_type): + return str(value) + elif pa.types.is_large_string(self.pa_type): + return str(value) + elif pa.types.is_string_view(self.pa_type): + return str(value) + else: + return value + + def __repr__(self): + return f"{type(self).__name__}('{self.dtype}')" + + +class _ArrayXD: + def __post_init__(self): + self.shape = tuple(self.shape) + + def __call__(self): + pa_type = globals()[self.__class__.__name__ + "ExtensionType"](self.shape, self.dtype) + return pa_type + + def encode_example(self, value): + return value + + +@dataclass +class Array2D(_ArrayXD): + """Create a two-dimensional array. + + Args: + shape (`tuple`): + Size of each dimension. + dtype (`str`): + Name of the data type. + + Example: + + ```py + >>> from datasets import Features + >>> features = Features({'x': Array2D(shape=(1, 3), dtype='int32')}) + ``` + """ + + shape: tuple + dtype: str + id: Optional[str] = field(default=None, repr=False) + # Automatically constructed + _type: str = field(default="Array2D", init=False, repr=False) + + +@dataclass +class Array3D(_ArrayXD): + """Create a three-dimensional array. + + Args: + shape (`tuple`): + Size of each dimension. + dtype (`str`): + Name of the data type. + + Example: + + ```py + >>> from datasets import Features + >>> features = Features({'x': Array3D(shape=(1, 2, 3), dtype='int32')}) + ``` + """ + + shape: tuple + dtype: str + id: Optional[str] = field(default=None, repr=False) + # Automatically constructed + _type: str = field(default="Array3D", init=False, repr=False) + + +@dataclass +class Array4D(_ArrayXD): + """Create a four-dimensional array. + + Args: + shape (`tuple`): + Size of each dimension. + dtype (`str`): + Name of the data type. + + Example: + + ```py + >>> from datasets import Features + >>> features = Features({'x': Array4D(shape=(1, 2, 2, 3), dtype='int32')}) + ``` + """ + + shape: tuple + dtype: str + id: Optional[str] = field(default=None, repr=False) + # Automatically constructed + _type: str = field(default="Array4D", init=False, repr=False) + + +@dataclass +class Array5D(_ArrayXD): + """Create a five-dimensional array. + + Args: + shape (`tuple`): + Size of each dimension. + dtype (`str`): + Name of the data type. + + Example: + + ```py + >>> from datasets import Features + >>> features = Features({'x': Array5D(shape=(1, 2, 2, 3, 3), dtype='int32')}) + ``` + """ + + shape: tuple + dtype: str + id: Optional[str] = field(default=None, repr=False) + # Automatically constructed + _type: str = field(default="Array5D", init=False, repr=False) + + +class _ArrayXDExtensionType(pa.ExtensionType): + ndims: Optional[int] = None + + def __init__(self, shape: tuple, dtype: str): + if self.ndims is None or self.ndims <= 1: + raise ValueError("You must instantiate an array type with a value for dim that is > 1") + if len(shape) != self.ndims: + raise ValueError(f"shape={shape} and ndims={self.ndims} don't match") + for dim in range(1, self.ndims): + if shape[dim] is None: + raise ValueError(f"Support only dynamic size on first dimension. Got: {shape}") + self.shape = tuple(shape) + self.value_type = dtype + self.storage_dtype = self._generate_dtype(self.value_type) + pa.ExtensionType.__init__(self, self.storage_dtype, f"{self.__class__.__module__}.{self.__class__.__name__}") + + def __arrow_ext_serialize__(self): + return json.dumps((self.shape, self.value_type)).encode() + + @classmethod + def __arrow_ext_deserialize__(cls, storage_type, serialized): + args = json.loads(serialized) + return cls(*args) + + # This was added to pa.ExtensionType in pyarrow >= 13.0.0 + def __reduce__(self): + return self.__arrow_ext_deserialize__, (self.storage_type, self.__arrow_ext_serialize__()) + + def __hash__(self): + return hash((self.__class__, self.shape, self.value_type)) + + def __arrow_ext_class__(self): + return ArrayExtensionArray + + def _generate_dtype(self, dtype): + dtype = string_to_arrow(dtype) + for d in reversed(self.shape): + dtype = pa.list_(dtype) + # Don't specify the size of the list, since fixed length list arrays have issues + # being validated after slicing in pyarrow 0.17.1 + return dtype + + def to_pandas_dtype(self): + return PandasArrayExtensionDtype(self.value_type) + + +class Array2DExtensionType(_ArrayXDExtensionType): + ndims = 2 + + +class Array3DExtensionType(_ArrayXDExtensionType): + ndims = 3 + + +class Array4DExtensionType(_ArrayXDExtensionType): + ndims = 4 + + +class Array5DExtensionType(_ArrayXDExtensionType): + ndims = 5 + + +# Register the extension types for deserialization +pa.register_extension_type(Array2DExtensionType((1, 2), "int64")) +pa.register_extension_type(Array3DExtensionType((1, 2, 3), "int64")) +pa.register_extension_type(Array4DExtensionType((1, 2, 3, 4), "int64")) +pa.register_extension_type(Array5DExtensionType((1, 2, 3, 4, 5), "int64")) + + +def _is_zero_copy_only(pa_type: pa.DataType, unnest: bool = False) -> bool: + """ + When converting a pyarrow array to a numpy array, we must know whether this could be done in zero-copy or not. + This function returns the value of the ``zero_copy_only`` parameter to pass to ``.to_numpy()``, given the type of the pyarrow array. + + # zero copy is available for all primitive types except booleans and temporal types (date, time, timestamp or duration) + # primitive types are types for which the physical representation in arrow and in numpy + # https://github.com/wesm/arrow/blob/c07b9b48cf3e0bbbab493992a492ae47e5b04cad/python/pyarrow/types.pxi#L821 + # see https://arrow.apache.org/docs/python/generated/pyarrow.Array.html#pyarrow.Array.to_numpy + # and https://issues.apache.org/jira/browse/ARROW-2871?jql=text%20~%20%22boolean%20to_numpy%22 + """ + + def _unnest_pa_type(pa_type: pa.DataType) -> pa.DataType: + if pa.types.is_list(pa_type): + return _unnest_pa_type(pa_type.value_type) + return pa_type + + if unnest: + pa_type = _unnest_pa_type(pa_type) + return pa.types.is_primitive(pa_type) and not (pa.types.is_boolean(pa_type) or pa.types.is_temporal(pa_type)) + + +class ArrayExtensionArray(pa.ExtensionArray): + def __array__(self): + zero_copy_only = _is_zero_copy_only(self.storage.type, unnest=True) + return self.to_numpy(zero_copy_only=zero_copy_only) + + def __getitem__(self, i): + return self.storage[i] + + def to_numpy(self, zero_copy_only=True): + storage: pa.ListArray = self.storage + null_mask = storage.is_null().to_numpy(zero_copy_only=False) + + if self.type.shape[0] is not None: + size = 1 + null_indices = np.arange(len(storage))[null_mask] - np.arange(np.sum(null_mask)) + + for i in range(self.type.ndims): + size *= self.type.shape[i] + storage = storage.flatten() + numpy_arr = storage.to_numpy(zero_copy_only=zero_copy_only) + numpy_arr = numpy_arr.reshape(len(self) - len(null_indices), *self.type.shape) + + if len(null_indices): + numpy_arr = np.insert(numpy_arr.astype(np.float64), null_indices, np.nan, axis=0) + + else: + shape = self.type.shape + ndims = self.type.ndims + arrays = [] + first_dim_offsets = np.array([off.as_py() for off in storage.offsets]) + for i, is_null in enumerate(null_mask): + if is_null: + arrays.append(np.nan) + else: + storage_el = storage[i : i + 1] + first_dim = first_dim_offsets[i + 1] - first_dim_offsets[i] + # flatten storage + for _ in range(ndims): + storage_el = storage_el.flatten() + + numpy_arr = storage_el.to_numpy(zero_copy_only=zero_copy_only) + arrays.append(numpy_arr.reshape(first_dim, *shape[1:])) + + if len(np.unique(np.diff(first_dim_offsets))) > 1: + # ragged + numpy_arr = np.empty(len(arrays), dtype=object) + numpy_arr[:] = arrays + else: + numpy_arr = np.array(arrays) + + return numpy_arr + + def to_pylist(self, maps_as_pydicts: Optional[Literal["lossy", "strict"]] = None): + zero_copy_only = _is_zero_copy_only(self.storage.type, unnest=True) + numpy_arr = self.to_numpy(zero_copy_only=zero_copy_only) + if self.type.shape[0] is None and numpy_arr.dtype == object: + return [arr.tolist() for arr in numpy_arr.tolist()] + else: + return numpy_arr.tolist() + + +class PandasArrayExtensionDtype(PandasExtensionDtype): + _metadata = "value_type" + + def __init__(self, value_type: Union["PandasArrayExtensionDtype", np.dtype]): + self._value_type = value_type + + def __from_arrow__(self, array: Union[pa.Array, pa.ChunkedArray]): + if isinstance(array, pa.ChunkedArray): + array = array.type.wrap_array(pa.concat_arrays([chunk.storage for chunk in array.chunks])) + zero_copy_only = _is_zero_copy_only(array.storage.type, unnest=True) + numpy_arr = array.to_numpy(zero_copy_only=zero_copy_only) + return PandasArrayExtensionArray(numpy_arr) + + @classmethod + def construct_array_type(cls): + return PandasArrayExtensionArray + + @property + def type(self) -> type: + return np.ndarray + + @property + def kind(self) -> str: + return "O" + + @property + def name(self) -> str: + return f"array[{self.value_type}]" + + @property + def value_type(self) -> np.dtype: + return self._value_type + + +class PandasArrayExtensionArray(PandasExtensionArray): + def __init__(self, data: np.ndarray, copy: bool = False): + self._data = data if not copy else np.array(data) + self._dtype = PandasArrayExtensionDtype(data.dtype) + + def __array__(self, dtype=None): + """ + Convert to NumPy Array. + Note that Pandas expects a 1D array when dtype is set to object. + But for other dtypes, the returned shape is the same as the one of ``data``. + + More info about pandas 1D requirement for PandasExtensionArray here: + https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.api.extensions.ExtensionArray.html#pandas.api.extensions.ExtensionArray + + """ + if dtype == np.dtype(object): + out = np.empty(len(self._data), dtype=object) + for i in range(len(self._data)): + out[i] = self._data[i] + return out + if dtype is None: + return self._data + else: + return self._data.astype(dtype) + + def copy(self, deep: bool = False) -> "PandasArrayExtensionArray": + return PandasArrayExtensionArray(self._data, copy=True) + + @classmethod + def _from_sequence( + cls, scalars, dtype: Optional[PandasArrayExtensionDtype] = None, copy: bool = False + ) -> "PandasArrayExtensionArray": + if len(scalars) > 1 and all( + isinstance(x, np.ndarray) and x.shape == scalars[0].shape and x.dtype == scalars[0].dtype for x in scalars + ): + data = np.array(scalars, dtype=dtype if dtype is None else dtype.value_type, copy=copy) + else: + data = np.empty(len(scalars), dtype=object) + data[:] = scalars + return cls(data, copy=copy) + + @classmethod + def _concat_same_type(cls, to_concat: Sequence_["PandasArrayExtensionArray"]) -> "PandasArrayExtensionArray": + if len(to_concat) > 1 and all( + va._data.shape == to_concat[0]._data.shape and va._data.dtype == to_concat[0]._data.dtype + for va in to_concat + ): + data = np.vstack([va._data for va in to_concat]) + else: + data = np.empty(len(to_concat), dtype=object) + data[:] = [va._data for va in to_concat] + return cls(data, copy=False) + + @property + def dtype(self) -> PandasArrayExtensionDtype: + return self._dtype + + @property + def nbytes(self) -> int: + return self._data.nbytes + + def isna(self) -> np.ndarray: + return np.array([pd.isna(arr).any() for arr in self._data]) + + def __setitem__(self, key: Union[int, slice, np.ndarray], value: Any) -> None: + raise NotImplementedError() + + def __getitem__(self, item: Union[int, slice, np.ndarray]) -> Union[np.ndarray, "PandasArrayExtensionArray"]: + if isinstance(item, int): + return self._data[item] + return PandasArrayExtensionArray(self._data[item], copy=False) + + def take( + self, indices: Sequence_[int], allow_fill: bool = False, fill_value: bool = None + ) -> "PandasArrayExtensionArray": + indices: np.ndarray = np.asarray(indices, dtype=int) + if allow_fill: + fill_value = ( + self.dtype.na_value if fill_value is None else np.asarray(fill_value, dtype=self.dtype.value_type) + ) + mask = indices == -1 + if (indices < -1).any(): + raise ValueError("Invalid value in `indices`, must be all >= -1 for `allow_fill` is True") + elif len(self) > 0: + pass + elif not np.all(mask): + raise IndexError("Invalid take for empty PandasArrayExtensionArray, must be all -1.") + else: + data = np.array([fill_value] * len(indices), dtype=self.dtype.value_type) + return PandasArrayExtensionArray(data, copy=False) + took = self._data.take(indices, axis=0) + if allow_fill and mask.any(): + took[mask] = [fill_value] * np.sum(mask) + return PandasArrayExtensionArray(took, copy=False) + + def __len__(self) -> int: + return len(self._data) + + def __eq__(self, other) -> np.ndarray: + if not isinstance(other, PandasArrayExtensionArray): + raise NotImplementedError(f"Invalid type to compare to: {type(other)}") + return (self._data == other._data).all() + + +def pandas_types_mapper(dtype): + if isinstance(dtype, _ArrayXDExtensionType): + return PandasArrayExtensionDtype(dtype.value_type) + + +@dataclass +class ClassLabel: + """Feature type for integer class labels. + + There are 3 ways to define a `ClassLabel`, which correspond to the 3 arguments: + + * `num_classes`: Create 0 to (num_classes-1) labels. + * `names`: List of label strings. + * `names_file`: File containing the list of labels. + + Under the hood the labels are stored as integers. + You can use -1 to represent unknown/missing labels. + + Args: + num_classes (`int`, *optional*): + Number of classes. All labels must be < `num_classes`. + names (`list` of `str`, *optional*): + String names for the integer classes. + The order in which the names are provided is kept. + names_file (`str`, *optional*): + Path to a file with names for the integer classes, one per line. + + Example: + + ```py + >>> from datasets import Features, ClassLabel + >>> features = Features({'label': ClassLabel(num_classes=3, names=['bad', 'ok', 'good'])}) + >>> features + {'label': ClassLabel(names=['bad', 'ok', 'good'])} + ``` + """ + + num_classes: InitVar[Optional[int]] = None # Pseudo-field: ignored by asdict/fields when converting to/from dict + names: list[str] = None + names_file: InitVar[Optional[str]] = None # Pseudo-field: ignored by asdict/fields when converting to/from dict + id: Optional[str] = field(default=None, repr=False) + # Automatically constructed + dtype: ClassVar[str] = "int64" + pa_type: ClassVar[Any] = pa.int64() + _str2int: ClassVar[dict[str, int]] = None + _int2str: ClassVar[dict[int, int]] = None + _type: str = field(default="ClassLabel", init=False, repr=False) + + def __post_init__(self, num_classes, names_file): + self.num_classes = num_classes + self.names_file = names_file + if self.names_file is not None and self.names is not None: + raise ValueError("Please provide either names or names_file but not both.") + # Set self.names + if self.names is None: + if self.names_file is not None: + self.names = self._load_names_from_file(self.names_file) + elif self.num_classes is not None: + self.names = [str(i) for i in range(self.num_classes)] + else: + raise ValueError("Please provide either num_classes, names or names_file.") + elif not isinstance(self.names, SequenceABC): + raise TypeError(f"Please provide names as a list, is {type(self.names)}") + # Set self.num_classes + if self.num_classes is None: + self.num_classes = len(self.names) + elif self.num_classes != len(self.names): + raise ValueError( + "ClassLabel number of names do not match the defined num_classes. " + f"Got {len(self.names)} names VS {self.num_classes} num_classes" + ) + # Prepare mappings + self._int2str = [str(name) for name in self.names] + self._str2int = {name: i for i, name in enumerate(self._int2str)} + if len(self._int2str) != len(self._str2int): + raise ValueError("Some label names are duplicated. Each label name should be unique.") + + def __call__(self): + return self.pa_type + + def str2int(self, values: Union[str, Iterable]) -> Union[int, Iterable]: + """Conversion class name `string` => `integer`. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train") + >>> ds.features["label"].str2int('neg') + 0 + ``` + """ + if not isinstance(values, str) and not isinstance(values, Iterable): + raise ValueError( + f"Values {values} should be a string or an Iterable (list, numpy array, pytorch, tensorflow tensors)" + ) + return_list = True + if isinstance(values, str): + values = [values] + return_list = False + + output = [self._strval2int(value) for value in values] + return output if return_list else output[0] + + def _strval2int(self, value: str) -> int: + failed_parse = False + value = str(value) + # first attempt - raw string value + int_value = self._str2int.get(value) + if int_value is None: + # second attempt - strip whitespace + int_value = self._str2int.get(value.strip()) + if int_value is None: + # third attempt - convert str to int + try: + int_value = int(value) + except ValueError: + failed_parse = True + else: + if int_value < -1 or int_value >= self.num_classes: + failed_parse = True + if failed_parse: + raise ValueError(f"Invalid string class label {value}") + return int_value + + def int2str(self, values: Union[int, Iterable]) -> Union[str, Iterable]: + """Conversion `integer` => class name `string`. + + Regarding unknown/missing labels: passing negative integers raises `ValueError`. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train") + >>> ds.features["label"].int2str(0) + 'neg' + ``` + """ + if not isinstance(values, int) and not isinstance(values, Iterable): + raise ValueError( + f"Values {values} should be an integer or an Iterable (list, numpy array, pytorch, tensorflow tensors)" + ) + return_list = True + if isinstance(values, int): + values = [values] + return_list = False + + for v in values: + if not 0 <= v < self.num_classes: + raise ValueError(f"Invalid integer class label {v:d}") + + output = [self._int2str[int(v)] for v in values] + return output if return_list else output[0] + + def encode_example(self, example_data): + if self.num_classes is None: + raise ValueError( + "Trying to use ClassLabel feature with undefined number of class. " + "Please set ClassLabel.names or num_classes." + ) + + # If a string is given, convert to associated integer + if isinstance(example_data, str): + example_data = self.str2int(example_data) + + # Allowing -1 to mean no label. + if not -1 <= example_data < self.num_classes: + raise ValueError(f"Class label {example_data:d} greater than configured num_classes {self.num_classes}") + return example_data + + def cast_storage(self, storage: Union[pa.StringArray, pa.IntegerArray]) -> pa.Int64Array: + """Cast an Arrow array to the `ClassLabel` arrow storage type. + The Arrow types that can be converted to the `ClassLabel` pyarrow storage type are: + + - `pa.string()` + - `pa.int()` + + Args: + storage (`Union[pa.StringArray, pa.IntegerArray]`): + PyArrow array to cast. + + Returns: + `pa.Int64Array`: Array in the `ClassLabel` arrow storage type. + """ + if isinstance(storage, pa.IntegerArray) and len(storage) > 0: + min_max = pc.min_max(storage).as_py() + if min_max["max"] is not None and min_max["max"] >= self.num_classes: + raise ValueError( + f"Class label {min_max['max']} greater than configured num_classes {self.num_classes}" + ) + elif isinstance(storage, pa.StringArray): + storage = pa.array( + [self._strval2int(label) if label is not None else None for label in storage.to_pylist()] + ) + return array_cast(storage, self.pa_type) + + @staticmethod + def _load_names_from_file(names_filepath): + with open(names_filepath, encoding="utf-8") as f: + return [name.strip() for name in f.read().split("\n") if name.strip()] # Filter empty names + + +@dataclass +class Json: + """Feature type for JSON objects. + + Under the hood the objects are stored as JSON-encoded strings. + + Example: + + ```py + >>> from datasets import Features, Json + >>> features = Features({'json': Json()}) + >>> features + {'json': Json()} + ``` + + ```py + >>> from datasets import Dataset, Features, Json, List + >>> features = Features({"a": List(Json())}) + >>> ds = Dataset.from_dict({"a": [[{"b": 0}, {"c": 0}]]}, features=features) + >>> # OR + >>> ds = Dataset.from_dict({"a": [[{"b": 0}, {"c": 0}]]}, on_mixed_types="use_json") + >>> ds.features + {'a': List(Json())} + >>> ds[0] + {'a': [{'b': 0}, {'c': 0}]} + >>> def f(x): + ... for y in x["a"]: + ... y["d"] = "foo" + ... return x + >>> ds = ds.map(f) + >>> ds.features + >>> ds[0] + {'a': [{'b': 0, 'd': 'foo'}, {'c': 0, 'd': 'foo'}]} + ``` + """ + + decode: bool = True + id: Optional[str] = field(default=None, repr=False) + # Automatically constructed + pa_type: ClassVar[Any] = pa.json_() + _type: str = field(default="Json", init=False, repr=False) + + def __call__(self): + return self.pa_type + + def encode_example(self, example_data): + if example_data is None: + return None + if not isinstance(example_data, str): + example_data = ujson_dumps(example_data) + else: + try: + ujson_loads(example_data) + except Exception: + example_data = ujson_dumps(example_data) + return example_data + + def decode_example(self, example_data, token_per_repo_id: Optional[dict[str, Union[str, bool, None]]] = None): + if not self.decode: + raise RuntimeError("Decoding is disabled for this feature. Please use Json(decode=True) instead.") + if example_data is None: + return None + return ujson_loads(example_data) + + def cast_storage(self, storage: Union[pa.Array]) -> pa.JsonArray: + """Cast an Arrow array to the `Json` arrow storage type. + + Args: + storage (`Union[pa.StringArray, pa.IntegerArray]`): + PyArrow array to cast. + + Returns: + `pa.JsonArray`: Array in the `Json` arrow storage type. + """ + if isinstance(storage, pa.JsonArray): + return storage + elif isinstance(storage, (pa.StringArray)): + items = storage[:5].to_pylist() + try: + for item in items: + if item is not None: + ujson_loads(item) + except Exception: + storage = pa.array( + [ujson_dumps(x) if x is not None else None for x in storage.to_pylist()], pa.json_() + ) + else: + storage = pa.array([ujson_dumps(x) if x is not None else None for x in storage.to_pylist()], pa.json_()) + return array_cast(storage, self.pa_type) + + +class Sequence: + """ + A `Sequence` is a utility that automatically converts internal dictionary feature into a dictionary of + lists. This behavior is implemented to have a compatibility layer with the TensorFlow Datasets library but may be + un-wanted in some cases. If you don't want this behavior, you can use a [`List`] or a [`LargeList`] + instead of the [`Sequence`]. + + Args: + feature ([`FeatureType`]): + Child feature data type of each item within the large list. + length (optional `int`, default to -1): + Length of the list if it is fixed. + Defaults to -1 which means an arbitrary length. + + Returns: + [`List`] of the specified feature, except `dict` of sub-features + which are converted to `dict` of lists of sub-features for compatibility with TFDS. + + """ + + def __new__(cls, feature=None, length=-1, **kwargs): + # useful to still get isinstance(Sequence(Value("int64")), Sequence) + if ( + cls is Sequence + and isinstance(feature, dict) + and any(not isinstance(subfeature, List) for subfeature in feature.values()) + ): + out = {key: List(value, length=length, **kwargs) for key, value in feature.items()} + else: + out = super().__new__(List) + return out + + +@dataclass(repr=False) +class List(Sequence): + """Feature type for large list data composed of child feature data type. + + It is backed by `pyarrow.ListType`, which uses 32-bit offsets or a fixed length. + + Args: + feature ([`FeatureType`]): + Child feature data type of each item within the large list. + length (optional `int`, default to -1): + Length of the list if it is fixed. + Defaults to -1 which means an arbitrary length. + """ + + feature: Any + length: int = -1 + id: Optional[str] = field(default=None, repr=False) + # Automatically constructed + pa_type: ClassVar[Any] = None + _type: str = field(default="List", init=False, repr=False) + + def __repr__(self): + if self.length != -1: + return f"{type(self).__name__}({self.feature}, length={self.length})" + else: + return f"{type(self).__name__}({self.feature})" + + +@dataclass(repr=False) +class LargeList: + """Feature type for large list data composed of child feature data type. + + It is backed by `pyarrow.LargeListType`, which is like `pyarrow.ListType` but with 64-bit rather than 32-bit offsets. + + Args: + feature ([`FeatureType`]): + Child feature data type of each item within the large list. + """ + + feature: Any + id: Optional[str] = field(default=None, repr=False) + # Automatically constructed + pa_type: ClassVar[Any] = None + _type: str = field(default="LargeList", init=False, repr=False) + + def __repr__(self): + return f"{type(self).__name__}({self.feature})" + + +FeatureType = Union[ + dict, + list, + tuple, + Value, + ClassLabel, + Translation, + TranslationVariableLanguages, + LargeList, + List, + Array2D, + Array3D, + Array4D, + Array5D, + Audio, + Image, + Mesh, + Video, + Pdf, + Nifti, +] + + +def _check_non_null_non_empty_recursive(obj, schema: Optional[FeatureType] = None) -> bool: + """ + Check if the object is not None. + If the object is a list or a tuple, recursively check the first element of the sequence and stop if at any point the first element is not a sequence or is an empty sequence. + """ + if obj is None: + return False + elif isinstance(obj, (list, tuple)) and (schema is None or isinstance(schema, (list, tuple, LargeList, List))): + if len(obj) > 0: + if schema is None: + pass + elif isinstance(schema, (list, tuple)): + schema = schema[0] + else: + schema = schema.feature + return _check_non_null_non_empty_recursive(obj[0], schema) + else: + return False + else: + return True + + +def get_nested_type(schema: FeatureType) -> pa.DataType: + """ + get_nested_type() converts a datasets.FeatureType into a pyarrow.DataType, and acts as the inverse of + generate_from_arrow_type(). + + It performs double-duty as the implementation of Features.type and handles the conversion of + datasets.Feature->pa.struct + """ + # Nested structures: we allow dict, list/tuples, sequences + if isinstance(schema, Features): + return pa.struct( + {key: get_nested_type(schema[key]) for key in schema} + ) # Features is subclass of dict, and dict order is deterministic since Python 3.6 + elif isinstance(schema, dict): + return pa.struct( + {key: get_nested_type(schema[key]) for key in schema} + ) # however don't sort on struct types since the order matters + elif isinstance(schema, (list, tuple)): + if len(schema) != 1: + raise ValueError("When defining list feature, you should just provide one example of the inner type") + value_type = get_nested_type(schema[0]) + return pa.list_(value_type) + elif isinstance(schema, LargeList): + value_type = get_nested_type(schema.feature) + return pa.large_list(value_type) + elif isinstance(schema, List): + value_type = get_nested_type(schema.feature) + return pa.list_(value_type, schema.length) + + # Other objects are callable which returns their data type (ClassLabel, Array2D, Translation, Arrow datatype creation methods) + return schema() + + +def encode_nested_example(schema, obj, level=0): + """Encode a nested example. + This is used since some features (in particular ClassLabel) have some logic during encoding. + + To avoid iterating over possibly long lists, it first checks (recursively) if the first element that is not None or empty (if it is a sequence) has to be encoded. + If the first element needs to be encoded, then all the elements of the list will be encoded, otherwise they'll stay the same. + """ + # Nested structures: we allow dict, list/tuples, sequences + if isinstance(schema, dict): + if level == 0 and obj is None: + raise ValueError("Got None but expected a dictionary instead") + return ( + {k: encode_nested_example(schema[k], obj.get(k), level=level + 1) for k in schema} + if obj is not None + else None + ) + elif isinstance(schema, (LargeList, List)): + if obj is None: + return None + else: + if len(obj) > 0: + sub_schema = schema.feature + for first_elmt in obj: + if _check_non_null_non_empty_recursive(first_elmt, sub_schema): + break + try: + changed = bool(encode_nested_example(sub_schema, first_elmt, level=level + 1) != first_elmt) + except ValueError: # can happen when comparing arrays + changed = False + if changed: + return [encode_nested_example(sub_schema, o, level=level + 1) for o in obj] + return list(obj) + # Object with special encoding: + # ClassLabel will convert from string to int, TranslationVariableLanguages does some checks + elif hasattr(schema, "encode_example"): + return schema.encode_example(obj) if obj is not None else None + # Other object should be directly convertible to a native Arrow type (like Translation and Translation) + return obj + + +def decode_nested_example(schema, obj, token_per_repo_id: Optional[dict[str, Union[str, bool, None]]] = None): + """Decode a nested example. + This is used since some features (in particular Audio and Image) have some logic during decoding. + + To avoid iterating over possibly long lists, it first checks (recursively) if the first element that is not None or empty (if it is a sequence) has to be decoded. + If the first element needs to be decoded, then all the elements of the list will be decoded, otherwise they'll stay the same. + """ + # Nested structures: we allow dict, list/tuples, sequences + if isinstance(schema, dict): + return ( + {k: decode_nested_example(sub_schema, sub_obj) for k, (sub_schema, sub_obj) in zip_dict(schema, obj)} + if obj is not None + else None + ) + elif isinstance(schema, (list, tuple)): + sub_schema = schema[0] + if obj is None: + return None + else: + if len(obj) > 0: + for first_elmt in obj: + if _check_non_null_non_empty_recursive(first_elmt, sub_schema): + break + if decode_nested_example(sub_schema, first_elmt) != first_elmt: + return [decode_nested_example(sub_schema, o) for o in obj] + return list(obj) + elif isinstance(schema, (LargeList, List)): + if obj is None: + return None + else: + sub_schema = schema.feature + if isinstance(sub_schema, dict): + return [decode_nested_example(sub_schema, o) for o in obj] + if len(obj) > 0: + for first_elmt in obj: + if _check_non_null_non_empty_recursive(first_elmt, sub_schema): + break + if decode_nested_example(sub_schema, first_elmt) != first_elmt: + return [decode_nested_example(sub_schema, o) for o in obj] + return list(obj) + # Object with special decoding: + elif hasattr(schema, "decode_example") and getattr(schema, "decode", True): + # we pass the token to read and decode files from private repositories in streaming mode + return schema.decode_example(obj, token_per_repo_id=token_per_repo_id) if obj is not None else None + return obj + + +_FEATURE_TYPES: dict[str, FeatureType] = { + Value.__name__: Value, + ClassLabel.__name__: ClassLabel, + Translation.__name__: Translation, + TranslationVariableLanguages.__name__: TranslationVariableLanguages, + LargeList.__name__: LargeList, + List.__name__: List, + Array2D.__name__: Array2D, + Array3D.__name__: Array3D, + Array4D.__name__: Array4D, + Array5D.__name__: Array5D, + Audio.__name__: Audio, + Image.__name__: Image, + Mesh.__name__: Mesh, + Video.__name__: Video, + Pdf.__name__: Pdf, + Nifti.__name__: Nifti, + Json.__name__: Json, +} + + +@experimental +def register_feature( + feature_cls: type, + feature_type: str, +): + """ + Register a Feature object using a name and class. + This function must be used on a Feature class. + """ + if feature_type in _FEATURE_TYPES: + logger.warning( + f"Overwriting feature type '{feature_type}' ({_FEATURE_TYPES[feature_type].__name__} -> {feature_cls.__name__})" + ) + _FEATURE_TYPES[feature_type] = feature_cls + + +def generate_from_dict(obj: Any): + """Regenerate the nested feature object from a deserialized dict. + We use the '_type' fields to get the dataclass name to load. + + generate_from_dict is the recursive helper for Features.from_dict, and allows for a convenient constructor syntax + to define features from deserialized JSON dictionaries. This function is used in particular when deserializing + a :class:`DatasetInfo` that was dumped to a JSON object. This acts as an analogue to + :meth:`Features.from_arrow_schema` and handles the recursive field-by-field instantiation, but doesn't require any + mapping to/from pyarrow, except for the fact that it takes advantage of the mapping of pyarrow primitive dtypes + that :class:`Value` automatically performs. + """ + # Nested structures: we allow dict, list/tuples, sequences + if isinstance(obj, list): + return [generate_from_dict(value) for value in obj] + # Otherwise we have a dict or a dataclass + if "_type" not in obj or isinstance(obj["_type"], dict): + return {key: generate_from_dict(value) for key, value in obj.items()} + obj = dict(obj) + _type = obj.pop("_type") + class_type = _FEATURE_TYPES.get(_type, None) or globals().get(_type, None) + + if class_type is None: + raise ValueError(f"Feature type '{_type}' not found. Available feature types: {list(_FEATURE_TYPES.keys())}") + + if class_type == LargeList: + feature = obj.pop("feature") + return LargeList(generate_from_dict(feature), **obj) + if class_type == List: + feature = obj.pop("feature") + return List(generate_from_dict(feature), **obj) + if class_type == Sequence: # backward compatibility, this translates to a List or a dict + feature = obj.pop("feature") + return Sequence(feature=generate_from_dict(feature), **obj) + + field_names = {f.name for f in fields(class_type)} + return class_type(**{k: v for k, v in obj.items() if k in field_names}) + + +def generate_from_arrow_type(pa_type: pa.DataType) -> FeatureType: + """ + generate_from_arrow_type accepts an arrow DataType and returns a datasets FeatureType to be used as the type for + a single field. + + This is the high-level arrow->datasets type conversion and is inverted by get_nested_type(). + + This operates at the individual *field* level, whereas Features.from_arrow_schema() operates at the + full schema level and holds the methods that represent the bijection from Features<->pyarrow.Schema + """ + if isinstance(pa_type, pa.StructType): + return {field.name: generate_from_arrow_type(field.type) for field in pa_type} + elif isinstance(pa_type, pa.FixedSizeListType): + return List(generate_from_arrow_type(pa_type.value_type), length=pa_type.list_size) + elif isinstance(pa_type, pa.ListType): + return List(generate_from_arrow_type(pa_type.value_type)) + elif isinstance(pa_type, pa.LargeListType): + return LargeList(generate_from_arrow_type(pa_type.value_type)) + elif isinstance(pa_type, _ArrayXDExtensionType): + array_feature = [None, None, Array2D, Array3D, Array4D, Array5D][pa_type.ndims] + return array_feature(shape=pa_type.shape, dtype=pa_type.value_type) + elif isinstance(pa_type, pa.JsonType): + return Json() + elif isinstance(pa_type, pa.DataType): + return Value(dtype=_arrow_to_datasets_dtype(pa_type)) + else: + raise ValueError(f"Cannot convert {pa_type} to a Feature type.") + + +def numpy_to_pyarrow_listarray(arr: np.ndarray, type: pa.DataType = None) -> pa.ListArray: + """Build a PyArrow ListArray from a multidimensional NumPy array""" + arr = np.array(arr) + values = pa.array(arr.flatten(), type=type) + for i in range(arr.ndim - 1): + n_offsets = reduce(mul, arr.shape[: arr.ndim - i - 1], 1) + step_offsets = arr.shape[arr.ndim - i - 1] + offsets = pa.array(np.arange(n_offsets + 1) * step_offsets, type=pa.int32()) + values = pa.ListArray.from_arrays(offsets, values) + return values + + +def list_of_pa_arrays_to_pyarrow_listarray(l_arr: list[Optional[pa.Array]]) -> pa.ListArray: + null_mask = np.array([arr is None for arr in l_arr]) + null_indices = np.arange(len(null_mask))[null_mask] - np.arange(np.sum(null_mask)) + l_arr = [arr for arr in l_arr if arr is not None] + offsets = np.cumsum( + [0] + [len(arr) for arr in l_arr], dtype=object + ) # convert to dtype object to allow None insertion + offsets = np.insert(offsets, null_indices, None) + offsets = pa.array(offsets, type=pa.int32()) + values = pa.concat_arrays(l_arr) + return pa.ListArray.from_arrays(offsets, values) + + +def list_of_np_array_to_pyarrow_listarray(l_arr: list[np.ndarray], type: pa.DataType = None) -> pa.ListArray: + """Build a PyArrow ListArray from a possibly nested list of NumPy arrays""" + if len(l_arr) > 0: + return list_of_pa_arrays_to_pyarrow_listarray( + [numpy_to_pyarrow_listarray(arr, type=type) if arr is not None else None for arr in l_arr] + ) + else: + return pa.array([], type=type) + + +def contains_any_np_array(data: Any): + """Return `True` if data is a NumPy ndarray or (recursively) if first non-null value in list is a NumPy ndarray. + + Args: + data (Any): Data. + + Returns: + bool + """ + if isinstance(data, np.ndarray): + return True + elif isinstance(data, list): + return contains_any_np_array(first_non_null_value(data)[1]) + else: + return False + + +def any_np_array_to_pyarrow_listarray(data: Union[np.ndarray, list], type: pa.DataType = None) -> pa.ListArray: + """Convert to PyArrow ListArray either a NumPy ndarray or (recursively) a list that may contain any NumPy ndarray. + + Args: + data (Union[np.ndarray, List]): Data. + type (pa.DataType): Explicit PyArrow DataType passed to coerce the ListArray data type. + + Returns: + pa.ListArray + """ + if isinstance(data, np.ndarray): + return numpy_to_pyarrow_listarray(data, type=type) + elif isinstance(data, list): + return list_of_pa_arrays_to_pyarrow_listarray([any_np_array_to_pyarrow_listarray(i, type=type) for i in data]) + + +def to_pyarrow_listarray(data: Any, pa_type: _ArrayXDExtensionType) -> pa.Array: + """Convert to PyArrow ListArray. + + Args: + data (Any): List, iterable, np.ndarray or pd.Series. + pa_type (_ArrayXDExtensionType): Any of the ArrayNDExtensionType. + + Returns: + pyarrow.Array + """ + if contains_any_np_array(data): + return any_np_array_to_pyarrow_listarray(data, type=pa_type.value_type) + else: + return pa.array(data, pa_type.storage_dtype) + + +def _visit(feature: FeatureType, func: Callable[[FeatureType], Optional[FeatureType]]) -> FeatureType: + """Visit a (possibly nested) feature. + + Args: + feature (FeatureType): the feature type to be checked + Returns: + visited feature (FeatureType) + """ + if isinstance(feature, Features): + out = func(Features({k: _visit(f, func) for k, f in feature.items()})) + elif isinstance(feature, dict): + out = func({k: _visit(f, func) for k, f in feature.items()}) + elif isinstance(feature, LargeList): + out = func(LargeList(_visit(feature.feature, func))) + elif isinstance(feature, List): + out = func(List(_visit(feature.feature, func), length=feature.length)) + else: + out = func(feature) + return feature if out is None else out + + +_VisitPath = list[Union[str, Literal[0]]] + + +def _visit_with_path( + feature: FeatureType, func: Callable[[FeatureType, _VisitPath], Optional[FeatureType]], visit_path: _VisitPath = [] +) -> FeatureType: + """Visit a (possibly nested) feature with its path in the Feature object. + + A path in a nested feature object is the list of keys that need to be + sequentially accessed to get to the sub-feature. + + For example: + - ["foo"] corresponds to the column "foo" + - ["foo", 0] corresponds to the sub-feature of the lists in "foo" + - ["foo", "bar"] corresponds to the sub-feature of the dicts in "foo" with key "bar" + + Args: + feature (`FeatureType`): the feature type to be checked. + + Returns: + `FeatureType`: the visited feature. + """ + if isinstance(feature, Features): + out = func(Features({k: _visit_with_path(f, func, visit_path + [k]) for k, f in feature.items()}), visit_path) + elif isinstance(feature, dict): + out = func({k: _visit_with_path(f, func, visit_path + [k]) for k, f in feature.items()}, visit_path) + elif isinstance(feature, List): + out = func(List(_visit_with_path(feature.feature, func, visit_path + [0]), length=feature.length), visit_path) + elif isinstance(feature, LargeList): + out = func(LargeList(_visit_with_path(feature.feature, func, visit_path + [0])), visit_path) + else: + out = func(feature, visit_path) + return feature if out is None else out + + +def require_decoding(feature: FeatureType, ignore_decode_attribute: bool = False) -> bool: + """Check if a (possibly nested) feature requires decoding. + + Args: + feature (FeatureType): the feature type to be checked + ignore_decode_attribute (:obj:`bool`, default ``False``): Whether to ignore the current value + of the `decode` attribute of the decodable feature types. + Returns: + :obj:`bool` + """ + if isinstance(feature, dict): + return any(require_decoding(f) for f in feature.values()) + elif isinstance(feature, (list, tuple)): + return require_decoding(feature[0]) + elif isinstance(feature, LargeList): + return require_decoding(feature.feature) + elif isinstance(feature, List): + return require_decoding(feature.feature) + else: + return hasattr(feature, "decode_example") and ( + getattr(feature, "decode", True) if not ignore_decode_attribute else True + ) + + +def require_storage_cast(feature: FeatureType) -> bool: + """Check if a (possibly nested) feature requires storage casting. + + Args: + feature (FeatureType): the feature type to be checked + Returns: + :obj:`bool` + """ + if isinstance(feature, dict): + return any(require_storage_cast(f) for f in feature.values()) + elif isinstance(feature, LargeList): + return require_storage_cast(feature.feature) + elif isinstance(feature, List): + return require_storage_cast(feature.feature) + else: + return hasattr(feature, "cast_storage") + + +def require_storage_embed(feature: FeatureType) -> bool: + """Check if a (possibly nested) feature requires embedding data into storage. + + Args: + feature (FeatureType): the feature type to be checked + Returns: + :obj:`bool` + """ + if isinstance(feature, dict): + return any(require_storage_cast(f) for f in feature.values()) + elif isinstance(feature, LargeList): + return require_storage_cast(feature.feature) + elif isinstance(feature, List): + return require_storage_cast(feature.feature) + else: + return hasattr(feature, "embed_storage") + + +def keep_features_dicts_synced(func): + """ + Wrapper to keep the secondary dictionary, which tracks whether keys are decodable, of the :class:`datasets.Features` object + in sync with the main dictionary. + """ + + @wraps(func) + def wrapper(*args, **kwargs): + if args: + self: "Features" = args[0] + args = args[1:] + else: + self: "Features" = kwargs.pop("self") + out = func(self, *args, **kwargs) + assert hasattr(self, "_column_requires_decoding") + self._column_requires_decoding = {col: require_decoding(feature) for col, feature in self.items()} + return out + + wrapper._decorator_name_ = "_keep_dicts_synced" + return wrapper + + +class Features(dict): + """A special dictionary that defines the internal structure of a dataset. + + Instantiated with a dictionary of type `dict[str, FieldType]`, where keys are the desired column names, + and values are the type of that column. + + `FieldType` can be one of the following: + - [`Value`] feature specifies a single data type value, e.g. `int64` or `string`. + - [`ClassLabel`] feature specifies a predefined set of classes which can have labels associated to them and + will be stored as integers in the dataset. + - Python `dict` specifies a composite feature containing a mapping of sub-fields to sub-features. + It's possible to have nested fields of nested fields in an arbitrary manner. + - [`List`] or [`LargeList`] specifies a composite feature containing a sequence of + sub-features, all of the same feature type. + - [`Array2D`], [`Array3D`], [`Array4D`] or [`Array5D`] feature for multidimensional arrays. + - [`Audio`] feature to store the absolute path to an audio file or a dictionary with the relative path + to an audio file ("path" key) and its bytes content ("bytes" key). + This feature loads the audio lazily with a decoder. + - [`Image`] feature to store the absolute path to an image file, an `np.ndarray` object, a `PIL.Image.Image` object + or a dictionary with the relative path to an image file ("path" key) and its bytes content ("bytes" key). + This feature extracts the image data. + - [`Video`] feature to store the absolute path to a video file, a `torchcodec.decoders.VideoDecoder` object + or a dictionary with the relative path to a video file ("path" key) and its bytes content ("bytes" key). + This feature loads the video lazily with a decoder. + - [`Pdf`] feature to store the absolute path to a PDF file, a `pdfplumber.pdf.PDF` object + or a dictionary with the relative path to a PDF file ("path" key) and its bytes content ("bytes" key). + This feature loads the PDF lazily with a PDF reader. + - [`Nifti`] feature to store the absolute path to a NIfTI neuroimaging file, a `nibabel.Nifti1Image` object + or a dictionary with the relative path to a NIfTI file ("path" key) and its bytes content ("bytes" key). + This feature loads the NIfTI file lazily with nibabel. + - [`Translation`] or [`TranslationVariableLanguages`] feature specific to Machine Translation. + - [`Json`] feature to store unstructred data, e.g. containing mixed/abritrary types. Under the hood + """ + + def __init__(*args, **kwargs): + # self not in the signature to allow passing self as a kwarg + if not args: + raise TypeError("descriptor '__init__' of 'Features' object needs an argument") + self, *args = args + super(Features, self).__init__(*args, **kwargs) + # keep track of columns which require decoding + self._column_requires_decoding: dict[str, bool] = { + col: require_decoding(feature) for col, feature in self.items() + } + + # backward compatibility with datasets<4 : [feature] -> List(feature) + def _check_old_list(feature): + if isinstance(feature, list): + return List(_visit(feature[0], _check_old_list)) + return feature + + for column_name, feature in self.items(): + self[column_name] = _visit(feature, _check_old_list) + + __setitem__ = keep_features_dicts_synced(dict.__setitem__) + __delitem__ = keep_features_dicts_synced(dict.__delitem__) + update = keep_features_dicts_synced(dict.update) + setdefault = keep_features_dicts_synced(dict.setdefault) + pop = keep_features_dicts_synced(dict.pop) + popitem = keep_features_dicts_synced(dict.popitem) + clear = keep_features_dicts_synced(dict.clear) + + def __reduce__(self): + return Features, (dict(self),) + + @property + def type(self): + """ + Features field types. + + Returns: + :obj:`pyarrow.DataType` + """ + return get_nested_type(self) + + @property + def arrow_schema(self): + """ + Features schema. + + Returns: + :obj:`pyarrow.Schema` + """ + hf_metadata = {"info": {"features": self.to_dict()}} + return pa.schema(self.type).with_metadata({"huggingface": json.dumps(hf_metadata)}) + + @classmethod + def from_arrow_schema(cls, pa_schema: pa.Schema) -> "Features": + """ + Construct [`Features`] from Arrow Schema. + It also checks the schema metadata for Hugging Face Datasets features. + Non-nullable fields are not supported and set to nullable. + + Also, pa.dictionary is not supported and it uses its underlying type instead. + Therefore datasets convert DictionaryArray objects to their actual values. + + Args: + pa_schema (`pyarrow.Schema`): + Arrow Schema. + + Returns: + [`Features`] + """ + # try to load features from the arrow schema metadata + metadata_features = Features() + if pa_schema.metadata is not None and b"huggingface" in pa_schema.metadata: + metadata = json.loads(pa_schema.metadata[b"huggingface"].decode()) + if "info" in metadata and "features" in metadata["info"] and metadata["info"]["features"] is not None: + metadata_features = Features.from_dict(metadata["info"]["features"]) + metadata_features_schema = metadata_features.arrow_schema + obj = { + field.name: ( + metadata_features[field.name] + if field.name in metadata_features and metadata_features_schema.field(field.name) == field + else generate_from_arrow_type(field.type) + ) + for field in pa_schema + } + return cls(**obj) + + @classmethod + def from_dict(cls, dic) -> "Features": + """ + Construct [`Features`] from dict. + + Regenerate the nested feature object from a deserialized dict. + We use the `_type` key to infer the dataclass name of the feature `FieldType`. + + It allows for a convenient constructor syntax + to define features from deserialized JSON dictionaries. This function is used in particular when deserializing + a [`DatasetInfo`] that was dumped to a JSON object. This acts as an analogue to + [`Features.from_arrow_schema`] and handles the recursive field-by-field instantiation, but doesn't require + any mapping to/from pyarrow, except for the fact that it takes advantage of the mapping of pyarrow primitive + dtypes that [`Value`] automatically performs. + + Args: + dic (`dict[str, Any]`): + Python dictionary. + + Returns: + `Features` + + Example:: + >>> Features.from_dict({'_type': {'dtype': 'string', 'id': None, '_type': 'Value'}}) + {'_type': Value('string')} + """ + obj = generate_from_dict(dic) + return cls(**obj) + + def to_dict(self): + return asdict(self) + + def _to_yaml_list(self) -> list: + # we compute the YAML list from the dict representation that is used for JSON dump + yaml_data = self.to_dict() + + def simplify(feature: dict) -> dict: + if not isinstance(feature, dict): + raise TypeError(f"Expected a dict but got a {type(feature)}: {feature}") + + for list_type in ["large_list", "list", "sequence"]: + # + # list_type: -> list_type: int32 + # dtype: int32 -> + # + if isinstance(feature.get(list_type), dict) and list(feature[list_type]) == ["dtype"]: + feature[list_type] = feature[list_type]["dtype"] + + # + # list_type: -> list_type: + # struct: -> - name: foo + # - name: foo -> dtype: int32 + # dtype: int32 -> + # + if isinstance(feature.get(list_type), dict) and list(feature[list_type]) == ["struct"]: + feature[list_type] = feature[list_type]["struct"] + + # + # class_label: -> class_label: + # names: -> names: + # - negative -> '0': negative + # - positive -> '1': positive + # + if isinstance(feature.get("class_label"), dict) and isinstance(feature["class_label"].get("names"), list): + # server-side requirement: keys must be strings + feature["class_label"]["names"] = { + str(label_id): label_name for label_id, label_name in enumerate(feature["class_label"]["names"]) + } + return feature + + def to_yaml_inner(obj: Union[dict, list]) -> dict: + if isinstance(obj, dict): + _type = obj.pop("_type", None) + if _type == "LargeList": + _feature = obj.pop("feature") + return simplify({"large_list": to_yaml_inner(_feature), **obj}) + elif _type == "List": + _feature = obj.pop("feature") + return simplify({"list": to_yaml_inner(_feature), **obj}) + elif _type == "Value": + return obj + elif _type and not obj: + return {"dtype": camelcase_to_snakecase(_type)} + elif _type: + return {"dtype": simplify({camelcase_to_snakecase(_type): obj})} + else: + return {"struct": [{"name": name, **to_yaml_inner(_feature)} for name, _feature in obj.items()]} + elif isinstance(obj, list): + return simplify({"list": simplify(to_yaml_inner(obj[0]))}) + elif isinstance(obj, tuple): + return to_yaml_inner(list(obj)) + else: + raise TypeError(f"Expected a dict or a list but got {type(obj)}: {obj}") + + def to_yaml_types(obj: dict) -> dict: + if isinstance(obj, dict): + return {k: to_yaml_types(v) for k, v in obj.items()} + elif isinstance(obj, list): + return [to_yaml_types(v) for v in obj] + elif isinstance(obj, tuple): + return to_yaml_types(list(obj)) + else: + return obj + + return to_yaml_types(to_yaml_inner(yaml_data)["struct"]) + + @classmethod + def _from_yaml_list(cls, yaml_data: list) -> "Features": + yaml_data = copy.deepcopy(yaml_data) + + # we convert the list obtained from YAML data into the dict representation that is used for JSON dump + + def unsimplify(feature: dict) -> dict: + if not isinstance(feature, dict): + raise TypeError(f"Expected a dict but got a {type(feature)}: {feature}") + + for list_type in ["large_list", "list", "sequence"]: + # + # list_type: int32 -> list_type: + # -> dtype: int32 + # + if isinstance(feature.get(list_type), str): + feature[list_type] = {"dtype": feature[list_type]} + + # + # class_label: -> class_label: + # names: -> names: + # '0': negative -> - negative + # '1': positive -> - positive + # + if isinstance(feature.get("class_label"), dict) and isinstance(feature["class_label"].get("names"), dict): + label_ids = sorted(feature["class_label"]["names"], key=int) + if label_ids and [int(label_id) for label_id in label_ids] != list(range(int(label_ids[-1]) + 1)): + raise ValueError( + f"ClassLabel expected a value for all label ids [0:{int(label_ids[-1]) + 1}] but some ids are missing." + ) + feature["class_label"]["names"] = [feature["class_label"]["names"][label_id] for label_id in label_ids] + return feature + + def from_yaml_inner(obj: Union[dict, list]) -> Union[dict, list]: + if isinstance(obj, dict): + if not obj: + return {} + _type = next(iter(obj)) + if _type == "large_list": + _feature = from_yaml_inner(unsimplify(obj).pop(_type)) + return {"feature": _feature, **obj, "_type": "LargeList"} + if _type == "sequence": # backward compatibility + if isinstance(obj[_type], list): + _feature = from_yaml_inner(unsimplify(obj).pop(_type)) + return { + name: {"feature": _subfeature, **obj, "_type": "List"} + for name, _subfeature in _feature.items() + } + else: + _feature = from_yaml_inner(unsimplify(obj).pop(_type)) + return {"feature": _feature, **obj, "_type": "List"} + if _type == "list": + _feature = from_yaml_inner(unsimplify(obj).pop(_type)) + return {"feature": _feature, **obj, "_type": "List"} + if _type == "struct": + return from_yaml_inner(obj["struct"]) + elif _type == "dtype": + if isinstance(obj["dtype"], str): + # e.g. int32, float64, string, audio, image + try: + Value(obj["dtype"]) + return {**obj, "_type": "Value"} + except ValueError: + # e.g. Audio, Image, ArrayXD + return {"_type": snakecase_to_camelcase(obj["dtype"])} + else: + return from_yaml_inner(obj["dtype"]) + else: + return {"_type": snakecase_to_camelcase(_type), **unsimplify(obj)[_type]} + elif isinstance(obj, list): + names = [_feature.pop("name") for _feature in obj] + return {name: from_yaml_inner(_feature) for name, _feature in zip(names, obj)} + else: + raise TypeError(f"Expected a dict or a list but got {type(obj)}: {obj}") + + return cls.from_dict(from_yaml_inner(yaml_data)) + + def encode_example(self, example): + """ + Encode example into a format for Arrow. + + Args: + example (`dict[str, Any]`): + Data in a Dataset row. + + Returns: + `dict[str, Any]` + """ + example = cast_to_python_objects(example) + return encode_nested_example(self, example) + + def encode_column(self, column, column_name: str): + """ + Encode column into a format for Arrow. + + Args: + column (`list[Any]`): + Data in a Dataset column. + column_name (`str`): + Dataset column name. + + Returns: + `list[Any]` + """ + column = cast_to_python_objects(column) + return [encode_nested_example(self[column_name], obj, level=1) for obj in column] + + def encode_batch(self, batch): + """ + Encode batch into a format for Arrow. + + Args: + batch (`dict[str, list[Any]]`): + Data in a Dataset batch. + + Returns: + `dict[str, list[Any]]` + """ + encoded_batch = {} + if set(batch) != set(self): + raise ValueError(f"Column mismatch between batch {set(batch)} and features {set(self)}") + for key, column in batch.items(): + column = cast_to_python_objects(column) + encoded_batch[key] = [encode_nested_example(self[key], obj, level=1) for obj in column] + return encoded_batch + + def decode_example(self, example: dict, token_per_repo_id: Optional[dict[str, Union[str, bool, None]]] = None): + """Decode example with custom feature decoding. + + Args: + example (`dict[str, Any]`): + Dataset row data. + token_per_repo_id (`dict`, *optional*): + To access and decode audio or image files from private repositories on the Hub, you can pass + a dictionary `repo_id (str) -> token (bool or str)`. + + Returns: + `dict[str, Any]` + """ + + return { + column_name: decode_nested_example(feature, value, token_per_repo_id=token_per_repo_id) + if self._column_requires_decoding[column_name] + else value + for column_name, (feature, value) in zip_dict( + {key: value for key, value in self.items() if key in example}, example + ) + } + + def decode_column( + self, column: list, column_name: str, token_per_repo_id: Optional[dict[str, Union[str, bool, None]]] = None + ): + """Decode column with custom feature decoding. + + Args: + column (`list[Any]`): + Dataset column data. + column_name (`str`): + Dataset column name. + + Returns: + `list[Any]` + """ + return ( + [ + decode_nested_example(self[column_name], value, token_per_repo_id=token_per_repo_id) + if value is not None + else None + for value in column + ] + if self._column_requires_decoding[column_name] + else column + ) + + def decode_batch(self, batch: dict, token_per_repo_id: Optional[dict[str, Union[str, bool, None]]] = None): + """Decode batch with custom feature decoding. + + Args: + batch (`dict[str, list[Any]]`): + Dataset batch data. + token_per_repo_id (`dict`, *optional*): + To access and decode audio or image files from private repositories on the Hub, you can pass + a dictionary repo_id (str) -> token (bool or str) + + Returns: + `dict[str, list[Any]]` + """ + decoded_batch = {} + for column_name, column in batch.items(): + decoded_batch[column_name] = ( + [ + decode_nested_example(self[column_name], value, token_per_repo_id=token_per_repo_id) + if value is not None + else None + for value in column + ] + if self._column_requires_decoding[column_name] + else column + ) + return decoded_batch + + def copy(self) -> "Features": + """ + Make a deep copy of [`Features`]. + + Returns: + [`Features`] + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train") + >>> copy_of_features = ds.features.copy() + >>> copy_of_features + {'label': ClassLabel(names=['neg', 'pos']), + 'text': Value('string')} + ``` + """ + return copy.deepcopy(self) + + def reorder_fields_as(self, other: "Features") -> "Features": + """ + Reorder Features fields to match the field order of other [`Features`]. + + The order of the fields is important since it matters for the underlying arrow data. + Re-ordering the fields allows to make the underlying arrow data type match. + + Args: + other ([`Features`]): + The other [`Features`] to align with. + + Returns: + [`Features`] + + Example:: + + >>> from datasets import Features, List, Value + >>> # let's say we have two features with a different order of nested fields (for a and b for example) + >>> f1 = Features({"root": {"a": Value("string"), "b": Value("string")}}) + >>> f2 = Features({"root": {"b": Value("string"), "a": Value("string")}}) + >>> assert f1.type != f2.type + >>> # re-ordering keeps the base structure (here List is defined at the root level), but makes the fields order match + >>> f1.reorder_fields_as(f2) + {'root': List({'b': Value('string'), 'a': Value('string')})} + >>> assert f1.reorder_fields_as(f2).type == f2.type + """ + + def recursive_reorder(source, target, stack=""): + stack_position = " at " + stack[1:] if stack else "" + if isinstance(source, dict): + if not isinstance(target, dict): + raise ValueError(f"Type mismatch: between {source} and {target}" + stack_position) + if sorted(source) != sorted(target): + message = ( + f"Keys mismatch: between {source} (source) and {target} (target).\n" + f"{source.keys() - target.keys()} are missing from target " + f"and {target.keys() - source.keys()} are missing from source" + stack_position + ) + raise ValueError(message) + return {key: recursive_reorder(source[key], target[key], stack + f".{key}") for key in target} + elif isinstance(source, List): + if not isinstance(target, List): + raise ValueError(f"Type mismatch: between {source} and {target}" + stack_position) + return List(recursive_reorder(source.feature, target.feature, stack + "."), length=source.length) + elif isinstance(source, LargeList): + if not isinstance(target, LargeList): + raise ValueError(f"Type mismatch: between {source} and {target}" + stack_position) + return LargeList(recursive_reorder(source.feature, target.feature, stack + ".")) + else: + return source + + return Features(recursive_reorder(self, other)) + + def flatten(self, max_depth=16) -> "Features": + """Flatten the features. Every dictionary column is removed and is replaced by + all the subfields it contains. The new fields are named by concatenating the + name of the original column and the subfield name like this: `.`. + + If a column contains nested dictionaries, then all the lower-level subfields names are + also concatenated to form new columns: `..`, etc. + + Returns: + [`Features`]: + The flattened features. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("rajpurkar/squad", split="train") + >>> ds.features.flatten() + {'answers.answer_start': List(Value('int32'), id=None), + 'answers.text': List(Value('string'), id=None), + 'context': Value('string'), + 'id': Value('string'), + 'question': Value('string'), + 'title': Value('string')} + ``` + """ + for depth in range(1, max_depth): + no_change = True + flattened = self.copy() + for column_name, subfeature in self.items(): + if isinstance(subfeature, dict): + no_change = False + flattened.update({f"{column_name}.{k}": v for k, v in subfeature.items()}) + del flattened[column_name] + elif hasattr(subfeature, "flatten") and subfeature.flatten() != subfeature: + no_change = False + flattened.update({f"{column_name}.{k}": v for k, v in subfeature.flatten().items()}) + del flattened[column_name] + self = flattened + if no_change: + break + return self + + +def _is_null_feature(feature) -> bool: + """Recursively check if a feature represents a null type. + + This handles not only top-level ``Value("null")`` but also nested null types + such as ``List(Value("null"))``, ``LargeList(Value("null"))``, and + ``Sequence(Value("null"))``, which can arise when a shard contains only + empty lists during multi-process ``Dataset.map()``. + """ + if isinstance(feature, Value) and feature.dtype == "null": + return True + if isinstance(feature, (Sequence, LargeList)) and hasattr(feature, "feature"): + return _is_null_feature(feature.feature) + return False + + +def _align_features(features_list: list[Features]) -> list[Features]: + """Align dictionaries of features so that the keys that are found in multiple dictionaries share the same feature.""" + name2feature = {} + for features in features_list: + for k, v in features.items(): + if k in name2feature and isinstance(v, dict): + # Recursively align features. + name2feature[k] = _align_features([name2feature[k], v])[0] + elif k not in name2feature or _is_null_feature(name2feature[k]): + name2feature[k] = v + + return [Features({k: name2feature[k] for k in features.keys()}) for features in features_list] + + +def _check_if_features_can_be_aligned(features_list: list[Features]): + """Check if the dictionaries of features can be aligned. + + Two dictionaries of features can be aligned if the keys they share have the same type or some of them is of + type ``Value("null")`` (or a container wrapping ``Value("null")``, such as ``List(Value("null"))``). + """ + name2feature = {} + for features in features_list: + for k, v in features.items(): + if k not in name2feature or _is_null_feature(name2feature[k]): + name2feature[k] = v + + for features in features_list: + for k, v in features.items(): + if isinstance(v, dict) and isinstance(name2feature[k], dict): + # Deep checks for structure. + _check_if_features_can_be_aligned([name2feature[k], v]) + elif not _is_null_feature(v) and name2feature[k] != v: + raise ValueError( + f'The features can\'t be aligned because the key {k} of features {features} has unexpected type - {v} (expected either {name2feature[k]} or Value("null").' + ) + + +def _fix_for_backward_compatible_features(feature: Any) -> FeatureType: + def _fix_old_list(feature): + if isinstance(feature, list): + return List(_fix_for_backward_compatible_features(feature[0])) + return feature + + return _visit(feature, _fix_old_list) diff --git a/src/datasets/features/image.py b/src/datasets/features/image.py new file mode 100644 index 0000000..9a7953d --- /dev/null +++ b/src/datasets/features/image.py @@ -0,0 +1,441 @@ +import os +import sys +import warnings +from dataclasses import dataclass, field +from io import BytesIO +from pathlib import Path +from typing import TYPE_CHECKING, Any, ClassVar, Optional, Union + +import numpy as np +import pyarrow as pa + +from .. import config +from ..download.download_config import DownloadConfig +from ..table import array_cast +from ..utils.file_utils import is_local_path, is_remote_url, xopen +from ..utils.py_utils import first_non_null_value, no_op_if_value_is_null, string_to_dict + + +if TYPE_CHECKING: + import PIL.Image + + from .features import FeatureType + + +_IMAGE_COMPRESSION_FORMATS: Optional[list[str]] = None +_NATIVE_BYTEORDER = "<" if sys.byteorder == "little" else ">" +# Origin: https://github.com/python-pillow/Pillow/blob/698951e19e19972aeed56df686868f1329981c12/src/PIL/Image.py#L3126 minus "|i1" which values are not preserved correctly when saving and loading an image +_VALID_IMAGE_ARRAY_DTPYES = [ + np.dtype("|b1"), + np.dtype("|u1"), + np.dtype("u2"), + np.dtype("i2"), + np.dtype("u4"), + np.dtype("i4"), + np.dtype("f4"), + np.dtype("f8"), +] + + +@dataclass +class Image: + """Image [`Feature`] to read image data from an image file. + + Input: The Image feature accepts as input: + - A `str`: Absolute path to the image file (i.e. random access is allowed). + - A `pathlib.Path`: path to the image file (i.e. random access is allowed). + - A `dict` with the keys: + + - `path`: String with relative path of the image file to the archive file. + - `bytes`: Bytes of the image file. + + This is useful for parquet or webdataset files which embed image files. + + - An `np.ndarray`: NumPy array representing an image. + - A `PIL.Image.Image`: PIL image object. + + Output: The Image features output data as `PIL.Image.Image` objects. + + Args: + mode (`str`, *optional*): + The mode to convert the image to. If `None`, the native mode of the image is used. + decode (`bool`, defaults to `True`): + Whether to decode the image data. If `False`, + returns the underlying dictionary in the format `{"path": image_path, "bytes": image_bytes}`. + + Examples: + + ```py + >>> from datasets import load_dataset, Image + >>> ds = load_dataset("AI-Lab-Makerere/beans", split="train") + >>> ds.features["image"] + Image(decode=True, id=None) + >>> ds[0]["image"] + + >>> ds = ds.cast_column('image', Image(decode=False)) + {'bytes': None, + 'path': '/root/.cache/huggingface/datasets/downloads/extracted/b0a21163f78769a2cf11f58dfc767fb458fc7cea5c05dccc0144a2c0f0bc1292/train/healthy/healthy_train.85.jpg'} + ``` + """ + + mode: Optional[str] = None + decode: bool = True + id: Optional[str] = field(default=None, repr=False) + # Automatically constructed + dtype: ClassVar[str] = "PIL.Image.Image" + pa_type: ClassVar[Any] = pa.struct({"bytes": pa.binary(), "path": pa.string()}) + _type: str = field(default="Image", init=False, repr=False) + + def __call__(self): + return self.pa_type + + def encode_example(self, value: Union[str, bytes, bytearray, dict, np.ndarray, "PIL.Image.Image"]) -> dict: + """Encode example into a format for Arrow. + + Args: + value (`str`, `np.ndarray`, `PIL.Image.Image` or `dict`): + Data passed as input to Image feature. + + Returns: + `dict` with "path" and "bytes" fields + """ + if config.PIL_AVAILABLE: + import PIL.Image + else: + raise ImportError("To support encoding images, please install 'Pillow'.") + + if isinstance(value, list): + value = np.array(value) + + if isinstance(value, str): + return {"path": value, "bytes": None} + elif isinstance(value, Path): + return {"path": str(value.absolute()), "bytes": None} + elif isinstance(value, (bytes, bytearray)): + return {"path": None, "bytes": value} + elif isinstance(value, np.ndarray): + # convert the image array to PNG/TIFF bytes + return encode_np_array(value) + elif isinstance(value, PIL.Image.Image): + # convert the PIL image to bytes (default format is PNG/TIFF) + return encode_pil_image(value) + elif value.get("path") is not None and os.path.isfile(value["path"]): + # we set "bytes": None to not duplicate the data if they're already available locally + return {"bytes": None, "path": value.get("path")} + elif value.get("bytes") is not None or value.get("path") is not None: + # store the image bytes, and path is used to infer the image format using the file extension + return {"bytes": value.get("bytes"), "path": value.get("path")} + else: + raise ValueError( + f"An image sample should have one of 'path' or 'bytes' but they are missing or None in {value}." + ) + + def decode_example(self, value: dict, token_per_repo_id=None) -> "PIL.Image.Image": + """Decode example image file into image data. + + Args: + value (`str` or `dict`): + A string with the absolute image file path, a dictionary with + keys: + + - `path`: String with absolute or relative image file path. + - `bytes`: The bytes of the image file. + token_per_repo_id (`dict`, *optional*): + To access and decode + image files from private repositories on the Hub, you can pass + a dictionary repo_id (`str`) -> token (`bool` or `str`). + + Returns: + `PIL.Image.Image` + """ + if not self.decode: + raise RuntimeError("Decoding is disabled for this feature. Please use Image(decode=True) instead.") + + if config.PIL_AVAILABLE: + import PIL.Image + import PIL.ImageOps + else: + raise ImportError("To support decoding images, please install 'Pillow'.") + + if token_per_repo_id is None: + token_per_repo_id = {} + + path, bytes_ = value["path"], value["bytes"] + if bytes_ is None: + if path is None: + raise ValueError(f"An image should have one of 'path' or 'bytes' but both are None in {value}.") + else: + if is_local_path(path): + image = PIL.Image.open(path) + else: + source_url = path.split("::")[-1] + pattern = ( + config.HUB_DATASETS_URL + if source_url.startswith(config.HF_ENDPOINT) + else config.HUB_DATASETS_HFFS_URL + ) + source_url_fields = string_to_dict(source_url, pattern) + token = ( + token_per_repo_id.get(source_url_fields["repo_id"]) if source_url_fields is not None else None + ) + download_config = DownloadConfig(token=token) + with xopen(path, "rb", download_config=download_config) as f: + bytes_ = BytesIO(f.read()) + image = PIL.Image.open(bytes_) + else: + image = PIL.Image.open(BytesIO(bytes_)) + image.load() # to avoid "Too many open files" errors + if image.getexif().get(PIL.Image.ExifTags.Base.Orientation) is not None: + image = PIL.ImageOps.exif_transpose(image) + if self.mode and self.mode != image.mode: + image = image.convert(self.mode) + return image + + def flatten(self) -> Union["FeatureType", dict[str, "FeatureType"]]: + """If in the decodable state, return the feature itself, otherwise flatten the feature into a dictionary.""" + from .features import Value + + return ( + self + if self.decode + else { + "bytes": Value("binary"), + "path": Value("string"), + } + ) + + def cast_storage(self, storage: Union[pa.StringArray, pa.StructArray, pa.ListArray]) -> pa.StructArray: + """Cast an Arrow array to the Image arrow storage type. + The Arrow types that can be converted to the Image pyarrow storage type are: + + - `pa.string()` - it must contain the "path" data + - `pa.large_string()` - it must contain the "path" data (will be cast to string if possible) + - `pa.binary()` - it must contain the image bytes + - `pa.struct({"bytes": pa.binary()})` + - `pa.struct({"path": pa.string()})` + - `pa.struct({"bytes": pa.binary(), "path": pa.string()})` - order doesn't matter + - `pa.list(*)` - it must contain the image array data + + Args: + storage (`Union[pa.StringArray, pa.StructArray, pa.ListArray]`): + PyArrow array to cast. + + Returns: + `pa.StructArray`: Array in the Image arrow storage type, that is + `pa.struct({"bytes": pa.binary(), "path": pa.string()})`. + """ + if pa.types.is_large_string(storage.type): + try: + storage = storage.cast(pa.string()) + except pa.ArrowInvalid as e: + raise ValueError( + f"Failed to cast large_string to string for Image feature. " + f"This can happen if string values exceed 2GB. " + f"Original error: {e}" + ) from e + if pa.types.is_string(storage.type): + bytes_array = pa.array([None] * len(storage), type=pa.binary()) + storage = pa.StructArray.from_arrays([bytes_array, storage], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_large_binary(storage.type): + storage = array_cast( + storage, pa.binary() + ) # this can fail in case of big images, paths should be used instead + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays([storage, path_array], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_binary(storage.type): + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays([storage, path_array], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_struct(storage.type): + if storage.type.get_field_index("bytes") >= 0: + bytes_array = storage.field("bytes") + else: + bytes_array = pa.array([None] * len(storage), type=pa.binary()) + if storage.type.get_field_index("path") >= 0: + path_array = storage.field("path") + else: + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays([bytes_array, path_array], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_list(storage.type): + bytes_array = pa.array( + [encode_np_array(np.array(arr))["bytes"] if arr is not None else None for arr in storage.to_pylist()], + type=pa.binary(), + ) + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays( + [bytes_array, path_array], ["bytes", "path"], mask=bytes_array.is_null() + ) + return array_cast(storage, self.pa_type) + + def embed_storage( + self, storage: pa.StructArray, token_per_repo_id=None, local_files: bool = True, remote_files: bool = True + ) -> pa.StructArray: + """Embed image files into the Arrow array. + + Args: + storage (`pa.StructArray`): + PyArrow array to embed. + token_per_repo_id (`dict`, optional): + Dictionary repo_id -> token to fetch the files bytes. + local_files (`bool`, defaults to `True`) + Whether to embed local files data in the array + + + remote_files (`bool`, defaults to `True`) + Whether to embed remote files data in the array. + E.g. files with paths that start with hf:// or https:// + + + + Returns: + `pa.StructArray`: Array in the Image arrow storage type, that is + `pa.struct({"bytes": pa.binary(), "path": pa.string()})`. + """ + if token_per_repo_id is None: + token_per_repo_id = {} + + @no_op_if_value_is_null + def path_to_bytes(path): + source_url = path.split("::")[-1] + pattern = ( + config.HUB_DATASETS_URL if source_url.startswith(config.HF_ENDPOINT) else config.HUB_DATASETS_HFFS_URL + ) + source_url_fields = string_to_dict(source_url, pattern) + token = token_per_repo_id.get(source_url_fields["repo_id"]) if source_url_fields is not None else None + download_config = DownloadConfig(token=token) + with xopen(path, "rb", download_config=download_config) as f: + return f.read() + + bytes_array = pa.array( + [ + ( + path_to_bytes(x["path"]) + if x["bytes"] is None + and ((local_files and is_local_path(x["path"])) or (remote_files and is_remote_url(x["path"]))) + else x["bytes"] + ) + if x is not None + else None + for x in storage.to_pylist() + ], + type=pa.binary(), + ) + path_array = pa.array( + [ + ( + os.path.basename(path) + if (local_files and is_local_path(path)) or (remote_files and is_remote_url(path)) + else path + ) + if path is not None + else None + for path in storage.field("path").to_pylist() + ], + type=pa.string(), + ) + storage = pa.StructArray.from_arrays([bytes_array, path_array], ["bytes", "path"], mask=storage.is_null()) + return array_cast(storage, self.pa_type) + + +def list_image_compression_formats() -> list[str]: + if config.PIL_AVAILABLE: + import PIL.Image + else: + raise ImportError("To support encoding images, please install 'Pillow'.") + + global _IMAGE_COMPRESSION_FORMATS + if _IMAGE_COMPRESSION_FORMATS is None: + PIL.Image.init() + _IMAGE_COMPRESSION_FORMATS = list(set(PIL.Image.OPEN.keys()) & set(PIL.Image.SAVE.keys())) + return _IMAGE_COMPRESSION_FORMATS + + +def image_to_bytes(image: "PIL.Image.Image") -> bytes: + """Convert a PIL Image object to bytes using native compression if possible, otherwise use PNG/TIFF compression.""" + buffer = BytesIO() + if image.format in list_image_compression_formats(): + format = image.format + else: + format = "PNG" if image.mode in ["1", "L", "LA", "RGB", "RGBA"] else "TIFF" + image.save(buffer, format=format) + return buffer.getvalue() + + +def encode_pil_image(image: "PIL.Image.Image") -> dict: + if hasattr(image, "filename") and image.filename != "": + return {"path": image.filename, "bytes": None} + else: + return {"path": None, "bytes": image_to_bytes(image)} + + +def encode_np_array(array: np.ndarray) -> dict: + if config.PIL_AVAILABLE: + import PIL.Image + else: + raise ImportError("To support encoding images, please install 'Pillow'.") + + dtype = array.dtype + dtype_byteorder = dtype.byteorder if dtype.byteorder != "=" else _NATIVE_BYTEORDER + dtype_kind = dtype.kind + dtype_itemsize = dtype.itemsize + + dest_dtype = None + + # Multi-channel array case (only np.dtype("|u1") is allowed) + if array.shape[2:]: + if dtype_kind not in ["u", "i"]: + raise TypeError( + f"Unsupported array dtype {dtype} for image encoding. Only {dest_dtype} is supported for multi-channel arrays." + ) + dest_dtype = np.dtype("|u1") + if dtype != dest_dtype: + warnings.warn(f"Downcasting array dtype {dtype} to {dest_dtype} to be compatible with 'Pillow'") + # Exact match + elif dtype in _VALID_IMAGE_ARRAY_DTPYES: + dest_dtype = dtype + else: # Downcast the type within the kind (np.can_cast(from_type, to_type, casting="same_kind") doesn't behave as expected, so do it manually) + while dtype_itemsize >= 1: + dtype_str = dtype_byteorder + dtype_kind + str(dtype_itemsize) + if np.dtype(dtype_str) in _VALID_IMAGE_ARRAY_DTPYES: + dest_dtype = np.dtype(dtype_str) + warnings.warn(f"Downcasting array dtype {dtype} to {dest_dtype} to be compatible with 'Pillow'") + break + else: + dtype_itemsize //= 2 + if dest_dtype is None: + raise TypeError( + f"Cannot downcast dtype {dtype} to a valid image dtype. Valid image dtypes: {_VALID_IMAGE_ARRAY_DTPYES}" + ) + + image = PIL.Image.fromarray(array.astype(dest_dtype)) + return {"path": None, "bytes": image_to_bytes(image)} + + +def objects_to_list_of_image_dicts( + objs: Union[list[str], list[dict], list[np.ndarray], list["PIL.Image.Image"]], +) -> list[dict]: + """Encode a list of objects into a format suitable for creating an extension array of type `ImageExtensionType`.""" + if config.PIL_AVAILABLE: + import PIL.Image + else: + raise ImportError("To support encoding images, please install 'Pillow'.") + + if objs: + _, obj = first_non_null_value(objs) + if isinstance(obj, str): + return [{"path": obj, "bytes": None} if obj is not None else None for obj in objs] + if isinstance(obj, np.ndarray): + obj_to_image_dict_func = no_op_if_value_is_null(encode_np_array) + return [obj_to_image_dict_func(obj) for obj in objs] + elif isinstance(obj, PIL.Image.Image): + obj_to_image_dict_func = no_op_if_value_is_null(encode_pil_image) + return [obj_to_image_dict_func(obj) for obj in objs] + else: + return objs + else: + return objs diff --git a/src/datasets/features/mesh.py b/src/datasets/features/mesh.py new file mode 100644 index 0000000..58da5d2 --- /dev/null +++ b/src/datasets/features/mesh.py @@ -0,0 +1,295 @@ +import os +from dataclasses import dataclass, field +from io import BytesIO +from pathlib import Path +from typing import TYPE_CHECKING, Any, ClassVar, Optional, Union + +import pyarrow as pa + +from .. import config +from ..download.download_config import DownloadConfig +from ..table import array_cast +from ..utils.file_utils import is_local_path, is_remote_url, xopen +from ..utils.py_utils import string_to_dict + + +if TYPE_CHECKING: + import trimesh + + from .features import FeatureType + + +@dataclass +class Mesh: + """Mesh [`Feature`] to read 3D mesh data from a file. + + Input: The Mesh feature accepts as input: + - A `str`: Absolute path to the mesh file (i.e. random access is allowed). + - A `pathlib.Path`: path to the mesh file (i.e. random access is allowed). + - A `dict` with the keys: + + - `path`: String with relative path of the mesh file to the archive file. + - `bytes`: Bytes of the mesh file. + + This is useful for parquet or webdataset files which embed mesh files. + + - A `trimesh.Trimesh` or `trimesh.Scene`: 3D mesh or scene object. + + Output: The Mesh feature outputs data as `trimesh.Trimesh` or `trimesh.Scene` objects. + + Args: + decode (`bool`, defaults to `True`): + Whether to decode the mesh data. If `False`, + returns the underlying dictionary in the format `{"path": mesh_path, "bytes": mesh_bytes}`. + Mesh decoding uses `trimesh` and supports `.glb`, `.ply`, and `.stl` files. + """ + + decode: bool = True + id: Optional[str] = field(default=None, repr=False) + # Automatically constructed + dtype: ClassVar[str] = "trimesh.Trimesh" + pa_type: ClassVar[Any] = pa.struct({"bytes": pa.binary(), "path": pa.string()}) + _type: str = field(default="Mesh", init=False, repr=False) + + def __call__(self): + return self.pa_type + + def encode_example(self, value: Union[str, bytes, bytearray, dict, "trimesh.Trimesh", "trimesh.Scene"]) -> dict: + """Encode example into a format for Arrow. + + Args: + value (`str`, `bytes`, `dict`, `trimesh.Trimesh`, or `trimesh.Scene`): + Data passed as input to Mesh feature. + + Returns: + `dict` with "path" and "bytes" fields + """ + if config.TRIMESH_AVAILABLE: + import trimesh + else: + trimesh = None + + if isinstance(value, str): + return {"path": value, "bytes": None} + elif isinstance(value, Path): + return {"path": str(value.absolute()), "bytes": None} + elif isinstance(value, (bytes, bytearray)): + return {"path": None, "bytes": value} + elif trimesh is not None and isinstance(value, (trimesh.Trimesh, trimesh.Scene)): + return encode_trimesh_mesh(value) + elif isinstance(value, dict) and value.get("path") is not None and os.path.isfile(value["path"]): + # we set "bytes": None to not duplicate the data if they're already available locally + return {"bytes": None, "path": value.get("path")} + elif isinstance(value, dict) and (value.get("bytes") is not None or value.get("path") is not None): + # store the mesh bytes, and path is used to infer the mesh format using the file extension + return {"bytes": value.get("bytes"), "path": value.get("path")} + else: + raise ValueError( + f"A mesh sample should have one of 'path' or 'bytes' but they are missing or None in {value}." + ) + + def decode_example(self, value: dict, token_per_repo_id=None) -> Union["trimesh.Trimesh", "trimesh.Scene"]: + """Decode example mesh file. + + Args: + value (`dict`): + A dictionary with keys: + + - `path`: String with absolute or relative mesh file path. + - `bytes`: The bytes of the mesh file. + token_per_repo_id (`dict`, *optional*): + To access and decode + mesh files from private repositories on the Hub, you can pass + a dictionary repo_id (`str`) -> token (`bool` or `str`). + + Returns: + `trimesh.Trimesh` or `trimesh.Scene` + """ + if not self.decode: + raise RuntimeError("Decoding is disabled for this feature. Please use Mesh(decode=True) instead.") + + if config.TRIMESH_AVAILABLE: + import trimesh + else: + raise ImportError("To support decoding meshes, please install 'trimesh'.") + + if token_per_repo_id is None: + token_per_repo_id = {} + + path, bytes_ = value["path"], value["bytes"] + if bytes_ is None: + if path is None: + raise ValueError(f"A mesh should have one of 'path' or 'bytes' but both are None in {value}.") + if is_local_path(path): + file_type = _infer_mesh_file_type(path) + if file_type is None: + raise ValueError("A mesh path should have a .glb, .ply, or .stl extension.") + return trimesh.load(path, file_type=file_type) + source_url = path.split("::")[-1] + pattern = ( + config.HUB_DATASETS_URL if source_url.startswith(config.HF_ENDPOINT) else config.HUB_DATASETS_HFFS_URL + ) + source_url_fields = string_to_dict(source_url, pattern) + token = token_per_repo_id.get(source_url_fields["repo_id"]) if source_url_fields is not None else None + download_config = DownloadConfig(token=token) + with xopen(path, "rb", download_config=download_config) as f: + bytes_ = f.read() + + file_type = _infer_mesh_file_type(path) + if file_type is None: + raise ValueError( + "Decoding mesh bytes requires a 'path' value with a .glb, .ply, or .stl extension " + "to infer the mesh file type." + ) + return trimesh.load(BytesIO(bytes_), file_type=file_type) + + def flatten(self) -> Union["FeatureType", dict[str, "FeatureType"]]: + """If in the decodable state, return the feature itself, otherwise flatten the feature into a dictionary.""" + from .features import Value + + return ( + self + if self.decode + else { + "bytes": Value("binary"), + "path": Value("string"), + } + ) + + def cast_storage(self, storage: Union[pa.StringArray, pa.StructArray]) -> pa.StructArray: + """Cast an Arrow array to the Mesh arrow storage type. + The Arrow types that can be converted to the Mesh pyarrow storage type are: + + - `pa.string()` - it must contain the "path" data + - `pa.large_string()` - it must contain the "path" data (will be cast to string if possible) + - `pa.binary()` - it must contain the mesh bytes + - `pa.struct({"bytes": pa.binary()})` + - `pa.struct({"path": pa.string()})` + - `pa.struct({"bytes": pa.binary(), "path": pa.string()})` - order doesn't matter + + Args: + storage (`Union[pa.StringArray, pa.StructArray]`): + PyArrow array to cast. + + Returns: + `pa.StructArray`: Array in the Mesh arrow storage type, that is + `pa.struct({"bytes": pa.binary(), "path": pa.string()})`. + """ + if pa.types.is_large_string(storage.type): + try: + storage = storage.cast(pa.string()) + except pa.ArrowInvalid as e: + raise ValueError( + f"Failed to cast large_string to string for Mesh feature. " + f"This can happen if string values exceed 2GB. " + f"Original error: {e}" + ) from e + if pa.types.is_string(storage.type): + bytes_array = pa.array([None] * len(storage), type=pa.binary()) + storage = pa.StructArray.from_arrays([bytes_array, storage], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_large_binary(storage.type): + storage = array_cast( + storage, pa.binary() + ) # this can fail in case of big meshes, paths should be used instead + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays([storage, path_array], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_binary(storage.type): + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays([storage, path_array], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_struct(storage.type): + if storage.type.get_field_index("bytes") >= 0: + bytes_array = storage.field("bytes") + else: + bytes_array = pa.array([None] * len(storage), type=pa.binary()) + if storage.type.get_field_index("path") >= 0: + path_array = storage.field("path") + else: + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays([bytes_array, path_array], ["bytes", "path"], mask=storage.is_null()) + + return array_cast(storage, self.pa_type) + + def embed_storage( + self, storage: pa.StructArray, token_per_repo_id=None, local_files: bool = True, remote_files: bool = True + ) -> pa.StructArray: + """Embed mesh files into the Arrow array. + + Args: + storage (`pa.StructArray`): + PyArrow array to embed. + token_per_repo_id (`dict`, optional): + Dictionary repo_id -> token to fetch the files bytes. + local_files (`bool`, defaults to `True`): + Whether to embed local files data in the array. + remote_files (`bool`, defaults to `True`): + Whether to embed remote files data in the array. + + Returns: + `pa.StructArray`: Array in the Mesh arrow storage type, that is + `pa.struct({"bytes": pa.binary(), "path": pa.string()})`. + """ + if token_per_repo_id is None: + token_per_repo_id = {} + + def path_to_bytes(path): + if path is None: + return None + source_url = path.split("::")[-1] + pattern = ( + config.HUB_DATASETS_URL if source_url.startswith(config.HF_ENDPOINT) else config.HUB_DATASETS_HFFS_URL + ) + source_url_fields = string_to_dict(source_url, pattern) + token = token_per_repo_id.get(source_url_fields["repo_id"]) if source_url_fields is not None else None + download_config = DownloadConfig(token=token) + with xopen(path, "rb", download_config=download_config) as f: + return f.read() + + bytes_array = pa.array( + [ + ( + path_to_bytes(x["path"]) + if x["bytes"] is None + and ((local_files and is_local_path(x["path"])) or (remote_files and is_remote_url(x["path"]))) + else x["bytes"] + ) + if x is not None + else None + for x in storage.to_pylist() + ], + type=pa.binary(), + ) + path_array = pa.array( + [ + ( + os.path.basename(path) + if (local_files and is_local_path(path)) or (remote_files and is_remote_url(path)) + else path + ) + if path is not None + else None + for path in storage.field("path").to_pylist() + ], + type=pa.string(), + ) + storage = pa.StructArray.from_arrays([bytes_array, path_array], ["bytes", "path"], mask=storage.is_null()) + return array_cast(storage, self.pa_type) + + +def _infer_mesh_file_type(path: Optional[str]) -> Optional[str]: + supported_file_types = {"glb", "ply", "stl"} + if path is None: + return None + path_without_archive = path.split("::", 1)[0] + path_without_query = path_without_archive.split("?", 1)[0] + extension = os.path.splitext(path_without_query)[1].lower().lstrip(".") + return extension if extension in supported_file_types else None + + +def encode_trimesh_mesh(mesh: Union["trimesh.Trimesh", "trimesh.Scene"]) -> dict[str, Optional[bytes | str]]: + """Encode a trimesh mesh or scene object into GLB bytes.""" + metadata = getattr(mesh, "metadata", None) or {} + path = metadata.get("file_path") or metadata.get("file_name") if isinstance(metadata, dict) else None + if path is not None and os.path.isfile(path): + return {"path": path, "bytes": None} + bytes_ = mesh.export(file_type="glb") + return {"path": os.path.basename(path) if path else "mesh.glb", "bytes": bytes_} diff --git a/src/datasets/features/nifti.py b/src/datasets/features/nifti.py new file mode 100644 index 0000000..1e78cad --- /dev/null +++ b/src/datasets/features/nifti.py @@ -0,0 +1,351 @@ +import os +from dataclasses import dataclass, field +from pathlib import Path +from typing import TYPE_CHECKING, Any, ClassVar, Dict, Optional, Union + +import pyarrow as pa + +from .. import config +from ..download.download_config import DownloadConfig +from ..table import array_cast +from ..utils.file_utils import is_local_path, is_remote_url, xopen +from ..utils.py_utils import no_op_if_value_is_null, string_to_dict + + +if TYPE_CHECKING: + import nibabel as nib + + from .features import FeatureType + +if config.NIBABEL_AVAILABLE: + import nibabel as nib + + class Nifti1ImageWrapper(nib.nifti1.Nifti1Image): + """ + A wrapper around nibabel's Nifti1Image to customize its representation. + """ + + def __init__(self, nifti_image: nib.nifti1.Nifti1Image): + super().__init__( + dataobj=nifti_image.dataobj, + affine=nifti_image.affine, + header=nifti_image.header, + extra=nifti_image.extra, + file_map=nifti_image.file_map, + dtype=nifti_image.get_data_dtype(), + ) + self.nifti_image = nifti_image + + def _repr_html_(self): + from ipyniivue import NiiVue, ShowRender, SliceType, Volume + from IPython.display import display + + bytes_ = self.nifti_image.to_bytes() + nv = NiiVue() + nv.set_slice_type(SliceType.MULTIPLANAR) + nv.opts.multiplanar_show_render = ShowRender.ALWAYS + nv.opts.show_3d_crosshair = True + nv.opts.multiplanar_force_render = True + name = None + if hasattr(self.nifti_image, "file_map"): + if ( + "image" in self.nifti_image.file_map + and getattr(self.nifti_image.file_map["image"], "filename", None) is not None + ): + name = self.nifti_image.file_map["image"].filename + if name is None: + name = "volume.nii.gz" + volume = Volume(name=name, data=bytes_) + nv.load_volumes([volume]) + display(nv) + + +@dataclass +class Nifti: + """ + **Experimental.** + Nifti [`Feature`] to read NIfTI neuroimaging files. + + Input: The Nifti feature accepts as input: + - A `str`: Absolute path to the NIfTI file (i.e. random access is allowed). + - A `pathlib.Path`: path to the NIfTI file (i.e. random access is allowed). + - A `dict` with the keys: + - `path`: String with relative path of the NIfTI file in a dataset repository. + - `bytes`: Bytes of the NIfTI file. + This is useful for archived files with sequential access. + + - A `nibabel` image object (e.g., `nibabel.nifti1.Nifti1Image`). + + Args: + decode (`bool`, defaults to `True`): + Whether to decode the NIfTI data. If `False` a string with the bytes is returned. `decode=False` is not supported when decoding examples. + + Examples: + + ```py + >>> from datasets import Dataset, Nifti + >>> ds = Dataset.from_dict({"nifti": ["path/to/file.nii.gz"]}).cast_column("nifti", Nifti()) + >>> ds.features["nifti"] + Nifti(decode=True, id=None) + >>> ds[0]["nifti"] + + >>> ds = ds.cast_column("nifti", Nifti(decode=False)) + >>> ds[0]["nifti"] + {'bytes': None, + 'path': 'path/to/file.nii.gz'} + ``` + """ + + decode: bool = True + id: Optional[str] = field(default=None, repr=False) + + # Automatically constructed + dtype: ClassVar[str] = "nibabel.nifti1.Nifti1Image" + pa_type: ClassVar[Any] = pa.struct({"bytes": pa.binary(), "path": pa.string()}) + _type: str = field(default="Nifti", init=False, repr=False) + + def __call__(self): + return self.pa_type + + def encode_example(self, value: Union[str, bytes, bytearray, dict, "nib.Nifti1Image"]) -> dict: + """Encode example into a format for Arrow. + + Args: + value (`str`, `bytes`, `nibabel.Nifti1Image` or `dict`): + Data passed as input to Nifti feature. + + Returns: + `dict` with "path" and "bytes" fields + """ + if config.NIBABEL_AVAILABLE: + import nibabel as nib + else: + nib = None + + if isinstance(value, str): + return {"path": value, "bytes": None} + elif isinstance(value, Path): + return {"path": str(value.absolute()), "bytes": None} + elif isinstance(value, (bytes, bytearray)): + return {"path": None, "bytes": value} + elif nib is not None and isinstance(value, nib.spatialimages.SpatialImage): + # nibabel image object - try to get path or convert to bytes + return encode_nibabel_image(value) + elif isinstance(value, dict): + if value.get("path") is not None and os.path.isfile(value["path"]): + # we set "bytes": None to not duplicate the data if they're already available locally + return {"bytes": None, "path": value.get("path")} + elif value.get("bytes") is not None or value.get("path") is not None: + # store the nifti bytes, and path is used to infer the format using the file extension + return {"bytes": value.get("bytes"), "path": value.get("path")} + else: + raise ValueError( + f"A nifti sample should have one of 'path' or 'bytes' but they are missing or None in {value}." + ) + else: + raise ValueError( + f"A nifti sample should be a string, bytes, Path, nibabel image, or dict, but got {type(value)}." + ) + + def decode_example(self, value: dict, token_per_repo_id=None) -> "Nifti1ImageWrapper": + """Decode example NIfTI file into nibabel image object. + + Args: + value (`str` or `dict`): + A string with the absolute NIfTI file path, a dictionary with + keys: + + - `path`: String with absolute or relative NIfTI file path. + - `bytes`: The bytes of the NIfTI file. + + token_per_repo_id (`dict`, *optional*): + To access and decode NIfTI files from private repositories on + the Hub, you can pass a dictionary + repo_id (`str`) -> token (`bool` or `str`). + + Returns: + `nibabel.Nifti1Image` objects + """ + if config.NIBABEL_AVAILABLE: + import nibabel as nib + else: + raise ImportError("To support decoding NIfTI files, please install 'nibabel'.") + + if token_per_repo_id is None: + token_per_repo_id = {} + + path, bytes_ = value["path"], value["bytes"] + if bytes_ is None: + if path is None: + raise ValueError(f"A nifti should have one of 'path' or 'bytes' but both are None in {value}.") + else: + # gzipped files have the structure: 'gzip://T1.nii::' + if path.startswith("gzip://") and is_local_path(path.split("::")[-1]): + path = path.split("::")[-1] + if is_local_path(path): + nifti = nib.load(path) + else: + source_url = path.split("::")[-1] + pattern = ( + config.HUB_DATASETS_URL + if source_url.startswith(config.HF_ENDPOINT) + else config.HUB_DATASETS_HFFS_URL + ) + source_url_fields = string_to_dict(source_url, pattern) + token = ( + token_per_repo_id.get(source_url_fields["repo_id"]) if source_url_fields is not None else None + ) + download_config = DownloadConfig(token=token) + with xopen(path, "rb", download_config=download_config) as f: + nifti = nib.load(f) + else: + import gzip + + if ( + bytes_[:2] == b"\x1f\x8b" + ): # gzip magic number, see https://stackoverflow.com/a/76055284/9534390 or "Magic number" on https://en.wikipedia.org/wiki/Gzip + bytes_ = gzip.decompress(bytes_) + + nifti = nib.Nifti1Image.from_bytes(bytes_) + + return Nifti1ImageWrapper(nifti) + + def embed_storage( + self, storage: pa.StructArray, token_per_repo_id=None, local_files: bool = True, remote_files: bool = True + ) -> pa.StructArray: + """Embed NifTI files into the Arrow array. + + Args: + storage (`pa.StructArray`): + PyArrow array to embed. + token_per_repo_id (`dict`, optional): + Dictionary repo_id -> token to fetch the files bytes. + local_files (`bool`, defaults to `True`) + Whether to embed local files data in the array + + + remote_files (`bool`, defaults to `True`) + Whether to embed remote files data in the array. + E.g. files with paths that start with hf:// or https:// + + + + Returns: + `pa.StructArray`: Array in the NifTI arrow storage type, that is + `pa.struct({"bytes": pa.binary(), "path": pa.string()})`. + """ + if token_per_repo_id is None: + token_per_repo_id = {} + + @no_op_if_value_is_null + def path_to_bytes(path): + source_url = path.split("::")[-1] + pattern = ( + config.HUB_DATASETS_URL if source_url.startswith(config.HF_ENDPOINT) else config.HUB_DATASETS_HFFS_URL + ) + source_url_fields = string_to_dict(source_url, pattern) + token = token_per_repo_id.get(source_url_fields["repo_id"]) if source_url_fields is not None else None + download_config = DownloadConfig(token=token) + with xopen(path, "rb", download_config=download_config) as f: + return f.read() + + bytes_array = pa.array( + [ + ( + path_to_bytes(x["path"]) + if x["bytes"] is None + and ((local_files and is_local_path(x["path"])) or (remote_files and is_remote_url(x["path"]))) + else x["bytes"] + ) + if x is not None + else None + for x in storage.to_pylist() + ], + type=pa.binary(), + ) + path_array = pa.array( + [ + ( + os.path.basename(path) + if (local_files and is_local_path(path)) or (remote_files and is_remote_url(path)) + else path + ) + if path is not None + else None + for path in storage.field("path").to_pylist() + ], + type=pa.string(), + ) + storage = pa.StructArray.from_arrays([bytes_array, path_array], ["bytes", "path"], mask=storage.is_null()) + return array_cast(storage, self.pa_type) + + def flatten(self) -> Union["FeatureType", Dict[str, "FeatureType"]]: + """If in the decodable state, return the feature itself, otherwise flatten the feature into a dictionary.""" + from .features import Value + + return ( + self + if self.decode + else { + "bytes": Value("binary"), + "path": Value("string"), + } + ) + + def cast_storage(self, storage: Union[pa.StringArray, pa.StructArray, pa.BinaryArray]) -> pa.StructArray: + """Cast an Arrow array to the Nifti arrow storage type. + The Arrow types that can be converted to the Nifti pyarrow storage type are: + + - `pa.string()` - it must contain the "path" data + - `pa.binary()` - it must contain the NIfTI bytes + - `pa.struct({"bytes": pa.binary()})` + - `pa.struct({"path": pa.string()})` + - `pa.struct({"bytes": pa.binary(), "path": pa.string()})` - order doesn't matter + + Args: + storage (`Union[pa.StringArray, pa.StructArray, pa.BinaryArray]`): + PyArrow array to cast. + + Returns: + `pa.StructArray`: Array in the Nifti arrow storage type, that is + `pa.struct({"bytes": pa.binary(), "path": pa.string()})`. + """ + if pa.types.is_string(storage.type): + bytes_array = pa.array([None] * len(storage), type=pa.binary()) + storage = pa.StructArray.from_arrays([bytes_array, storage], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_binary(storage.type): + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays([storage, path_array], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_struct(storage.type): + if storage.type.get_field_index("bytes") >= 0: + bytes_array = storage.field("bytes") + else: + bytes_array = pa.array([None] * len(storage), type=pa.binary()) + if storage.type.get_field_index("path") >= 0: + path_array = storage.field("path") + else: + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays([bytes_array, path_array], ["bytes", "path"], mask=storage.is_null()) + return array_cast(storage, self.pa_type) + + +def encode_nibabel_image(img: "nib.Nifti1Image", force_bytes: bool = False) -> dict[str, Optional[Union[str, bytes]]]: + """ + Encode a nibabel image object into a dictionary. + + If the image has an associated file path, returns the path. Otherwise, serializes + the image content into bytes. + + Args: + img: A nibabel image object (e.g., Nifti1Image). + force_bytes: If `True`, always serialize to bytes even if a file path exists. Needed to upload bytes properly. + + Returns: + dict: A dictionary with "path" or "bytes" field. + """ + if hasattr(img, "file_map") and img.file_map is not None and not force_bytes: + filename = img.file_map["image"].filename + return {"path": filename, "bytes": None} + + bytes_data = img.to_bytes() + return {"path": None, "bytes": bytes_data} diff --git a/src/datasets/features/pdf.py b/src/datasets/features/pdf.py new file mode 100644 index 0000000..74c7560 --- /dev/null +++ b/src/datasets/features/pdf.py @@ -0,0 +1,309 @@ +import os +from dataclasses import dataclass, field +from io import BytesIO +from pathlib import Path +from typing import TYPE_CHECKING, Any, ClassVar, Dict, Optional, Union + +import pyarrow as pa + +from .. import config +from ..download.download_config import DownloadConfig +from ..table import array_cast +from ..utils.file_utils import is_local_path, is_remote_url, xopen +from ..utils.py_utils import no_op_if_value_is_null, string_to_dict + + +if TYPE_CHECKING: + import pdfplumber + + from .features import FeatureType + + +def pdf_to_bytes(pdf: "pdfplumber.pdf.PDF") -> bytes: + """Convert a pdfplumber.pdf.PDF object to bytes.""" + with BytesIO() as buffer: + for page in pdf.pages: + buffer.write(page.pdf.stream) + return buffer.getvalue() + + +@dataclass +class Pdf: + """ + **Experimental.** + Pdf [`Feature`] to read pdf documents from a pdf file. + + Input: The Pdf feature accepts as input: + - A `str`: Absolute path to the pdf file (i.e. random access is allowed). + - A `pathlib.Path`: path to the pdf file (i.e. random access is allowed). + - A `dict` with the keys: + - `path`: String with relative path of the pdf file in a dataset repository. + - `bytes`: Bytes of the pdf file. + This is useful for archived files with sequential access. + + - A `pdfplumber.pdf.PDF`: pdfplumber pdf object. + + Args: + decode (`bool`, defaults to `True`): + Whether to decode the pdf data. If `False`, + returns the underlying dictionary in the format `{"path": pdf_path, "bytes": pdf_bytes}`. + + Examples: + + ```py + >>> from datasets import Dataset, Pdf + >>> ds = Dataset.from_dict({"pdf": ["path/to/pdf/file.pdf"]}).cast_column("pdf", Pdf()) + >>> ds.features["pdf"] + Pdf(decode=True, id=None) + >>> ds[0]["pdf"] + + >>> ds = ds.cast_column("pdf", Pdf(decode=False)) + >>> ds[0]["pdf"] + {'bytes': None, + 'path': 'path/to/pdf/file.pdf'} + ``` + """ + + decode: bool = True + id: Optional[str] = field(default=None, repr=False) + + # Automatically constructed + dtype: ClassVar[str] = "pdfplumber.pdf.PDF" + pa_type: ClassVar[Any] = pa.struct({"bytes": pa.binary(), "path": pa.string()}) + _type: str = field(default="Pdf", init=False, repr=False) + + def __call__(self): + return self.pa_type + + def encode_example(self, value: Union[str, bytes, bytearray, dict, "pdfplumber.pdf.PDF"]) -> dict: + """Encode example into a format for Arrow. + + Args: + value (`str`, `bytes`, `pdfplumber.pdf.PDF` or `dict`): + Data passed as input to Pdf feature. + + Returns: + `dict` with "path" and "bytes" fields + """ + if config.PDFPLUMBER_AVAILABLE: + import pdfplumber + else: + pdfplumber = None + + if isinstance(value, str): + return {"path": value, "bytes": None} + elif isinstance(value, Path): + return {"path": str(value.absolute()), "bytes": None} + elif isinstance(value, (bytes, bytearray)): + return {"path": None, "bytes": value} + elif pdfplumber is not None and isinstance(value, pdfplumber.pdf.PDF): + # convert the pdfplumber.pdf.PDF to bytes + return encode_pdfplumber_pdf(value) + elif value.get("path") is not None and os.path.isfile(value["path"]): + # we set "bytes": None to not duplicate the data if they're already available locally + return {"bytes": None, "path": value.get("path")} + elif value.get("bytes") is not None or value.get("path") is not None: + # store the pdf bytes, and path is used to infer the pdf format using the file extension + return {"bytes": value.get("bytes"), "path": value.get("path")} + else: + raise ValueError( + f"A pdf sample should have one of 'path' or 'bytes' but they are missing or None in {value}." + ) + + def decode_example(self, value: dict, token_per_repo_id=None) -> "pdfplumber.pdf.PDF": + """Decode example pdf file into pdf data. + + Args: + value (`str` or `dict`): + A string with the absolute pdf file path, a dictionary with + keys: + + - `path`: String with absolute or relative pdf file path. + - `bytes`: The bytes of the pdf file. + + token_per_repo_id (`dict`, *optional*): + To access and decode pdf files from private repositories on + the Hub, you can pass a dictionary + repo_id (`str`) -> token (`bool` or `str`). + + Returns: + `pdfplumber.pdf.PDF` + """ + if not self.decode: + raise RuntimeError("Decoding is disabled for this feature. Please use Pdf(decode=True) instead.") + + if config.PDFPLUMBER_AVAILABLE: + import pdfplumber + else: + raise ImportError("To support decoding pdfs, please install 'pdfplumber'.") + + if token_per_repo_id is None: + token_per_repo_id = {} + + path, bytes_ = value["path"], value["bytes"] + if bytes_ is None: + if path is None: + raise ValueError(f"A pdf should have one of 'path' or 'bytes' but both are None in {value}.") + else: + if is_local_path(path): + pdf = pdfplumber.open(path) + else: + source_url = path.split("::")[-1] + pattern = ( + config.HUB_DATASETS_URL + if source_url.startswith(config.HF_ENDPOINT) + else config.HUB_DATASETS_HFFS_URL + ) + try: + repo_id = string_to_dict(source_url, pattern)["repo_id"] + token = token_per_repo_id.get(repo_id) + except ValueError: + token = None + download_config = DownloadConfig(token=token) + f = xopen(path, "rb", download_config=download_config) + return pdfplumber.open(f) + else: + with pdfplumber.open(BytesIO(bytes_)) as p: + pdf = p + + return pdf + + def flatten(self) -> Union["FeatureType", Dict[str, "FeatureType"]]: + """If in the decodable state, return the feature itself, otherwise flatten the feature into a dictionary.""" + from .features import Value + + return ( + self + if self.decode + else { + "bytes": Value("binary"), + "path": Value("string"), + } + ) + + def cast_storage(self, storage: Union[pa.StringArray, pa.StructArray, pa.ListArray]) -> pa.StructArray: + """Cast an Arrow array to the Pdf arrow storage type. + The Arrow types that can be converted to the Pdf pyarrow storage type are: + + - `pa.string()` - it must contain the "path" data + - `pa.binary()` - it must contain the image bytes + - `pa.struct({"bytes": pa.binary()})` + - `pa.struct({"path": pa.string()})` + - `pa.struct({"bytes": pa.binary(), "path": pa.string()})` - order doesn't matter + - `pa.list(*)` - it must contain the pdf array data + + Args: + storage (`Union[pa.StringArray, pa.StructArray, pa.ListArray]`): + PyArrow array to cast. + + Returns: + `pa.StructArray`: Array in the Pdf arrow storage type, that is + `pa.struct({"bytes": pa.binary(), "path": pa.string()})`. + """ + if pa.types.is_string(storage.type): + bytes_array = pa.array([None] * len(storage), type=pa.binary()) + storage = pa.StructArray.from_arrays([bytes_array, storage], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_binary(storage.type): + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays([storage, path_array], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_struct(storage.type): + if storage.type.get_field_index("bytes") >= 0: + bytes_array = storage.field("bytes") + else: + bytes_array = pa.array([None] * len(storage), type=pa.binary()) + if storage.type.get_field_index("path") >= 0: + path_array = storage.field("path") + else: + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays([bytes_array, path_array], ["bytes", "path"], mask=storage.is_null()) + return array_cast(storage, self.pa_type) + + def embed_storage( + self, storage: pa.StructArray, token_per_repo_id=None, local_files: bool = True, remote_files: bool = True + ) -> pa.StructArray: + """Embed PDF files into the Arrow array. + + Args: + storage (`pa.StructArray`): + PyArrow array to embed. + token_per_repo_id (`dict`, optional): + Dictionary repo_id -> token to fetch the files bytes. + local_files (`bool`, defaults to `True`) + Whether to embed local files data in the array + + + remote_files (`bool`, defaults to `True`) + Whether to embed remote files data in the array. + E.g. files with paths that start with hf:// or https:// + + + + Returns: + `pa.StructArray`: Array in the PDF arrow storage type, that is + `pa.struct({"bytes": pa.binary(), "path": pa.string()})`. + """ + if token_per_repo_id is None: + token_per_repo_id = {} + + @no_op_if_value_is_null + def path_to_bytes(path): + source_url = path.split("::")[-1] + pattern = ( + config.HUB_DATASETS_URL if source_url.startswith(config.HF_ENDPOINT) else config.HUB_DATASETS_HFFS_URL + ) + source_url_fields = string_to_dict(source_url, pattern) + token = token_per_repo_id.get(source_url_fields["repo_id"]) if source_url_fields is not None else None + download_config = DownloadConfig(token=token) + with xopen(path, "rb", download_config=download_config) as f: + return f.read() + + bytes_array = pa.array( + [ + ( + path_to_bytes(x["path"]) + if x["bytes"] is None + and ((local_files and is_local_path(x["path"])) or (remote_files and is_remote_url(x["path"]))) + else x["bytes"] + ) + if x is not None + else None + for x in storage.to_pylist() + ], + type=pa.binary(), + ) + path_array = pa.array( + [ + ( + os.path.basename(path) + if (local_files and is_local_path(path)) or (remote_files and is_remote_url(path)) + else path + ) + if path is not None + else None + for path in storage.field("path").to_pylist() + ], + type=pa.string(), + ) + storage = pa.StructArray.from_arrays([bytes_array, path_array], ["bytes", "path"], mask=storage.is_null()) + return array_cast(storage, self.pa_type) + + +def encode_pdfplumber_pdf(pdf: "pdfplumber.pdf.PDF") -> dict: + """ + Encode a pdfplumber.pdf.PDF object into a dictionary. + + If the PDF has an associated file path, returns the path. Otherwise, serializes + the PDF content into bytes. + + Args: + pdf (pdfplumber.pdf.PDF): A pdfplumber PDF object. + + Returns: + dict: A dictionary with "path" or "bytes" field. + """ + if hasattr(pdf, "stream") and hasattr(pdf.stream, "name") and pdf.stream.name: + # Return the path if the PDF has an associated file path + return {"path": pdf.stream.name, "bytes": None} + else: + # Convert the PDF to bytes if no path is available + return {"path": None, "bytes": pdf_to_bytes(pdf)} diff --git a/src/datasets/features/translation.py b/src/datasets/features/translation.py new file mode 100644 index 0000000..9bee3aa --- /dev/null +++ b/src/datasets/features/translation.py @@ -0,0 +1,129 @@ +from dataclasses import dataclass, field +from typing import TYPE_CHECKING, Any, ClassVar, Optional, Union + +import pyarrow as pa + + +if TYPE_CHECKING: + from .features import FeatureType + + +@dataclass +class Translation: + """`Feature` for translations with fixed languages per example. + Here for compatibility with tfds. + + Args: + languages (`dict`): + A dictionary for each example mapping string language codes to string translations. + + Example: + + ```python + >>> # At construction time: + >>> datasets.features.Translation(languages=['en', 'fr', 'de']) + >>> # During data generation: + >>> yield { + ... 'en': 'the cat', + ... 'fr': 'le chat', + ... 'de': 'die katze' + ... } + ``` + """ + + languages: list[str] + id: Optional[str] = field(default=None, repr=False) + # Automatically constructed + dtype: ClassVar[str] = "dict" + pa_type: ClassVar[Any] = None + _type: str = field(default="Translation", init=False, repr=False) + + def __call__(self): + return pa.struct({lang: pa.string() for lang in sorted(self.languages)}) + + def flatten(self) -> Union["FeatureType", dict[str, "FeatureType"]]: + """Flatten the Translation feature into a dictionary.""" + from .features import Value + + return {k: Value("string") for k in sorted(self.languages)} + + +@dataclass +class TranslationVariableLanguages: + """`Feature` for translations with variable languages per example. + Here for compatibility with tfds. + + Args: + languages (`dict`): + A dictionary for each example mapping string language codes to one or more string translations. + The languages present may vary from example to example. + + Returns: + - `language` or `translation` (variable-length 1D `tf.Tensor` of `tf.string`): + Language codes sorted in ascending order or plain text translations, sorted to align with language codes. + + Example: + + ```python + >>> # At construction time: + >>> datasets.features.TranslationVariableLanguages(languages=['en', 'fr', 'de']) + >>> # During data generation: + >>> yield { + ... 'en': 'the cat', + ... 'fr': ['le chat', 'la chatte,'] + ... 'de': 'die katze' + ... } + >>> # Tensor returned : + >>> { + ... 'language': ['en', 'de', 'fr', 'fr'], + ... 'translation': ['the cat', 'die katze', 'la chatte', 'le chat'], + ... } + ``` + """ + + languages: Optional[list] = None + num_languages: Optional[int] = None + id: Optional[str] = field(default=None, repr=False) + # Automatically constructed + dtype: ClassVar[str] = "dict" + pa_type: ClassVar[Any] = None + _type: str = field(default="TranslationVariableLanguages", init=False, repr=False) + + def __post_init__(self): + self.languages = sorted(set(self.languages)) if self.languages else None + self.num_languages = len(self.languages) if self.languages else None + + def __call__(self): + return pa.struct({"language": pa.list_(pa.string()), "translation": pa.list_(pa.string())}) + + def encode_example(self, translation_dict): + lang_set = set(self.languages) + if set(translation_dict) == {"language", "translation"}: + return translation_dict + elif self.languages and set(translation_dict) - lang_set: + raise ValueError( + f"Some languages in example ({', '.join(sorted(set(translation_dict) - lang_set))}) are not in valid set ({', '.join(lang_set)})." + ) + + # Convert dictionary into tuples, splitting out cases where there are + # multiple translations for a single language. + translation_tuples = [] + for lang, text in translation_dict.items(): + if isinstance(text, str): + translation_tuples.append((lang, text)) + else: + translation_tuples.extend([(lang, el) for el in text]) + + # Ensure translations are in ascending order by language code. + languages, translations = zip(*sorted(translation_tuples)) + + return {"language": languages, "translation": translations} + + def flatten(self) -> Union["FeatureType", dict[str, "FeatureType"]]: + """Flatten the TranslationVariableLanguages feature into a dictionary.""" + from .features import List, Value + + return { + "language": List(Value("string")), + "translation": List(Value("string")), + } diff --git a/src/datasets/features/video.py b/src/datasets/features/video.py new file mode 100644 index 0000000..8522c2c --- /dev/null +++ b/src/datasets/features/video.py @@ -0,0 +1,415 @@ +import os +from dataclasses import dataclass, field +from pathlib import Path +from typing import TYPE_CHECKING, Any, ClassVar, Literal, Optional, TypedDict, Union + +import numpy as np +import pyarrow as pa + +from .. import config +from ..download.download_config import DownloadConfig +from ..table import array_cast +from ..utils.file_utils import is_local_path, is_remote_url, xopen +from ..utils.py_utils import no_op_if_value_is_null, string_to_dict + + +if TYPE_CHECKING: + import torch + from torchcodec.decoders import VideoDecoder + + from .features import FeatureType + + +class Example(TypedDict): + path: Optional[str] + bytes: Optional[bytes] + + +@dataclass +class Video: + """ + Video [`Feature`] to read video data from a video file. + + Input: The Video feature accepts as input: + - A `str`: Absolute path to the video file (i.e. random access is allowed). + - A `pathlib.Path`: path to the video file (i.e. random access is allowed). + - A `dict` with the keys: + + - `path`: String with relative path of the video file in a dataset repository. + - `bytes`: Bytes of the video file. + + This is useful for parquet or webdataset files which embed video files. + + - A `torchcodec.decoders.VideoDecoder`: torchcodec video decoder object. + + Output: The Video features output data as `torchcodec.decoders.VideoDecoder` objects. + + Args: + decode (`bool`, defaults to `True`): + Whether to decode the video data. If `False`, + returns the underlying dictionary in the format `{"path": video_path, "bytes": video_bytes}`. + stream_index (`int`, *optional*): + The streaming index to use from the file. If `None` defaults to the "best" index. + dimension_order (`str`, defaults to `NCHW`): + The dimension order of the decoded frames. + where N is the batch size, C is the number of channels, + H is the height, and W is the width of the frames. + num_ffmpeg_threads (`int`, defaults to `1`): + The number of threads to use for decoding the video. (Recommended to keep this at 1) + device (`str` or `torch.device`, defaults to `cpu`): + The device to use for decoding the video. + seek_mode (`str`, defaults to `exact`): + Determines if frame access will be “exact” or “approximate”. + Exact guarantees that requesting frame i will always return frame i, but doing so requires an initial scan of the file. + Approximate is faster as it avoids scanning the file, but less accurate as it uses the file's metadata to calculate where i probably is. + read more [here](https://docs.pytorch.org/torchcodec/stable/generated_examples/approximate_mode.html#sphx-glr-generated-examples-approximate-mode-py) + + Examples: + + ```py + >>> from datasets import Dataset, Video + >>> ds = Dataset.from_dict({"video":["path/to/Screen Recording.mov"]}).cast_column("video", Video()) + >>> ds.features["video"] + Video(decode=True, id=None) + >>> ds[0]["video"] + + >>> video = ds[0]["video"] + >>> video.get_frames_in_range(0, 10) + FrameBatch: + data (shape): torch.Size([10, 3, 50, 66]) + pts_seconds: tensor([0.4333, 0.4333, 0.4333, 0.4333, 0.4333, 0.4333, 0.4333, 0.4333, 0.4333, + 0.4333], dtype=torch.float64) + duration_seconds: tensor([0.0167, 0.0167, 0.0167, 0.0167, 0.0167, 0.0167, 0.0167, 0.0167, 0.0167, + 0.0167], dtype=torch.float64) + >>> ds.cast_column('video', Video(decode=False))[0]["video] + {'bytes': None, + 'path': 'path/to/Screen Recording.mov'} + ``` + """ + + decode: bool = True + stream_index: Optional[int] = None + dimension_order: Literal["NCHW", "NHWC"] = "NCHW" + num_ffmpeg_threads: int = 1 + device: Optional[Union[str, "torch.device"]] = "cpu" + seek_mode: Literal["exact", "approximate"] = "exact" + id: Optional[str] = field(default=None, repr=False) + # Automatically constructed + dtype: ClassVar[str] = "torchcodec.decoders.VideoDecoder" + pa_type: ClassVar[Any] = pa.struct({"bytes": pa.binary(), "path": pa.string()}) + _type: str = field(default="Video", init=False, repr=False) + + def __call__(self): + return self.pa_type + + def encode_example(self, value: Union[str, bytes, bytearray, Example, np.ndarray, "VideoDecoder"]) -> Example: + """Encode example into a format for Arrow. + + Args: + value (`str`, `np.ndarray`, `bytes`, `bytearray`, `VideoDecoder` or `dict`): + Data passed as input to Video feature. + + Returns: + `dict` with "path" and "bytes" fields + """ + if value is None: + raise ValueError("value must be provided") + + if config.TORCHCODEC_AVAILABLE: + from torchcodec.decoders import VideoDecoder + else: + VideoDecoder = None + + if isinstance(value, list): + value = np.array(value) + + if isinstance(value, str): + return {"path": value, "bytes": None} + elif isinstance(value, Path): + return {"path": str(value.absolute()), "bytes": None} + elif isinstance(value, (bytes, bytearray)): + return {"path": None, "bytes": value} + elif isinstance(value, np.ndarray): + # convert the video array to bytes + return encode_np_array(value) + elif VideoDecoder is not None and isinstance(value, VideoDecoder): + # convert the torchcodec video decoder to bytes + return encode_torchcodec_video(value) + elif isinstance(value, dict): + path, bytes_ = value.get("path"), value.get("bytes") + if path is not None and os.path.isfile(path): + # we set "bytes": None to not duplicate the data if they're already available locally + return {"bytes": None, "path": path} + elif bytes_ is not None or path is not None: + # store the video bytes, and path is used to infer the video format using the file extension + return {"bytes": bytes_, "path": path} + else: + raise ValueError( + f"A video sample should have one of 'path' or 'bytes' but they are missing or None in {value}." + ) + else: + raise TypeError(f"Unsupported encode_example type: {type(value)}") + + def decode_example( + self, + value: Union[str, Example], + token_per_repo_id: Optional[dict[str, Union[bool, str]]] = None, + ) -> "VideoDecoder": + """Decode example video file into video data. + + Args: + value (`str` or `dict`): + A string with the absolute video file path, a dictionary with + keys: + + - `path`: String with absolute or relative video file path. + - `bytes`: The bytes of the video file. + token_per_repo_id (`dict`, *optional*): + To access and decode + video files from private repositories on the Hub, you can pass + a dictionary repo_id (`str`) -> token (`bool` or `str`). + + Returns: + `torchcodec.decoders.VideoDecoder` + """ + if not self.decode: + raise RuntimeError("Decoding is disabled for this feature. Please use Video(decode=True) instead.") + + if config.TORCHCODEC_AVAILABLE: + from torchcodec.decoders import VideoDecoder + + else: + raise ImportError("To support decoding videos, please install 'torchcodec'.") + + if token_per_repo_id is None: + token_per_repo_id = {} + + if isinstance(value, str): + path, bytes_ = value, None + else: + path, bytes_ = value["path"], value["bytes"] + + if bytes_ is None: + if path is None: + raise ValueError(f"A video should have one of 'path' or 'bytes' but both are None in {value}.") + elif is_local_path(path): + video = VideoDecoder( + path, + stream_index=self.stream_index, + dimension_order=self.dimension_order, + num_ffmpeg_threads=self.num_ffmpeg_threads, + device=self.device, + seek_mode=self.seek_mode, + ) + else: + video = hf_video_reader( + path, + token_per_repo_id=token_per_repo_id, + dimension_order=self.dimension_order, + num_ffmpeg_threads=self.num_ffmpeg_threads, + device=self.device, + seek_mode=self.seek_mode, + ) + else: + video = VideoDecoder( + bytes_, + stream_index=self.stream_index, + dimension_order=self.dimension_order, + num_ffmpeg_threads=self.num_ffmpeg_threads, + device=self.device, + seek_mode=self.seek_mode, + ) + video._hf_encoded = {"path": path, "bytes": bytes_} + video.metadata.path = path + return video + + def flatten(self) -> Union["FeatureType", dict[str, "FeatureType"]]: + """If in the decodable state, return the feature itself, otherwise flatten the feature into a dictionary.""" + from .features import Value + + return ( + self + if self.decode + else { + "bytes": Value("binary"), + "path": Value("string"), + } + ) + + def cast_storage(self, storage: Union[pa.StringArray, pa.StructArray, pa.ListArray]) -> pa.StructArray: + """Cast an Arrow array to the Video arrow storage type. + The Arrow types that can be converted to the Video pyarrow storage type are: + + - `pa.string()` - it must contain the "path" data + - `pa.binary()` - it must contain the video bytes + - `pa.struct({"bytes": pa.binary()})` + - `pa.struct({"path": pa.string()})` + - `pa.struct({"bytes": pa.binary(), "path": pa.string()})` - order doesn't matter + - `pa.list(*)` - it must contain the video array data + + Args: + storage (`Union[pa.StringArray, pa.StructArray, pa.ListArray]`): + PyArrow array to cast. + + Returns: + `pa.StructArray`: Array in the Video arrow storage type, that is + `pa.struct({"bytes": pa.binary(), "path": pa.string()})`. + """ + if pa.types.is_string(storage.type): + bytes_array = pa.array([None] * len(storage), type=pa.binary()) + storage = pa.StructArray.from_arrays([bytes_array, storage], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_large_binary(storage.type): + storage = array_cast( + storage, pa.binary() + ) # this can fail in case of big videos, paths should be used instead + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays([storage, path_array], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_binary(storage.type): + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays([storage, path_array], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_struct(storage.type): + if storage.type.get_field_index("bytes") >= 0: + bytes_array = storage.field("bytes") + else: + bytes_array = pa.array([None] * len(storage), type=pa.binary()) + if storage.type.get_field_index("path") >= 0: + path_array = storage.field("path") + else: + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays([bytes_array, path_array], ["bytes", "path"], mask=storage.is_null()) + elif pa.types.is_list(storage.type): + bytes_array = pa.array( + [encode_np_array(np.array(arr))["bytes"] if arr is not None else None for arr in storage.to_pylist()], + type=pa.binary(), + ) + path_array = pa.array([None] * len(storage), type=pa.string()) + storage = pa.StructArray.from_arrays( + [bytes_array, path_array], ["bytes", "path"], mask=bytes_array.is_null() + ) + return array_cast(storage, self.pa_type) + + def embed_storage( + self, storage: pa.StructArray, token_per_repo_id=None, local_files: bool = True, remote_files: bool = True + ) -> pa.StructArray: + """Embed image files into the Arrow array. + + Args: + storage (`pa.StructArray`): + PyArrow array to embed. + token_per_repo_id (`dict`, optional): + Dictionary repo_id -> token to fetch the files bytes. + local_files (`bool`, defaults to `True`) + Whether to embed local files data in the array + + + remote_files (`bool`, defaults to `True`) + Whether to embed remote files data in the array. + E.g. files with paths that start with hf:// or https:// + + + + Returns: + `pa.StructArray`: Array in the Video arrow storage type, that is + `pa.struct({"bytes": pa.binary(), "path": pa.string()})`. + """ + if token_per_repo_id is None: + token_per_repo_id = {} + + @no_op_if_value_is_null + def path_to_bytes(path): + source_url = path.split("::")[-1] + pattern = ( + config.HUB_DATASETS_URL if source_url.startswith(config.HF_ENDPOINT) else config.HUB_DATASETS_HFFS_URL + ) + source_url_fields = string_to_dict(source_url, pattern) + token = token_per_repo_id.get(source_url_fields["repo_id"]) if source_url_fields is not None else None + download_config = DownloadConfig(token=token) + with xopen(path, "rb", download_config=download_config) as f: + return f.read() + + bytes_array = pa.array( + [ + ( + path_to_bytes(x["path"]) + if x["bytes"] is None + and ((local_files and is_local_path(x["path"])) or (remote_files and is_remote_url(x["path"]))) + else x["bytes"] + ) + if x is not None + else None + for x in storage.to_pylist() + ], + type=pa.binary(), + ) + path_array = pa.array( + [ + ( + os.path.basename(path) + if (local_files and is_local_path(path)) or (remote_files and is_remote_url(path)) + else path + ) + if path is not None + else None + for path in storage.field("path").to_pylist() + ], + type=pa.string(), + ) + storage = pa.StructArray.from_arrays([bytes_array, path_array], ["bytes", "path"], mask=storage.is_null()) + return array_cast(storage, self.pa_type) + + +def video_to_bytes(video: "VideoDecoder") -> bytes: + """Convert a torchcodec Video object to bytes using native compression if possible""" + raise NotImplementedError() + + +def encode_torchcodec_video(video: "VideoDecoder") -> Example: + if hasattr(video, "_hf_encoded"): + return video._hf_encoded + else: + raise NotImplementedError( + "Encoding a VideoDecoder that doesn't come from datasets.Video.decode() is not implemented" + ) + + +def encode_np_array(array: np.ndarray) -> Example: + raise NotImplementedError() + + +# No monkey patch needed! +# 1. store the encoded video data {"path": ..., "bytes": ...} in `video._hf_encoded`` +# 2. add support for hf:// files + + +def hf_video_reader( + path: str, + token_per_repo_id: Optional[dict[str, Union[bool, str]]] = None, + stream: str = "video", + dimension_order: Literal["NCHW", "NHWC"] = "NCHW", + num_ffmpeg_threads: int = 1, + device: Optional[Union[str, "torch.device"]] = "cpu", + seek_mode: Literal["exact", "approximate"] = "exact", +) -> "VideoDecoder": + from torchcodec.decoders import VideoDecoder + + # Load the file from HF + if token_per_repo_id is None: + token_per_repo_id = {} + source_url = path.split("::")[-1] + pattern = config.HUB_DATASETS_URL if source_url.startswith(config.HF_ENDPOINT) else config.HUB_DATASETS_HFFS_URL + source_url_fields = string_to_dict(source_url, pattern) + token = token_per_repo_id.get(source_url_fields["repo_id"]) if source_url_fields is not None else None + download_config = DownloadConfig(token=token) + f = xopen(path, "rb", download_config=download_config) + + # Instantiate the VideoDecoder + stream_id = 0 if len(stream.split(":")) == 1 else int(stream.split(":")[1]) + vd = VideoDecoder( + f, + stream_index=stream_id, + dimension_order=dimension_order, + num_ffmpeg_threads=num_ffmpeg_threads, + device=device, + seek_mode=seek_mode, + ) + return vd diff --git a/src/datasets/filesystems/__init__.py b/src/datasets/filesystems/__init__.py new file mode 100644 index 0000000..d19d58b --- /dev/null +++ b/src/datasets/filesystems/__init__.py @@ -0,0 +1,47 @@ +import importlib +import shutil +import warnings +from typing import List + +import fsspec +import fsspec.asyn +from fsspec.implementations.local import LocalFileSystem + +from . import compression + + +COMPRESSION_FILESYSTEMS: list[compression.BaseCompressedFileFileSystem] = [ + compression.Bz2FileSystem, + compression.GzipFileSystem, + compression.Lz4FileSystem, + compression.XzFileSystem, + compression.ZstdFileSystem, +] + +# Register custom filesystems +for fs_class in COMPRESSION_FILESYSTEMS: + if fs_class.protocol in fsspec.registry and fsspec.registry[fs_class.protocol] is not fs_class: + warnings.warn(f"A filesystem protocol was already set for {fs_class.protocol} and will be overwritten.") + fsspec.register_implementation(fs_class.protocol, fs_class, clobber=True) + + +def is_remote_filesystem(fs: fsspec.AbstractFileSystem) -> bool: + """ + Checks if `fs` is a remote filesystem. + + Args: + fs (`fsspec.spec.AbstractFileSystem`): + An abstract super-class for pythonic file-systems, e.g. `fsspec.filesystem(\'file\')` or `s3fs.S3FileSystem`. + """ + return not isinstance(fs, LocalFileSystem) + + +def rename(fs: fsspec.AbstractFileSystem, src: str, dst: str): + """ + Renames the file `src` in `fs` to `dst`. + """ + if not is_remote_filesystem(fs): + # LocalFileSystem.mv does copy + rm, it is more efficient to simply move a local directory + shutil.move(fs._strip_protocol(src), fs._strip_protocol(dst)) + else: + fs.mv(src, dst, recursive=True) diff --git a/src/datasets/filesystems/compression.py b/src/datasets/filesystems/compression.py new file mode 100644 index 0000000..237b06d --- /dev/null +++ b/src/datasets/filesystems/compression.py @@ -0,0 +1,127 @@ +import os +from functools import partial +from typing import Optional + +import fsspec +from fsspec.archive import AbstractArchiveFileSystem + + +class BaseCompressedFileFileSystem(AbstractArchiveFileSystem): + """Read contents of compressed file as a filesystem with one file inside.""" + + root_marker = "" + protocol: str = ( + None # protocol passed in prefix to the url. ex: "gzip", for gzip://file.txt::http://foo.bar/file.txt.gz + ) + compression: str = None # compression type in fsspec. ex: "gzip" + extensions: list[str] = None # extensions of the filename to strip. ex: ".gz" to get file.txt from file.txt.gz + + def __init__( + self, fo: str = "", target_protocol: Optional[str] = None, target_options: Optional[dict] = None, **kwargs + ): + """ + The compressed file system can be instantiated from any compressed file. + It reads the contents of compressed file as a filesystem with one file inside, as if it was an archive. + + The single file inside the filesystem is named after the compresssed file, + without the compression extension at the end of the filename. + + Args: + fo (:obj:``str``): Path to compressed file. Will fetch file using ``fsspec.open()`` + mode (:obj:``str``): Currently, only 'rb' accepted + target_protocol(:obj:``str``, optional): To override the FS protocol inferred from a URL. + target_options (:obj:``dict``, optional): Kwargs passed when instantiating the target FS. + """ + super().__init__(self, **kwargs) + self.fo = fo.__fspath__() if hasattr(fo, "__fspath__") else fo + # always open as "rb" since fsspec can then use the TextIOWrapper to make it work for "r" mode + self._open_with_fsspec = partial( + fsspec.open, + self.fo, + mode="rb", + protocol=target_protocol, + compression=self.compression, + client_kwargs={ + "requote_redirect_url": False, # see https://github.com/huggingface/datasets/pull/5459 + "trust_env": True, # Enable reading proxy env variables. + **(target_options or {}).pop("client_kwargs", {}), # To avoid issues if it was already passed. + }, + **(target_options or {}), + ) + self.compressed_name = os.path.basename(self.fo.split("::")[0]) + self.uncompressed_name = ( + self.compressed_name[: self.compressed_name.rindex(".")] + if "." in self.compressed_name + else self.compressed_name + ) + self.dir_cache = None + + @classmethod + def _strip_protocol(cls, path): + # compressed file paths are always relative to the archive root + return super()._strip_protocol(path).lstrip("/") + + def _get_dirs(self): + if self.dir_cache is None: + f = {**self._open_with_fsspec().fs.info(self.fo), "name": self.uncompressed_name} + self.dir_cache = {f["name"]: f} + + def cat(self, path: str): + with self._open_with_fsspec().open() as f: + return f.read() + + def _open( + self, + path: str, + mode: str = "rb", + block_size=None, + autocommit=True, + cache_options=None, + **kwargs, + ): + path = self._strip_protocol(path) + if mode != "rb": + raise ValueError(f"Tried to read with mode {mode} on file {self.fo} opened with mode 'rb'") + return self._open_with_fsspec().open() + + +class Bz2FileSystem(BaseCompressedFileFileSystem): + """Read contents of BZ2 file as a filesystem with one file inside.""" + + protocol = "bz2" + compression = "bz2" + extensions = [".bz2"] + + +class GzipFileSystem(BaseCompressedFileFileSystem): + """Read contents of GZIP file as a filesystem with one file inside.""" + + protocol = "gzip" + compression = "gzip" + extensions = [".gz", ".gzip"] + + +class Lz4FileSystem(BaseCompressedFileFileSystem): + """Read contents of LZ4 file as a filesystem with one file inside.""" + + protocol = "lz4" + compression = "lz4" + extensions = [".lz4"] + + +class XzFileSystem(BaseCompressedFileFileSystem): + """Read contents of .xz (LZMA) file as a filesystem with one file inside.""" + + protocol = "xz" + compression = "xz" + extensions = [".xz"] + + +class ZstdFileSystem(BaseCompressedFileFileSystem): + """ + Read contents of .zstd file as a filesystem with one file inside. + """ + + protocol = "zstd" + compression = "zstd" + extensions = [".zst", ".zstd"] diff --git a/src/datasets/fingerprint.py b/src/datasets/fingerprint.py new file mode 100644 index 0000000..13b8016 --- /dev/null +++ b/src/datasets/fingerprint.py @@ -0,0 +1,480 @@ +import inspect +import os +import random +import shutil +import tempfile +import weakref +from functools import wraps +from pathlib import Path +from typing import TYPE_CHECKING, Any, Callable, Optional, Union + +import numpy as np +import xxhash + +from . import config +from .naming import INVALID_WINDOWS_CHARACTERS_IN_PATH +from .utils._dill import dumps +from .utils.logging import get_logger + + +if TYPE_CHECKING: + from .arrow_dataset import Dataset + + +logger = get_logger(__name__) + + +# Fingerprinting allows to have one deterministic fingerprint per dataset state. +# A dataset fingerprint is updated after each transform. +# Re-running the same transforms on a dataset in a different session results in the same fingerprint. +# This is possible thanks to a custom hashing function that works with most python objects. + +# Fingerprinting is the main mechanism that enables caching. +# The caching mechanism allows to reload an existing cache file if it's already been computed. + + +################# +# Caching +################# + +_CACHING_ENABLED = True +_TEMP_DIR_FOR_TEMP_CACHE_FILES: Optional["_TempCacheDir"] = None +_DATASETS_WITH_TABLE_IN_TEMP_DIR: Optional[weakref.WeakSet] = None + + +class _TempCacheDir: + """ + A temporary directory for storing cached Arrow files with a cleanup that frees references to the Arrow files + before deleting the directory itself to avoid permission errors on Windows. + """ + + def __init__(self): + # Check if TMPDIR is set and handle the case where it doesn't exist + tmpdir = os.environ.get("TMPDIR") or os.environ.get("TEMP") or os.environ.get("TMP") + # Normalize the path to handle any path resolution issues + if tmpdir: + tmpdir = os.path.normpath(tmpdir) + if not os.path.exists(tmpdir): + # Auto-create the directory if it doesn't exist + # This prevents tempfile from silently falling back to /tmp + try: + os.makedirs(tmpdir, exist_ok=True) + logger.info(f"Created TMPDIR directory: {tmpdir}") + except OSError as e: + raise OSError( + f"TMPDIR is set to '{tmpdir}' but the directory does not exist and could not be created: {e}. " + "Please create it manually or unset TMPDIR to fall back to the default temporary directory." + ) from e + # If tmpdir exists, verify it's actually a directory and writable + elif not os.path.isdir(tmpdir): + raise OSError( + f"TMPDIR is set to '{tmpdir}' but it is not a directory. " + "Please point TMPDIR to a writable directory or unset it to fall back to the default temporary directory." + ) + + # Explicitly pass the directory to mkdtemp to ensure TMPDIR is respected + # This works even if tempfile.gettempdir() was already called and cached + # Pass dir=None if tmpdir is None to use default temp directory + self.name = tempfile.mkdtemp(prefix=config.TEMP_CACHE_DIR_PREFIX, dir=tmpdir) + self._finalizer = weakref.finalize(self, self._cleanup) + + def _cleanup(self): + for dset in get_datasets_with_cache_file_in_temp_dir(): + dset.__del__() + if os.path.exists(self.name): + try: + shutil.rmtree(self.name) + except Exception as e: + raise OSError( + f"An error occurred while trying to delete temporary cache directory {self.name}. Please delete it manually." + ) from e + + def cleanup(self): + if self._finalizer.detach(): + self._cleanup() + + +def maybe_register_dataset_for_temp_dir_deletion(dataset): + """ + This function registers the datasets that have cache files in _TEMP_DIR_FOR_TEMP_CACHE_FILES in order + to properly delete them before deleting the temporary directory. + The temporary directory _TEMP_DIR_FOR_TEMP_CACHE_FILES is used when caching is disabled. + """ + if _TEMP_DIR_FOR_TEMP_CACHE_FILES is None: + return + + global _DATASETS_WITH_TABLE_IN_TEMP_DIR + if _DATASETS_WITH_TABLE_IN_TEMP_DIR is None: + _DATASETS_WITH_TABLE_IN_TEMP_DIR = weakref.WeakSet() + if any( + Path(_TEMP_DIR_FOR_TEMP_CACHE_FILES.name) in Path(cache_file["filename"]).parents + for cache_file in dataset.cache_files + ): + _DATASETS_WITH_TABLE_IN_TEMP_DIR.add(dataset) + + +def get_datasets_with_cache_file_in_temp_dir(): + return list(_DATASETS_WITH_TABLE_IN_TEMP_DIR) if _DATASETS_WITH_TABLE_IN_TEMP_DIR is not None else [] + + +def enable_caching(): + """ + When applying transforms on a dataset, the data are stored in cache files. + The caching mechanism allows to reload an existing cache file if it's already been computed. + + Reloading a dataset is possible since the cache files are named using the dataset fingerprint, which is updated + after each transform. + + If disabled, the library will no longer reload cached datasets files when applying transforms to the datasets. + More precisely, if the caching is disabled: + - cache files are always recreated + - cache files are written to a temporary directory that is deleted when session closes + - cache files are named using a random hash instead of the dataset fingerprint + - use [`~datasets.Dataset.save_to_disk`] to save a transformed dataset or it will be deleted when session closes + - caching doesn't affect [`~datasets.load_dataset`]. If you want to regenerate a dataset from scratch you should use + the `download_mode` parameter in [`~datasets.load_dataset`]. + """ + global _CACHING_ENABLED + _CACHING_ENABLED = True + + +def disable_caching(): + """ + When applying transforms on a dataset, the data are stored in cache files. + The caching mechanism allows to reload an existing cache file if it's already been computed. + + Reloading a dataset is possible since the cache files are named using the dataset fingerprint, which is updated + after each transform. + + If disabled, the library will no longer reload cached datasets files when applying transforms to the datasets. + More precisely, if the caching is disabled: + - cache files are always recreated + - cache files are written to a temporary directory that is deleted when session closes + - cache files are named using a random hash instead of the dataset fingerprint + - use [`~datasets.Dataset.save_to_disk`] to save a transformed dataset or it will be deleted when session closes + - caching doesn't affect [`~datasets.load_dataset`]. If you want to regenerate a dataset from scratch you should use + the `download_mode` parameter in [`~datasets.load_dataset`]. + """ + global _CACHING_ENABLED + _CACHING_ENABLED = False + + +def is_caching_enabled() -> bool: + """ + When applying transforms on a dataset, the data are stored in cache files. + The caching mechanism allows to reload an existing cache file if it's already been computed. + + Reloading a dataset is possible since the cache files are named using the dataset fingerprint, which is updated + after each transform. + + If disabled, the library will no longer reload cached datasets files when applying transforms to the datasets. + More precisely, if the caching is disabled: + - cache files are always recreated + - cache files are written to a temporary directory that is deleted when session closes + - cache files are named using a random hash instead of the dataset fingerprint + - use [`~datasets.Dataset.save_to_disk`]] to save a transformed dataset or it will be deleted when session closes + - caching doesn't affect [`~datasets.load_dataset`]. If you want to regenerate a dataset from scratch you should use + the `download_mode` parameter in [`~datasets.load_dataset`]. + """ + global _CACHING_ENABLED + return bool(_CACHING_ENABLED) + + +def get_temporary_cache_files_directory() -> str: + """Return a directory that is deleted when session closes.""" + global _TEMP_DIR_FOR_TEMP_CACHE_FILES + if _TEMP_DIR_FOR_TEMP_CACHE_FILES is None: + _TEMP_DIR_FOR_TEMP_CACHE_FILES = _TempCacheDir() + return _TEMP_DIR_FOR_TEMP_CACHE_FILES.name + + +################# +# Hashing +################# + + +class Hasher: + """Hasher that accepts python objects as inputs.""" + + dispatch: dict = {} + + def __init__(self): + self.m = xxhash.xxh64() + + @classmethod + def hash_bytes(cls, value: Union[bytes, list[bytes]]) -> str: + value = [value] if isinstance(value, bytes) else value + m = xxhash.xxh64() + for x in value: + m.update(x) + return m.hexdigest() + + @classmethod + def hash(cls, value: Any) -> str: + return cls.hash_bytes(dumps(value)) + + def update(self, value: Any) -> None: + header_for_update = f"=={type(value)}==" + value_for_update = self.hash(value) + self.m.update(header_for_update.encode("utf8")) + self.m.update(value_for_update.encode("utf-8")) + + def hexdigest(self) -> str: + return self.m.hexdigest() + + +################# +# Fingerprinting +################# + +fingerprint_rng = random.Random() +# we show a warning only once when fingerprinting fails to avoid spam +fingerprint_warnings: dict[str, bool] = {} + + +def generate_fingerprint(dataset: "Dataset") -> str: + state = dataset.__dict__ + hasher = Hasher() + for key in sorted(state): + if key == "_fingerprint": + continue + hasher.update(key) + hasher.update(state[key]) + # hash data files last modification timestamps as well + for cache_file in dataset.cache_files: + hasher.update(os.path.getmtime(cache_file["filename"])) + return hasher.hexdigest() + + +def generate_random_fingerprint(nbits: int = 64) -> str: + return f"{fingerprint_rng.getrandbits(nbits):0{nbits // 4}x}" + + +def update_fingerprint(fingerprint, transform, transform_args): + global fingerprint_warnings + hasher = Hasher() + hasher.update(fingerprint) + try: + hasher.update(transform) + except: # noqa various errors might raise here from pickle or dill + if _CACHING_ENABLED: + if not fingerprint_warnings.get("update_fingerprint_transform_hash_failed", False): + logger.warning( + f"Transform {transform} couldn't be hashed properly, a random hash was used instead. " + "Make sure your transforms and parameters are serializable with pickle or dill for the dataset fingerprinting and caching to work. " + "If you reuse this transform, the caching mechanism will consider it to be different from the previous calls and recompute everything. " + "This warning is only shown once. Subsequent hashing failures won't be shown." + ) + fingerprint_warnings["update_fingerprint_transform_hash_failed"] = True + else: + logger.info(f"Transform {transform} couldn't be hashed properly, a random hash was used instead.") + else: + logger.info( + f"Transform {transform} couldn't be hashed properly, a random hash was used instead. This doesn't affect caching since it's disabled." + ) + + return generate_random_fingerprint() + for key in sorted(transform_args): + hasher.update(key) + try: + hasher.update(transform_args[key]) + except: # noqa various errors might raise here from pickle or dill + if _CACHING_ENABLED: + if not fingerprint_warnings.get("update_fingerprint_transform_hash_failed", False): + logger.warning( + f"Parameter '{key}'={transform_args[key]} of the transform {transform} couldn't be hashed properly, a random hash was used instead. " + "Make sure your transforms and parameters are serializable with pickle or dill for the dataset fingerprinting and caching to work. " + "If you reuse this transform, the caching mechanism will consider it to be different from the previous calls and recompute everything. " + "This warning is only shown once. Subsequent hashing failures won't be shown." + ) + fingerprint_warnings["update_fingerprint_transform_hash_failed"] = True + else: + logger.info( + f"Parameter '{key}'={transform_args[key]} of the transform {transform} couldn't be hashed properly, a random hash was used instead." + ) + else: + logger.info( + f"Parameter '{key}'={transform_args[key]} of the transform {transform} couldn't be hashed properly, a random hash was used instead. This doesn't affect caching since it's disabled." + ) + return generate_random_fingerprint() + return hasher.hexdigest() + + +def validate_fingerprint(fingerprint: str, max_length=64): + """ + Make sure the fingerprint is a non-empty string that is not longer that max_length=64 by default, + so that the fingerprint can be used to name cache files without issues. + """ + if not isinstance(fingerprint, str) or not fingerprint: + raise ValueError(f"Invalid fingerprint '{fingerprint}': it should be a non-empty string.") + for invalid_char in INVALID_WINDOWS_CHARACTERS_IN_PATH: + if invalid_char in fingerprint: + raise ValueError( + f"Invalid fingerprint. Bad characters from black list '{INVALID_WINDOWS_CHARACTERS_IN_PATH}' found in '{fingerprint}'. " + f"They could create issues when creating cache files." + ) + if len(fingerprint) > max_length: + raise ValueError( + f"Invalid fingerprint. Maximum lenth is {max_length} but '{fingerprint}' has length {len(fingerprint)}." + "It could create issues when creating cache files." + ) + + +def format_transform_for_fingerprint(func: Callable, version: Optional[str] = None) -> str: + """ + Format a transform to the format that will be used to update the fingerprint. + """ + transform = f"{func.__module__}.{func.__qualname__}" + if version is not None: + transform += f"@{version}" + return transform + + +def format_kwargs_for_fingerprint( + func: Callable, + args: tuple, + kwargs: dict[str, Any], + use_kwargs: Optional[list[str]] = None, + ignore_kwargs: Optional[list[str]] = None, + randomized_function: bool = False, +) -> dict[str, Any]: + """ + Format the kwargs of a transform to the format that will be used to update the fingerprint. + """ + kwargs_for_fingerprint = kwargs.copy() + if args: + params = [p.name for p in inspect.signature(func).parameters.values() if p != p.VAR_KEYWORD] + args = args[1:] # assume the first argument is the dataset + params = params[1:] + kwargs_for_fingerprint.update(zip(params, args)) + else: + del kwargs_for_fingerprint[ + next(iter(inspect.signature(func).parameters)) + ] # assume the first key is the dataset + + # keep the right kwargs to be hashed to generate the fingerprint + + if use_kwargs: + kwargs_for_fingerprint = {k: v for k, v in kwargs_for_fingerprint.items() if k in use_kwargs} + if ignore_kwargs: + kwargs_for_fingerprint = {k: v for k, v in kwargs_for_fingerprint.items() if k not in ignore_kwargs} + if randomized_function: # randomized functions have `seed` and `generator` parameters + if kwargs_for_fingerprint.get("seed") is None and kwargs_for_fingerprint.get("generator") is None: + _, seed, pos, *_ = np.random.get_state() + seed = seed[pos] if pos < 624 else seed[0] + kwargs_for_fingerprint["generator"] = np.random.default_rng(seed) + + # remove kwargs that are the default values + + default_values = { + p.name: p.default for p in inspect.signature(func).parameters.values() if p.default != inspect._empty + } + for default_varname, default_value in default_values.items(): + if default_varname in kwargs_for_fingerprint and kwargs_for_fingerprint[default_varname] == default_value: + kwargs_for_fingerprint.pop(default_varname) + return kwargs_for_fingerprint + + +def fingerprint_transform( + inplace: bool, + use_kwargs: Optional[list[str]] = None, + ignore_kwargs: Optional[list[str]] = None, + fingerprint_names: Optional[list[str]] = None, + randomized_function: bool = False, + version: Optional[str] = None, +): + """ + Wrapper for dataset transforms to update the dataset fingerprint using ``update_fingerprint`` + Args: + inplace (:obj:`bool`): If inplace is True, the fingerprint of the dataset is updated inplace. + Otherwise, a parameter "new_fingerprint" is passed to the wrapped method that should take care of + setting the fingerprint of the returned Dataset. + use_kwargs (:obj:`List[str]`, optional): optional white list of argument names to take into account + to update the fingerprint to the wrapped method that should take care of + setting the fingerprint of the returned Dataset. By default all the arguments are used. + ignore_kwargs (:obj:`List[str]`, optional): optional black list of argument names to take into account + to update the fingerprint. Note that ignore_kwargs prevails on use_kwargs. + fingerprint_names (:obj:`List[str]`, optional, defaults to ["new_fingerprint"]): + If the dataset transforms is not inplace and returns a DatasetDict, then it can require + several fingerprints (one per dataset in the DatasetDict). By specifying fingerprint_names, + one fingerprint named after each element of fingerprint_names is going to be passed. + randomized_function (:obj:`bool`, defaults to False): If the dataset transform is random and has + optional parameters "seed" and "generator", then you can set randomized_function to True. + This way, even if users set "seed" and "generator" to None, then the fingerprint is + going to be randomly generated depending on numpy's current state. In this case, the + generator is set to np.random.default_rng(np.random.get_state()[1][0]). + version (:obj:`str`, optional): version of the transform. The version is taken into account when + computing the fingerprint. If a datase transform changes (or at least if the output data + that are cached changes), then one should increase the version. If the version stays the + same, then old cached data could be reused that are not compatible with the new transform. + It should be in the format "MAJOR.MINOR.PATCH". + """ + + if use_kwargs is not None and not isinstance(use_kwargs, list): + raise ValueError(f"use_kwargs is supposed to be a list, not {type(use_kwargs)}") + + if ignore_kwargs is not None and not isinstance(ignore_kwargs, list): + raise ValueError(f"ignore_kwargs is supposed to be a list, not {type(use_kwargs)}") + + if inplace and fingerprint_names: + raise ValueError("fingerprint_names are only used when inplace is False") + + fingerprint_names = fingerprint_names if fingerprint_names is not None else ["new_fingerprint"] + + def _fingerprint(func): + if not inplace and not all(name in func.__code__.co_varnames for name in fingerprint_names): + raise ValueError(f"function {func} is missing parameters {fingerprint_names} in signature") + + if randomized_function: # randomized function have seed and generator parameters + if "seed" not in func.__code__.co_varnames: + raise ValueError(f"'seed' must be in {func}'s signature") + if "generator" not in func.__code__.co_varnames: + raise ValueError(f"'generator' must be in {func}'s signature") + # this call has to be outside the wrapper or since __qualname__ changes in multiprocessing + transform = format_transform_for_fingerprint(func, version=version) + + @wraps(func) + def wrapper(*args, **kwargs): + kwargs_for_fingerprint = format_kwargs_for_fingerprint( + func, + args, + kwargs, + use_kwargs=use_kwargs, + ignore_kwargs=ignore_kwargs, + randomized_function=randomized_function, + ) + + if args: + dataset: Dataset = args[0] + args = args[1:] + else: + dataset: Dataset = kwargs.pop(next(iter(inspect.signature(func).parameters))) + + # compute new_fingerprint and add it to the args of not in-place transforms + if inplace: + new_fingerprint = update_fingerprint(dataset._fingerprint, transform, kwargs_for_fingerprint) + else: + for fingerprint_name in fingerprint_names: # transforms like `train_test_split` have several hashes + if kwargs.get(fingerprint_name) is None: + kwargs_for_fingerprint["fingerprint_name"] = fingerprint_name + kwargs[fingerprint_name] = update_fingerprint( + dataset._fingerprint, transform, kwargs_for_fingerprint + ) + else: + validate_fingerprint(kwargs[fingerprint_name]) + + # Call actual function + + out = func(dataset, *args, **kwargs) + + # Update fingerprint of in-place transforms + update in-place history of transforms + + if inplace: # update after calling func so that the fingerprint doesn't change if the function fails + dataset._fingerprint = new_fingerprint + + return out + + wrapper._decorator_name_ = "fingerprint" + return wrapper + + return _fingerprint diff --git a/src/datasets/formatting/__init__.py b/src/datasets/formatting/__init__.py new file mode 100644 index 0000000..e29421d --- /dev/null +++ b/src/datasets/formatting/__init__.py @@ -0,0 +1,136 @@ +# Copyright 2020 The HuggingFace Datasets Authors and the TensorFlow Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Dict, List, Optional, Type + +from .. import config +from ..utils import logging +from .formatting import ( + ArrowFormatter, + CustomFormatter, + Formatter, + PandasFormatter, + PythonFormatter, + TableFormatter, + TensorFormatter, + format_table, + query_table, +) +from .np_formatter import NumpyFormatter + + +logger = logging.get_logger(__name__) + +_FORMAT_TYPES: dict[Optional[str], type[Formatter]] = {} +_FORMAT_TYPES_ALIASES: dict[Optional[str], str] = {} +_FORMAT_TYPES_ALIASES_UNAVAILABLE: dict[Optional[str], Exception] = {} + + +def _register_formatter( + formatter_cls: type, + format_type: Optional[str], + aliases: Optional[list[str]] = None, +): + """ + Register a Formatter object using a name and optional aliases. + This function must be used on a Formatter class. + """ + aliases = aliases if aliases is not None else [] + if format_type in _FORMAT_TYPES: + logger.warning( + f"Overwriting format type '{format_type}' ({_FORMAT_TYPES[format_type].__name__} -> {formatter_cls.__name__})" + ) + _FORMAT_TYPES[format_type] = formatter_cls + for alias in set(aliases + [format_type]): + if alias in _FORMAT_TYPES_ALIASES: + logger.warning( + f"Overwriting format type alias '{alias}' ({_FORMAT_TYPES_ALIASES[alias]} -> {format_type})" + ) + _FORMAT_TYPES_ALIASES[alias] = format_type + + +def _register_unavailable_formatter( + unavailable_error: Exception, format_type: Optional[str], aliases: Optional[list[str]] = None +): + """ + Register an unavailable Formatter object using a name and optional aliases. + This function must be used on an Exception object that is raised when trying to get the unavailable formatter. + """ + aliases = aliases if aliases is not None else [] + for alias in set(aliases + [format_type]): + _FORMAT_TYPES_ALIASES_UNAVAILABLE[alias] = unavailable_error + + +# Here we define all the available formatting functions that can be used by `Dataset.set_format` +_register_formatter(PythonFormatter, None, aliases=["python"]) +_register_formatter(ArrowFormatter, "arrow", aliases=["pa", "pyarrow"]) +_register_formatter(NumpyFormatter, "numpy", aliases=["np"]) +_register_formatter(PandasFormatter, "pandas", aliases=["pd"]) +_register_formatter(CustomFormatter, "custom") + +if config.POLARS_AVAILABLE: + from .polars_formatter import PolarsFormatter + + _register_formatter(PolarsFormatter, "polars", aliases=["pl"]) +else: + _polars_error = ValueError("Polars needs to be installed to be able to return Polars dataframes.") + _register_unavailable_formatter(_polars_error, "polars", aliases=["pl"]) + +if config.TORCH_AVAILABLE: + from .torch_formatter import TorchFormatter + + _register_formatter(TorchFormatter, "torch", aliases=["pt", "pytorch"]) +else: + _torch_error = ValueError("PyTorch needs to be installed to be able to return PyTorch tensors.") + _register_unavailable_formatter(_torch_error, "torch", aliases=["pt", "pytorch"]) + +if config.TF_AVAILABLE: + from .tf_formatter import TFFormatter + + _register_formatter(TFFormatter, "tensorflow", aliases=["tf"]) +else: + _tf_error = ValueError("Tensorflow needs to be installed to be able to return Tensorflow tensors.") + _register_unavailable_formatter(_tf_error, "tensorflow", aliases=["tf"]) + +if config.JAX_AVAILABLE: + from .jax_formatter import JaxFormatter + + _register_formatter(JaxFormatter, "jax", aliases=[]) +else: + _jax_error = ValueError("JAX needs to be installed to be able to return JAX arrays.") + _register_unavailable_formatter(_jax_error, "jax", aliases=[]) + + +def get_format_type_from_alias(format_type: Optional[str]) -> Optional[str]: + """If the given format type is a known alias, then return its main type name. Otherwise return the type with no change.""" + if format_type in _FORMAT_TYPES_ALIASES: + return _FORMAT_TYPES_ALIASES[format_type] + else: + return format_type + + +def get_formatter(format_type: Optional[str], **format_kwargs) -> Formatter: + """ + Factory function to get a Formatter given its type name and keyword arguments. + A formatter is an object that extracts and formats data from pyarrow table. + It defines the formatting for rows, columns and batches. + If the formatter for a given type name doesn't exist or is not available, an error is raised. + """ + format_type = get_format_type_from_alias(format_type) + if format_type in _FORMAT_TYPES: + return _FORMAT_TYPES[format_type](**format_kwargs) + if format_type in _FORMAT_TYPES_ALIASES_UNAVAILABLE: + raise _FORMAT_TYPES_ALIASES_UNAVAILABLE[format_type] + else: + raise ValueError(f"Format type should be one of {list(_FORMAT_TYPES.keys())}, but got '{format_type}'") diff --git a/src/datasets/formatting/formatting.py b/src/datasets/formatting/formatting.py new file mode 100644 index 0000000..24805dc --- /dev/null +++ b/src/datasets/formatting/formatting.py @@ -0,0 +1,678 @@ +# Copyright 2020 The HuggingFace Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import numbers +import operator +from collections.abc import Iterable, Mapping, MutableMapping +from functools import partial + +# Lint as: python3 +from typing import Any, Callable, Generic, Optional, TypeVar, Union + +import numpy as np +import pandas as pd +import pyarrow as pa + +from ..features import Features +from ..features.features import _ArrayXDExtensionType, _is_zero_copy_only, decode_nested_example, pandas_types_mapper +from ..table import Table +from ..utils.py_utils import no_op_if_value_is_null + + +T = TypeVar("T") + +RowFormat = TypeVar("RowFormat") +ColumnFormat = TypeVar("ColumnFormat") +BatchFormat = TypeVar("BatchFormat") + + +def _is_range_contiguous(key: range) -> bool: + return key.step == 1 and key.stop >= key.start + + +def _raise_bad_key_type(key: Any): + raise TypeError( + f"Wrong key type: '{key}' of type '{type(key)}'. Expected one of int, slice, range, str or Iterable." + ) + + +def _query_table_with_indices_mapping( + table: Table, key: Union[int, slice, range, str, Iterable], indices: Table +) -> pa.Table: + """ + Query a pyarrow Table to extract the subtable that correspond to the given key. + The :obj:`indices` parameter corresponds to the indices mapping in case we cant to take into + account a shuffling or an indices selection for example. + The indices table must contain one column named "indices" of type uint64. + """ + if isinstance(key, int): + key = indices.fast_slice(key % indices.num_rows, 1).column(0)[0].as_py() + return _query_table(table, key) + if isinstance(key, slice): + key = range(*key.indices(indices.num_rows)) + if isinstance(key, range): + if _is_range_contiguous(key) and key.start >= 0: + return _query_table( + table, [i.as_py() for i in indices.fast_slice(key.start, key.stop - key.start).column(0)] + ) + else: + pass # treat as an iterable + if isinstance(key, str): + table = table.select([key]) + return _query_table(table, indices.column(0).to_pylist()) + if isinstance(key, Iterable): + return _query_table(table, [indices.fast_slice(i, 1).column(0)[0].as_py() for i in key]) + + _raise_bad_key_type(key) + + +def _query_table(table: Table, key: Union[int, slice, range, str, Iterable]) -> pa.Table: + """ + Query a pyarrow Table to extract the subtable that correspond to the given key. + """ + if isinstance(key, int): + return table.fast_slice(key % table.num_rows, 1) + if isinstance(key, slice): + key = range(*key.indices(table.num_rows)) + if isinstance(key, range): + if _is_range_contiguous(key) and key.start >= 0: + return table.fast_slice(key.start, key.stop - key.start) + else: + pass # treat as an iterable + if isinstance(key, str): + return table.table.drop([column for column in table.column_names if column != key]) + if isinstance(key, Iterable): + key = np.fromiter(key, np.int64) + if len(key) == 0: + return table.table.slice(0, 0) + # don't use pyarrow.Table.take even for pyarrow >=1.0 (see https://issues.apache.org/jira/browse/ARROW-9773) + return table.fast_gather(key % table.num_rows) + + _raise_bad_key_type(key) + + +def _is_array_with_nulls(pa_array: pa.Array) -> bool: + return pa_array.null_count > 0 + + +class BaseArrowExtractor(Generic[RowFormat, ColumnFormat, BatchFormat]): + """ + Arrow extractor are used to extract data from pyarrow tables. + It makes it possible to extract rows, columns and batches. + These three extractions types have to be implemented. + """ + + def extract_row(self, pa_table: pa.Table) -> RowFormat: + raise NotImplementedError + + def extract_column(self, pa_table: pa.Table) -> ColumnFormat: + raise NotImplementedError + + def extract_batch(self, pa_table: pa.Table) -> BatchFormat: + raise NotImplementedError + + +def _unnest(py_dict: dict[str, list[T]]) -> dict[str, T]: + """Return the first element of a batch (dict) as a row (dict)""" + return {key: array[0] for key, array in py_dict.items()} + + +class SimpleArrowExtractor(BaseArrowExtractor[pa.Table, pa.Array, pa.Table]): + def extract_row(self, pa_table: pa.Table) -> pa.Table: + return pa_table + + def extract_column(self, pa_table: pa.Table) -> pa.Array: + return pa_table.column(0) + + def extract_batch(self, pa_table: pa.Table) -> pa.Table: + return pa_table + + +class PythonArrowExtractor(BaseArrowExtractor[dict, list, dict]): + def extract_row(self, pa_table: pa.Table) -> dict: + return _unnest(pa_table.to_pydict()) + + def extract_column(self, pa_table: pa.Table) -> list: + return pa_table.column(0).to_pylist() + + def extract_batch(self, pa_table: pa.Table) -> dict: + return pa_table.to_pydict() + + +class NumpyArrowExtractor(BaseArrowExtractor[dict, np.ndarray, dict]): + def __init__(self, **np_array_kwargs): + self.np_array_kwargs = np_array_kwargs + + def extract_row(self, pa_table: pa.Table) -> dict: + return _unnest(self.extract_batch(pa_table)) + + def extract_column(self, pa_table: pa.Table) -> np.ndarray: + return self._arrow_array_to_numpy(pa_table[pa_table.column_names[0]]) + + def extract_batch(self, pa_table: pa.Table) -> dict: + return {col: self._arrow_array_to_numpy(pa_table[col]) for col in pa_table.column_names} + + def _arrow_array_to_numpy(self, pa_array: pa.Array) -> np.ndarray: + if isinstance(pa_array, pa.ChunkedArray): + if isinstance(pa_array.type, _ArrayXDExtensionType): + # don't call to_pylist() to preserve dtype of the fixed-size array + zero_copy_only = _is_zero_copy_only(pa_array.type.storage_dtype, unnest=True) + array: list = [ + row for chunk in pa_array.chunks for row in chunk.to_numpy(zero_copy_only=zero_copy_only) + ] + else: + zero_copy_only = _is_zero_copy_only(pa_array.type) and all( + not _is_array_with_nulls(chunk) for chunk in pa_array.chunks + ) + array: list = [ + row for chunk in pa_array.chunks for row in chunk.to_numpy(zero_copy_only=zero_copy_only) + ] + else: + if isinstance(pa_array.type, _ArrayXDExtensionType): + # don't call to_pylist() to preserve dtype of the fixed-size array + zero_copy_only = _is_zero_copy_only(pa_array.type.storage_dtype, unnest=True) + array: list = pa_array.to_numpy(zero_copy_only=zero_copy_only) + else: + zero_copy_only = _is_zero_copy_only(pa_array.type) and not _is_array_with_nulls(pa_array) + array: list = pa_array.to_numpy(zero_copy_only=zero_copy_only).tolist() + + if len(array) > 0: + if any( + (isinstance(x, np.ndarray) and (x.dtype == object or x.shape != array[0].shape)) + or (isinstance(x, float) and np.isnan(x)) + for x in array + ): + if np.lib.NumpyVersion(np.__version__) >= "2.0.0b1": + return np.asarray(array, dtype=object) + return np.array(array, copy=False, dtype=object) + if np.lib.NumpyVersion(np.__version__) >= "2.0.0b1": + return np.asarray(array) + else: + return np.array(array, copy=False) + + +class PandasArrowExtractor(BaseArrowExtractor[pd.DataFrame, pd.Series, pd.DataFrame]): + def extract_row(self, pa_table: pa.Table) -> pd.DataFrame: + return pa_table.slice(length=1).to_pandas(types_mapper=pandas_types_mapper) + + def extract_column(self, pa_table: pa.Table) -> pd.Series: + return pa_table.select([0]).to_pandas(types_mapper=pandas_types_mapper)[pa_table.column_names[0]] + + def extract_batch(self, pa_table: pa.Table) -> pd.DataFrame: + return pa_table.to_pandas(types_mapper=pandas_types_mapper) + + +class PythonFeaturesDecoder: + def __init__( + self, features: Optional[Features], token_per_repo_id: Optional[dict[str, Union[str, bool, None]]] = None + ): + self.features = features + self.token_per_repo_id = token_per_repo_id + + def decode_row(self, row: dict) -> dict: + return self.features.decode_example(row, token_per_repo_id=self.token_per_repo_id) if self.features else row + + def decode_column(self, column: list, column_name: str) -> list: + return ( + self.features.decode_column(column, column_name, token_per_repo_id=self.token_per_repo_id) + if self.features + else column + ) + + def decode_batch(self, batch: dict) -> dict: + return self.features.decode_batch(batch, token_per_repo_id=self.token_per_repo_id) if self.features else batch + + +class PandasFeaturesDecoder: + def __init__(self, features: Optional[Features]): + self.features = features + + def decode_row(self, row: pd.DataFrame) -> pd.DataFrame: + decode = ( + { + column_name: no_op_if_value_is_null(partial(decode_nested_example, feature)) + for column_name, feature in self.features.items() + if self.features._column_requires_decoding[column_name] + } + if self.features + else {} + ) + if decode: + row[list(decode.keys())] = row.transform(decode) + return row + + def decode_column(self, column: pd.Series, column_name: str) -> pd.Series: + decode = ( + no_op_if_value_is_null(partial(decode_nested_example, self.features[column_name])) + if self.features and column_name in self.features and self.features._column_requires_decoding[column_name] + else None + ) + if decode: + column = column.transform(decode) + return column + + def decode_batch(self, batch: pd.DataFrame) -> pd.DataFrame: + return self.decode_row(batch) + + +class LazyDict(MutableMapping): + """A dictionary backed by Arrow data. The values are formatted on-the-fly when accessing the dictionary.""" + + def __init__(self, pa_table: pa.Table, formatter: "Formatter"): + self.pa_table = pa_table + self.formatter = formatter + + self.data = dict.fromkeys(pa_table.column_names) + self.keys_to_format = set(self.data.keys()) + + def __len__(self): + return len(self.data) + + def __getitem__(self, key): + value = self.data[key] + if key in self.keys_to_format: + value = self.format(key) + self.data[key] = value + self.keys_to_format.remove(key) + return value + + def __setitem__(self, key, value): + if key in self.keys_to_format: + self.keys_to_format.remove(key) + self.data[key] = value + + def __delitem__(self, key) -> None: + if key in self.keys_to_format: + self.keys_to_format.remove(key) + del self.data[key] + + def __iter__(self): + return iter(self.data) + + def __contains__(self, key): + return key in self.data + + def __repr__(self): + self._format_all() + return repr(self.data) + + def __or__(self, other): + if isinstance(other, LazyDict): + inst = self.copy() + other = other.copy() + other._format_all() + inst.keys_to_format -= other.data.keys() + inst.data = inst.data | other.data + return inst + if isinstance(other, dict): + inst = self.copy() + inst.keys_to_format -= other.keys() + inst.data = inst.data | other + return inst + return NotImplemented + + def __ror__(self, other): + if isinstance(other, LazyDict): + inst = self.copy() + other = other.copy() + other._format_all() + inst.keys_to_format -= other.data.keys() + inst.data = other.data | inst.data + return inst + if isinstance(other, dict): + inst = self.copy() + inst.keys_to_format -= other.keys() + inst.data = other | inst.data + return inst + return NotImplemented + + def __ior__(self, other): + if isinstance(other, LazyDict): + other = other.copy() + other._format_all() + self.keys_to_format -= other.data.keys() + self.data |= other.data + else: + self.keys_to_format -= other.keys() + self.data |= other + return self + + def __copy__(self): + # Identical to `UserDict.__copy__` + inst = self.__class__.__new__(self.__class__) + inst.__dict__.update(self.__dict__) + # Create a copy and avoid triggering descriptors + inst.__dict__["data"] = self.__dict__["data"].copy() + inst.__dict__["keys_to_format"] = self.__dict__["keys_to_format"].copy() + return inst + + def copy(self): + import copy + + return copy.copy(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + raise NotImplementedError + + def format(self, key): + raise NotImplementedError + + def _format_all(self): + for key in self.keys_to_format: + self.data[key] = self.format(key) + self.keys_to_format.clear() + + +class LazyRow(LazyDict): + def format(self, key): + return self.formatter.format_column(self.pa_table.select([key]))[0] + + +class LazyBatch(LazyDict): + def format(self, key): + return self.formatter.format_column(self.pa_table.select([key])) + + +class Formatter(Generic[RowFormat, ColumnFormat, BatchFormat]): + """ + A formatter is an object that extracts and formats data from pyarrow tables. + It defines the formatting for rows, columns and batches. + """ + + simple_arrow_extractor = SimpleArrowExtractor + python_arrow_extractor = PythonArrowExtractor + numpy_arrow_extractor = NumpyArrowExtractor + pandas_arrow_extractor = PandasArrowExtractor + + def __init__( + self, + features: Optional[Features] = None, + token_per_repo_id: Optional[dict[str, Union[str, bool, None]]] = None, + ): + self.features = features + self.token_per_repo_id = token_per_repo_id + self.python_features_decoder = PythonFeaturesDecoder(self.features, self.token_per_repo_id) + self.pandas_features_decoder = PandasFeaturesDecoder(self.features) + + def __call__(self, pa_table: pa.Table, query_type: str) -> Union[RowFormat, ColumnFormat, BatchFormat]: + if query_type == "row": + return self.format_row(pa_table) + elif query_type == "column": + return self.format_column(pa_table) + elif query_type == "batch": + return self.format_batch(pa_table) + + def format_row(self, pa_table: pa.Table) -> RowFormat: + raise NotImplementedError + + def format_column(self, pa_table: pa.Table) -> ColumnFormat: + raise NotImplementedError + + def format_batch(self, pa_table: pa.Table) -> BatchFormat: + raise NotImplementedError + + +class TensorFormatter(Formatter[RowFormat, ColumnFormat, BatchFormat]): + def recursive_tensorize(self, data_struct: dict): + raise NotImplementedError + + +class TableFormatter(Formatter[RowFormat, ColumnFormat, BatchFormat]): + table_type: str + column_type: str + + +class ArrowFormatter(TableFormatter[pa.Table, pa.Array, pa.Table]): + table_type = "arrow table" + column_type = "arrow array" + + def format_row(self, pa_table: pa.Table) -> pa.Table: + return self.simple_arrow_extractor().extract_row(pa_table) + + def format_column(self, pa_table: pa.Table) -> pa.Array: + return self.simple_arrow_extractor().extract_column(pa_table) + + def format_batch(self, pa_table: pa.Table) -> pa.Table: + return self.simple_arrow_extractor().extract_batch(pa_table) + + +class PythonFormatter(Formatter[Mapping, list, Mapping]): + def __init__(self, features=None, lazy=False, token_per_repo_id=None): + super().__init__(features, token_per_repo_id) + self.lazy = lazy + + def format_row(self, pa_table: pa.Table) -> Mapping: + if self.lazy: + return LazyRow(pa_table, self) + row = self.python_arrow_extractor().extract_row(pa_table) + row = self.python_features_decoder.decode_row(row) + return row + + def format_column(self, pa_table: pa.Table) -> list: + column = self.python_arrow_extractor().extract_column(pa_table) + column = self.python_features_decoder.decode_column(column, pa_table.column_names[0]) + return column + + def format_batch(self, pa_table: pa.Table) -> Mapping: + if self.lazy: + return LazyBatch(pa_table, self) + batch = self.python_arrow_extractor().extract_batch(pa_table) + batch = self.python_features_decoder.decode_batch(batch) + return batch + + +class PandasFormatter(TableFormatter[pd.DataFrame, pd.Series, pd.DataFrame]): + table_type = "pandas dataframe" + column_type = "pandas series" + + def format_row(self, pa_table: pa.Table) -> pd.DataFrame: + row = self.pandas_arrow_extractor().extract_row(pa_table) + row = self.pandas_features_decoder.decode_row(row) + return row + + def format_column(self, pa_table: pa.Table) -> pd.Series: + column = self.pandas_arrow_extractor().extract_column(pa_table) + column = self.pandas_features_decoder.decode_column(column, pa_table.column_names[0]) + return column + + def format_batch(self, pa_table: pa.Table) -> pd.DataFrame: + row = self.pandas_arrow_extractor().extract_batch(pa_table) + row = self.pandas_features_decoder.decode_batch(row) + return row + + +class CustomFormatter(Formatter[dict, ColumnFormat, dict]): + """ + A user-defined custom formatter function defined by a ``transform``. + The transform must take as input a batch of data extracted for an arrow table using the python extractor, + and return a batch. + If the output batch is not a dict, then output_all_columns won't work. + If the output batch has several fields, then querying a single column won't work since we don't know which field + to return. + """ + + def __init__(self, transform: Callable[[dict], dict], features=None, token_per_repo_id=None, **kwargs): + super().__init__(features=features, token_per_repo_id=token_per_repo_id) + self.transform = transform + + def format_row(self, pa_table: pa.Table) -> dict: + formatted_batch = self.format_batch(pa_table) + try: + return _unnest(formatted_batch) + except Exception as exc: + raise TypeError( + f"Custom formatting function must return a dict of sequences to be able to pick a row, but got {formatted_batch}" + ) from exc + + def format_column(self, pa_table: pa.Table) -> ColumnFormat: + formatted_batch = self.format_batch(pa_table) + if hasattr(formatted_batch, "keys"): + if len(formatted_batch.keys()) > 1: + raise TypeError( + "Tried to query a column but the custom formatting function returns too many columns. " + f"Only one column was expected but got columns {list(formatted_batch.keys())}." + ) + else: + raise TypeError( + f"Custom formatting function must return a dict to be able to pick a row, but got {formatted_batch}" + ) + try: + return formatted_batch[pa_table.column_names[0]] + except Exception as exc: + raise TypeError( + f"Custom formatting function must return a dict to be able to pick a row, but got {formatted_batch}" + ) from exc + + def format_batch(self, pa_table: pa.Table) -> dict: + batch = self.python_arrow_extractor().extract_batch(pa_table) + batch = self.python_features_decoder.decode_batch(batch) + return self.transform(batch) + + +def _check_valid_column_key(key: str, columns: list[str]) -> None: + if key not in columns: + raise KeyError(f"Column {key} not in the dataset. Current columns in the dataset: {columns}") + + +def _check_valid_index_key(key: Union[int, slice, range, Iterable], size: int) -> None: + if isinstance(key, int): + if (key < 0 and key + size < 0) or (key >= size): + raise IndexError(f"Invalid key: {key} is out of bounds for size {size}") + return + elif isinstance(key, slice): + pass + elif isinstance(key, range): + if len(key) > 0: + _check_valid_index_key(max(key), size=size) + _check_valid_index_key(min(key), size=size) + elif isinstance(key, Iterable): + if len(key) > 0: + _check_valid_index_key(int(max(key)), size=size) + _check_valid_index_key(int(min(key)), size=size) + else: + _raise_bad_key_type(key) + + +def key_to_query_type(key: Union[int, slice, range, str, Iterable]) -> str: + if isinstance(key, numbers.Integral): + return "row" + elif isinstance(key, str): + return "column" + elif isinstance(key, (slice, range, Iterable)): + return "batch" + _raise_bad_key_type(key) + + +def query_table( + table: Table, + key: Union[int, slice, range, str, Iterable], + indices: Optional[Table] = None, +) -> pa.Table: + """ + Query a Table to extract the subtable that correspond to the given key. + + Args: + table (``datasets.table.Table``): The input Table to query from + key (``Union[int, slice, range, str, Iterable]``): The key can be of different types: + - an integer i: the subtable containing only the i-th row + - a slice [i:j:k]: the subtable containing the rows that correspond to this slice + - a range(i, j, k): the subtable containing the rows that correspond to this range + - a string c: the subtable containing all the rows but only the column c + - an iterable l: the subtable that is the concatenation of all the i-th rows for all i in the iterable + indices (Optional ``datasets.table.Table``): If not None, it is used to re-map the given key to the table rows. + The indices table must contain one column named "indices" of type uint64. + This is used in case of shuffling or rows selection. + + + Returns: + ``pyarrow.Table``: the result of the query on the input table + """ + # Check if key is valid + if not isinstance(key, (int, slice, range, str, Iterable)): + try: + key = operator.index(key) + except TypeError: + _raise_bad_key_type(key) + if isinstance(key, str): + _check_valid_column_key(key, table.column_names) + else: + size = indices.num_rows if indices is not None else table.num_rows + _check_valid_index_key(key, size) + # Query the main table + if indices is None: + pa_subtable = _query_table(table, key) + else: + pa_subtable = _query_table_with_indices_mapping(table, key, indices=indices) + return pa_subtable + + +def format_table( + table: Table, + key: Union[int, slice, range, str, Iterable], + formatter: Formatter, + format_columns: Optional[list] = None, + output_all_columns=False, +): + """ + Format a Table depending on the key that was used and a Formatter object. + + Args: + table (``datasets.table.Table``): The input Table to format + key (``Union[int, slice, range, str, Iterable]``): Depending on the key that was used, the formatter formats + the table as either a row, a column or a batch. + formatter (``datasets.formatting.formatting.Formatter``): Any subclass of a Formatter such as + PythonFormatter, NumpyFormatter, etc. + format_columns (:obj:`List[str]`, optional): if not None, it defines the columns that will be formatted using the + given formatter. Other columns are discarded (unless ``output_all_columns`` is True) + output_all_columns (:obj:`bool`, defaults to False). If True, the formatted output is completed using the columns + that are not in the ``format_columns`` list. For these columns, the PythonFormatter is used. + + + Returns: + A row, column or batch formatted object defined by the Formatter: + - the PythonFormatter returns a dictionary for a row or a batch, and a list for a column. + - the NumpyFormatter returns a dictionary for a row or a batch, and a np.array for a column. + - the PandasFormatter returns a pd.DataFrame for a row or a batch, and a pd.Series for a column. + - the TorchFormatter returns a dictionary for a row or a batch, and a torch.Tensor for a column. + - the TFFormatter returns a dictionary for a row or a batch, and a tf.Tensor for a column. + """ + if isinstance(table, Table): + pa_table = table.table + else: + pa_table = table + query_type = key_to_query_type(key) + python_formatter = PythonFormatter(features=formatter.features) + if format_columns is None: + return formatter(pa_table, query_type=query_type) + elif query_type == "column": + if key in format_columns: + return formatter(pa_table, query_type) + else: + return python_formatter(pa_table, query_type=query_type) + else: + pa_table_to_format = pa_table.drop(col for col in pa_table.column_names if col not in format_columns) + formatted_output = formatter(pa_table_to_format, query_type=query_type) + if output_all_columns: + if isinstance(formatted_output, MutableMapping): + pa_table_with_remaining_columns = pa_table.drop( + col for col in pa_table.column_names if col in format_columns + ) + remaining_columns_dict = python_formatter(pa_table_with_remaining_columns, query_type=query_type) + formatted_output.update(remaining_columns_dict) + else: + raise TypeError( + f"Custom formatting function must return a dict to work with output_all_columns=True, but got {formatted_output}" + ) + return formatted_output diff --git a/src/datasets/formatting/jax_formatter.py b/src/datasets/formatting/jax_formatter.py new file mode 100644 index 0000000..8d0cad4 --- /dev/null +++ b/src/datasets/formatting/jax_formatter.py @@ -0,0 +1,174 @@ +# Copyright 2021 The HuggingFace Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +import sys +from collections.abc import Mapping +from typing import TYPE_CHECKING, Optional + +import numpy as np +import pyarrow as pa + +from .. import config +from ..utils.logging import get_logger +from ..utils.py_utils import map_nested +from .formatting import TensorFormatter + + +if TYPE_CHECKING: + import jax + import jaxlib + +logger = get_logger() + +DEVICE_MAPPING: Optional[dict] = None + + +class JaxFormatter(TensorFormatter[Mapping, "jax.Array", Mapping]): + def __init__(self, features=None, device=None, token_per_repo_id=None, **jnp_array_kwargs): + super().__init__(features=features, token_per_repo_id=token_per_repo_id) + import jax + from jaxlib.xla_client import Device + + if isinstance(device, Device): + raise ValueError( + f"Expected {device} to be a `str` not {type(device)}, as `jaxlib.xla_extension.Device` " + "is not serializable neither with `pickle` nor with `dill`. Instead you can surround " + "the device with `str()` to get its string identifier that will be internally mapped " + "to the actual `jaxlib.xla_extension.Device`." + ) + self.device = device if isinstance(device, str) else str(jax.devices()[0]) + # using global variable since `jaxlib.xla_extension.Device` is not serializable neither + # with `pickle` nor with `dill`, so we need to use a global variable instead + global DEVICE_MAPPING + if DEVICE_MAPPING is None: + DEVICE_MAPPING = self._map_devices_to_str() + if self.device not in list(DEVICE_MAPPING.keys()): + logger.warning( + f"Device with string identifier {self.device} not listed among the available " + f"devices: {list(DEVICE_MAPPING.keys())}, so falling back to the default " + f"device: {str(jax.devices()[0])}." + ) + self.device = str(jax.devices()[0]) + self.jnp_array_kwargs = jnp_array_kwargs + + @staticmethod + def _map_devices_to_str() -> dict[str, "jaxlib.xla_extension.Device"]: + import jax + + return {str(device): device for device in jax.devices()} + + def _consolidate(self, column): + import jax + import jax.numpy as jnp + + if isinstance(column, list) and column: + if all( + isinstance(x, jax.Array) and x.shape == column[0].shape and x.dtype == column[0].dtype for x in column + ): + return jnp.stack(column, axis=0) + return column + + def _tensorize(self, value): + import jax + import jax.numpy as jnp + + if isinstance(value, (str, bytes, type(None))): + return value + elif isinstance(value, (np.character, np.ndarray)) and np.issubdtype(value.dtype, np.character): + return value.tolist() + + default_dtype = {} + + if isinstance(value, (np.number, np.ndarray)) and np.issubdtype(value.dtype, np.integer): + # the default int precision depends on the jax config + # see https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#double-64bit-precision + if jax.config.jax_enable_x64: + default_dtype = {"dtype": jnp.int64} + else: + default_dtype = {"dtype": jnp.int32} + elif isinstance(value, (np.number, np.ndarray)) and np.issubdtype(value.dtype, np.floating): + default_dtype = {"dtype": jnp.float32} + + if config.PIL_AVAILABLE and "PIL" in sys.modules: + import PIL.Image + + if isinstance(value, PIL.Image.Image): + value = np.asarray(value) + if config.TORCHVISION_AVAILABLE and "torchvision" in sys.modules: + try: + from torchvision.io import VideoReader + + if isinstance(value, VideoReader): + return value # TODO(QL): set output to jax arrays ? + except ImportError: + pass + if config.TORCHCODEC_AVAILABLE and "torchcodec" in sys.modules: + from torchcodec.decoders import AudioDecoder, VideoDecoder + + if isinstance(value, (VideoDecoder, AudioDecoder)): + return value # TODO(QL): set output to jax arrays ? + + # using global variable since `jaxlib.xla_extension.Device` is not serializable neither + # with `pickle` nor with `dill`, so we need to use a global variable instead + global DEVICE_MAPPING + if DEVICE_MAPPING is None: + DEVICE_MAPPING = self._map_devices_to_str() + + with jax.default_device(DEVICE_MAPPING[self.device]): + # calling jnp.array on a np.ndarray does copy the data + # see https://github.com/google/jax/issues/4486 + return jnp.array(value, **{**default_dtype, **self.jnp_array_kwargs}) + + def _recursive_tensorize(self, data_struct): + import jax + + # support for torch, tf, jax etc. + if config.TORCH_AVAILABLE and "torch" in sys.modules: + import torch + + if isinstance(data_struct, torch.Tensor): + return self._tensorize(data_struct.detach().cpu().numpy()[()]) + if hasattr(data_struct, "__array__") and not isinstance(data_struct, jax.Array): + data_struct = data_struct.__array__() + # support for nested types like struct of list of struct + if isinstance(data_struct, np.ndarray): + if data_struct.dtype == object: # jax arrays cannot be instantied from an array of objects + return self._consolidate([self.recursive_tensorize(substruct) for substruct in data_struct]) + elif isinstance(data_struct, (list, tuple)): + return self._consolidate([self.recursive_tensorize(substruct) for substruct in data_struct]) + return self._tensorize(data_struct) + + def recursive_tensorize(self, data_struct: dict): + return map_nested(self._recursive_tensorize, data_struct, map_list=False) + + def format_row(self, pa_table: pa.Table) -> Mapping: + row = self.numpy_arrow_extractor().extract_row(pa_table) + row = self.python_features_decoder.decode_row(row) + return self.recursive_tensorize(row) + + def format_column(self, pa_table: pa.Table) -> "jax.Array": + column = self.numpy_arrow_extractor().extract_column(pa_table) + column = self.python_features_decoder.decode_column(column, pa_table.column_names[0]) + column = self.recursive_tensorize(column) + column = self._consolidate(column) + return column + + def format_batch(self, pa_table: pa.Table) -> Mapping: + batch = self.numpy_arrow_extractor().extract_batch(pa_table) + batch = self.python_features_decoder.decode_batch(batch) + batch = self.recursive_tensorize(batch) + for column_name in batch: + batch[column_name] = self._consolidate(batch[column_name]) + return batch diff --git a/src/datasets/formatting/np_formatter.py b/src/datasets/formatting/np_formatter.py new file mode 100644 index 0000000..eee14a3 --- /dev/null +++ b/src/datasets/formatting/np_formatter.py @@ -0,0 +1,120 @@ +# Copyright 2020 The HuggingFace Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys +from collections.abc import Mapping + +import numpy as np +import pyarrow as pa + +from .. import config +from ..utils.py_utils import map_nested +from .formatting import TensorFormatter + + +class NumpyFormatter(TensorFormatter[Mapping, np.ndarray, Mapping]): + def __init__(self, features=None, token_per_repo_id=None, **np_array_kwargs): + super().__init__(features=features, token_per_repo_id=token_per_repo_id) + self.np_array_kwargs = np_array_kwargs + + def _consolidate(self, column): + if isinstance(column, list): + if column and all( + isinstance(x, np.ndarray) and x.shape == column[0].shape and x.dtype == column[0].dtype for x in column + ): + return np.stack(column) + else: + # don't use np.array(column, dtype=object) + # since it fails in certain cases + # see https://stackoverflow.com/q/51005699 + out = np.empty(len(column), dtype=object) + out[:] = column + return out + return column + + def _tensorize(self, value): + if isinstance(value, (str, bytes, type(None))): + return value + elif isinstance(value, (np.character, np.ndarray)) and np.issubdtype(value.dtype, np.character): + return value + elif isinstance(value, np.number): + return value + + default_dtype = {} + + if isinstance(value, np.ndarray) and np.issubdtype(value.dtype, np.integer): + default_dtype = {"dtype": np.int64} + elif isinstance(value, np.ndarray) and np.issubdtype(value.dtype, np.floating): + default_dtype = {"dtype": np.float32} + + if config.PIL_AVAILABLE and "PIL" in sys.modules: + import PIL.Image + + if isinstance(value, PIL.Image.Image): + return np.asarray(value, **self.np_array_kwargs) + if config.TORCHVISION_AVAILABLE and "torchvision" in sys.modules: + try: + from torchvision.io import VideoReader + + if isinstance(value, VideoReader): + return value # TODO(QL): set output to np arrays ? + except ImportError: + pass + if config.TORCHCODEC_AVAILABLE and "torchcodec" in sys.modules: + from torchcodec.decoders import AudioDecoder, VideoDecoder + + if isinstance(value, (VideoDecoder, AudioDecoder)): + return value # TODO(QL): set output to np arrays ? + + return np.asarray(value, **{**default_dtype, **self.np_array_kwargs}) + + def _recursive_tensorize(self, data_struct): + # support for torch, tf, jax etc. + if config.TORCH_AVAILABLE and "torch" in sys.modules: + import torch + + if isinstance(data_struct, torch.Tensor): + return self._tensorize(data_struct.detach().cpu().numpy()[()]) + if hasattr(data_struct, "__array__") and not isinstance(data_struct, (np.ndarray, np.character, np.number)): + data_struct = data_struct.__array__() + # support for nested types like struct of list of struct + if isinstance(data_struct, np.ndarray): + if data_struct.dtype == object: + return self._consolidate([self.recursive_tensorize(substruct) for substruct in data_struct]) + if isinstance(data_struct, (list, tuple)): + return self._consolidate([self.recursive_tensorize(substruct) for substruct in data_struct]) + return self._tensorize(data_struct) + + def recursive_tensorize(self, data_struct: dict): + return map_nested(self._recursive_tensorize, data_struct, map_list=False) + + def format_row(self, pa_table: pa.Table) -> Mapping: + row = self.numpy_arrow_extractor().extract_row(pa_table) + row = self.python_features_decoder.decode_row(row) + return self.recursive_tensorize(row) + + def format_column(self, pa_table: pa.Table) -> np.ndarray: + column = self.numpy_arrow_extractor().extract_column(pa_table) + column = self.python_features_decoder.decode_column(column, pa_table.column_names[0]) + column = self.recursive_tensorize(column) + column = self._consolidate(column) + return column + + def format_batch(self, pa_table: pa.Table) -> Mapping: + batch = self.numpy_arrow_extractor().extract_batch(pa_table) + batch = self.python_features_decoder.decode_batch(batch) + batch = self.recursive_tensorize(batch) + for column_name in batch: + batch[column_name] = self._consolidate(batch[column_name]) + return batch diff --git a/src/datasets/formatting/polars_formatter.py b/src/datasets/formatting/polars_formatter.py new file mode 100644 index 0000000..7ea2f78 --- /dev/null +++ b/src/datasets/formatting/polars_formatter.py @@ -0,0 +1,124 @@ +# Copyright 2020 The HuggingFace Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys +from functools import partial +from typing import TYPE_CHECKING, Optional + +import pyarrow as pa + +from .. import config +from ..features import Features +from ..features.features import decode_nested_example +from ..utils.py_utils import no_op_if_value_is_null +from .formatting import BaseArrowExtractor, TableFormatter + + +if TYPE_CHECKING: + import polars as pl + + +class PolarsArrowExtractor(BaseArrowExtractor["pl.DataFrame", "pl.Series", "pl.DataFrame"]): + def extract_row(self, pa_table: pa.Table) -> "pl.DataFrame": + if config.POLARS_AVAILABLE: + if "polars" not in sys.modules: + import polars + else: + polars = sys.modules["polars"] + + return polars.from_arrow(pa_table.slice(length=1)) + else: + raise ValueError("Polars needs to be installed to be able to return Polars dataframes.") + + def extract_column(self, pa_table: pa.Table) -> "pl.Series": + if config.POLARS_AVAILABLE: + if "polars" not in sys.modules: + import polars + else: + polars = sys.modules["polars"] + + return polars.from_arrow(pa_table.select([0]))[pa_table.column_names[0]] + else: + raise ValueError("Polars needs to be installed to be able to return Polars dataframes.") + + def extract_batch(self, pa_table: pa.Table) -> "pl.DataFrame": + if config.POLARS_AVAILABLE: + if "polars" not in sys.modules: + import polars + else: + polars = sys.modules["polars"] + + return polars.from_arrow(pa_table) + else: + raise ValueError("Polars needs to be installed to be able to return Polars dataframes.") + + +class PolarsFeaturesDecoder: + def __init__(self, features: Optional[Features]): + self.features = features + import polars as pl # noqa: F401 - import pl at initialization + + def decode_row(self, row: "pl.DataFrame") -> "pl.DataFrame": + decode = ( + { + column_name: no_op_if_value_is_null(partial(decode_nested_example, feature)) + for column_name, feature in self.features.items() + if self.features._column_requires_decoding[column_name] + } + if self.features + else {} + ) + if decode: + row[list(decode.keys())] = row.map_rows(decode) + return row + + def decode_column(self, column: "pl.Series", column_name: str) -> "pl.Series": + decode = ( + no_op_if_value_is_null(partial(decode_nested_example, self.features[column_name])) + if self.features and column_name in self.features and self.features._column_requires_decoding[column_name] + else None + ) + if decode: + column = column.map_elements(decode) + return column + + def decode_batch(self, batch: "pl.DataFrame") -> "pl.DataFrame": + return self.decode_row(batch) + + +class PolarsFormatter(TableFormatter["pl.DataFrame", "pl.Series", "pl.DataFrame"]): + table_type = "polars dataframe" + column_type = "polars series" + + def __init__(self, features=None, **np_array_kwargs): + super().__init__(features=features) + self.np_array_kwargs = np_array_kwargs + self.polars_arrow_extractor = PolarsArrowExtractor + self.polars_features_decoder = PolarsFeaturesDecoder(features) + import polars as pl # noqa: F401 - import pl at initialization + + def format_row(self, pa_table: pa.Table) -> "pl.DataFrame": + row = self.polars_arrow_extractor().extract_row(pa_table) + row = self.polars_features_decoder.decode_row(row) + return row + + def format_column(self, pa_table: pa.Table) -> "pl.Series": + column = self.polars_arrow_extractor().extract_column(pa_table) + column = self.polars_features_decoder.decode_column(column, pa_table.column_names[0]) + return column + + def format_batch(self, pa_table: pa.Table) -> "pl.DataFrame": + row = self.polars_arrow_extractor().extract_batch(pa_table) + row = self.polars_features_decoder.decode_batch(row) + return row diff --git a/src/datasets/formatting/tf_formatter.py b/src/datasets/formatting/tf_formatter.py new file mode 100644 index 0000000..028b998 --- /dev/null +++ b/src/datasets/formatting/tf_formatter.py @@ -0,0 +1,129 @@ +# Copyright 2020 The HuggingFace Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +import sys +from collections.abc import Mapping +from typing import TYPE_CHECKING + +import numpy as np +import pyarrow as pa + +from .. import config +from ..utils.py_utils import map_nested +from .formatting import TensorFormatter + + +if TYPE_CHECKING: + import tensorflow as tf + + +class TFFormatter(TensorFormatter[Mapping, "tf.Tensor", Mapping]): + def __init__(self, features=None, token_per_repo_id=None, **tf_tensor_kwargs): + super().__init__(features=features, token_per_repo_id=token_per_repo_id) + self.tf_tensor_kwargs = tf_tensor_kwargs + import tensorflow as tf # noqa: F401 - import tf at initialization + + def _consolidate(self, column): + import tensorflow as tf + + if isinstance(column, list) and column: + if all( + isinstance(x, tf.Tensor) and x.shape == column[0].shape and x.dtype == column[0].dtype for x in column + ): + return tf.stack(column) + elif all( + isinstance(x, (tf.Tensor, tf.RaggedTensor)) and x.ndim == 1 and x.dtype == column[0].dtype + for x in column + ): + # only rag 1-D tensors, otherwise some dimensions become ragged even though they were consolidated + return tf.ragged.stack(column) + + return column + + def _tensorize(self, value): + import tensorflow as tf + + if value is None: + return value + + default_dtype = {} + + if isinstance(value, (np.number, np.ndarray)) and np.issubdtype(value.dtype, np.integer): + default_dtype = {"dtype": tf.int64} + elif isinstance(value, (np.number, np.ndarray)) and np.issubdtype(value.dtype, np.floating): + default_dtype = {"dtype": tf.float32} + + if config.PIL_AVAILABLE and "PIL" in sys.modules: + import PIL.Image + + if isinstance(value, PIL.Image.Image): + value = np.asarray(value) + if config.TORCHVISION_AVAILABLE and "torchvision" in sys.modules: + try: + from torchvision.io import VideoReader + + if isinstance(value, VideoReader): + return value # TODO(QL): set output to tf tensors ? + except ImportError: + pass + if config.TORCHCODEC_AVAILABLE and "torchcodec" in sys.modules: + from torchcodec.decoders import AudioDecoder, VideoDecoder + + if isinstance(value, (VideoDecoder, AudioDecoder)): + return value # TODO(QL): set output to jax arrays ? + + return tf.convert_to_tensor(value, **{**default_dtype, **self.tf_tensor_kwargs}) + + def _recursive_tensorize(self, data_struct): + import tensorflow as tf + + # support for torch, tf, jax etc. + if config.TORCH_AVAILABLE and "torch" in sys.modules: + import torch + + if isinstance(data_struct, torch.Tensor): + return self._tensorize(data_struct.detach().cpu().numpy()[()]) + if hasattr(data_struct, "__array__") and not isinstance(data_struct, tf.Tensor): + data_struct = data_struct.__array__() + # support for nested types like struct of list of struct + if isinstance(data_struct, np.ndarray): + if data_struct.dtype == object: # tf tensors cannot be instantied from an array of objects + return self._consolidate([self.recursive_tensorize(substruct) for substruct in data_struct]) + elif isinstance(data_struct, (list, tuple)): + return self._consolidate([self.recursive_tensorize(substruct) for substruct in data_struct]) + return self._tensorize(data_struct) + + def recursive_tensorize(self, data_struct: dict): + return map_nested(self._recursive_tensorize, data_struct, map_list=False) + + def format_row(self, pa_table: pa.Table) -> Mapping: + row = self.numpy_arrow_extractor().extract_row(pa_table) + row = self.python_features_decoder.decode_row(row) + return self.recursive_tensorize(row) + + def format_column(self, pa_table: pa.Table) -> "tf.Tensor": + column = self.numpy_arrow_extractor().extract_column(pa_table) + column = self.python_features_decoder.decode_column(column, pa_table.column_names[0]) + column = self.recursive_tensorize(column) + column = self._consolidate(column) + return column + + def format_batch(self, pa_table: pa.Table) -> Mapping: + batch = self.numpy_arrow_extractor().extract_batch(pa_table) + batch = self.python_features_decoder.decode_batch(batch) + batch = self.recursive_tensorize(batch) + for column_name in batch: + batch[column_name] = self._consolidate(batch[column_name]) + return batch diff --git a/src/datasets/formatting/torch_formatter.py b/src/datasets/formatting/torch_formatter.py new file mode 100644 index 0000000..a41dac9 --- /dev/null +++ b/src/datasets/formatting/torch_formatter.py @@ -0,0 +1,130 @@ +# Copyright 2020 The HuggingFace Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +import sys +from collections.abc import Mapping +from typing import TYPE_CHECKING + +import numpy as np +import pyarrow as pa + +from .. import config +from ..utils.py_utils import map_nested +from .formatting import TensorFormatter + + +if TYPE_CHECKING: + import torch + + +class TorchFormatter(TensorFormatter[Mapping, "torch.Tensor", Mapping]): + def __init__(self, features=None, token_per_repo_id=None, **torch_tensor_kwargs): + super().__init__(features=features, token_per_repo_id=token_per_repo_id) + self.torch_tensor_kwargs = torch_tensor_kwargs + import torch # noqa import torch at initialization + + def _consolidate(self, column): + import torch + + if isinstance(column, list) and column: + if all( + isinstance(x, torch.Tensor) and x.shape == column[0].shape and x.dtype == column[0].dtype + for x in column + ): + return torch.stack(column) + return column + + def _tensorize(self, value): + import torch + + if isinstance(value, (str, bytes, type(None))): + return value + elif isinstance(value, (np.character, np.ndarray)) and np.issubdtype(value.dtype, np.character): + return value.tolist() + + default_dtype = {} + + if isinstance(value, (np.number, np.ndarray)) and np.issubdtype(value.dtype, np.integer): + default_dtype = {"dtype": torch.int64} + + # Convert dtype to np.int64 if it's either np.uint16 or np.uint32 to ensure compatibility. + # np.uint64 is excluded from this conversion as there is no compatible PyTorch dtype that can handle it without loss. + if value.dtype in [np.uint16, np.uint32]: + value = value.astype(np.int64) + + elif isinstance(value, (np.number, np.ndarray)) and np.issubdtype(value.dtype, np.floating): + default_dtype = {"dtype": torch.float32} + + if config.PIL_AVAILABLE and "PIL" in sys.modules: + import PIL.Image + + if isinstance(value, PIL.Image.Image): + value = np.asarray(value) + if value.ndim == 2: + value = value[:, :, np.newaxis] + + value = value.transpose((2, 0, 1)) + if config.TORCHVISION_AVAILABLE and "torchvision" in sys.modules: + try: + from torchvision.io import VideoReader + + if isinstance(value, VideoReader): + return value # TODO(QL): set output to torch tensors ? + except ImportError: + pass + if config.TORCHCODEC_AVAILABLE and "torchcodec" in sys.modules: + from torchcodec.decoders import AudioDecoder, VideoDecoder + + if isinstance(value, (VideoDecoder, AudioDecoder)): + return value # TODO(QL): set output to jax arrays ? + + return torch.tensor(value, **{**default_dtype, **self.torch_tensor_kwargs}) + + def _recursive_tensorize(self, data_struct): + import torch + + # support for torch, tf, jax etc. + if hasattr(data_struct, "__array__") and not isinstance(data_struct, torch.Tensor): + data_struct = data_struct.__array__() + # support for nested types like struct of list of struct + if isinstance(data_struct, np.ndarray): + if data_struct.dtype == object: # torch tensors cannot be instantied from an array of objects + return self._consolidate([self.recursive_tensorize(substruct) for substruct in data_struct]) + elif isinstance(data_struct, (list, tuple)): + return self._consolidate([self.recursive_tensorize(substruct) for substruct in data_struct]) + return self._tensorize(data_struct) + + def recursive_tensorize(self, data_struct: dict): + return map_nested(self._recursive_tensorize, data_struct, map_list=False) + + def format_row(self, pa_table: pa.Table) -> Mapping: + row = self.numpy_arrow_extractor().extract_row(pa_table) + row = self.python_features_decoder.decode_row(row) + return self.recursive_tensorize(row) + + def format_column(self, pa_table: pa.Table) -> "torch.Tensor": + column = self.numpy_arrow_extractor().extract_column(pa_table) + column = self.python_features_decoder.decode_column(column, pa_table.column_names[0]) + column = self.recursive_tensorize(column) + column = self._consolidate(column) + return column + + def format_batch(self, pa_table: pa.Table) -> Mapping: + batch = self.numpy_arrow_extractor().extract_batch(pa_table) + batch = self.python_features_decoder.decode_batch(batch) + batch = self.recursive_tensorize(batch) + for column_name in batch: + batch[column_name] = self._consolidate(batch[column_name]) + return batch diff --git a/src/datasets/hub.py b/src/datasets/hub.py new file mode 100644 index 0000000..fd64e04 --- /dev/null +++ b/src/datasets/hub.py @@ -0,0 +1,135 @@ +from itertools import chain +from typing import Optional, Union + +from huggingface_hub import ( + CommitInfo, + CommitOperationAdd, + CommitOperationDelete, + DatasetCard, + DatasetCardData, + HfApi, + HfFileSystem, +) + +import datasets.config +from datasets import __version__ +from datasets.info import DatasetInfosDict +from datasets.load import load_dataset_builder +from datasets.utils.metadata import MetadataConfigs + + +def delete_from_hub( + repo_id: str, + config_name: str, + revision: Optional[str] = None, + token: Optional[Union[bool, str]] = None, +) -> CommitInfo: + """Delete a dataset configuration from a [data-only dataset](repository_structure) on the Hub. + + Args: + repo_id (`str`): ID of the Hub dataset repository, in the following format: `/` or + `/`. + config_name (`str`): Name of the dataset configuration. + revision (`str`, *optional*): Branch to delete the configuration from. Defaults to the `"main"` branch. + token (`bool` or `str`, *optional*): Authentication token for the Hugging Face Hub. + + Returns: + `huggingface_hub.CommitInfo` + """ + operations = [] + # data_files + fs = HfFileSystem(endpoint=datasets.config.HF_ENDPOINT, token=token) + builder = load_dataset_builder(repo_id, config_name, revision=revision, token=token) + for data_file in chain(*builder.config.data_files.values()): + data_file_resolved_path = fs.resolve_path(data_file) + if data_file_resolved_path.repo_id == repo_id: + operations.append(CommitOperationDelete(path_in_repo=data_file_resolved_path.path_in_repo)) + # README.md + dataset_card = DatasetCard.load(repo_id) + # config_names + if dataset_card.data.get("config_names", None) and config_name in dataset_card.data["config_names"]: + dataset_card.data["config_names"].remove(config_name) + # metadata_configs + metadata_configs = MetadataConfigs.from_dataset_card_data(dataset_card.data) + if metadata_configs: + _ = metadata_configs.pop(config_name, None) + dataset_card_data = DatasetCardData() + metadata_configs.to_dataset_card_data(dataset_card_data) + if datasets.config.METADATA_CONFIGS_FIELD in dataset_card_data: + dataset_card.data[datasets.config.METADATA_CONFIGS_FIELD] = dataset_card_data[ + datasets.config.METADATA_CONFIGS_FIELD + ] + else: + _ = dataset_card.data.pop(datasets.config.METADATA_CONFIGS_FIELD, None) + # dataset_info + dataset_infos: DatasetInfosDict = DatasetInfosDict.from_dataset_card_data(dataset_card.data) + if dataset_infos: + _ = dataset_infos.pop(config_name, None) + dataset_card_data = DatasetCardData() + dataset_infos.to_dataset_card_data(dataset_card_data) + if "dataset_info" in dataset_card_data: + dataset_card.data["dataset_info"] = dataset_card_data["dataset_info"] + else: + _ = dataset_card.data.pop("dataset_info", None) + # Commit + operations.append( + CommitOperationAdd(path_in_repo=datasets.config.REPOCARD_FILENAME, path_or_fileobj=str(dataset_card).encode()) + ) + api = HfApi( + endpoint=datasets.config.HF_ENDPOINT, + token=token, + library_name="datasets", + library_version=__version__, + ) + commit_info = api.create_commit( + repo_id, + operations=operations, + commit_message=f"Delete '{config_name}' config", + commit_description=f"Delete '{config_name}' config.", + token=token, + repo_type="dataset", + revision=revision, + create_pr=True, + ) + print(f"You can find your PR to delete the dataset config at: {commit_info.pr_url}") + return commit_info + + +def _delete_files(dataset_id, revision=None, token=None): + hf_api = HfApi( + endpoint=datasets.config.HF_ENDPOINT, + token=token, + library_name="datasets", + library_version=__version__, + ) + repo_files = hf_api.list_repo_files( + dataset_id, + repo_type="dataset", + ) + if repo_files: + legacy_json_file = [] + data_files = [] + for filename in repo_files: + if filename in {".gitattributes", "README.md"}: + continue + elif filename == "dataset_infos.json": + legacy_json_file.append(filename) + else: + data_files.append(filename) + if legacy_json_file: + hf_api.delete_file( + "dataset_infos.json", + dataset_id, + repo_type="dataset", + revision=revision, + commit_message="Delete legacy dataset_infos.json", + ) + if data_files: + for filename in data_files: + hf_api.delete_file( + filename, + dataset_id, + repo_type="dataset", + revision=revision, + commit_message="Delete data file", + ) diff --git a/src/datasets/info.py b/src/datasets/info.py new file mode 100644 index 0000000..13fd972 --- /dev/null +++ b/src/datasets/info.py @@ -0,0 +1,440 @@ +# Copyright 2020 The HuggingFace Datasets Authors and the TensorFlow Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""DatasetInfo record information we know about a dataset. + +This includes things that we know about the dataset statically, i.e.: + - description + - canonical location + - does it have validation and tests splits + - size + - etc. + +This also includes the things that can and should be computed once we've +processed the dataset as well: + - number of examples (in each split) + - etc. +""" + +import copy +import dataclasses +import json +import os +import posixpath +from dataclasses import dataclass +from pathlib import Path +from typing import ClassVar, Optional, Union + +import fsspec +from fsspec.core import url_to_fs +from huggingface_hub import DatasetCard, DatasetCardData + +from . import config +from .features import Features +from .splits import SplitDict +from .utils import Version +from .utils.logging import get_logger +from .utils.py_utils import asdict, unique_values + + +logger = get_logger(__name__) + + +@dataclass +class SupervisedKeysData: + input: str = "" + output: str = "" + + +@dataclass +class DownloadChecksumsEntryData: + key: str = "" + value: str = "" + + +class MissingCachedSizesConfigError(Exception): + """The expected cached sizes of the download file are missing.""" + + +class NonMatchingCachedSizesError(Exception): + """The prepared split doesn't have expected sizes.""" + + +@dataclass +class PostProcessedInfo: + features: Optional[Features] = None + resources_checksums: Optional[dict] = None + + def __post_init__(self): + # Convert back to the correct classes when we reload from dict + if self.features is not None and not isinstance(self.features, Features): + self.features = Features.from_dict(self.features) + + @classmethod + def from_dict(cls, post_processed_info_dict: dict) -> "PostProcessedInfo": + field_names = {f.name for f in dataclasses.fields(cls)} + return cls(**{k: v for k, v in post_processed_info_dict.items() if k in field_names}) + + +@dataclass +class DatasetInfo: + """Information about a dataset. + + `DatasetInfo` documents datasets, including its name, version, and features. + See the constructor arguments and properties for a full list. + + Not all fields are known on construction and may be updated later. + + Attributes: + description (`str`): + A description of the dataset. + citation (`str`): + A BibTeX citation of the dataset. + homepage (`str`): + A URL to the official homepage for the dataset. + license (`str`): + The dataset's license. It can be the name of the license or a paragraph containing the terms of the license. + features ([`Features`], *optional*): + The features used to specify the dataset's column types. + post_processed (`PostProcessedInfo`, *optional*): + Deprecated. Information regarding the resources of a possible post-processing of a dataset. For example, it can contain the information of an index. + supervised_keys (`SupervisedKeysData`, *optional*): + Specifies the input feature and the label for supervised learning if applicable for the dataset (legacy from TFDS). + builder_name (`str`, *optional*): + The name of the `GeneratorBasedBuilder` subclass used to create the dataset. It is also the snake_case version of the dataset builder class name. + config_name (`str`, *optional*): + The name of the configuration derived from [`BuilderConfig`]. + version (`str` or [`Version`], *optional*): + The version of the dataset. + splits (`dict`, *optional*): + The mapping between split name and metadata. + download_checksums (`dict`, *optional*): + The mapping between the URL to download the dataset's checksums and corresponding metadata. + download_size (`int`, *optional*): + The size of the files to download to generate the dataset, in bytes. + post_processing_size (`int`, *optional*): + Deprecated. Size of the dataset in bytes after post-processing, if any. + dataset_size (`int`, *optional*): + The combined size in bytes of the Arrow tables for all splits. + size_in_bytes (`int`, *optional*): + The combined size in bytes of all files associated with the dataset (downloaded files + Arrow files). + **config_kwargs (additional keyword arguments): + Keyword arguments to be passed to the [`BuilderConfig`] and used in the [`DatasetBuilder`]. + """ + + # Set in the dataset builders + description: str = dataclasses.field(default_factory=str) + citation: str = dataclasses.field(default_factory=str) + homepage: str = dataclasses.field(default_factory=str) + license: str = dataclasses.field(default_factory=str) + features: Optional[Features] = None + post_processed: Optional[PostProcessedInfo] = None # kept for bawkard compat + supervised_keys: Optional[SupervisedKeysData] = None + + # Set later by the builder + builder_name: Optional[str] = None + dataset_name: Optional[str] = None # for packaged builders, to be different from builder_name + config_name: Optional[str] = None + version: Optional[Union[str, Version]] = None + # Set later by `download_and_prepare` + splits: Optional[SplitDict] = None + download_checksums: Optional[dict] = None + download_size: Optional[int] = None + post_processing_size: Optional[int] = None + dataset_size: Optional[int] = None + size_in_bytes: Optional[int] = None + + _INCLUDED_INFO_IN_YAML: ClassVar[list[str]] = [ + "config_name", + "download_size", + "dataset_size", + "features", + "splits", + ] + + def __post_init__(self): + # Convert back to the correct classes when we reload from dict + if self.features is not None and not isinstance(self.features, Features): + self.features = Features.from_dict(self.features) + if self.post_processed is not None and not isinstance(self.post_processed, PostProcessedInfo): + self.post_processed = PostProcessedInfo.from_dict(self.post_processed) + if self.version is not None and not isinstance(self.version, Version): + if isinstance(self.version, str): + self.version = Version(self.version) + else: + self.version = Version.from_dict(self.version) + if self.splits is not None and not isinstance(self.splits, SplitDict): + self.splits = SplitDict.from_split_dict(self.splits) + if self.supervised_keys is not None and not isinstance(self.supervised_keys, SupervisedKeysData): + if isinstance(self.supervised_keys, (tuple, list)): + self.supervised_keys = SupervisedKeysData(*self.supervised_keys) + else: + self.supervised_keys = SupervisedKeysData(**self.supervised_keys) + + def write_to_directory(self, dataset_info_dir, pretty_print=False, storage_options: Optional[dict] = None): + """Write `DatasetInfo` and license (if present) as JSON files to `dataset_info_dir`. + + Args: + dataset_info_dir (`str`): + Destination directory. + pretty_print (`bool`, defaults to `False`): + If `True`, the JSON will be pretty-printed with the indent level of 4. + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the file-system backend, if any. + + + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds.info.write_to_directory("/path/to/directory/") + ``` + """ + fs: fsspec.AbstractFileSystem + fs, *_ = url_to_fs(dataset_info_dir, **(storage_options or {})) + with fs.open(posixpath.join(dataset_info_dir, config.DATASET_INFO_FILENAME), "wb") as f: + self._dump_info(f, pretty_print=pretty_print) + if self.license: + with fs.open(posixpath.join(dataset_info_dir, config.LICENSE_FILENAME), "wb") as f: + self._dump_license(f) + + def _dump_info(self, file, pretty_print=False): + """Dump info in `file` file-like object open in bytes mode (to support remote files)""" + file.write(json.dumps(asdict(self), indent=4 if pretty_print else None).encode("utf-8")) + + def _dump_license(self, file): + """Dump license in `file` file-like object open in bytes mode (to support remote files)""" + file.write(self.license.encode("utf-8")) + + @classmethod + def from_merge(cls, dataset_infos: list["DatasetInfo"]): + dataset_infos = [dset_info.copy() for dset_info in dataset_infos if dset_info is not None] + + if len(dataset_infos) > 0 and all(dataset_infos[0] == dset_info for dset_info in dataset_infos): + # if all dataset_infos are equal we don't need to merge. Just return the first. + return dataset_infos[0] + + description = "\n\n".join(unique_values(info.description for info in dataset_infos)).strip() + citation = "\n\n".join(unique_values(info.citation for info in dataset_infos)).strip() + homepage = "\n\n".join(unique_values(info.homepage for info in dataset_infos)).strip() + license = "\n\n".join(unique_values(info.license for info in dataset_infos)).strip() + features = None + supervised_keys = None + + return cls( + description=description, + citation=citation, + homepage=homepage, + license=license, + features=features, + supervised_keys=supervised_keys, + ) + + @classmethod + def from_directory(cls, dataset_info_dir: str, storage_options: Optional[dict] = None) -> "DatasetInfo": + """Create [`DatasetInfo`] from the JSON file in `dataset_info_dir`. + + This function updates all the dynamically generated fields (num_examples, + hash, time of creation,...) of the [`DatasetInfo`]. + + This will overwrite all previous metadata. + + Args: + dataset_info_dir (`str`): + The directory containing the metadata file. This + should be the root directory of a specific dataset version. + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the file-system backend, if any. + + + + Example: + + ```py + >>> from datasets import DatasetInfo + >>> ds_info = DatasetInfo.from_directory("/path/to/directory/") + ``` + """ + fs: fsspec.AbstractFileSystem + fs, *_ = url_to_fs(dataset_info_dir, **(storage_options or {})) + logger.debug(f"Loading Dataset info from {dataset_info_dir}") + if not dataset_info_dir: + raise ValueError("Calling DatasetInfo.from_directory() with undefined dataset_info_dir.") + with fs.open(posixpath.join(dataset_info_dir, config.DATASET_INFO_FILENAME), "r", encoding="utf-8") as f: + dataset_info_dict = json.load(f) + return cls.from_dict(dataset_info_dict) + + @classmethod + def from_dict(cls, dataset_info_dict: dict) -> "DatasetInfo": + field_names = {f.name for f in dataclasses.fields(cls)} + return cls(**{k: v for k, v in dataset_info_dict.items() if k in field_names}) + + def update(self, other_dataset_info: "DatasetInfo", ignore_none=True): + self_dict = self.__dict__ + self_dict.update( + **{ + k: copy.deepcopy(v) + for k, v in other_dataset_info.__dict__.items() + if (v is not None or not ignore_none) + } + ) + + def copy(self) -> "DatasetInfo": + return self.__class__(**{k: copy.deepcopy(v) for k, v in self.__dict__.items()}) + + def _to_yaml_dict(self) -> dict: + yaml_dict = {} + dataset_info_dict = asdict(self) + for key in dataset_info_dict: + if key in self._INCLUDED_INFO_IN_YAML: + value = getattr(self, key) + if hasattr(value, "_to_yaml_list"): # Features, SplitDict + yaml_dict[key] = value._to_yaml_list() + elif hasattr(value, "_to_yaml_string"): # Version + yaml_dict[key] = value._to_yaml_string() + else: + yaml_dict[key] = value + return yaml_dict + + @classmethod + def _from_yaml_dict(cls, yaml_data: dict) -> "DatasetInfo": + yaml_data = copy.deepcopy(yaml_data) + if yaml_data.get("features") is not None: + yaml_data["features"] = Features._from_yaml_list(yaml_data["features"]) + if yaml_data.get("splits") is not None: + yaml_data["splits"] = SplitDict._from_yaml_list(yaml_data["splits"]) + field_names = {f.name for f in dataclasses.fields(cls)} + return cls(**{k: v for k, v in yaml_data.items() if k in field_names}) + + def __repr__(self): + return ( + self.__class__.__qualname__ + + "(" + + ", ".join( + [f"{f.name}={repr(getattr(self, f.name))}" for f in dataclasses.fields(self) if getattr(self, f.name)] + ) + + ")" + ) + + +class DatasetInfosDict(dict[str, DatasetInfo]): + def write_to_directory(self, dataset_infos_dir, overwrite=False, pretty_print=False) -> None: + total_dataset_infos = {} + dataset_infos_path = os.path.join(dataset_infos_dir, config.DATASETDICT_INFOS_FILENAME) + dataset_readme_path = os.path.join(dataset_infos_dir, config.REPOCARD_FILENAME) + if not overwrite: + total_dataset_infos = self.from_directory(dataset_infos_dir) + total_dataset_infos.update(self) + if os.path.exists(dataset_infos_path): + # for backward compatibility, let's update the JSON file if it exists + with open(dataset_infos_path, "w", encoding="utf-8") as f: + dataset_infos_dict = { + config_name: asdict(dset_info) for config_name, dset_info in total_dataset_infos.items() + } + json.dump(dataset_infos_dict, f, indent=4 if pretty_print else None) + # Dump the infos in the YAML part of the README.md file + if os.path.exists(dataset_readme_path): + dataset_card = DatasetCard.load(dataset_readme_path) + dataset_card_data = dataset_card.data + else: + dataset_card = None + dataset_card_data = DatasetCardData() + if total_dataset_infos: + total_dataset_infos.to_dataset_card_data(dataset_card_data) + dataset_card = ( + DatasetCard("---\n" + str(dataset_card_data) + "\n---\n") if dataset_card is None else dataset_card + ) + dataset_card.save(Path(dataset_readme_path)) + + @classmethod + def from_directory(cls, dataset_infos_dir) -> "DatasetInfosDict": + logger.debug(f"Loading Dataset Infos from {dataset_infos_dir}") + # Load the info from the YAML part of README.md + if os.path.exists(os.path.join(dataset_infos_dir, config.REPOCARD_FILENAME)): + dataset_card_data = DatasetCard.load(Path(dataset_infos_dir) / config.REPOCARD_FILENAME).data + if "dataset_info" in dataset_card_data: + return cls.from_dataset_card_data(dataset_card_data) + if os.path.exists(os.path.join(dataset_infos_dir, config.DATASETDICT_INFOS_FILENAME)): + # this is just to have backward compatibility with dataset_infos.json files + with open(os.path.join(dataset_infos_dir, config.DATASETDICT_INFOS_FILENAME), encoding="utf-8") as f: + return cls( + { + config_name: DatasetInfo.from_dict(dataset_info_dict) + for config_name, dataset_info_dict in json.load(f).items() + } + ) + else: + return cls() + + @classmethod + def from_dataset_card_data(cls, dataset_card_data: DatasetCardData) -> "DatasetInfosDict": + if isinstance(dataset_card_data.get("dataset_info"), (list, dict)): + if isinstance(dataset_card_data["dataset_info"], list): + return cls( + { + dataset_info_yaml_dict.get("config_name", "default"): DatasetInfo._from_yaml_dict( + dataset_info_yaml_dict + ) + for dataset_info_yaml_dict in dataset_card_data["dataset_info"] + } + ) + else: + dataset_info = DatasetInfo._from_yaml_dict(dataset_card_data["dataset_info"]) + dataset_info.config_name = dataset_card_data["dataset_info"].get("config_name", "default") + return cls({dataset_info.config_name: dataset_info}) + else: + return cls() + + def to_dataset_card_data(self, dataset_card_data: DatasetCardData) -> None: + if self: + # first get existing metadata info + if "dataset_info" in dataset_card_data and isinstance(dataset_card_data["dataset_info"], dict): + dataset_metadata_infos = { + dataset_card_data["dataset_info"].get("config_name", "default"): dataset_card_data["dataset_info"] + } + elif "dataset_info" in dataset_card_data and isinstance(dataset_card_data["dataset_info"], list): + dataset_metadata_infos = { + config_metadata["config_name"]: config_metadata + for config_metadata in dataset_card_data["dataset_info"] + } + else: + dataset_metadata_infos = {} + # update/rewrite existing metadata info with the one to dump + total_dataset_infos = { + **dataset_metadata_infos, + **{config_name: dset_info._to_yaml_dict() for config_name, dset_info in self.items()}, + } + # the config_name from the dataset_infos_dict takes over the config_name of the DatasetInfo + for config_name, dset_info_yaml_dict in total_dataset_infos.items(): + dset_info_yaml_dict["config_name"] = config_name + if len(total_dataset_infos) == 1: + # use a struct instead of a list of configurations, since there's only one + dataset_card_data["dataset_info"] = next(iter(total_dataset_infos.values())) + config_name = dataset_card_data["dataset_info"].pop("config_name", None) + if config_name != "default": + # if config_name is not "default" preserve it and put at the first position + dataset_card_data["dataset_info"] = { + "config_name": config_name, + **dataset_card_data["dataset_info"], + } + else: + dataset_card_data["dataset_info"] = [] + for config_name, dataset_info_yaml_dict in sorted(total_dataset_infos.items()): + # add the config_name field in first position + dataset_info_yaml_dict.pop("config_name", None) + dataset_info_yaml_dict = {"config_name": config_name, **dataset_info_yaml_dict} + dataset_card_data["dataset_info"].append(dataset_info_yaml_dict) diff --git a/src/datasets/inspect.py b/src/datasets/inspect.py new file mode 100644 index 0000000..f07c825 --- /dev/null +++ b/src/datasets/inspect.py @@ -0,0 +1,350 @@ +# Copyright 2020 The HuggingFace Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""List and inspect datasets.""" + +import os +from collections.abc import Mapping, Sequence +from typing import Optional, Union + +from .download.download_config import DownloadConfig +from .download.download_manager import DownloadMode +from .download.streaming_download_manager import StreamingDownloadManager +from .info import DatasetInfo +from .load import ( + dataset_module_factory, + get_dataset_builder_class, + load_dataset_builder, +) +from .utils.logging import get_logger +from .utils.version import Version + + +logger = get_logger(__name__) + + +class SplitsNotFoundError(ValueError): + pass + + +def get_dataset_infos( + path: str, + data_files: Optional[Union[dict, list, str]] = None, + download_config: Optional[DownloadConfig] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + revision: Optional[Union[str, Version]] = None, + token: Optional[Union[bool, str]] = None, + **config_kwargs, +): + """Get the meta information about a dataset, returned as a dict mapping config name to DatasetInfoDict. + + Args: + path (`str`): path to the dataset repository. Can be either: + + - a local path to the dataset directory containing the data files, + e.g. `'./dataset/squad'` + - a dataset identifier on the Hugging Face Hub (list all available datasets and ids with [`huggingface_hub.list_datasets`]), + e.g. `'rajpurkar/squad'`, `'nyu-mll/glue'` or``'openai/webtext'` + revision (`Union[str, datasets.Version]`, *optional*): + If specified, the dataset module will be loaded from the datasets repository at this version. + By default: + - it is set to the local version of the lib. + - it will also try to load it from the main branch if it's not available at the local version of the lib. + Specifying a version that is different from your local version of the lib might cause compatibility issues. + download_config ([`DownloadConfig`], *optional*): + Specific download configuration parameters. + download_mode ([`DownloadMode`] or `str`, defaults to `REUSE_DATASET_IF_EXISTS`): + Download/generate mode. + data_files (`Union[Dict, List, str]`, *optional*): + Defining the data_files of the dataset configuration. + token (`str` or `bool`, *optional*): + Optional string or boolean to use as Bearer token for remote files on the Datasets Hub. + If `True`, or not specified, will get token from `"~/.huggingface"`. + **config_kwargs (additional keyword arguments): + Optional attributes for builder class which will override the attributes if supplied. + + Example: + + ```py + >>> from datasets import get_dataset_infos + >>> get_dataset_infos('cornell-movie-review-data/rotten_tomatoes') + {'default': DatasetInfo(description="Movie Review Dataset.\nThis is a dataset of containing 5,331 positive and 5,331 negative processed\nsentences from Rotten Tomatoes movie reviews...), ...} + ``` + """ + config_names = get_dataset_config_names( + path=path, + revision=revision, + download_config=download_config, + download_mode=download_mode, + data_files=data_files, + token=token, + ) + return { + config_name: get_dataset_config_info( + path=path, + config_name=config_name, + data_files=data_files, + download_config=download_config, + download_mode=download_mode, + revision=revision, + token=token, + **config_kwargs, + ) + for config_name in config_names + } + + +def get_dataset_config_names( + path: str, + revision: Optional[Union[str, Version]] = None, + download_config: Optional[DownloadConfig] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + data_files: Optional[Union[dict, list, str]] = None, + **download_kwargs, +): + """Get the list of available config names for a particular dataset. + + Args: + path (`str`): path to the dataset repository. Can be either: + + - a local path to the dataset directory containing the data files, + e.g. `'./dataset/squad'` + - a dataset identifier on the Hugging Face Hub (list all available datasets and ids with [`huggingface_hub.list_datasets`]), + e.g. `'rajpurkar/squad'`, `'nyu-mll/glue'` or``'openai/webtext'` + revision (`Union[str, datasets.Version]`, *optional*): + If specified, the dataset module will be loaded from the datasets repository at this version. + By default: + - it is set to the local version of the lib. + - it will also try to load it from the main branch if it's not available at the local version of the lib. + Specifying a version that is different from your local version of the lib might cause compatibility issues. + download_config ([`DownloadConfig`], *optional*): + Specific download configuration parameters. + download_mode ([`DownloadMode`] or `str`, defaults to `REUSE_DATASET_IF_EXISTS`): + Download/generate mode. + data_files (`Union[Dict, List, str]`, *optional*): + Defining the data_files of the dataset configuration. + **download_kwargs (additional keyword arguments): + Optional attributes for [`DownloadConfig`] which will override the attributes in `download_config` if supplied, + for example `token`. + + Example: + + ```py + >>> from datasets import get_dataset_config_names + >>> get_dataset_config_names("nyu-mll/glue") + ['cola', + 'sst2', + 'mrpc', + 'qqp', + 'stsb', + 'mnli', + 'mnli_mismatched', + 'mnli_matched', + 'qnli', + 'rte', + 'wnli', + 'ax'] + ``` + """ + dataset_module = dataset_module_factory( + path, + revision=revision, + download_config=download_config, + download_mode=download_mode, + data_files=data_files, + **download_kwargs, + ) + builder_cls = get_dataset_builder_class(dataset_module, dataset_name=os.path.basename(path)) + return list(builder_cls.builder_configs.keys()) or [ + dataset_module.builder_kwargs.get("config_name", builder_cls.DEFAULT_CONFIG_NAME or "default") + ] + + +def get_dataset_default_config_name( + path: str, + revision: Optional[Union[str, Version]] = None, + download_config: Optional[DownloadConfig] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + data_files: Optional[Union[dict, list, str]] = None, + **download_kwargs, +) -> Optional[str]: + """Get the default config name for a particular dataset. + Can return None only if the dataset has multiple configurations and no default configuration. + + Args: + path (`str`): path to the dataset repository. Can be either: + + - a local path to the dataset directory containing the data files, + e.g. `'./dataset/squad'` + - a dataset identifier on the Hugging Face Hub (list all available datasets and ids with [`huggingface_hub.list_datasets`]), + e.g. `'rajpurkar/squad'`, `'nyu-mll/glue'` or``'openai/webtext'` + revision (`Union[str, datasets.Version]`, *optional*): + If specified, the dataset module will be loaded from the datasets repository at this version. + By default: + - it is set to the local version of the lib. + - it will also try to load it from the main branch if it's not available at the local version of the lib. + Specifying a version that is different from your local version of the lib might cause compatibility issues. + download_config ([`DownloadConfig`], *optional*): + Specific download configuration parameters. + download_mode ([`DownloadMode`] or `str`, defaults to `REUSE_DATASET_IF_EXISTS`): + Download/generate mode. + data_files (`Union[Dict, List, str]`, *optional*): + Defining the data_files of the dataset configuration. + **download_kwargs (additional keyword arguments): + Optional attributes for [`DownloadConfig`] which will override the attributes in `download_config` if supplied, + for example `token`. + + Returns: + Optional[str]: the default config name if there is one + + Example: + + ```py + >>> from datasets import get_dataset_default_config_name + >>> get_dataset_default_config_name("openbookqa") + 'main' + ``` + """ + dataset_module = dataset_module_factory( + path, + revision=revision, + download_config=download_config, + download_mode=download_mode, + data_files=data_files, + **download_kwargs, + ) + builder_cls = get_dataset_builder_class(dataset_module, dataset_name=os.path.basename(path)) + builder_configs = list(builder_cls.builder_configs.keys()) + if builder_configs: + default_config_name = builder_configs[0] if len(builder_configs) == 1 else None + else: + default_config_name = "default" + return builder_cls.DEFAULT_CONFIG_NAME or default_config_name + + +def get_dataset_config_info( + path: str, + config_name: Optional[str] = None, + data_files: Optional[Union[str, Sequence[str], Mapping[str, Union[str, Sequence[str]]]]] = None, + download_config: Optional[DownloadConfig] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + revision: Optional[Union[str, Version]] = None, + token: Optional[Union[bool, str]] = None, + **config_kwargs, +) -> DatasetInfo: + """Get the meta information (DatasetInfo) about a dataset for a particular config + + Args: + path (`str`): path to the dataset repository. Can be either: + + - a local path to the dataset directory containing the data files, + e.g. `'./dataset/squad'` + - a dataset identifier on the Hugging Face Hub (list all available datasets and ids with [`huggingface_hub.list_datasets`]), + e.g. `'rajpurkar/squad'`, `'nyu-mll/glue'` or``'openai/webtext'` + config_name (:obj:`str`, optional): Defining the name of the dataset configuration. + data_files (:obj:`str` or :obj:`Sequence` or :obj:`Mapping`, optional): Path(s) to source data file(s). + download_config (:class:`~download.DownloadConfig`, optional): Specific download configuration parameters. + download_mode (:class:`DownloadMode` or :obj:`str`, default ``REUSE_DATASET_IF_EXISTS``): Download/generate mode. + revision (:class:`~utils.Version` or :obj:`str`, optional): Version of the dataset to load. + As datasets have their own git repository on the Datasets Hub, the default version "main" corresponds to their "main" branch. + You can specify a different version than the default "main" by using a commit SHA or a git tag of the dataset repository. + token (``str`` or :obj:`bool`, optional): Optional string or boolean to use as Bearer token for remote files on the Datasets Hub. + If True, or not specified, will get token from `"~/.huggingface"`. + **config_kwargs (additional keyword arguments): optional attributes for builder class which will override the attributes if supplied. + + """ + builder = load_dataset_builder( + path, + name=config_name, + data_files=data_files, + download_config=download_config, + download_mode=download_mode, + revision=revision, + token=token, + **config_kwargs, + ) + info = builder.info + if info.splits is None: + download_config = download_config.copy() if download_config else DownloadConfig() + if token is not None: + download_config.token = token + try: + info.splits = { + split_generator.name: {"name": split_generator.name, "dataset_name": path} + for split_generator in builder._split_generators( + StreamingDownloadManager(base_path=builder.base_path, download_config=download_config) + ) + } + except Exception as err: + raise SplitsNotFoundError("The split names could not be parsed from the dataset config.") from err + return info + + +def get_dataset_split_names( + path: str, + config_name: Optional[str] = None, + data_files: Optional[Union[str, Sequence[str], Mapping[str, Union[str, Sequence[str]]]]] = None, + download_config: Optional[DownloadConfig] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + revision: Optional[Union[str, Version]] = None, + token: Optional[Union[bool, str]] = None, + **config_kwargs, +): + """Get the list of available splits for a particular config and dataset. + + Args: + path (`str`): path to the dataset repository. Can be either: + + - a local path to the dataset directory containing the data files, + e.g. `'./dataset/squad'` + - a dataset identifier on the Hugging Face Hub (list all available datasets and ids with [`huggingface_hub.list_datasets`]), + e.g. `'rajpurkar/squad'`, `'nyu-mll/glue'` or``'openai/webtext'` + config_name (`str`, *optional*): + Defining the name of the dataset configuration. + data_files (`str` or `Sequence` or `Mapping`, *optional*): + Path(s) to source data file(s). + download_config ([`DownloadConfig`], *optional*): + Specific download configuration parameters. + download_mode ([`DownloadMode`] or `str`, defaults to `REUSE_DATASET_IF_EXISTS`): + Download/generate mode. + revision ([`Version`] or `str`, *optional*): + Version of the dataset to load. + As datasets have their own git repository on the Datasets Hub, the default version "main" corresponds to their "main" branch. + You can specify a different version than the default "main" by using a commit SHA or a git tag of the dataset repository. + token (`str` or `bool`, *optional*): + Optional string or boolean to use as Bearer token for remote files on the Datasets Hub. + If `True`, or not specified, will get token from `"~/.huggingface"`. + **config_kwargs (additional keyword arguments): + Optional attributes for builder class which will override the attributes if supplied. + + Example: + + ```py + >>> from datasets import get_dataset_split_names + >>> get_dataset_split_names('cornell-movie-review-data/rotten_tomatoes') + ['train', 'validation', 'test'] + ``` + """ + info = get_dataset_config_info( + path, + config_name=config_name, + data_files=data_files, + download_config=download_config, + download_mode=download_mode, + revision=revision, + token=token, + **config_kwargs, + ) + return list(info.splits.keys()) diff --git a/src/datasets/io/__init__.py b/src/datasets/io/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/io/abc.py b/src/datasets/io/abc.py new file mode 100644 index 0000000..a1913cc --- /dev/null +++ b/src/datasets/io/abc.py @@ -0,0 +1,53 @@ +from abc import ABC, abstractmethod +from typing import Optional, Union + +from .. import Dataset, DatasetDict, Features, IterableDataset, IterableDatasetDict, NamedSplit +from ..utils.typing import NestedDataStructureLike, PathLike + + +class AbstractDatasetReader(ABC): + def __init__( + self, + path_or_paths: Optional[NestedDataStructureLike[PathLike]] = None, + split: Optional[NamedSplit] = None, + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + streaming: bool = False, + num_proc: Optional[int] = None, + **kwargs, + ): + self.path_or_paths = path_or_paths + self.split = split if split or isinstance(path_or_paths, dict) else "train" + self.features = features + self.cache_dir = cache_dir + self.keep_in_memory = keep_in_memory + self.streaming = streaming + self.num_proc = num_proc + self.kwargs = kwargs + + @abstractmethod + def read(self) -> Union[Dataset, DatasetDict, IterableDataset, IterableDatasetDict]: + pass + + +class AbstractDatasetInputStream(ABC): + def __init__( + self, + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + streaming: bool = False, + num_proc: Optional[int] = None, + **kwargs, + ): + self.features = features + self.cache_dir = cache_dir + self.keep_in_memory = keep_in_memory + self.streaming = streaming + self.num_proc = num_proc + self.kwargs = kwargs + + @abstractmethod + def read(self) -> Union[Dataset, IterableDataset]: + pass diff --git a/src/datasets/io/csv.py b/src/datasets/io/csv.py new file mode 100644 index 0000000..13d87d0 --- /dev/null +++ b/src/datasets/io/csv.py @@ -0,0 +1,143 @@ +import multiprocessing +import os +from typing import BinaryIO, Optional, Union + +import fsspec + +from .. import Dataset, Features, NamedSplit, config +from ..formatting import query_table +from ..packaged_modules.csv.csv import Csv +from ..utils import tqdm as hf_tqdm +from ..utils.typing import NestedDataStructureLike, PathLike +from .abc import AbstractDatasetReader + + +class CsvDatasetReader(AbstractDatasetReader): + def __init__( + self, + path_or_paths: NestedDataStructureLike[PathLike], + split: Optional[NamedSplit] = None, + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + streaming: bool = False, + num_proc: Optional[int] = None, + **kwargs, + ): + super().__init__( + path_or_paths, + split=split, + features=features, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + streaming=streaming, + num_proc=num_proc, + **kwargs, + ) + path_or_paths = path_or_paths if isinstance(path_or_paths, dict) else {self.split: path_or_paths} + self.builder = Csv( + cache_dir=cache_dir, + data_files=path_or_paths, + features=features, + **kwargs, + ) + + def read(self): + # Build iterable dataset + if self.streaming: + dataset = self.builder.as_streaming_dataset(split=self.split) + # Build regular (map-style) dataset + else: + download_config = None + download_mode = None + verification_mode = None + base_path = None + + self.builder.download_and_prepare( + download_config=download_config, + download_mode=download_mode, + verification_mode=verification_mode, + base_path=base_path, + num_proc=self.num_proc, + ) + dataset = self.builder.as_dataset(split=self.split, in_memory=self.keep_in_memory) + return dataset + + +class CsvDatasetWriter: + def __init__( + self, + dataset: Dataset, + path_or_buf: Union[PathLike, BinaryIO], + batch_size: Optional[int] = None, + num_proc: Optional[int] = None, + storage_options: Optional[dict] = None, + **to_csv_kwargs, + ): + if num_proc is not None and num_proc <= 0: + raise ValueError(f"num_proc {num_proc} must be an integer > 0.") + + self.dataset = dataset + self.path_or_buf = path_or_buf + self.batch_size = batch_size if batch_size else config.DEFAULT_MAX_BATCH_SIZE + self.num_proc = num_proc + self.encoding = "utf-8" + self.storage_options = storage_options or {} + self.to_csv_kwargs = to_csv_kwargs + + def write(self) -> int: + _ = self.to_csv_kwargs.pop("path_or_buf", None) + header = self.to_csv_kwargs.pop("header", True) + index = self.to_csv_kwargs.pop("index", False) + + if isinstance(self.path_or_buf, (str, bytes, os.PathLike)): + with fsspec.open(self.path_or_buf, "wb", **(self.storage_options or {})) as buffer: + written = self._write(file_obj=buffer, header=header, index=index, **self.to_csv_kwargs) + else: + written = self._write(file_obj=self.path_or_buf, header=header, index=index, **self.to_csv_kwargs) + return written + + def _batch_csv(self, args): + offset, header, index, to_csv_kwargs = args + + batch = query_table( + table=self.dataset.data, + key=slice(offset, offset + self.batch_size), + indices=self.dataset._indices, + ) + csv_str = batch.to_pandas().to_csv( + path_or_buf=None, header=header if (offset == 0) else False, index=index, **to_csv_kwargs + ) + return csv_str.encode(self.encoding) + + def _write(self, file_obj: BinaryIO, header, index, **to_csv_kwargs) -> int: + """Writes the pyarrow table as CSV to a binary file handle. + + Caller is responsible for opening and closing the handle. + """ + written = 0 + + if self.num_proc is None or self.num_proc == 1: + for offset in hf_tqdm( + range(0, len(self.dataset), self.batch_size), + unit="ba", + desc="Creating CSV from Arrow format", + ): + csv_str = self._batch_csv((offset, header, index, to_csv_kwargs)) + written += file_obj.write(csv_str) + + else: + num_rows, batch_size = len(self.dataset), self.batch_size + with multiprocessing.Pool(self.num_proc) as pool: + for csv_str in hf_tqdm( + pool.imap( + self._batch_csv, + [(offset, header, index, to_csv_kwargs) for offset in range(0, num_rows, batch_size)], + ), + total=(num_rows // batch_size) + 1 if num_rows % batch_size else num_rows // batch_size, + unit="ba", + desc="Creating CSV from Arrow format", + ): + written += file_obj.write(csv_str) + + return written diff --git a/src/datasets/io/generator.py b/src/datasets/io/generator.py new file mode 100644 index 0000000..cb5ae76 --- /dev/null +++ b/src/datasets/io/generator.py @@ -0,0 +1,62 @@ +from typing import Callable, Optional + +from .. import Features, NamedSplit, Split +from ..packaged_modules.generator.generator import Generator +from .abc import AbstractDatasetInputStream + + +class GeneratorDatasetInputStream(AbstractDatasetInputStream): + def __init__( + self, + generator: Callable, + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + streaming: bool = False, + gen_kwargs: Optional[dict] = None, + num_proc: Optional[int] = None, + split: NamedSplit = Split.TRAIN, + fingerprint: Optional[str] = None, + **kwargs, + ): + super().__init__( + features=features, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + streaming=streaming, + num_proc=num_proc, + **kwargs, + ) + self.builder = Generator( + cache_dir=cache_dir, + features=features, + generator=generator, + gen_kwargs=gen_kwargs, + split=split, + config_id="default-fingerprint=" + fingerprint if fingerprint else None, + **kwargs, + ) + self.fingerprint = fingerprint + + def read(self): + # Build iterable dataset + if self.streaming: + dataset = self.builder.as_streaming_dataset(split=self.builder.config.split) + # Build regular (map-style) dataset + else: + download_config = None + download_mode = None + verification_mode = None + base_path = None + + self.builder.download_and_prepare( + download_config=download_config, + download_mode=download_mode, + verification_mode=verification_mode, + base_path=base_path, + num_proc=self.num_proc, + ) + dataset = self.builder.as_dataset(split=self.builder.config.split, in_memory=self.keep_in_memory) + if self.fingerprint: + dataset._fingerprint = self.fingerprint + return dataset diff --git a/src/datasets/io/json.py b/src/datasets/io/json.py new file mode 100644 index 0000000..eb347ae --- /dev/null +++ b/src/datasets/io/json.py @@ -0,0 +1,178 @@ +import multiprocessing +import os +from functools import partial +from typing import BinaryIO, Optional, Union + +import fsspec + +from .. import Dataset, Features, NamedSplit, config +from ..formatting import query_table +from ..packaged_modules.json.json import Json +from ..utils import tqdm as hf_tqdm +from ..utils.json import get_json_field_paths_from_feature, json_decode_field +from ..utils.typing import NestedDataStructureLike, PathLike +from .abc import AbstractDatasetReader + + +class JsonDatasetReader(AbstractDatasetReader): + def __init__( + self, + path_or_paths: NestedDataStructureLike[PathLike], + split: Optional[NamedSplit] = None, + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + streaming: bool = False, + field: Optional[str] = None, + num_proc: Optional[int] = None, + **kwargs, + ): + super().__init__( + path_or_paths, + split=split, + features=features, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + streaming=streaming, + num_proc=num_proc, + **kwargs, + ) + self.field = field + path_or_paths = path_or_paths if isinstance(path_or_paths, dict) else {self.split: path_or_paths} + self.builder = Json( + cache_dir=cache_dir, + data_files=path_or_paths, + features=features, + field=field, + **kwargs, + ) + + def read(self): + # Build iterable dataset + if self.streaming: + dataset = self.builder.as_streaming_dataset(split=self.split) + # Build regular (map-style) dataset + else: + download_config = None + download_mode = None + verification_mode = None + base_path = None + + self.builder.download_and_prepare( + download_config=download_config, + download_mode=download_mode, + verification_mode=verification_mode, + base_path=base_path, + num_proc=self.num_proc, + ) + dataset = self.builder.as_dataset(split=self.split, in_memory=self.keep_in_memory) + return dataset + + +class JsonDatasetWriter: + def __init__( + self, + dataset: Dataset, + path_or_buf: Union[PathLike, BinaryIO], + batch_size: Optional[int] = None, + num_proc: Optional[int] = None, + storage_options: Optional[dict] = None, + **to_json_kwargs, + ): + if num_proc is not None and num_proc <= 0: + raise ValueError(f"num_proc {num_proc} must be an integer > 0.") + + self.dataset = dataset + self.path_or_buf = path_or_buf + self.batch_size = batch_size if batch_size else config.DEFAULT_MAX_BATCH_SIZE + self.num_proc = num_proc + self.encoding = "utf-8" + self.storage_options = storage_options or {} + self.to_json_kwargs = to_json_kwargs + + def write(self) -> int: + _ = self.to_json_kwargs.pop("path_or_buf", None) + orient = self.to_json_kwargs.pop("orient", "records") + lines = self.to_json_kwargs.pop("lines", True if orient == "records" else False) + if "index" not in self.to_json_kwargs and orient in ["split", "table"]: + self.to_json_kwargs["index"] = False + + # Determine the default compression value based on self.path_or_buf type + default_compression = "infer" if isinstance(self.path_or_buf, (str, bytes, os.PathLike)) else None + compression = self.to_json_kwargs.pop("compression", default_compression) + + if compression not in [None, "infer", "gzip", "bz2", "xz"]: + raise NotImplementedError(f"`datasets` currently does not support {compression} compression") + + if not lines and self.batch_size < self.dataset.num_rows: + raise NotImplementedError( + "Output JSON will not be formatted correctly when lines = False and batch_size < number of rows in the dataset. Use pandas.DataFrame.to_json() instead." + ) + + if isinstance(self.path_or_buf, (str, bytes, os.PathLike)): + with fsspec.open( + self.path_or_buf, "wb", compression=compression, **(self.storage_options or {}) + ) as buffer: + written = self._write(file_obj=buffer, orient=orient, lines=lines, **self.to_json_kwargs) + else: + if compression: + raise NotImplementedError( + f"The compression parameter is not supported when writing to a buffer, but compression={compression}" + " was passed. Please provide a local path instead." + ) + written = self._write(file_obj=self.path_or_buf, orient=orient, lines=lines, **self.to_json_kwargs) + return written + + def _batch_json(self, args): + offset, orient, lines, to_json_kwargs = args + + batch = query_table( + table=self.dataset.data, + key=slice(offset, offset + self.batch_size), + indices=self.dataset._indices, + ) + batch = batch.to_pandas() + for json_field_path in get_json_field_paths_from_feature(self.dataset.features): + col, *json_field_subpath = json_field_path + batch[col] = batch[col].apply(partial(json_decode_field, json_field_path=json_field_subpath)) + json_str = batch.to_json(path_or_buf=None, orient=orient, lines=lines, **to_json_kwargs) + if not json_str.endswith("\n"): + json_str += "\n" + return json_str.encode(self.encoding) + + def _write( + self, + file_obj: BinaryIO, + orient, + lines, + **to_json_kwargs, + ) -> int: + """Writes the pyarrow table as JSON lines to a binary file handle. + + Caller is responsible for opening and closing the handle. + """ + written = 0 + + if self.num_proc is None or self.num_proc == 1: + for offset in hf_tqdm( + range(0, len(self.dataset), self.batch_size), + unit="ba", + desc="Creating json from Arrow format", + ): + json_str = self._batch_json((offset, orient, lines, to_json_kwargs)) + written += file_obj.write(json_str) + else: + num_rows, batch_size = len(self.dataset), self.batch_size + with multiprocessing.Pool(self.num_proc) as pool: + for json_str in hf_tqdm( + pool.imap( + self._batch_json, + [(offset, orient, lines, to_json_kwargs) for offset in range(0, num_rows, batch_size)], + ), + total=(num_rows // batch_size) + 1 if num_rows % batch_size else num_rows // batch_size, + unit="ba", + desc="Creating json from Arrow format", + ): + written += file_obj.write(json_str) + + return written diff --git a/src/datasets/io/parquet.py b/src/datasets/io/parquet.py new file mode 100644 index 0000000..7d17fbf --- /dev/null +++ b/src/datasets/io/parquet.py @@ -0,0 +1,159 @@ +import json +import os +from typing import BinaryIO, Optional, Union + +import fsspec +import pyarrow.parquet as pq + +from .. import Dataset, Features, NamedSplit, config +from ..arrow_writer import get_writer_batch_size_from_data_size, get_writer_batch_size_from_features +from ..features.features import require_storage_embed +from ..formatting import query_table +from ..packaged_modules import _PACKAGED_DATASETS_MODULES +from ..packaged_modules.parquet.parquet import Parquet +from ..utils import tqdm as hf_tqdm +from ..utils.typing import NestedDataStructureLike, PathLike +from .abc import AbstractDatasetReader + + +class ParquetDatasetReader(AbstractDatasetReader): + def __init__( + self, + path_or_paths: NestedDataStructureLike[PathLike], + split: Optional[NamedSplit] = None, + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + streaming: bool = False, + num_proc: Optional[int] = None, + **kwargs, + ): + super().__init__( + path_or_paths, + split=split, + features=features, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + streaming=streaming, + num_proc=num_proc, + **kwargs, + ) + path_or_paths = path_or_paths if isinstance(path_or_paths, dict) else {self.split: path_or_paths} + hash = _PACKAGED_DATASETS_MODULES["parquet"][1] + self.builder = Parquet( + cache_dir=cache_dir, + data_files=path_or_paths, + features=features, + hash=hash, + **kwargs, + ) + + def read(self): + # Build iterable dataset + if self.streaming: + dataset = self.builder.as_streaming_dataset(split=self.split) + # Build regular (map-style) dataset + else: + download_config = None + download_mode = None + verification_mode = None + base_path = None + + self.builder.download_and_prepare( + download_config=download_config, + download_mode=download_mode, + verification_mode=verification_mode, + base_path=base_path, + num_proc=self.num_proc, + ) + dataset = self.builder.as_dataset(split=self.split, in_memory=self.keep_in_memory) + return dataset + + +class ParquetDatasetWriter: + def __init__( + self, + dataset: Dataset, + path_or_buf: Union[PathLike, BinaryIO], + batch_size: Optional[int] = None, + storage_options: Optional[dict] = None, + use_content_defined_chunking: Union[bool, dict] = True, + write_page_index: bool = True, + **parquet_writer_kwargs, + ): + self.dataset = dataset + self.path_or_buf = path_or_buf + self.batch_size = ( + batch_size + or get_writer_batch_size_from_features(dataset.features) + or get_writer_batch_size_from_data_size(len(dataset), dataset._estimate_nbytes()) + ) + self.storage_options = storage_options or {} + self.parquet_writer_kwargs = parquet_writer_kwargs + if use_content_defined_chunking is True: + use_content_defined_chunking = config.DEFAULT_CDC_OPTIONS + self.use_content_defined_chunking = use_content_defined_chunking + self.write_page_index = write_page_index + + def write(self) -> int: + if isinstance(self.path_or_buf, (str, bytes, os.PathLike)): + with fsspec.open(self.path_or_buf, "wb", **(self.storage_options or {})) as buffer: + written = self._write( + file_obj=buffer, + batch_size=self.batch_size, + **self.parquet_writer_kwargs, + ) + else: + written = self._write( + file_obj=self.path_or_buf, + batch_size=self.batch_size, + **self.parquet_writer_kwargs, + ) + return written + + def _write(self, file_obj: BinaryIO, batch_size: int, **parquet_writer_kwargs) -> int: + """Writes the pyarrow table as Parquet to a binary file handle. + + Caller is responsible for opening and closing the handle. + """ + written = 0 + _ = parquet_writer_kwargs.pop("path_or_buf", None) + schema = self.dataset.features.arrow_schema + + writer = pq.ParquetWriter( + file_obj, + schema=schema, + use_content_defined_chunking=self.use_content_defined_chunking, + write_page_index=self.write_page_index, + compression={ + col: "none" if require_storage_embed(feature) else "snappy" + for col, feature in self.dataset.features.items() + }, + use_dictionary=[ + col for col, feature in self.dataset.features.items() if not require_storage_embed(feature) + ], + column_encoding={ + col: "PLAIN" for col, feature in self.dataset.features.items() if require_storage_embed(feature) + }, + **parquet_writer_kwargs, + ) + + for offset in hf_tqdm( + range(0, len(self.dataset), batch_size), + unit="ba", + desc="Creating parquet from Arrow format", + ): + batch = query_table( + table=self.dataset._data, + key=slice(offset, offset + batch_size), + indices=self.dataset._indices, + ) + writer.write_table(batch) + written += batch.nbytes + + # TODO(kszucs): we may want to persist multiple parameters + if self.use_content_defined_chunking is not False: + writer.add_key_value_metadata({"content_defined_chunking": json.dumps(self.use_content_defined_chunking)}) + + writer.close() + return written diff --git a/src/datasets/io/spark.py b/src/datasets/io/spark.py new file mode 100644 index 0000000..7562ba1 --- /dev/null +++ b/src/datasets/io/spark.py @@ -0,0 +1,57 @@ +from typing import Optional + +import pyspark + +from .. import Features, NamedSplit +from ..download import DownloadMode +from ..packaged_modules.spark.spark import Spark +from .abc import AbstractDatasetReader + + +class SparkDatasetReader(AbstractDatasetReader): + """A dataset reader that reads from a Spark DataFrame. + + When caching, cache materialization is parallelized over Spark; an NFS that is accessible to the driver must be + provided. Streaming is not currently supported. + """ + + def __init__( + self, + df: pyspark.sql.DataFrame, + split: Optional[NamedSplit] = None, + features: Optional[Features] = None, + streaming: bool = True, + cache_dir: str = None, + keep_in_memory: bool = False, + working_dir: str = None, + load_from_cache_file: bool = True, + file_format: str = "arrow", + **kwargs, + ): + super().__init__( + split=split, + features=features, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + streaming=streaming, + **kwargs, + ) + self._load_from_cache_file = load_from_cache_file + self._file_format = file_format + self.builder = Spark( + df=df, + features=features, + cache_dir=cache_dir, + working_dir=working_dir, + **kwargs, + ) + + def read(self): + if self.streaming: + return self.builder.as_streaming_dataset(split=self.split) + download_mode = None if self._load_from_cache_file else DownloadMode.FORCE_REDOWNLOAD + self.builder.download_and_prepare( + download_mode=download_mode, + file_format=self._file_format, + ) + return self.builder.as_dataset(split=self.split) diff --git a/src/datasets/io/sql.py b/src/datasets/io/sql.py new file mode 100644 index 0000000..f74374a --- /dev/null +++ b/src/datasets/io/sql.py @@ -0,0 +1,122 @@ +import multiprocessing +from typing import TYPE_CHECKING, Optional, Union + +from .. import Dataset, Features, config +from ..formatting import query_table +from ..packaged_modules.sql.sql import Sql +from ..utils import tqdm as hf_tqdm +from .abc import AbstractDatasetInputStream + + +if TYPE_CHECKING: + import sqlite3 + + import sqlalchemy + + +class SqlDatasetReader(AbstractDatasetInputStream): + def __init__( + self, + sql: Union[str, "sqlalchemy.sql.Selectable"], + con: Union[str, "sqlalchemy.engine.Connection", "sqlalchemy.engine.Engine", "sqlite3.Connection"], + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + **kwargs, + ): + super().__init__(features=features, cache_dir=cache_dir, keep_in_memory=keep_in_memory, **kwargs) + self.builder = Sql( + cache_dir=cache_dir, + features=features, + sql=sql, + con=con, + **kwargs, + ) + + def read(self): + download_config = None + download_mode = None + verification_mode = None + base_path = None + + self.builder.download_and_prepare( + download_config=download_config, + download_mode=download_mode, + verification_mode=verification_mode, + base_path=base_path, + ) + + # Build dataset for splits + dataset = self.builder.as_dataset(split="train", in_memory=self.keep_in_memory) + return dataset + + +class SqlDatasetWriter: + def __init__( + self, + dataset: Dataset, + name: str, + con: Union[str, "sqlalchemy.engine.Connection", "sqlalchemy.engine.Engine", "sqlite3.Connection"], + batch_size: Optional[int] = None, + num_proc: Optional[int] = None, + **to_sql_kwargs, + ): + if num_proc is not None and num_proc <= 0: + raise ValueError(f"num_proc {num_proc} must be an integer > 0.") + + self.dataset = dataset + self.name = name + self.con = con + self.batch_size = batch_size if batch_size else config.DEFAULT_MAX_BATCH_SIZE + self.num_proc = num_proc + self.to_sql_kwargs = to_sql_kwargs + + def write(self) -> int: + _ = self.to_sql_kwargs.pop("sql", None) + _ = self.to_sql_kwargs.pop("con", None) + index = self.to_sql_kwargs.pop("index", False) + + written = self._write(index=index, **self.to_sql_kwargs) + return written + + def _batch_sql(self, args): + offset, index, to_sql_kwargs = args + to_sql_kwargs = {**to_sql_kwargs, "if_exists": "append"} if offset > 0 else to_sql_kwargs + batch = query_table( + table=self.dataset.data, + key=slice(offset, offset + self.batch_size), + indices=self.dataset._indices, + ) + df = batch.to_pandas() + num_rows = df.to_sql(self.name, self.con, index=index, **to_sql_kwargs) + return num_rows or len(df) + + def _write(self, index, **to_sql_kwargs) -> int: + """Writes the pyarrow table as SQL to a database. + + Caller is responsible for opening and closing the SQL connection. + """ + written = 0 + + if self.num_proc is None or self.num_proc == 1: + for offset in hf_tqdm( + range(0, len(self.dataset), self.batch_size), + unit="ba", + desc="Creating SQL from Arrow format", + ): + written += self._batch_sql((offset, index, to_sql_kwargs)) + else: + num_rows, batch_size = len(self.dataset), self.batch_size + with multiprocessing.Pool(self.num_proc) as pool: + for num_rows in hf_tqdm( + pool.imap( + self._batch_sql, + [(offset, index, to_sql_kwargs) for offset in range(0, num_rows, batch_size)], + ), + total=(num_rows // batch_size) + 1 if num_rows % batch_size else num_rows // batch_size, + unit="ba", + desc="Creating SQL from Arrow format", + ): + written += num_rows + + return written diff --git a/src/datasets/io/text.py b/src/datasets/io/text.py new file mode 100644 index 0000000..d010ddc --- /dev/null +++ b/src/datasets/io/text.py @@ -0,0 +1,58 @@ +from typing import Optional + +from .. import Features, NamedSplit +from ..packaged_modules.text.text import Text +from ..utils.typing import NestedDataStructureLike, PathLike +from .abc import AbstractDatasetReader + + +class TextDatasetReader(AbstractDatasetReader): + def __init__( + self, + path_or_paths: NestedDataStructureLike[PathLike], + split: Optional[NamedSplit] = None, + features: Optional[Features] = None, + cache_dir: str = None, + keep_in_memory: bool = False, + streaming: bool = False, + num_proc: Optional[int] = None, + **kwargs, + ): + super().__init__( + path_or_paths, + split=split, + features=features, + cache_dir=cache_dir, + keep_in_memory=keep_in_memory, + streaming=streaming, + num_proc=num_proc, + **kwargs, + ) + path_or_paths = path_or_paths if isinstance(path_or_paths, dict) else {self.split: path_or_paths} + self.builder = Text( + cache_dir=cache_dir, + data_files=path_or_paths, + features=features, + **kwargs, + ) + + def read(self): + # Build iterable dataset + if self.streaming: + dataset = self.builder.as_streaming_dataset(split=self.split) + # Build regular (map-style) dataset + else: + download_config = None + download_mode = None + verification_mode = None + base_path = None + + self.builder.download_and_prepare( + download_config=download_config, + download_mode=download_mode, + verification_mode=verification_mode, + base_path=base_path, + num_proc=self.num_proc, + ) + dataset = self.builder.as_dataset(split=self.split, in_memory=self.keep_in_memory) + return dataset diff --git a/src/datasets/iterable_dataset.py b/src/datasets/iterable_dataset.py new file mode 100644 index 0000000..17b9a20 --- /dev/null +++ b/src/datasets/iterable_dataset.py @@ -0,0 +1,5400 @@ +import asyncio +import concurrent.futures +import contextlib +import inspect +import itertools +import multiprocessing.pool +import re +import sys +import tempfile +import time +from collections import Counter +from collections.abc import Iterable, Iterator +from copy import copy, deepcopy +from dataclasses import dataclass +from functools import partial +from itertools import cycle, islice +from pathlib import Path +from typing import TYPE_CHECKING, Any, BinaryIO, Callable, Optional, Union + +import fsspec.asyn +import multiprocess as mp +import numpy as np +import pandas as pd +import pyarrow as pa +import pyarrow.dataset as pds +import pyarrow.parquet as pq +from huggingface_hub import ( + CommitInfo, + CommitOperationAdd, + HfApi, + HfFileSystem, + HfFileSystemResolvedPath, +) +from huggingface_hub.utils import RepositoryNotFoundError +from packaging import version + +from . import __version__, config +from .arrow_dataset import Dataset, DatasetInfoMixin, _push_to_bucket, _push_to_repo +from .features import Features +from .features.features import ( + FeatureType, + List, + Value, + _align_features, + _check_if_features_can_be_aligned, + _fix_for_backward_compatible_features, + _visit, + cast_to_python_objects, + require_decoding, +) +from .formatting import ( + ArrowFormatter, + PythonFormatter, + TableFormatter, + TensorFormatter, + get_format_type_from_alias, + get_formatter, +) +from .info import DatasetInfo +from .naming import _split_re +from .splits import NamedSplit, Split, SplitInfo +from .table import ( + _batch_accumulate_arrow_table_by_columns, + _batch_arrow_table, + cast_table_to_features, + embed_table_storage, + read_schema_from_file, + table_cast, +) +from .utils import tqdm as hf_tqdm +from .utils.logging import get_logger +from .utils.py_utils import ( + Literal, + convert_file_size_to_int, + iflatmap_unordered, +) +from .utils.sharding import _merge_gen_kwargs, _number_of_shards_in_gen_kwargs, _shuffle_gen_kwargs, _split_gen_kwargs +from .utils.typing import PathLike + + +if config.HF_HUB_VERSION >= version.parse("1.6.0"): + from huggingface_hub.errors import BucketNotFoundError + from huggingface_hub.hf_file_system import HfFileSystemResolvedBucketPath, HfFileSystemResolvedRepositoryPath + +else: + BucketNotFoundError = None + HfFileSystemResolvedBucketPath = None + HfFileSystemResolvedRepositoryPath = HfFileSystemResolvedPath + +if TYPE_CHECKING: + import sqlite3 + + import polars as pl + import sqlalchemy + import torch + + from .builder import Key as BuilderKey + +logger = get_logger(__name__) + +Key = Union[int, str, tuple[int, int], "BuilderKey"] + + +def identity_func(x): + return x + + +def _rename_columns_fn(example: dict, column_mapping: dict[str, str]): + if any(col not in example for col in column_mapping): + raise ValueError( + f"Error when renaming {list(column_mapping)} to {list(column_mapping.values())}: columns {set(column_mapping) - set(example)} are not in the dataset." + ) + if any(col in example for col in column_mapping.values()): + raise ValueError( + f"Error when renaming {list(column_mapping)} to {list(column_mapping.values())}: columns {set(example) - set(column_mapping.values())} are already in the dataset." + ) + return { + new_column_name: example[original_column_name] + for original_column_name, new_column_name in column_mapping.items() + } + + +def add_column_fn(example: dict, idx: int, name: str, column: list[dict]): + if name in example: + raise ValueError(f"Error when adding {name}: column {name} is already in the dataset.") + return {name: column[idx]} + + +def _infer_features_from_batch(batch: dict[str, list], try_features: Optional[Features] = None) -> Features: + pa_table = pa.Table.from_pydict(batch) + if try_features is not None: + try: + pa_table = table_cast(pa_table, pa.schema(try_features.type)) + except (TypeError, pa.ArrowInvalid, pa.ArrowNotImplementedError): + pass + return Features.from_arrow_schema(pa_table.schema) + + +def _examples_to_batch(examples: list[dict[str, Any]]) -> dict[str, list]: + # we order the columns by order of appearance + # to do so, we use a dict as an ordered set + cols = {col: None for example in examples for col in example} + # when an example is missing a column, we set the value to None with .get() + arrays = [[example.get(col) for example in examples] for col in cols] + return dict(zip(cols, arrays)) + + +def _batch_to_examples(batch: dict[str, list]) -> Iterator[dict[str, Any]]: + """Convert a batch (dict of examples) to examples list""" + n_examples = 0 if len(batch) == 0 else len(batch[next(iter(batch))]) + for i in range(n_examples): + yield {col: array[i] for col, array in batch.items()} + + +def _convert_to_arrow( + iterable: Iterable[tuple[Key, dict]], + batch_size: int, + drop_last_batch: bool = False, +) -> Iterator[tuple[Key, pa.Table]]: + """Convert and group examples in Arrow tables of size `batch_size`. + + Args: + iterable (`Iterable[Tuple[Key, dict]]`): + An examples iterable containing tuples (example_key, example) of type (int/str, dict) + batch_size (`Optional[int]`): + Size of each sub-table to yield. If None or <= 0, yields the full table. + drop_last_batch (`bool`, defaults to `False`): + Drop the last batch if it is smaller than `batch_size`. + """ + if batch_size is None or batch_size <= 0: + yield ( + "all", + pa.Table.from_pylist(cast_to_python_objects([example for _, example in iterable], only_1d_for_numpy=True)), + ) + return + iterator = iter(iterable) + for key, example in iterator: + iterator_batch = islice(iterator, batch_size - 1) + key_examples_list = [(key, example)] + list(iterator_batch) + if len(key_examples_list) < batch_size and drop_last_batch: + return + keys, examples = zip(*key_examples_list) + new_key = "_".join(str(key) for key in keys) + yield new_key, pa.Table.from_pylist(cast_to_python_objects(examples, only_1d_for_numpy=True)) + + +def shift_ex_examples_rngs(ex_iterable: "_BaseExamplesIterable", value: int) -> "_BaseExamplesIterable": + """We need to go through the ex_iterables recursively, create a new seed and return a new iterable, then set it to the containing ex_iterable.""" + + def set_seed_recursively(ex_iterable): + if hasattr(ex_iterable, "shift_rngs"): + ex_iterable = ex_iterable.shift_rngs(value) + if hasattr(ex_iterable, "ex_iterable"): + ex_iterable.ex_iterable = set_seed_recursively(ex_iterable.ex_iterable) + if hasattr(ex_iterable, "ex_iterables"): + ex_iterable.ex_iterables = [set_seed_recursively(ei) for ei in ex_iterable.ex_iterables] + return ex_iterable + + return set_seed_recursively(ex_iterable) + + +class _BaseExamplesIterable: + """Base class for the examples iterable used by an IterableDataset""" + + def __init__(self) -> None: + self._state_dict: Optional[Union[list, dict]] = None + + def __iter__(self) -> Iterator[tuple[Key, dict]]: + """An examples iterable should yield tuples (example_key, example) of type (int/str, dict)""" + raise NotImplementedError(f"{type(self)} doesn't implement __iter__ yet") + + @property + def iter_arrow(self) -> Optional[Callable[[], Iterator[tuple[Key, pa.Table]]]]: + return None + + @property + def is_typed(self) -> bool: + return False + + @property + def features(self) -> Optional[Features]: + return None + + def shuffle_data_sources(self, generator: np.random.Generator) -> "_BaseExamplesIterable": + """ + Either shuffle the shards/sources of the dataset, or propagate the shuffling to the underlying iterable. + If the order of the shards must stay fixed (when using .skip or .take for example), then this method returns self. + """ + raise NotImplementedError(f"{type(self)} doesn't implement shuffle_data_sources yet") + + def shard_data_sources(self, num_shards: int, index: int, contiguous=True) -> "_BaseExamplesIterable": + """Either keep only the requested shard, or propagate the request to the underlying iterable.""" + raise NotImplementedError(f"{type(self)} doesn't implement shard_data_sources yet") + + def reshard_data_sources(self) -> "_BaseExamplesIterable": + """ + Either reshard the shards/sources of the dataset, i.e. further split the current shards into more shards, + or propagate the resharding to the underlying iterable. + If the examples iterable can't be further resharded, then this method returns self. + """ + raise NotImplementedError(f"{type(self)} doesn't implement reshard_data_sources yet") + + def split_shard_indices_by_worker(self, num_shards: int, index: int, contiguous=True) -> list[int]: + if contiguous: + div = self.num_shards // num_shards + mod = self.num_shards % num_shards + start = div * index + min(index, mod) + end = start + div + (1 if index < mod else 0) + return list(range(start, end)) + else: + return list(range(index, self.num_shards, num_shards)) + + @property + def num_shards(self) -> int: + raise NotImplementedError(f"{type(self)} doesn't implement num_shards yet") + + def _init_state_dict(self) -> dict: + raise NotImplementedError(f"{type(self)} doesn't implement _init_state_dict yet") + + def load_state_dict(self, state_dict: dict) -> dict: + def _inner_load_state_dict(state, new_state): + if new_state is not None and isinstance(state, dict): + for key in new_state: + state[key] = _inner_load_state_dict(state[key], new_state[key]) + return state + elif new_state is not None and isinstance(state, list): + for i in range(len(state)): + state[i] = _inner_load_state_dict(state[i], new_state[i]) + return state + return deepcopy(new_state) + + self._init_state_dict() + return _inner_load_state_dict(self._state_dict, state_dict) + + def state_dict(self) -> dict: + if self._state_dict: + return deepcopy(self._state_dict) + raise RuntimeError("State dict is not initialized, please call ex_iterable._init_state_dict() first.") + + @property + def sleep_on_threads_shutdown(self): + if hasattr(self, "_sleep_on_threads_shutdown"): + return self._sleep_on_threads_shutdown + else: + ex_iterables = [self.ex_iterable] if hasattr(self, "ex_iterable") else self.ex_iterables + return any(ex_iterable.sleep_on_threads_shutdown for ex_iterable in ex_iterables) + + +class ExamplesIterable(_BaseExamplesIterable): + def __init__( + self, + generate_examples_fn: Callable[..., Iterator[tuple[Key, dict]]], + kwargs: dict, + generate_more_kwargs_fn: Optional[Callable[..., Iterator[dict]]] = None, + sleep_on_threads_shutdown: bool = False, + ): + super().__init__() + self.generate_examples_fn = generate_examples_fn + self.kwargs = kwargs + + # for resharding + self.generate_more_kwargs_fn = generate_more_kwargs_fn + + # for threads shutdowns + self._sleep_on_threads_shutdown = sleep_on_threads_shutdown + + def _init_state_dict(self) -> dict: + self._state_dict = {"shard_idx": 0, "shard_example_idx": 0, "type": self.__class__.__name__} + return self._state_dict + + def __iter__(self): + shard_idx_start = self._state_dict["shard_idx"] if self._state_dict else 0 + for gen_kwargs in islice(_split_gen_kwargs(self.kwargs, max_num_jobs=self.num_shards), shard_idx_start, None): + shard_example_idx_start = self._state_dict["shard_example_idx"] if self._state_dict else 0 + for key_example in islice(self.generate_examples_fn(**gen_kwargs), shard_example_idx_start, None): + if self._state_dict: + self._state_dict["shard_example_idx"] += 1 + yield key_example + if self._state_dict: + self._state_dict["shard_idx"] += 1 + self._state_dict["shard_example_idx"] = 0 + + def shuffle_data_sources(self, generator: np.random.Generator) -> "ExamplesIterable": + return ExamplesIterable( + self.generate_examples_fn, + _shuffle_gen_kwargs(deepcopy(generator), self.kwargs), + self.generate_more_kwargs_fn, + self.sleep_on_threads_shutdown, + ) + + def shard_data_sources(self, num_shards: int, index: int, contiguous=True) -> "ExamplesIterable": + """Keep only the requested shard.""" + gen_kwargs_list = _split_gen_kwargs(self.kwargs, max_num_jobs=self.num_shards) + shard_indices = self.split_shard_indices_by_worker(num_shards, index, contiguous=contiguous) + requested_gen_kwargs = _merge_gen_kwargs([gen_kwargs_list[i] for i in shard_indices]) + return ExamplesIterable( + self.generate_examples_fn, + requested_gen_kwargs, + self.generate_more_kwargs_fn, + self.sleep_on_threads_shutdown, + ) + + def reshard_data_sources(self) -> "ExamplesIterable": + """Split shars into more shards if possible.""" + if not self.generate_more_kwargs_fn: + return ExamplesIterable( + self.generate_examples_fn, self.kwargs, self.generate_more_kwargs_fn, self.sleep_on_threads_shutdown + ) + gen_kwargs_list = _split_gen_kwargs(self.kwargs, max_num_jobs=self.num_shards) + new_gen_kwargs = _merge_gen_kwargs( + [ + new_gen_kwargs + for gen_kwargs in gen_kwargs_list + for new_gen_kwargs in self.generate_more_kwargs_fn(**gen_kwargs) + ] + ) + return ExamplesIterable( + self.generate_examples_fn, new_gen_kwargs, self.generate_more_kwargs_fn, self.sleep_on_threads_shutdown + ) + + @property + def num_shards(self) -> int: + return _number_of_shards_in_gen_kwargs(self.kwargs) + + +class ArrowExamplesIterable(_BaseExamplesIterable): + def __init__( + self, + generate_tables_fn: Callable[..., Iterator[tuple[Key, pa.Table]]], + kwargs: dict, + generate_more_kwargs_fn: Optional[Callable[..., Iterator[dict]]] = None, + sleep_on_threads_shutdown: bool = False, + ): + super().__init__() + self.generate_tables_fn = generate_tables_fn + self.kwargs = kwargs + + # for resharding + self.generate_more_kwargs_fn = generate_more_kwargs_fn + + # for threads shutdowns + self._sleep_on_threads_shutdown = sleep_on_threads_shutdown + + @property + def iter_arrow(self): + return self._iter_arrow + + def _init_state_dict(self) -> dict: + self._state_dict = {"shard_idx": 0, "shard_example_idx": 0, "type": self.__class__.__name__} + return self._state_dict + + def __iter__(self): + formatter = PythonFormatter() + shard_idx_start = self._state_dict["shard_idx"] if self._state_dict else 0 + for gen_kwags in islice(_split_gen_kwargs(self.kwargs, max_num_jobs=self.num_shards), shard_idx_start, None): + shard_example_idx_start = self._state_dict["shard_example_idx"] if self._state_dict else 0 + shard_example_idx = 0 + for key, pa_table in self.generate_tables_fn(**gen_kwags): + if shard_example_idx + len(pa_table) <= shard_example_idx_start: + shard_example_idx += len(pa_table) + continue + for pa_subtable in pa_table.to_reader(max_chunksize=config.ARROW_READER_BATCH_SIZE_IN_DATASET_ITER): + formatted_batch = formatter.format_batch(pa_subtable) + for example in _batch_to_examples(formatted_batch): + if shard_example_idx >= shard_example_idx_start: + if self._state_dict: + self._state_dict["shard_example_idx"] += 1 + yield key, example + shard_example_idx += 1 + if self._state_dict: + self._state_dict["shard_idx"] += 1 + self._state_dict["shard_example_idx"] = 0 + + def _iter_arrow(self): + shard_idx_start = self._state_dict["shard_idx"] if self._state_dict else 0 + for gen_kwags in islice(_split_gen_kwargs(self.kwargs, max_num_jobs=self.num_shards), shard_idx_start, None): + shard_example_idx_start = self._state_dict["shard_example_idx"] if self._state_dict else 0 + shard_example_idx = 0 + for key, pa_table in self.generate_tables_fn(**gen_kwags): + shard_example_idx += len(pa_table) + if shard_example_idx <= shard_example_idx_start: + continue + if self._state_dict: + self._state_dict["shard_example_idx"] += len(pa_table) + yield key, pa_table + if self._state_dict: + self._state_dict["shard_idx"] += 1 + self._state_dict["shard_example_idx"] = 0 + + def shuffle_data_sources(self, generator: np.random.Generator) -> "ArrowExamplesIterable": + return ArrowExamplesIterable( + self.generate_tables_fn, + _shuffle_gen_kwargs(deepcopy(generator), self.kwargs), + self.generate_more_kwargs_fn, + self.sleep_on_threads_shutdown, + ) + + def shard_data_sources(self, num_shards: int, index: int, contiguous=True) -> "ArrowExamplesIterable": + """Keep only the requested shard.""" + gen_kwargs_list = _split_gen_kwargs(self.kwargs, max_num_jobs=self.num_shards) + shard_indices = self.split_shard_indices_by_worker(num_shards, index, contiguous=contiguous) + requested_gen_kwargs = _merge_gen_kwargs([gen_kwargs_list[i] for i in shard_indices]) + return ArrowExamplesIterable( + self.generate_tables_fn, requested_gen_kwargs, self.generate_more_kwargs_fn, self.sleep_on_threads_shutdown + ) + + def reshard_data_sources(self) -> "ArrowExamplesIterable": + """Split shars into more shards if possible.""" + if not self.generate_more_kwargs_fn: + return ArrowExamplesIterable(self.generate_tables_fn, self.kwargs, self.generate_more_kwargs_fn) + gen_kwargs_list = _split_gen_kwargs(self.kwargs, max_num_jobs=self.num_shards) + new_gen_kwargs = _merge_gen_kwargs( + [ + new_gen_kwargs + for gen_kwargs in gen_kwargs_list + for new_gen_kwargs in self.generate_more_kwargs_fn(**gen_kwargs) + ] + ) + return ArrowExamplesIterable( + self.generate_tables_fn, new_gen_kwargs, self.generate_more_kwargs_fn, self.sleep_on_threads_shutdown + ) + + @property + def num_shards(self) -> int: + return _number_of_shards_in_gen_kwargs(self.kwargs) + + +class RebatchedArrowExamplesIterable(_BaseExamplesIterable): + def __init__( + self, + ex_iterable: _BaseExamplesIterable, + batch_size: Optional[int], + drop_last_batch: bool = False, + force_convert_to_arrow: bool = False, + ): + super().__init__() + self.ex_iterable = ex_iterable + self.batch_size = batch_size + self.drop_last_batch = drop_last_batch + self.force_convert_to_arrow = force_convert_to_arrow + + @property + def iter_arrow(self): + return self._iter_arrow if self.ex_iterable.iter_arrow or self.force_convert_to_arrow else None + + @property + def is_typed(self): + return self.ex_iterable.is_typed + + @property + def features(self): + return self.ex_iterable.features + + def _init_state_dict(self) -> dict: + self._state_dict = { + "examples_iterable": self.ex_iterable._init_state_dict(), + "previous_state": None, + "batch_idx": 0, + "num_chunks_since_previous_state": 0, + "cropped_chunk_length": 0, + "type": self.__class__.__name__, + } + return self._state_dict + + def __iter__(self): + yield from self.ex_iterable + + def _iter_arrow(self) -> Iterator[tuple[Key, pa.Table]]: + """Iterate over sub-tables of size `batch_size`.""" + if self._state_dict and self._state_dict["previous_state"]: + self.ex_iterable.load_state_dict(self._state_dict["previous_state"]) + if self.ex_iterable.iter_arrow: + iterator = self.ex_iterable.iter_arrow() + elif self.force_convert_to_arrow: + iterator = _convert_to_arrow(self.ex_iterable, batch_size=1) + else: + raise RuntimeError( + "_iter_arrow is not available in RebatchedArrowExamplesIterable, use an examples iterable that implements _iter_arrow() or pass force_convert_to_arrow=True" + ) + if self.batch_size is None or self.batch_size <= 0: + if self._state_dict and self._state_dict["batch_idx"] > 0: + return + all_pa_table = pa.concat_tables([pa_table for _, pa_table in iterator]) + if self._state_dict: + self._state_dict["batch_idx"] = 1 + yield "all", all_pa_table + return + keys_buffer = [] + chunks_buffer = [] + chunks_buffer_size = 0 + num_chunks_to_skip = self._state_dict["num_chunks_since_previous_state"] if self._state_dict else 0 + chunk_length_to_crop = self._state_dict["cropped_chunk_length"] if self._state_dict else 0 + if self._state_dict: + previous_state = self.ex_iterable.state_dict() + self._state_dict["previous_state"] = previous_state + for key, pa_table in iterator: + for num_chunks_since_previous_state, chunk in enumerate(pa_table.to_reader(max_chunksize=self.batch_size)): + if num_chunks_to_skip > 1: + num_chunks_to_skip -= 1 + continue + elif num_chunks_to_skip == 1 and chunk_length_to_crop == 0: + num_chunks_to_skip -= 1 + continue + elif num_chunks_to_skip == 1 and chunk_length_to_crop > 0: + chunk = chunk.slice(chunk_length_to_crop, len(chunk) - chunk_length_to_crop) + num_chunks_to_skip = 0 + chunk_length_to_crop = 0 + if len(chunk) == 0: + continue + + if chunks_buffer_size + len(chunk) < self.batch_size: + keys_buffer.append(key) + chunks_buffer.append(chunk) + chunks_buffer_size += len(chunk) + continue + elif chunks_buffer_size + len(chunk) == self.batch_size: + keys_buffer.append(key) + chunks_buffer.append(chunk) + new_key = "_".join(str(_key) for _key in keys_buffer) + if self._state_dict: + self._state_dict["batch_idx"] += 1 + self._state_dict["num_chunks_since_previous_state"] += len(chunks_buffer) + self._state_dict["cropped_chunk_length"] = 0 + yield new_key, pa.Table.from_batches(chunks_buffer) + keys_buffer = [] + chunks_buffer = [] + chunks_buffer_size = 0 + if self._state_dict: + self._state_dict["previous_state"] = previous_state + self._state_dict["num_chunks_since_previous_state"] = num_chunks_since_previous_state + 1 + else: + cropped_chunk_length = self.batch_size - chunks_buffer_size + keys_buffer.append(f"{key}[:{cropped_chunk_length}]") + chunks_buffer.append(chunk.slice(0, cropped_chunk_length)) + new_key = "_".join(str(_key) for _key in keys_buffer) + if self._state_dict: + self._state_dict["batch_idx"] += 1 + self._state_dict["num_chunks_since_previous_state"] += len(chunks_buffer) + self._state_dict["cropped_chunk_length"] = cropped_chunk_length + yield new_key, pa.Table.from_batches(chunks_buffer) + keys_buffer = [f"{key}[{cropped_chunk_length}:]"] + chunks_buffer = [chunk.slice(cropped_chunk_length, len(chunk) - cropped_chunk_length)] + chunks_buffer_size = len(chunk) - cropped_chunk_length + if self._state_dict: + self._state_dict["previous_state"] = previous_state + self._state_dict["num_chunks_since_previous_state"] = num_chunks_since_previous_state + if self._state_dict: + previous_state = self.ex_iterable.state_dict() + if not self.drop_last_batch and chunks_buffer: + new_key = "_".join(str(_key) for _key in keys_buffer) + if self._state_dict: + self._state_dict["previous_state"] = previous_state + self._state_dict["batch_idx"] += 1 + self._state_dict["num_chunks_since_previous_state"] = 0 + self._state_dict["cropped_chunk_length"] = 0 + yield new_key, pa.Table.from_batches(chunks_buffer) + + def shuffle_data_sources(self, generator: np.random.Generator) -> "RebatchedArrowExamplesIterable": + return RebatchedArrowExamplesIterable( + self.ex_iterable.shuffle_data_sources(generator), + self.batch_size, + self.drop_last_batch, + self.force_convert_to_arrow, + ) + + def shard_data_sources(self, num_shards: int, index: int, contiguous=True) -> "RebatchedArrowExamplesIterable": + return RebatchedArrowExamplesIterable( + self.ex_iterable.shard_data_sources(num_shards, index, contiguous=contiguous), + self.batch_size, + self.drop_last_batch, + self.force_convert_to_arrow, + ) + + def reshard_data_sources(self) -> "RebatchedArrowExamplesIterable": + return RebatchedArrowExamplesIterable( + self.ex_iterable.reshard_data_sources(), self.batch_size, self.drop_last_batch, self.force_convert_to_arrow + ) + + @property + def num_shards(self) -> int: + return self.ex_iterable.num_shards + + +class SelectColumnsIterable(_BaseExamplesIterable): + def __init__(self, ex_iterable: _BaseExamplesIterable, column_names: list[str]): + super().__init__() + self.ex_iterable = ex_iterable + self.column_names = column_names + + @property + def iter_arrow(self): + if self.ex_iterable.iter_arrow: + return self._iter_arrow + + @property + def is_typed(self): + return self.ex_iterable.is_typed + + @property + def features(self): + return self.ex_iterable.features + + def _init_state_dict(self) -> dict: + self._state_dict = self.ex_iterable._init_state_dict() + return self._state_dict + + def __iter__(self): + for idx, row in self.ex_iterable: + yield idx, {c: row[c] for c in self.column_names} + + def _iter_arrow(self) -> Iterator[tuple[Key, pa.Table]]: + for idx, pa_table in self.ex_iterable.iter_arrow(): + if len(pa_table) > 0: # empty tables have no schema + yield idx, pa_table.select(self.column_names) + + def shuffle_data_sources(self, generator: np.random.Generator) -> "SelectColumnsIterable": + return SelectColumnsIterable(self.ex_iterable.shuffle_data_sources(generator), self.column_names) + + def shard_data_sources(self, num_shards: int, index: int, contiguous=True) -> "SelectColumnsIterable": + return SelectColumnsIterable( + self.ex_iterable.shard_data_sources(num_shards, index, contiguous=contiguous), self.column_names + ) + + def reshard_data_sources(self) -> "SelectColumnsIterable": + return SelectColumnsIterable(self.ex_iterable.reshard_data_sources(), self.column_names) + + @property + def num_shards(self) -> int: + return self.ex_iterable.num_shards + + +class StepExamplesIterable(_BaseExamplesIterable): + def __init__(self, ex_iterable: _BaseExamplesIterable, step: int, offset: int): + super().__init__() + self.ex_iterable = ex_iterable + self.step = step + self.offset = offset + + @property + def iter_arrow(self): + return self._iter_arrow if self.ex_iterable.iter_arrow else None + + @property + def is_typed(self): + return self.ex_iterable.is_typed + + @property + def features(self): + return self.ex_iterable.features + + def _init_state_dict(self) -> dict: + self._state_dict = { + "examples_iterable": self.ex_iterable._init_state_dict(), + "stepped": 0, + "type": self.__class__.__name__, + } + return self._state_dict + + def __iter__(self): + ex_iterator = iter(self.ex_iterable) + while True: + batch = list(islice(ex_iterator, self.step)) + if len(batch) > self.offset: + yield batch[self.offset] + else: + break + + def _iter_arrow(self): + stepped = self._state_dict["stepped"] if self._state_dict else 0 + for key, pa_table in self.ex_iterable.iter_arrow(): + stepped_pa_table = pa_table.take( + pa.array(range((self.offset - stepped) % self.step, len(pa_table), self.step), type=pa.int64()) + ) + stepped = (stepped + len(pa_table)) % self.step + if self._state_dict: + self._state_dict["stepped"] = stepped + yield key, stepped_pa_table + + def shuffle_data_sources(self, generator: np.random.Generator) -> "StepExamplesIterable": + return StepExamplesIterable( + self.ex_iterable.shuffle_data_sources(generator), step=self.step, offset=self.offset + ) + + def shard_data_sources(self, num_shards: int, index: int, contiguous=True) -> "StepExamplesIterable": + return StepExamplesIterable( + self.ex_iterable.shard_data_sources(num_shards, index, contiguous=contiguous), + step=self.step, + offset=self.offset, + ) + + def reshard_data_sources(self) -> "StepExamplesIterable": + return StepExamplesIterable( + self.ex_iterable.reshard_data_sources(), + step=self.step, + offset=self.offset, + ) + + @property + def num_shards(self) -> int: + return self.ex_iterable.num_shards + + +class CyclingMultiSourcesExamplesIterable(_BaseExamplesIterable): + def __init__( + self, + ex_iterables: list[_BaseExamplesIterable], + stopping_strategy: Literal[ + "first_exhausted", "all_exhausted", "all_exhausted_without_replacement" + ] = "first_exhausted", + ): + super().__init__() + self.ex_iterables = ex_iterables + self.stopping_strategy = stopping_strategy + + # if undersampling ("first_exhausted"), we stop as soon as one dataset is exhausted + # if oversampling ("all_exhausted"), we stop as soons as every dataset is exhausted, i.e as soon as every samples of every dataset has been visited at least once + # if sampling without replacement ("all_exhausted_without_replacement"), we stop once all samples of every dataset has been visited exactly once. + self.bool_strategy_func = ( + np.all if (stopping_strategy in ("all_exhausted", "all_exhausted_without_replacement")) else np.any + ) + + @property + def is_typed(self): + return self.ex_iterables[0].is_typed + + @property + def features(self): + return self.ex_iterables[0].features + + @property + def iter_arrow(self): + # iterate on arrow tables if all ex_iterables can iterate + return self._iter_arrow if all(ex_iterable.iter_arrow for ex_iterable in self.ex_iterables) else None + + def _get_indices_iterator(self): + # this is an infinite iterator to keep track of which iterator we want to pick examples from + ex_iterable_idx = self._state_dict["ex_iterable_idx"] if self._state_dict else 0 + for next_ex_iterable_idx in islice(cycle(range(len(self.ex_iterables))), ex_iterable_idx + 1, None): + if self._state_dict: + self._state_dict["ex_iterable_idx"] = next_ex_iterable_idx + yield ex_iterable_idx + ex_iterable_idx = next_ex_iterable_idx + + def _init_state_dict(self) -> dict: + for ex_iterable in self.ex_iterables: + ex_iterable._init_state_dict() + self._state_dict = { + "ex_iterable_idx": 0, + "previous_states": [None] * len(self.ex_iterables), + "is_exhausted": [False] * len(self.ex_iterables), + "type": self.__class__.__name__, + } + return self._state_dict + + def _iter_arrow(self): + # we use this to buffer one example of each iterator to know if an iterator is exhausted + nexts = [None] * len(self.ex_iterables) + # because of that, we need to rewind 1 example when reloading the state dict + if self._state_dict: + for i in range(len(self.ex_iterables)): + if self._state_dict["previous_states"][i] is not None: + self.ex_iterables[i].load_state_dict(self._state_dict["previous_states"][i]) + previous_states = [ex_iterable.state_dict() for ex_iterable in self.ex_iterables] + iterators = [ex_iterable.iter_arrow() for ex_iterable in self.ex_iterables] + + # Pre-populate futures for next samples from each iterator using threads for prefetching + def fetch_next_sample(iterator): + return next(iterator, False) + + # Use ThreadPoolExecutor to fetch next samples in parallel + executor = concurrent.futures.ThreadPoolExecutor(max_workers=len(self.ex_iterables)) + futures = [executor.submit(fetch_next_sample, iterator) for iterator in iterators] + + indices_iterator = self._get_indices_iterator() + + is_exhausted = ( + np.array(self._state_dict["is_exhausted"]) if self._state_dict else np.full(len(self.ex_iterables), False) + ) + try: + for i in indices_iterator: + # if the stopping criteria is met, break the main for loop + if self.bool_strategy_func(is_exhausted): + break + # Skip exhausted iterators if we sample without replacement + if is_exhausted[i] and self.stopping_strategy in ["all_exhausted_without_replacement"]: + continue + # let's pick one example from the iterator at index i + # Resolve the future to get the current sample + if nexts[i] is None: + nexts[i] = futures[i].result() + if self._state_dict: + self._state_dict["previous_states"][i] = previous_states[i] + previous_states[i] = self.ex_iterables[i].state_dict() + futures[i] = executor.submit(fetch_next_sample, iterators[i]) + result = nexts[i] + # Fetch the next sample for this iterator (prefetching) + nexts[i] = futures[i].result() + if self._state_dict: + self._state_dict["previous_states"][i] = previous_states[i] + previous_states[i] = self.ex_iterables[i].state_dict() + + if nexts[i] is not False: + futures[i] = executor.submit(fetch_next_sample, iterators[i]) + else: + # the iterator is exhausted + is_exhausted[i] = True + if self._state_dict: + self._state_dict["is_exhausted"][i] = True + # we reset it in case the stopping criteria isn't met yet + if self.stopping_strategy not in ["all_exhausted_without_replacement"]: + if self._state_dict: + self.ex_iterables[i]._init_state_dict() + previous_states[i] = self.ex_iterables[i].state_dict() + self._state_dict["previous_states"][i] = None + iterators[i] = self.ex_iterables[i].iter_arrow() + nexts[i] = None + futures[i] = executor.submit(fetch_next_sample, iterators[i]) + if result is not False: + yield result + finally: + # Related to https://github.com/apache/arrow/issues/45214 + for future in futures: + future.result() + while iterators: + iterator = iterators.pop() + del iterator + if any(ex_iterable.sleep_on_threads_shutdown for ex_iterable in self.ex_iterables): + time.sleep(config.SLEEP_TIME_ON_THREADS_SHUTDOWN) + + def __iter__(self): + # we use this to buffer one example of each iterator to know if an iterator is exhausted + nexts = [None] * len(self.ex_iterables) + # because of that, we need to rewind 1 example when reloading the state dict + if self._state_dict: + for i in range(len(self.ex_iterables)): + if self._state_dict["previous_states"][i] is not None: + self.ex_iterables[i].load_state_dict(self._state_dict["previous_states"][i]) + previous_states = [ex_iterable.state_dict() for ex_iterable in self.ex_iterables] + iterators = [iter(ex_iterable) for ex_iterable in self.ex_iterables] + + # Pre-populate futures for next samples from each iterator using threads for prefetching + def fetch_next_sample(iterator): + return next(iterator, False) + + # Use ThreadPoolExecutor to fetch next samples in parallel + executor = concurrent.futures.ThreadPoolExecutor(max_workers=len(self.ex_iterables)) + futures = [executor.submit(fetch_next_sample, iterator) for iterator in iterators] + + indices_iterator = self._get_indices_iterator() + + is_exhausted = ( + np.array(self._state_dict["is_exhausted"]) if self._state_dict else np.full(len(self.ex_iterables), False) + ) + try: + for i in indices_iterator: + # if the stopping criteria is met, break the main for loop + if self.bool_strategy_func(is_exhausted): + break + # Skip exhausted iterators if we sample without replacement + if is_exhausted[i] and self.stopping_strategy in ["all_exhausted_without_replacement"]: + continue + # let's pick one example from the iterator at index i + # Resolve the future to get the current sample + if nexts[i] is None: + nexts[i] = futures[i].result() + if self._state_dict: + self._state_dict["previous_states"][i] = previous_states[i] + previous_states[i] = self.ex_iterables[i].state_dict() + futures[i] = executor.submit(fetch_next_sample, iterators[i]) + result = nexts[i] + # Fetch the next sample for this iterator (prefetching) + nexts[i] = futures[i].result() + if self._state_dict: + self._state_dict["previous_states"][i] = previous_states[i] + previous_states[i] = self.ex_iterables[i].state_dict() + + if nexts[i] is not False: + futures[i] = executor.submit(fetch_next_sample, iterators[i]) + else: + # the iterator is exhausted + is_exhausted[i] = True + if self._state_dict: + self._state_dict["is_exhausted"][i] = True + # we reset it in case the stopping criteria isn't met yet + if self.stopping_strategy not in ["all_exhausted_without_replacement"]: + if self._state_dict: + self.ex_iterables[i]._init_state_dict() + previous_states[i] = self.ex_iterables[i].state_dict() + self._state_dict["previous_states"][i] = None + iterators[i] = iter(self.ex_iterables[i]) + nexts[i] = None + futures[i] = executor.submit(fetch_next_sample, iterators[i]) + if result is not False: + yield result + finally: + # Related to https://github.com/apache/arrow/issues/45214 + for future in futures: + future.result() + while iterators: + iterator = iterators.pop() + del iterator + executor.shutdown(wait=True) + if any(ex_iterable.sleep_on_threads_shutdown for ex_iterable in self.ex_iterables): + time.sleep(config.SLEEP_TIME_ON_THREADS_SHUTDOWN) + + def shuffle_data_sources(self, generator: np.random.Generator) -> "CyclingMultiSourcesExamplesIterable": + """Shuffle each underlying examples iterable.""" + ex_iterables = [ex_iterable.shuffle_data_sources(generator) for ex_iterable in self.ex_iterables] + return CyclingMultiSourcesExamplesIterable(ex_iterables, self.stopping_strategy) + + @property + def num_shards(self) -> int: + return min(ex_iterable.num_shards for ex_iterable in self.ex_iterables) if self.ex_iterables else 0 + + def shard_data_sources( + self, num_shards: int, index: int, contiguous=True + ) -> "CyclingMultiSourcesExamplesIterable": + """Either keep only the requested shard, or propagate the request to the underlying iterable.""" + if num_shards < self.num_shards: + return CyclingMultiSourcesExamplesIterable( + [ + iterable.shard_data_sources(num_shards, index, contiguous=contiguous) + for iterable in self.ex_iterables + ], + stopping_strategy=self.stopping_strategy, + ) + elif index < self.num_shards: + return CyclingMultiSourcesExamplesIterable( + [ + iterable.shard_data_sources(self.num_shards, index, contiguous=contiguous) + for iterable in self.ex_iterables + ], + stopping_strategy=self.stopping_strategy, + ) + else: + return CyclingMultiSourcesExamplesIterable( + [], + stopping_strategy=self.stopping_strategy, + ) + + def reshard_data_sources(self) -> "CyclingMultiSourcesExamplesIterable": + return CyclingMultiSourcesExamplesIterable( + [iterable.reshard_data_sources() for iterable in self.ex_iterables], + stopping_strategy=self.stopping_strategy, + ) + + +class VerticallyConcatenatedMultiSourcesExamplesIterable(_BaseExamplesIterable): + """ + VerticallyConcatenatedMultiSourcesExamplesIterable simply chains the input iterables. + It doesn't require the examples iterables to always yield the same columns. + Instead, this is handled by the `IterableDataset` class or `FormattedExamplesIterable`. + + For information, `IterableDataset` merges the features of all the datasets to concatenate into one. + We use `IterableDataset._resolve_features` to obtain the features of all the datasets to concatenate. + + Then for each example, `IterableDataset` and `FormattedExamplesIterable` automatically fill missing columns with None. + This is done with `_apply_feature_types_on_example`. + """ + + def __init__(self, ex_iterables: list[_BaseExamplesIterable]): + super().__init__() + self.ex_iterables = ex_iterables + + @property + def is_typed(self): + return self.ex_iterables[0].is_typed + + @property + def features(self): + return self.ex_iterables[0].features + + @property + def iter_arrow(self): + if all(ex_iterable.iter_arrow is not None for ex_iterable in self.ex_iterables): + return self._iter_arrow + + def _init_state_dict(self) -> dict: + self._state_dict = { + "ex_iterable_idx": 0, + "ex_iterables": [ex_iterable._init_state_dict() for ex_iterable in self.ex_iterables], + "type": self.__class__.__name__, + } + return self._state_dict + + def __iter__(self): + ex_iterable_idx_start = self._state_dict["ex_iterable_idx"] if self._state_dict else 0 + for ex_iterable in islice(self.ex_iterables, ex_iterable_idx_start, None): + yield from ex_iterable + if self._state_dict: + self._state_dict["ex_iterable_idx"] += 1 + + def _iter_arrow(self): + ex_iterable_idx_start = self._state_dict["ex_iterable_idx"] if self._state_dict else 0 + for ex_iterable in islice(self.ex_iterables, ex_iterable_idx_start, None): + yield from ex_iterable.iter_arrow() + if self._state_dict: + self._state_dict["ex_iterable_idx"] += 1 + + def shuffle_data_sources( + self, generator: np.random.Generator + ) -> "VerticallyConcatenatedMultiSourcesExamplesIterable": + """Shuffle all shards.""" + rng = deepcopy(generator) + single_shard_ex_iterables = [ + ex_iterable.shard_data_sources(num_shards=ex_iterable.num_shards, index=index) + for ex_iterable in self.ex_iterables + for index in range(ex_iterable.num_shards) + ] + rng.shuffle(single_shard_ex_iterables) + return VerticallyConcatenatedMultiSourcesExamplesIterable(single_shard_ex_iterables) + + @property + def num_shards(self) -> int: + return sum(ex_iterable.num_shards for ex_iterable in self.ex_iterables) + + def shard_data_sources( + self, num_shards: int, index: int, contiguous=True + ) -> "VerticallyConcatenatedMultiSourcesExamplesIterable": + """Keep only the requested shard""" + single_shard_ex_iterables = [ + ex_iterable.shard_data_sources(num_shards=ex_iterable.num_shards, index=index) + for ex_iterable in self.ex_iterables + for index in range(ex_iterable.num_shards) + ] + shard_indices = self.split_shard_indices_by_worker(num_shards, index, contiguous=contiguous) + return VerticallyConcatenatedMultiSourcesExamplesIterable( + [single_shard_ex_iterables[i] for i in shard_indices] + ) + + def reshard_data_sources(self) -> "VerticallyConcatenatedMultiSourcesExamplesIterable": + return VerticallyConcatenatedMultiSourcesExamplesIterable( + [iterable.reshard_data_sources() for iterable in self.ex_iterables] + ) + + +def _check_column_names(column_names: list[str]): + """Check the column names to make sure they don't contain duplicates.""" + counter = Counter(column_names) + if not all(count == 1 for count in counter.values()): + duplicated_columns = [col for col in counter if counter[col] > 1] + raise ValueError( + f"The examples iterables can't have duplicated columns but columns {duplicated_columns} are duplicated." + ) + + +class HorizontallyConcatenatedMultiSourcesExamplesIterable(_BaseExamplesIterable): + """ + HorizontallyConcatenatedMultiSourcesExamplesIterable merges examples together for the input list of iterables. + It also checks that there are no duplicate columns (otherwise we don't know which one to keep). + This check is done once when yielding the first example. + + However it doesn't fill missing columns with None. + Instead, this is handled by the `IterableDataset` class or `FormattedExamplesIterable`. + + For information, `IterableDataset` merges the features of all the datasets to concatenate into one. + We use `IterableDataset._resolve_features` to obtain the features of all the datasets to concatenate. + + Then for each example, `IterableDataset` and `FormattedExamplesIterable` automatically fill missing columns with None. + This is done with `_apply_feature_types_on_example`. + """ + + def __init__(self, ex_iterables: list[_BaseExamplesIterable]): + super().__init__() + self.ex_iterables = ex_iterables + + @property + def iter_arrow(self): + return ( + self._iter_arrow + if all( + isinstance(ex_iterable, RebatchedArrowExamplesIterable) and ex_iterable.ex_iterable.iter_arrow + for ex_iterable in self.ex_iterables + ) + or (len(self.ex_iterables) < 2 and all(ex_iterable.iter_arrow for ex_iterable in self.ex_iterables)) + else None + ) + + @property + def is_typed(self): + return self.ex_iterables[0].is_typed + + @property + def features(self): + return self.ex_iterables[0].features + + def _init_state_dict(self) -> dict: + self._state_dict = { + "ex_iterables": [ex_iterable._init_state_dict() for ex_iterable in self.ex_iterables], + "type": self.__class__.__name__, + } + return self._state_dict + + def __iter__(self): + ex_iterators = [iter(ex_iterable) for ex_iterable in self.ex_iterables] + for i in itertools.count(): + keys = [] + examples = [] + for ex_iterator in list(ex_iterators): + try: + key, example = next(ex_iterator) + keys.append(key) + examples.append(example) + except StopIteration: + ex_iterators.remove(ex_iterator) + if ex_iterators: + if i == 0: + _check_column_names([column_name for example in examples for column_name in example]) + new_example = {} + for example in examples: + new_example.update(example) + new_key = "_".join(str(key) for key in keys) + yield new_key, new_example + else: + break + + def _iter_arrow(self): + pa_table_iterators = [iter(ex_iterable.iter_arrow()) for ex_iterable in self.ex_iterables] + for i in itertools.count(): + keys = [] + pa_tables = [] + for pa_table_iterator in list(pa_table_iterators): + try: + key, pa_table = next(pa_table_iterator) + keys.append(key) + pa_tables.append(pa_table) + except StopIteration: + pa_table_iterators.remove(pa_table_iterator) + if pa_table_iterators: + if i == 0: + _check_column_names( + [column_name for pa_table in pa_tables for column_name in pa_table.column_names] + ) + for j, table in enumerate(pa_tables): + if j == 0: + new_pa_table = table + else: + for name, col in zip(table.column_names, table.columns): + new_pa_table = pa_table.append_column(name, col) + new_key = "_".join(str(key) for key in keys) + yield new_key, new_pa_table + else: + break + + def shuffle_data_sources( + self, generator: np.random.Generator + ) -> "HorizontallyConcatenatedMultiSourcesExamplesIterable": + """Doesn't shuffle the wrapped examples iterable since it would break the alignment between them.""" + return self + + @property + def num_shards(self) -> int: + return 1 + + def shard_data_sources( + self, num_shards: int, index: int, contiguous=True + ) -> "HorizontallyConcatenatedMultiSourcesExamplesIterable": + """Doesn't shard the wrapped examples iterable since it would break the alignment between them.""" + return self + + def reshard_data_sources(self) -> "HorizontallyConcatenatedMultiSourcesExamplesIterable": + """Doesn't reshard the wrapped examples iterable since it would break the alignment between them.""" + return self + + +class RandomlyCyclingMultiSourcesExamplesIterable(CyclingMultiSourcesExamplesIterable): + def __init__( + self, + ex_iterables: list[_BaseExamplesIterable], + generator: np.random.Generator, + probabilities: Optional[list[float]] = None, + stopping_strategy: Literal[ + "first_exhausted", "all_exhausted", "all_exhausted_without_replacement" + ] = "first_exhausted", + ): + super().__init__(ex_iterables, stopping_strategy) + self.generator = deepcopy(generator) + self.probabilities = probabilities + + def shift_rngs(self, value: int) -> "_BaseExamplesIterable": + rng = deepcopy(self.generator) + new_seed = rng.integers(0, 1 << 63) - value + return RandomlyCyclingMultiSourcesExamplesIterable( + ex_iterables=self.ex_iterables, + generator=np.random.default_rng(seed=new_seed), + probabilities=self.probabilities, + stopping_strategy=self.stopping_strategy, + ) + + @property + def is_typed(self): + return self.ex_iterables[0].is_typed + + @property + def features(self): + return self.ex_iterables[0].features + + def _get_indices_iterator(self): + rng = deepcopy(self.generator) + num_sources = len(self.ex_iterables) + random_batch_size = 1000 + # this is an infinite iterator that randomly samples the index of the source to pick examples from + index_offset = self._state_dict["bit_generator_index_offset"] if self._state_dict else 0 + if self._state_dict: + rng.bit_generator.state = self._state_dict["bit_generator_state"] + if self.probabilities is None: + while True: + for i in islice(rng.integers(0, num_sources, size=random_batch_size), index_offset, None): + index_offset = (index_offset + 1) % random_batch_size + if self._state_dict: + self._state_dict["bit_generator_index_offset"] = index_offset + if index_offset == 0: + self._state_dict["bit_generator_state"] = rng.bit_generator.state + yield int(i) + else: + while True: + for i in islice( + rng.choice(num_sources, size=random_batch_size, p=self.probabilities), index_offset, None + ): + index_offset = (index_offset + 1) % random_batch_size + if self._state_dict: + self._state_dict["bit_generator_index_offset"] = index_offset + if index_offset == 0: + self._state_dict["bit_generator_state"] = rng.bit_generator.state + yield int(i) + + def _init_state_dict(self) -> dict: + for ex_iterable in self.ex_iterables: + ex_iterable._init_state_dict() + self._state_dict = { + "bit_generator_state": self.generator.bit_generator.state, + "bit_generator_index_offset": 0, + "previous_states": [None] * len(self.ex_iterables), + "is_exhausted": [False] * len(self.ex_iterables), + "type": self.__class__.__name__, + } + return self._state_dict + + def shuffle_data_sources(self, generator: np.random.Generator) -> "RandomlyCyclingMultiSourcesExamplesIterable": + """Shuffle the data sources of each wrapped examples iterable.""" + ex_iterables = [ex_iterable.shuffle_data_sources(generator) for ex_iterable in self.ex_iterables] + return RandomlyCyclingMultiSourcesExamplesIterable( + ex_iterables, + generator=generator, + probabilities=self.probabilities, + stopping_strategy=self.stopping_strategy, + ) + + def shard_data_sources( + self, num_shards: int, index: int, contiguous=True + ) -> "RandomlyCyclingMultiSourcesExamplesIterable": + """Either keep only the requested shard, or propagate the request to the underlying iterable.""" + if num_shards < self.num_shards: + return RandomlyCyclingMultiSourcesExamplesIterable( + [ + iterable.shard_data_sources(num_shards, index, contiguous=contiguous) + for iterable in self.ex_iterables + ], + self.generator, + self.probabilities, + self.stopping_strategy, + ) + elif index < self.num_shards: + return RandomlyCyclingMultiSourcesExamplesIterable( + [ + iterable.shard_data_sources(self.num_shards, index, contiguous=contiguous) + for iterable in self.ex_iterables + ], + self.generator, + self.probabilities, + self.stopping_strategy, + ) + else: + return RandomlyCyclingMultiSourcesExamplesIterable( + [], + self.generator, + self.probabilities, + self.stopping_strategy, + ) + + def reshard_data_sources(self) -> "RandomlyCyclingMultiSourcesExamplesIterable": + """Either keep only the requested shard, or propagate the request to the underlying iterable.""" + return RandomlyCyclingMultiSourcesExamplesIterable( + [iterable.reshard_data_sources() for iterable in self.ex_iterables], + self.generator, + self.probabilities, + self.stopping_strategy, + ) + + +def _table_output_to_arrow(output) -> pa.Table: + if isinstance(output, pa.Table): + return output + if isinstance(output, (pd.DataFrame, pd.Series)): + return pa.Table.from_pandas(output) + if config.POLARS_AVAILABLE and "polars" in sys.modules: + import polars as pl + + if isinstance(output, (pl.DataFrame, pl.Series)): + return output.to_arrow() + return output + + +class MappedExamplesIterable(_BaseExamplesIterable): + def __init__( + self, + ex_iterable: _BaseExamplesIterable, + function: Callable, + with_indices: bool = False, + input_columns: Optional[list[str]] = None, + batched: bool = False, + batch_size: Optional[int] = 1000, + drop_last_batch: bool = False, + remove_columns: Optional[list[str]] = None, + fn_kwargs: Optional[dict] = None, + formatting: Optional["FormattingConfig"] = None, + features: Optional[Features] = None, + max_num_running_async_map_functions_in_parallel: Optional[int] = None, + is_batch_accumulate_arrow_table_function: bool = False, + ): + super().__init__() + self.ex_iterable = ex_iterable + self.function = function + self.batched = batched + self.batch_size = batch_size + self.drop_last_batch = drop_last_batch + self.remove_columns = remove_columns + self.with_indices = with_indices + self.input_columns = input_columns + self.fn_kwargs = fn_kwargs or {} + self.formatting = formatting # required for iter_arrow + self._features = features + self.max_num_running_async_map_functions_in_parallel = ( + max_num_running_async_map_functions_in_parallel or config.MAX_NUM_RUNNING_ASYNC_MAP_FUNCTIONS_IN_PARALLEL + ) + self.is_batch_accumulate_arrow_table_function = is_batch_accumulate_arrow_table_function + # sanity checks + if formatting and formatting.is_table: + # batch_size should match for iter_arrow + if not isinstance(ex_iterable, RebatchedArrowExamplesIterable): + raise ValueError( + f"The {formatting.format_type.capitalize()}-formatted {type(self).__name__} has underlying iterable " + f"that is a {type(ex_iterable).__name__} instead of a RebatchedArrowExamplesIterable." + ) + elif not ex_iterable.iter_arrow: + raise ValueError( + f"The {formatting.format_type.capitalize()}-formatted {type(self).__name__} has underlying iterable " + f"that is a {type(ex_iterable).__name__} but doesnt' implement iter_arrow(), a possible fix could be " + "to use RebatchedArrowExamplesIterable(..., force_convert_to_arrow=True)." + ) + elif ex_iterable.batch_size != (batch_size if batched else 1): + raise ValueError( + f"The {formatting.format_type.capitalize()}-formatted {type(self).__name__} has batch_size={batch_size if batched else 1} which is " + f"different from {ex_iterable.batch_size=} from its underlying iterable." + ) + # to enable graceful ends + self._owned_loops_and_tasks: list[tuple[asyncio.AbstractEventLoop, list[asyncio.Task]]] = [] + + @property + def iter_arrow(self): + if self.formatting and self.formatting.is_table: + return self._iter_arrow + + @property + def is_typed(self): + return self.features is not None # user has extracted features + + @property + def features(self): + return self._features + + def _init_state_dict(self) -> dict: + self._state_dict = { + "examples_iterable": self.ex_iterable._init_state_dict(), + "previous_state": None, + "num_examples_since_previous_state": 0, + "previous_state_example_idx": 0, + "type": self.__class__.__name__, + } + return self._state_dict + + def __iter__(self): + if self.formatting and self.formatting.is_table: + formatter = PythonFormatter() + for key, pa_table in self._iter_arrow(max_chunksize=1): + yield key, formatter.format_row(pa_table) + else: + yield from self._iter() + + def _iter(self): + current_idx = self._state_dict["previous_state_example_idx"] if self._state_dict else 0 + if self._state_dict and self._state_dict["previous_state"]: + self.ex_iterable.load_state_dict(self._state_dict["previous_state"]) + num_examples_to_skip = self._state_dict["num_examples_since_previous_state"] + else: + num_examples_to_skip = 0 + iterator = iter(self.ex_iterable) + + # We use the same logic as in Dataset.map, but with less features/formatting + # since they're handled by FormattedExamplesIterable + + if self.formatting: + formatter = get_formatter(self.formatting.format_type) + format_dict = formatter.recursive_tensorize if isinstance(formatter, TensorFormatter) else None + else: + format_dict = None + + def iter_batched_inputs(): + nonlocal current_idx + for key, example in iterator: + # If `batched`, first build the batch, if `batch_size` is None or <=0, then the batch is the whole dataset + iterator_batch = ( + iterator + if self.batch_size is None or self.batch_size <= 0 + else islice(iterator, self.batch_size - 1) + ) + key_examples_list = [(key, example)] + list(iterator_batch) + keys, examples = zip(*key_examples_list) + # the new key is the concatenation of the examples keys from the batch + key = "_".join(str(key) for key in keys) + if ( + self.drop_last_batch + and self.batch_size is not None + and self.batch_size > 0 + and len(examples) < self.batch_size + ): # ignore last batch + return + batch = _examples_to_batch(examples) + # we need to format here in case we need to stack tensors together + batch = format_dict(batch) if format_dict else batch + indices = [current_idx + i for i in range(len(key_examples_list))] + current_idx += len(indices) + yield indices, (key, batch) + + def iter_inputs(): + nonlocal current_idx + for key, example in iterator: + # If not batched, we can apply the transform and yield the example directly + # first copy the example, since we might drop some keys + example = dict(example) + # no need to do formatting here + current_idx += 1 + yield current_idx - 1, (key, example) + + def validate_function_output(processed_inputs): + if self.batched and processed_inputs: + first_col = next(iter(processed_inputs)) + bad_cols = [ + col for col in processed_inputs if len(processed_inputs[col]) != len(processed_inputs[first_col]) + ] + if bad_cols: + raise ValueError( + f"Column lengths mismatch: columns {bad_cols} have length {[len(processed_inputs[col]) for col in bad_cols]} " + f"while {first_col} has length {len(processed_inputs[first_col])}." + ) + + def prepare_inputs(key_example, indices): + key, example = key_example + fn_args = [example] if self.input_columns is None else [example[col] for col in self.input_columns] + additional_args = () + if self.with_indices: + fn_args += (indices,) + inputs = dict(example) + return inputs, fn_args, additional_args, self.fn_kwargs + + def prepare_outputs(key_example, inputs, processed_inputs): + validate_function_output(processed_inputs) + # this logic mimics the one in Dataset.map + if self.remove_columns: + for c in self.remove_columns: + if c in inputs: + del inputs[c] + if processed_inputs is key_example[1] and c in processed_inputs: + del processed_inputs[c] + transformed_inputs = {**inputs, **processed_inputs} + # no need to do features decoding here + return transformed_inputs + + def apply_function(key_example, indices): + """Utility to apply the function on a selection of columns.""" + inputs, fn_args, additional_args, fn_kwargs = prepare_inputs(key_example, indices) + processed_inputs = self.function(*fn_args, *additional_args, **fn_kwargs) + return prepare_outputs(key_example, inputs, processed_inputs) + + async def async_apply_function(key_example, indices): + """Utility to apply the function on a selection of columns. Same code but async""" + inputs, fn_args, additional_args, fn_kwargs = prepare_inputs(key_example, indices) + processed_inputs = await self.function(*fn_args, *additional_args, **fn_kwargs) + return prepare_outputs(key_example, inputs, processed_inputs) + + tasks: list[asyncio.Task] = [] + if inspect.iscoroutinefunction(self.function): + try: + loop = asyncio.get_running_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + self._owned_loops_and_tasks.append((loop, tasks)) + else: + loop = None + + def iter_outputs(): + nonlocal tasks, loop + inputs_iterator = iter_batched_inputs() if self.batched else iter_inputs() + if inspect.iscoroutinefunction(self.function): + if self._state_dict: + previous_state = self.ex_iterable.state_dict() + self._state_dict["previous_state"] = previous_state + previous_state_task = None + previous_state_example_idx = self._state_dict["previous_state_example_idx"] + indices: Union[list[int], list[list[int]]] = [] + for i, key_example in inputs_iterator: + indices.append(i) + tasks.append(loop.create_task(async_apply_function(key_example, i))) + # keep the total active tasks under a certain number + if len(tasks) >= self.max_num_running_async_map_functions_in_parallel: + done, pending = loop.run_until_complete( + asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) + ) + while tasks and len(pending) >= self.max_num_running_async_map_functions_in_parallel: + done, pending = loop.run_until_complete( + asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) + ) + if len(tasks) >= 10 * self.max_num_running_async_map_functions_in_parallel: + loop.run_until_complete(tasks[0]) + # yield finished tasks + while tasks and tasks[0].done(): + i, task = indices.pop(0), tasks.pop(0) + yield i, task.result() + if self._state_dict and task is previous_state_task: + self._state_dict["previous_state"] = previous_state + self._state_dict["num_examples_since_previous_state"] = 0 + self._state_dict["previous_state_example_idx"] = previous_state_example_idx + previous_state, previous_state_task = None, None + # checkpoint + if self._state_dict and previous_state_task is None and tasks: + previous_state = self.ex_iterable.state_dict() + previous_state_task = tasks[-1] + previous_state_example_idx = current_idx + while tasks: + yield indices[0], loop.run_until_complete(tasks[0]) + indices.pop(0), tasks.pop(0) + else: + if self._state_dict: + if self.batched: + self._state_dict["previous_state"] = self.ex_iterable.state_dict() + self._state_dict["num_examples_since_previous_state"] = 0 + self._state_dict["previous_state_example_idx"] = current_idx + for i, key_example in inputs_iterator: + if self._state_dict: + if not self.batched: + self._state_dict["previous_state_example_idx"] = current_idx + yield i, apply_function(key_example, i) + if self._state_dict: + if self.batched: + self._state_dict["previous_state"] = self.ex_iterable.state_dict() + self._state_dict["num_examples_since_previous_state"] = 0 + self._state_dict["previous_state_example_idx"] = current_idx + + try: + outputs = iter_outputs() + if self.batched: + outputs = ( + (key, transformed_example) + for key, transformed_batch in outputs + for transformed_example in _batch_to_examples(transformed_batch) + ) + for key, transformed_example in outputs: + if self._state_dict and self._state_dict["previous_state"] is not None: + self._state_dict["num_examples_since_previous_state"] += 1 + if num_examples_to_skip > 0: + num_examples_to_skip -= 1 + continue + yield key, transformed_example + except (Exception, KeyboardInterrupt): + if loop: + logger.debug(f"Canceling {len(tasks)} async tasks.") + for task in tasks: + task.cancel(msg="KeyboardInterrupt") + try: + loop.run_until_complete(asyncio.gather(*tasks)) + except (asyncio.CancelledError, ValueError): + logger.debug("Tasks canceled.") + raise + + def _iter_arrow(self, max_chunksize: Optional[int] = None) -> Iterator[tuple[Key, pa.Table]]: + formatter: TableFormatter = get_formatter(self.formatting.format_type) if self.formatting else ArrowFormatter() + if self.ex_iterable.iter_arrow: + iterator = self.ex_iterable.iter_arrow() + else: + iterator = _convert_to_arrow( + self.ex_iterable, + batch_size=self.batch_size if self.batched else 1, + drop_last_batch=self.drop_last_batch, + ) + if self._state_dict and self._state_dict["previous_state"]: + self.ex_iterable.load_state_dict(self._state_dict["previous_state"]) + num_examples_to_skip = self._state_dict["num_examples_since_previous_state"] + else: + num_examples_to_skip = 0 + if self._state_dict and max_chunksize is not None: + self._state_dict["previous_state"] = self.ex_iterable.state_dict() + self._state_dict["num_examples_since_previous_state"] = 0 + current_idx = self._state_dict["previous_state_example_idx"] if self._state_dict else 0 + fn_kwargs = self.fn_kwargs.copy() + if self.is_batch_accumulate_arrow_table_function: + tables_accumulator: list[pa.Table] = [] + length: Optional[int] = None + fn_kwargs["tables_accumulator"] = tables_accumulator + fn_kwargs["length"] = length + for key, pa_table in iterator: + if ( + self.batched + and self.batch_size is not None + and len(pa_table) < self.batch_size + and self.drop_last_batch + ): + return + # first build the batch + function_args = ( + [formatter.format_batch(pa_table)] + if self.input_columns is None + else [pa_table[col] for col in self.input_columns] + ) + if self.with_indices: + if self.batched: + function_args.append([current_idx + i for i in range(len(pa_table))]) + else: + function_args.append(current_idx) + # then apply the transform + output = self.function(*function_args, **fn_kwargs) + output_table = _table_output_to_arrow(output) + if not isinstance(output_table, pa.Table): + raise TypeError( + f"Provided `function` which is applied to {formatter.table_type} returns a variable of type " + f"{type(output)}. Make sure provided `function` returns a {formatter.table_type} to update the dataset." + ) + # we don't need to merge results for consistency with Dataset.map which merges iif both input and output are dicts + # then remove the unwanted columns + if self.remove_columns: + for column in self.remove_columns: + if column in output_table.column_names: + output_table = output_table.remove_column(output_table.column_names.index(column)) + # return output + if max_chunksize is None: + current_idx += len(pa_table) + if self._state_dict: + self._state_dict["previous_state_example_idx"] += len(pa_table) + yield key, output_table + else: + for i, pa_subtable in enumerate(output_table.to_reader(max_chunksize=max_chunksize)): + current_idx += 1 + if self._state_dict: + self._state_dict["num_examples_since_previous_state"] += 1 + if num_examples_to_skip > 0: + num_examples_to_skip -= 1 + continue + yield f"{key}_{i}", pa_subtable + if self._state_dict: + self._state_dict["previous_state"] = self.ex_iterable.state_dict() + self._state_dict["num_examples_since_previous_state"] = 0 + self._state_dict["previous_state_example_idx"] = current_idx + if self.is_batch_accumulate_arrow_table_function and tables_accumulator: + pa_table = tables_accumulator.pop(-1) + indices = [current_idx + i for i in range(len(pa_table))] + function_args = (pa_table, indices) + output_table = self.function( + *function_args, **self.fn_kwargs, tables_accumulator=tables_accumulator, length=indices[-1] + 1 + ) + yield "last_batch_from_tables_accumulator", output_table + + def shuffle_data_sources(self, generator: np.random.Generator) -> "MappedExamplesIterable": + """Shuffle the wrapped examples iterable.""" + return MappedExamplesIterable( + self.ex_iterable.shuffle_data_sources(generator), + function=self.function, + with_indices=self.with_indices, + input_columns=self.input_columns, + batched=self.batched, + batch_size=self.batch_size, + drop_last_batch=self.drop_last_batch, + remove_columns=self.remove_columns, + fn_kwargs=self.fn_kwargs, + formatting=self.formatting, + features=self.features, + max_num_running_async_map_functions_in_parallel=self.max_num_running_async_map_functions_in_parallel, + is_batch_accumulate_arrow_table_function=self.is_batch_accumulate_arrow_table_function, + ) + + def shard_data_sources(self, num_shards: int, index: int, contiguous=True) -> "MappedExamplesIterable": + """Keep only the requested shard.""" + return MappedExamplesIterable( + self.ex_iterable.shard_data_sources(num_shards, index, contiguous=contiguous), + function=self.function, + with_indices=self.with_indices, + input_columns=self.input_columns, + batched=self.batched, + batch_size=self.batch_size, + drop_last_batch=self.drop_last_batch, + remove_columns=self.remove_columns, + fn_kwargs=self.fn_kwargs, + formatting=self.formatting, + features=self.features, + max_num_running_async_map_functions_in_parallel=self.max_num_running_async_map_functions_in_parallel, + is_batch_accumulate_arrow_table_function=self.is_batch_accumulate_arrow_table_function, + ) + + def reshard_data_sources(self) -> "MappedExamplesIterable": + return MappedExamplesIterable( + self.ex_iterable.reshard_data_sources(), + function=self.function, + with_indices=self.with_indices, + input_columns=self.input_columns, + batched=self.batched, + batch_size=self.batch_size, + drop_last_batch=self.drop_last_batch, + remove_columns=self.remove_columns, + fn_kwargs=self.fn_kwargs, + formatting=self.formatting, + features=self.features, + max_num_running_async_map_functions_in_parallel=self.max_num_running_async_map_functions_in_parallel, + is_batch_accumulate_arrow_table_function=self.is_batch_accumulate_arrow_table_function, + ) + + @property + def num_shards(self) -> int: + return self.ex_iterable.num_shards + + +def _add_mask( + input: Union[dict, pa.Table], + mask: Union[bool, list, pa.Array, pa.ChunkedArray, pa.BooleanScalar], + mask_column_name: str, +): + if isinstance(input, pa.Table): + if not isinstance(mask, (list, pa.Array, pa.ChunkedArray)): + mask = pa.array([mask], type=pa.bool_()) + return input.append_column(mask_column_name, mask) + else: + return {mask_column_name: mask} + + +def add_mask(mask_function: Callable, input: Union[dict, pa.Table], *args, mask_column_name: str, **kwargs): + mask = mask_function(input, *args, **kwargs) + return _add_mask(input, mask, mask_column_name) + + +async def async_add_mask( + mask_function: Callable, input: Union[dict, pa.Table], *args, mask_column_name: str, **kwargs +): + mask = await mask_function(input, *args, **kwargs) + return _add_mask(input, mask, mask_column_name) + + +class FilteredExamplesIterable(MappedExamplesIterable): + mask_column_name = "===MASK===" + + def __init__( + self, + ex_iterable: _BaseExamplesIterable, + function: Callable, + with_indices: bool = False, + input_columns: Optional[list[str]] = None, + batched: bool = False, + batch_size: Optional[int] = 1000, + fn_kwargs: Optional[dict] = None, + formatting: Optional["FormattingConfig"] = None, + ): + self.mask_function = function + if ex_iterable.is_typed: + features = Features({**ex_iterable.features, self.mask_column_name: Value("bool")}) + else: + features = None + super().__init__( + ex_iterable=ex_iterable, + function=partial( + async_add_mask if inspect.iscoroutinefunction(function) else add_mask, + function, + mask_column_name=self.mask_column_name, + ), + with_indices=with_indices, + input_columns=input_columns, + batched=batched, + batch_size=batch_size, + fn_kwargs=fn_kwargs, + formatting=formatting, + features=features, + ) + + def _iter(self): + for key, example in super()._iter(): + example = dict(example) + if example.pop(self.mask_column_name): + yield key, example + + def _iter_arrow(self, max_chunksize: Optional[int] = None): + for key, pa_table in super()._iter_arrow(max_chunksize=max_chunksize): + mask = pa_table[self.mask_column_name] + yield key, pa_table.drop(self.mask_column_name).filter(mask) + + def shuffle_data_sources(self, seed: Optional[int]) -> "FilteredExamplesIterable": + """Shuffle the wrapped examples iterable.""" + return FilteredExamplesIterable( + self.ex_iterable.shuffle_data_sources(seed), + function=self.mask_function, + with_indices=self.with_indices, + input_columns=self.input_columns, + batched=self.batched, + batch_size=self.batch_size, + fn_kwargs=self.fn_kwargs, + formatting=self.formatting, + ) + + def shard_data_sources(self, num_shards: int, index: int, contiguous=True) -> "FilteredExamplesIterable": + """Keep only the requested shard.""" + return FilteredExamplesIterable( + self.ex_iterable.shard_data_sources(num_shards, index, contiguous=contiguous), + function=self.mask_function, + with_indices=self.with_indices, + input_columns=self.input_columns, + batched=self.batched, + batch_size=self.batch_size, + fn_kwargs=self.fn_kwargs, + formatting=self.formatting, + ) + + def reshard_data_sources(self) -> "FilteredExamplesIterable": + return FilteredExamplesIterable( + self.ex_iterable.reshard_data_sources(), + function=self.mask_function, + with_indices=self.with_indices, + input_columns=self.input_columns, + batched=self.batched, + batch_size=self.batch_size, + fn_kwargs=self.fn_kwargs, + formatting=self.formatting, + ) + + @property + def num_shards(self) -> int: + return self.ex_iterable.num_shards + + +class BufferShuffledExamplesIterable(_BaseExamplesIterable): + def __init__(self, ex_iterable: _BaseExamplesIterable, buffer_size: int, generator: np.random.Generator): + super().__init__() + self.ex_iterable = ex_iterable + self.buffer_size = buffer_size + self.generator = generator + + def shift_rngs(self, value: int) -> "_BaseExamplesIterable": + rng = deepcopy(self.generator) + new_seed = rng.integers(0, 1 << 63) - value + return BufferShuffledExamplesIterable( + ex_iterable=self.ex_iterable, + buffer_size=self.buffer_size, + generator=np.random.default_rng(seed=new_seed), + ) + + @property + def is_typed(self): + return self.ex_iterable.is_typed + + @property + def features(self): + return self.ex_iterable.features + + @property + def iter_arrow(self): + return self._iter_arrow if self.ex_iterable.iter_arrow else None + + def _init_state_dict(self) -> dict: + self._state_dict = self.ex_iterable._init_state_dict() + self._original_state_dict = self.state_dict() + return self._state_dict + + def load_state_dict(self, state_dict: dict) -> dict: + if self._state_dict: + if state_dict != self._original_state_dict: + logger.warning( + "Loading a state dict of a shuffle buffer of a dataset without the buffer content." + "The shuffle buffer will be refilled before starting to yield new examples." + ) + return super().load_state_dict(state_dict) + + @staticmethod + def _iter_random_indices(rng: np.random.Generator, buffer_size: int, random_batch_size=1000) -> Iterator[int]: + while True: + yield from (int(i) for i in rng.integers(0, buffer_size, size=random_batch_size)) + + def __iter__(self): + buffer_size = self.buffer_size + rng = deepcopy(self.generator) + indices_iterator = self._iter_random_indices(rng, buffer_size) + # this is the shuffle buffer that we keep in memory + mem_buffer = [] + for x in self.ex_iterable: + if len(mem_buffer) == buffer_size: # if the buffer is full, pick and example from it + i = next(indices_iterator) + yield mem_buffer[i] + mem_buffer[i] = x # replace the picked example by a new one + else: # otherwise, keep filling the buffer + mem_buffer.append(x) + # when we run out of examples, we shuffle the remaining examples in the buffer and yield them + rng.shuffle(mem_buffer) + yield from mem_buffer + + def _iter_arrow(self): + buffer_size = self.buffer_size + rng = deepcopy(self.generator) + indices_iterator = self._iter_random_indices(rng, buffer_size) + # this is the shuffle buffer that we keep in memory + mem_buffer = [] + for key, pa_table in self.ex_iterable.iter_arrow(): + if len(mem_buffer) == buffer_size: # if the buffer is full, pick and example from it + i = next(indices_iterator) + yield mem_buffer[i] + mem_buffer[i] = (key, pa_table) # replace the picked example by a new one + else: # otherwise, keep filling the buffer + mem_buffer.append((key, pa_table)) + # when we run out of examples, we shuffle the remaining examples in the buffer and yield them + rng.shuffle(mem_buffer) + yield from mem_buffer + + def shuffle_data_sources(self, generator: np.random.Generator) -> "BufferShuffledExamplesIterable": + """Shuffle the wrapped examples iterable as well as the shuffling buffer.""" + return BufferShuffledExamplesIterable( + self.ex_iterable.shuffle_data_sources(generator), buffer_size=self.buffer_size, generator=self.generator + ) + + def shard_data_sources(self, num_shards: int, index: int, contiguous=True) -> "BufferShuffledExamplesIterable": + """Keep only the requested shard.""" + return BufferShuffledExamplesIterable( + self.ex_iterable.shard_data_sources(num_shards, index, contiguous=contiguous), + buffer_size=self.buffer_size, + generator=self.generator, + ) + + def reshard_data_sources(self) -> "BufferShuffledExamplesIterable": + return BufferShuffledExamplesIterable( + self.ex_iterable.reshard_data_sources(), + buffer_size=self.buffer_size, + generator=self.generator, + ) + + @property + def num_shards(self) -> int: + return self.ex_iterable.num_shards + + +class DataSourcesShufflingDisallowed(Exception): + """skip() or take() freeze the order of data sources shards""" + + +class SkipExamplesIterable(_BaseExamplesIterable): + def __init__( + self, + ex_iterable: _BaseExamplesIterable, + n: int, + block_sources_order_when_shuffling: bool = True, + split_when_sharding: bool = True, + ): + super().__init__() + self.ex_iterable = ex_iterable + self.n = n + self.block_sources_order_when_shuffling = block_sources_order_when_shuffling + self.split_when_sharding = split_when_sharding + + @property + def iter_arrow(self): + return self._iter_arrow if self.ex_iterable.iter_arrow else None + + @property + def is_typed(self): + return self.ex_iterable.is_typed + + @property + def features(self): + return self.ex_iterable.features + + def _init_state_dict(self) -> dict: + self._state_dict = { + "skipped": 0, + "examples_iterable": self.ex_iterable._init_state_dict(), + "type": self.__class__.__name__, + } + return self._state_dict + + def __iter__(self): + skipped = self._state_dict["skipped"] if self._state_dict else 0 + for key_example in self.ex_iterable: + if skipped + 1 <= self.n: + skipped += 1 + if self._state_dict: + self._state_dict["skipped"] = skipped + else: + yield key_example + + def _iter_arrow(self): + skipped = self._state_dict["skipped"] if self._state_dict else 0 + for key, pa_table in self.ex_iterable.iter_arrow(): + if len(pa_table) == 0: + continue + elif skipped + len(pa_table) <= self.n: + skipped += len(pa_table) + if self._state_dict: + self._state_dict["skipped"] = skipped + elif skipped + 1 <= self.n: + offset = self.n - skipped + skipped = self.n + if self._state_dict: + self._state_dict["skipped"] = skipped + yield key, pa_table.slice(offset, len(pa_table) - offset) + else: + yield key, pa_table + + @staticmethod + def split_number(num, n): + quotient = num // n + remainder = num % n + result = [quotient] * n + for i in range(remainder): + result[i] += 1 + return result + + def shuffle_data_sources(self, generator: np.random.Generator) -> "SkipExamplesIterable": + """May not shuffle the wrapped examples iterable since it would skip examples from other shards instead.""" + if self.block_sources_order_when_shuffling: + raise DataSourcesShufflingDisallowed() + else: + return SkipExamplesIterable( + self.ex_iterable.shuffle_data_sources(generator), + n=self.n, + block_sources_order_when_shuffling=self.block_sources_order_when_shuffling, + split_when_sharding=self.split_when_sharding, + ) + + def shard_data_sources(self, num_shards: int, index: int, contiguous=True) -> "SkipExamplesIterable": + """Keep only the requested shard.""" + if self.split_when_sharding: + return SkipExamplesIterable( + self.ex_iterable.shard_data_sources(num_shards, index, contiguous=contiguous), + n=self.split_number(self.n, num_shards)[index], + block_sources_order_when_shuffling=self.block_sources_order_when_shuffling, + split_when_sharding=self.split_when_sharding, + ) + else: + return self + + def reshard_data_sources(self) -> "SkipExamplesIterable": + return SkipExamplesIterable( + self.ex_iterable.reshard_data_sources(), + n=self.n, + block_sources_order_when_shuffling=self.block_sources_order_when_shuffling, + split_when_sharding=self.split_when_sharding, + ) + + @property + def num_shards(self) -> int: + return self.ex_iterable.num_shards + + +class RepeatExamplesIterable(_BaseExamplesIterable): + """ + Iterable that repeats the underlying iterable a given number of times. + """ + + def __init__( + self, + ex_iterable: _BaseExamplesIterable, + num_times: Optional[int], + ): + super().__init__() + self.ex_iterable = ex_iterable + self.num_times = num_times + + def _init_state_dict(self) -> dict: + self._state_dict = { + "repeat_index": 0, + "examples_iterable": self.ex_iterable._init_state_dict(), + "type": self.__class__.__name__, + } + return self._state_dict + + def __iter__(self): + repeat_index = self._state_dict["repeat_index"] if self._state_dict else 0 + while True: + if self.num_times is not None and repeat_index >= max(self.num_times, 0): + break + yield from self.ex_iterable + repeat_index += 1 + if self._state_dict: + self._state_dict["repeat_index"] = repeat_index + self._state_dict["examples_iterable"] = self.ex_iterable._init_state_dict() + + def shuffle_data_sources(self, generator: np.random.Generator) -> "RepeatExamplesIterable": + """Shuffle the underlying iterable, then repeat.""" + return RepeatExamplesIterable(self.ex_iterable.shuffle_data_sources(generator), num_times=self.num_times) + + def shard_data_sources(self, num_shards: int, index: int, contiguous=True) -> "RepeatExamplesIterable": + """Shard, then repeat shards.""" + return RepeatExamplesIterable( + self.ex_iterable.shard_data_sources(num_shards, index, contiguous=contiguous), + num_times=self.num_times, + ) + + def reshard_data_sources(self) -> "RepeatExamplesIterable": + return RepeatExamplesIterable( + self.ex_iterable.reshard_data_sources(), + num_times=self.num_times, + ) + + @property + def num_shards(self) -> int: + return self.ex_iterable.num_shards + + +class TakeExamplesIterable(_BaseExamplesIterable): + def __init__( + self, + ex_iterable: _BaseExamplesIterable, + n: int, + block_sources_order_when_shuffling: bool = True, + split_when_sharding: bool = True, + ): + super().__init__() + self.ex_iterable = ex_iterable + self.n = n + self.block_sources_order_when_shuffling = block_sources_order_when_shuffling + self.split_when_sharding = split_when_sharding + + @property + def iter_arrow(self): + return self._iter_arrow if self.ex_iterable.iter_arrow else None + + @property + def is_typed(self): + return self.ex_iterable.is_typed + + @property + def features(self): + return self.ex_iterable.features + + def _init_state_dict(self) -> dict: + self._state_dict = { + "taken": 0, + "examples_iterable": self.ex_iterable._init_state_dict(), + "type": self.__class__.__name__, + } + return self._state_dict + + def __iter__(self): + taken = self._state_dict["taken"] if self._state_dict else 0 + if taken >= self.n: + return + for key_example in self.ex_iterable: + if taken + 1 <= self.n: + taken += 1 + if self._state_dict: + self._state_dict["taken"] = taken + yield key_example + else: + break + + def _iter_arrow(self): + taken = self._state_dict["taken"] if self._state_dict else 0 + if taken >= self.n: + return + for key, pa_table in self.ex_iterable.iter_arrow(): + if len(pa_table) == 0: + continue + elif taken + len(pa_table) <= self.n: + taken += len(pa_table) + if self._state_dict: + self._state_dict["taken"] = taken + yield key, pa_table + elif taken + 1 <= self.n: + length = self.n - taken + taken = self.n + if self._state_dict: + self._state_dict["taken"] = taken + yield key, pa_table.slice(0, length) + else: + break + + @staticmethod + def split_number(num, n): + quotient = num // n + remainder = num % n + result = [quotient] * n + for i in range(remainder): + result[i] += 1 + return result + + def shuffle_data_sources(self, generator: np.random.Generator) -> "TakeExamplesIterable": + """May not shuffle the wrapped examples iterable since it would take examples from other shards instead.""" + if self.block_sources_order_when_shuffling: + raise DataSourcesShufflingDisallowed() + else: + return TakeExamplesIterable( + self.ex_iterable.shuffle_data_sources(generator), + n=self.n, + block_sources_order_when_shuffling=self.block_sources_order_when_shuffling, + split_when_sharding=self.split_when_sharding, + ) + + def shard_data_sources(self, num_shards: int, index: int, contiguous=True) -> "TakeExamplesIterable": + """Keep only the requested shard.""" + if self.split_when_sharding: + return TakeExamplesIterable( + self.ex_iterable.shard_data_sources(num_shards, index, contiguous=contiguous), + n=self.split_number(self.n, num_shards)[index], + block_sources_order_when_shuffling=self.block_sources_order_when_shuffling, + split_when_sharding=self.split_when_sharding, + ) + else: + return TakeExamplesIterable( + self.ex_iterable.shard_data_sources(num_shards, index, contiguous=contiguous), + n=self.n, + block_sources_order_when_shuffling=self.block_sources_order_when_shuffling, + split_when_sharding=self.split_when_sharding, + ) + + def reshard_data_sources(self) -> "TakeExamplesIterable": + return TakeExamplesIterable( + self.ex_iterable.reshard_data_sources(), + n=self.n, + block_sources_order_when_shuffling=self.block_sources_order_when_shuffling, + split_when_sharding=self.split_when_sharding, + ) + + @property + def num_shards(self) -> int: + return self.ex_iterable.num_shards + + +def _apply_feature_types_on_example( + example: dict, features: Features, token_per_repo_id: dict[str, Union[str, bool, None]] +) -> dict: + example = dict(example) + # add missing columns + for column_name in features: + if column_name not in example: + example[column_name] = None + # we encode the example for ClassLabel feature types for example + encoded_example = features.encode_example(example) + # Decode example for Audio feature, e.g. + decoded_example = features.decode_example(encoded_example, token_per_repo_id=token_per_repo_id) + return decoded_example + + +@dataclass +class FormattingConfig: + format_type: Optional[str] + + @property + def is_table(self) -> bool: + return isinstance(get_formatter(self.format_type), TableFormatter) + + @property + def is_tensor(self) -> bool: + return isinstance(get_formatter(self.format_type), TensorFormatter) + + +class FormattedExamplesIterable(_BaseExamplesIterable): + def __init__( + self, + ex_iterable: _BaseExamplesIterable, + formatting: Optional[FormattingConfig], + features: Optional[Features], + token_per_repo_id: dict[str, Union[str, bool, None]], + force_convert_to_python: bool = False, + ): + super().__init__() + self.ex_iterable = ex_iterable + self._features = features + self.formatting = formatting + self.token_per_repo_id = token_per_repo_id + self.force_convert_to_python = force_convert_to_python + + @property + def iter_arrow(self): + if self.ex_iterable.iter_arrow and not self.force_convert_to_python: + return self._iter_arrow + + @property + def is_typed(self): + return self.ex_iterable.is_typed or self._features is not None + + @property + def features(self): + return self._features + + def _init_state_dict(self) -> dict: + self._state_dict = self.ex_iterable._init_state_dict() + return self._state_dict + + def __iter__(self): + if not self.formatting or self.formatting.is_table: + formatter = PythonFormatter( + features=self._features if not self.ex_iterable.is_typed else None, + token_per_repo_id=self.token_per_repo_id, + ) + else: + formatter = get_formatter( + self.formatting.format_type, + features=self._features if not self.ex_iterable.is_typed else None, + token_per_repo_id=self.token_per_repo_id, + ) + + # It's ok to use _iter_arrow here without fancy state_dict logic since it's + # used with RebatchedArrowExamplesIterable with the right batch_size to + # never lose examples + if self.ex_iterable.iter_arrow: + # feature casting (inc column addition) handled within self._iter_arrow() + for key, pa_table in self._iter_arrow(): + batch = formatter.format_batch(pa_table) + for example in _batch_to_examples(batch): + yield key, example + else: + format_dict = ( + formatter.recursive_tensorize + if isinstance(formatter, TensorFormatter) + else None # cast in case features is None + ) + for key, example in self.ex_iterable: + # don't apply feature types if already applied by ex_iterable (e.g. in case of chained with_format) + if self.features and not self.ex_iterable.is_typed: + example = _apply_feature_types_on_example( + example, self.features, token_per_repo_id=self.token_per_repo_id + ) + if format_dict: + example = format_dict(example) + yield key, example + + def _iter_arrow(self) -> Iterator[tuple[Key, pa.Table]]: + if not self.features: + yield from self.ex_iterable._iter_arrow() + return + schema = self.features.arrow_schema + for key, pa_table in self.ex_iterable._iter_arrow(): + columns = set(pa_table.column_names) + # add missing columns + for column_name in self.features: + if column_name not in columns: + col = pa.NullArray.from_buffers(pa.null(), len(pa_table), [None]) + pa_table = pa_table.append_column(column_name, col) + if pa_table.schema != schema: + pa_table = cast_table_to_features(pa_table, self.features) + yield key, pa_table + + def shuffle_data_sources(self, generator: np.random.Generator) -> "FormattedExamplesIterable": + """Shuffle the wrapped examples iterable.""" + return FormattedExamplesIterable( + self.ex_iterable.shuffle_data_sources(generator), + features=self.features, + token_per_repo_id=self.token_per_repo_id, + formatting=self.formatting, + force_convert_to_python=self.force_convert_to_python, + ) + + def shard_data_sources(self, num_shards: int, index: int, contiguous=True) -> "FormattedExamplesIterable": + """Keep only the requested shard.""" + return FormattedExamplesIterable( + self.ex_iterable.shard_data_sources(num_shards, index, contiguous=contiguous), + features=self.features, + token_per_repo_id=self.token_per_repo_id, + formatting=self.formatting, + force_convert_to_python=self.force_convert_to_python, + ) + + def reshard_data_sources(self) -> "FormattedExamplesIterable": + return FormattedExamplesIterable( + self.ex_iterable.reshard_data_sources(), + features=self.features, + token_per_repo_id=self.token_per_repo_id, + formatting=self.formatting, + force_convert_to_python=self.force_convert_to_python, + ) + + @property + def num_shards(self) -> int: + return self.ex_iterable.num_shards + + +@dataclass +class DistributedConfig: + rank: int + world_size: int + + +def _maybe_add_torch_iterable_dataset_parent_class(cls): + """Add torch.utils.data.IterableDataset as a parent class if 'torch' is available""" + if config.TORCH_AVAILABLE: + import torch.utils.data + + if torch.utils.data.IterableDataset not in cls.__bases__: + cls.__bases__ += (torch.utils.data.IterableDataset,) + + +def _maybe_share_with_torch_persistent_workers(value: Union[int, "torch.Tensor"]) -> Union[int, "torch.Tensor"]: + if config.TORCH_AVAILABLE: + import torch + + if isinstance(value, torch.Tensor): + return value.share_memory_() + else: + return torch.tensor(value).share_memory_() + else: + return value + + +class IterableColumn: + """ + An iterable for a specific column of an [`IterableDataset`]. + + Example: + + Iterate on the texts of the "text" column of a dataset: + + ```python + for text in dataset["text"]: + ... + ``` + + It also works with nested columns: + + ```python + for source in dataset["metadata"]["source"]: + ... + ``` + """ + + def __init__(self, source: Union["IterableDataset", "IterableColumn"], column_name: str): + self.source = source + self.column_name = column_name + + def __iter__(self) -> Iterator[Any]: + for example in self.source: + yield example[self.column_name] + + def __getitem__(self, column_name: str) -> "IterableColumn": + return IterableColumn(self, column_name) + + +class IterableDataset(DatasetInfoMixin): + """A Dataset backed by an iterable.""" + + def __init__( + self, + ex_iterable: _BaseExamplesIterable, + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + formatting: Optional[FormattingConfig] = None, + distributed: Optional[DistributedConfig] = None, + token_per_repo_id: Optional[dict[str, Union[str, bool, None]]] = None, + ): + info = info.copy() if info is not None else DatasetInfo() + DatasetInfoMixin.__init__(self, info=info, split=split) + + self._ex_iterable = copy(ex_iterable) + self._formatting = formatting + self._distributed = distributed + self._token_per_repo_id: dict[str, Union[str, bool, None]] = token_per_repo_id or {} + self._epoch: Union[int, "torch.Tensor"] = _maybe_share_with_torch_persistent_workers(0) + self._starting_state_dict: Optional[dict] = None + self.__hffs_cache = HfFileSystem._cache # keep the cache on pickling (e.g. for dataloader workers) + self._prepare_ex_iterable_for_iteration() # set state_dict + _maybe_add_torch_iterable_dataset_parent_class(self.__class__) # subclass of torch IterableDataset + + @property + def num_columns(self) -> Optional[int]: + """Number of columns in the dataset. + This can be None if the dataset has unknown features (e.g. after a map() operation). + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation") + >>> ds.num_columns + 2 + ``` + """ + return None if self.features is None else len(self.features) + + @property + def column_names(self) -> Optional[list[str]]: + """Names of the columns in the dataset. + This can be None if the dataset has unknown features (e.g. after a map() operation). + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation", streaming=True) + >>> ds.column_names + ['text', 'label'] + ``` + """ + return None if self.features is None else list(self.features) + + def state_dict(self) -> dict: + """Get the current state_dict of the dataset. + It corresponds to the state at the latest example it yielded. + + Resuming returns exactly where the checkpoint was saved except in two cases: + + 1. examples from shuffle buffers are lost when resuming and the buffers are refilled with new data + 2. combinations of `.with_format(arrow)` and batched `.map()` may skip one batch. + + Returns: + `dict` + + Example: + + ```py + >>> from datasets import Dataset, concatenate_datasets + >>> ds = Dataset.from_dict({"a": range(6)}).to_iterable_dataset(num_shards=3) + >>> for idx, example in enumerate(ds): + ... print(example) + ... if idx == 2: + ... state_dict = ds.state_dict() + ... print("checkpoint") + ... break + >>> ds.load_state_dict(state_dict) + >>> print(f"restart from checkpoint") + >>> for example in ds: + ... print(example) + ``` + + which returns: + ``` + {'a': 0} + {'a': 1} + {'a': 2} + checkpoint + restart from checkpoint + {'a': 3} + {'a': 4} + {'a': 5} + ``` + + ```py + >>> from torchdata.stateful_dataloader import StatefulDataLoader + >>> ds = load_dataset("deepmind/code_contests", streaming=True, split="train") + >>> dataloader = StatefulDataLoader(ds, batch_size=32, num_workers=4) + >>> # checkpoint + >>> state_dict = dataloader.state_dict() # uses ds.state_dict() under the hood + >>> # resume from checkpoint + >>> dataloader.load_state_dict(state_dict) # uses ds.load_state_dict() under the hood + ``` + """ + return deepcopy(self._state_dict) + + def load_state_dict(self, state_dict: dict) -> None: + """Load the state_dict of the dataset. + The iteration will restart at the next example from when the state was saved. + + Resuming returns exactly where the checkpoint was saved except in two cases: + + 1. examples from shuffle buffers are lost when resuming and the buffers are refilled with new data + 2. combinations of `.with_format(arrow)` and batched `.map()` may skip one batch. + + Example: + + ```py + >>> from datasets import Dataset, concatenate_datasets + >>> ds = Dataset.from_dict({"a": range(6)}).to_iterable_dataset(num_shards=3) + >>> for idx, example in enumerate(ds): + ... print(example) + ... if idx == 2: + ... state_dict = ds.state_dict() + ... print("checkpoint") + ... break + >>> ds.load_state_dict(state_dict) + >>> print(f"restart from checkpoint") + >>> for example in ds: + ... print(example) + ``` + + which returns: + ``` + {'a': 0} + {'a': 1} + {'a': 2} + checkpoint + restart from checkpoint + {'a': 3} + {'a': 4} + {'a': 5} + ``` + + ```py + >>> from torchdata.stateful_dataloader import StatefulDataLoader + >>> ds = load_dataset("deepmind/code_contests", streaming=True, split="train") + >>> dataloader = StatefulDataLoader(ds, batch_size=32, num_workers=4) + >>> # checkpoint + >>> state_dict = dataloader.state_dict() # uses ds.state_dict() under the hood + >>> # resume from checkpoint + >>> dataloader.load_state_dict(state_dict) # uses ds.load_state_dict() under the hood + ``` + """ + self._starting_state_dict = state_dict + + def __repr__(self): + return f"IterableDataset({{\n features: {list(self._info.features.keys()) if self._info.features is not None else 'Unknown'},\n num_shards: {self.num_shards}\n}})" + + def __getstate__(self): + return self.__dict__ + + def __setstate__(self, d): + self.__dict__ = d + # Re-add torch shared memory, since shared memory is not always kept when pickling + self._epoch = _maybe_share_with_torch_persistent_workers(self._epoch) + # Re-add the cache to keep on pickling (e.g. for dataloader workers) + self.__hffs_cache = HfFileSystem._cache + # Re-add torch iterable dataset as a parent class, since dynamically added parent classes are not kept when pickling + _maybe_add_torch_iterable_dataset_parent_class(self.__class__) + + def _head(self, n=5): + return next(iter(self.iter(batch_size=n))) + + @property + def epoch(self) -> int: + return int(self._epoch) + + @property + def num_shards(self) -> int: + if self._distributed and self._ex_iterable.num_shards % self._distributed.world_size == 0: + return self._ex_iterable.num_shards // self._distributed.world_size + return self._ex_iterable.num_shards + + @property + def n_shards(self) -> int: # backward compatibility + return self.num_shards + + def _iter_pytorch(self): + ex_iterable = self._prepare_ex_iterable_for_iteration() + # Fix for fsspec when using multiprocess to avoid hanging in the ML training loop. (only required for fsspec >= 0.9.0) + # See https://github.com/fsspec/gcsfs/issues/379 + fsspec.asyn.reset_lock() + # check if there aren't too many workers + import torch.utils.data + + worker_info = torch.utils.data.get_worker_info() + if self._is_main_process() and ex_iterable.num_shards < worker_info.num_workers: + logger.warning( + f"Too many dataloader workers: {worker_info.num_workers} (max is dataset.num_shards={ex_iterable.num_shards}). " + f"Stopping {worker_info.num_workers - ex_iterable.num_shards} dataloader workers." + ) + logger.info( + f"To parallelize data loading, we give each process some shards (or data sources) to process. " + f"Therefore it's unnecessary to have a number of workers greater than dataset.num_shards={ex_iterable.num_shards}. " + f"To enable more parallelism, please split the dataset in more files than {ex_iterable.num_shards} or try `dataset = dataset.reshard()` which may increase `num_shards` depending on the dataset file format." + ) + # split workload + _log_prefix = f"node#{self._distributed.rank} " if self._distributed else "" + shards_indices = ex_iterable.split_shard_indices_by_worker( + num_shards=worker_info.num_workers, index=worker_info.id, contiguous=False + ) + if shards_indices: + logger.debug( + f"{_log_prefix}dataloader worker#{worker_info.id}, ': Starting to iterate over {len(shards_indices)}/{ex_iterable.num_shards} shards." + ) + ex_iterable = ex_iterable.shard_data_sources( + num_shards=worker_info.num_workers, index=worker_info.id, contiguous=False + ) + ex_iterable = shift_ex_examples_rngs(ex_iterable=ex_iterable, value=worker_info.id) + self._state_dict = { + "examples_iterable": ex_iterable._init_state_dict(), + "epoch": self.epoch, + } + if self._starting_state_dict and self.epoch == self._starting_state_dict["epoch"]: + ex_iterable.load_state_dict(self._starting_state_dict["examples_iterable"]) + # re-point at the live ex_iterable state so progress tracking + self._state_dict["examples_iterable"] = ex_iterable._state_dict + + if self._formatting and (ex_iterable.iter_arrow or self._formatting.is_table): + formatter = get_formatter(self._formatting.format_type, features=self.features) + for key, pa_table in ex_iterable.iter_arrow(): + yield formatter.format_row(pa_table) + return + else: + for key, example in ex_iterable: + # no need to format thanks to FormattedExamplesIterable + yield example + logger.debug( + f"{_log_prefix}dataloader worker#{worker_info.id}, ': Finished iterating over {len(shards_indices)}/{ex_iterable.num_shards} shards." + ) + else: + logger.debug( + f"{_log_prefix}dataloader worker#{worker_info.id}, ': Stopping... Number of dataset shards < num_workers ({ex_iterable.num_shards}<{worker_info.num_workers})." + ) + + def _is_main_process(self): + if self._distributed and self._distributed.rank > 0: + return False + if "torch" in sys.modules: + import torch.utils.data + + worker_info = torch.utils.data.get_worker_info() + if worker_info is not None and worker_info.id > 0: + return False + return True + + def _prepare_ex_iterable_for_iteration( + self, batch_size: int = 1, drop_last_batch: bool = False + ) -> _BaseExamplesIterable: + ex_iterable = self._ex_iterable + + if self.epoch: + ex_iterable = ex_iterable.shuffle_data_sources(np.random.default_rng(self.epoch)) + ex_iterable = shift_ex_examples_rngs(ex_iterable, self.epoch) + + if self._distributed: + rank = self._distributed.rank + world_size = self._distributed.world_size + if ex_iterable.num_shards % world_size == 0: + if self._is_main_process(): + num_shards_per_node = ex_iterable.num_shards // world_size + plural = "s" if num_shards_per_node > 1 else "" + logger.info( + f"Assigning {num_shards_per_node} shard{plural} (or data source{plural}) of the dataset to each node." + ) + ex_iterable = ex_iterable.shard_data_sources(num_shards=world_size, index=rank, contiguous=False) + else: + if self._is_main_process(): + logger.info( + f"Assigning 1 out of {world_size} examples of the dataset to each node. The others are skipped during the iteration." + ) + logger.info( + f"It is more optimized to distribute the dataset shards (or data sources) across nodes. " + f"You can do that by using a dataset with number of shards that is a factor of world_size={world_size}. " + f"The current dataset has {ex_iterable.num_shards} which is not a factor of {world_size}" + ) + ex_iterable = StepExamplesIterable(ex_iterable, step=world_size, offset=rank) + + if ex_iterable.iter_arrow: + ex_iterable = RebatchedArrowExamplesIterable( + ex_iterable, batch_size=batch_size, drop_last_batch=drop_last_batch + ) + elif self._formatting and self._formatting.is_table: + ex_iterable = RebatchedArrowExamplesIterable( + ex_iterable, batch_size=batch_size, drop_last_batch=drop_last_batch, force_convert_to_arrow=True + ) + + if self._formatting or (self.features and ex_iterable.features != self.features): + ex_iterable = FormattedExamplesIterable( + ex_iterable, + formatting=self._formatting, + features=self.features, + token_per_repo_id=self._token_per_repo_id, + ) + + self._state_dict = { + "examples_iterable": ex_iterable._init_state_dict(), + "epoch": self.epoch, + } + if self._starting_state_dict and self.epoch == self._starting_state_dict["epoch"]: + ex_iterable.load_state_dict(self._starting_state_dict["examples_iterable"]) + # re-point at the live ex_iterable state so progress tracking + self._state_dict["examples_iterable"] = ex_iterable._state_dict + return ex_iterable + + def __iter__(self): + if "torch" in sys.modules: + import torch.utils.data + + worker_info = torch.utils.data.get_worker_info() + if isinstance(self, torch.utils.data.IterableDataset) and worker_info is not None: + # We're a torch.utils.data.IterableDataset in a PyTorch worker process + yield from self._iter_pytorch() + return + + ex_iterable = self._prepare_ex_iterable_for_iteration() + if self._formatting and (ex_iterable.iter_arrow or self._formatting.is_table): + formatter = get_formatter(self._formatting.format_type, features=self.features) + for key, pa_table in ex_iterable.iter_arrow(): + yield formatter.format_row(pa_table) + return + + for key, example in ex_iterable: + # no need to format thanks to FormattedExamplesIterable + yield example + + def iter(self, batch_size: int, drop_last_batch: bool = False): + """Iterate through the batches of size `batch_size`. + + Args: + batch_size (:obj:`int`): size of each batch to yield. + drop_last_batch (:obj:`bool`, default `False`): Whether a last batch smaller than the batch_size should be + dropped + """ + + if self._formatting: + formatter = get_formatter(self._formatting.format_type, features=self.features) + format_dict = formatter.recursive_tensorize if isinstance(formatter, TensorFormatter) else None + else: + format_dict = None + + ex_iterable = self._prepare_ex_iterable_for_iteration(batch_size=batch_size, drop_last_batch=drop_last_batch) + if self._formatting and (ex_iterable.iter_arrow or self._formatting.is_table): + for key, pa_table in ex_iterable.iter_arrow(): + yield formatter.format_batch(pa_table) + return + + iterator = iter(ex_iterable) + for key, example in iterator: + # If batched, first build the batch + examples = [example] + [example for key, example in islice(iterator, batch_size - 1)] + if drop_last_batch and len(examples) < batch_size: # ignore last batch + return + batch = _examples_to_batch(examples) + # we need to format here in case we need to stack tensors together + yield format_dict(batch) if format_dict else batch + + def __getitem__(self, column_name: str) -> IterableColumn: + return IterableColumn(self, column_name) + + @staticmethod + def from_generator( + generator: Callable, + features: Optional[Features] = None, + gen_kwargs: Optional[dict] = None, + split: NamedSplit = Split.TRAIN, + ) -> "IterableDataset": + """Create an Iterable Dataset from a generator. + + Args: + generator (`Callable`): + A generator function that `yields` examples. + features (`Features`, *optional*): + Dataset features. + gen_kwargs(`dict`, *optional*): + Keyword arguments to be passed to the `generator` callable. + You can define a sharded iterable dataset by passing the list of shards in `gen_kwargs`. + This can be used to improve shuffling and when iterating over the dataset with multiple workers. + split ([`NamedSplit`], defaults to `Split.TRAIN`): + Split name to be assigned to the dataset. + + + Returns: + [`IterableDataset`] + + Example: + + ```py + >>> def gen(): + ... yield {"text": "Good", "label": 0} + ... yield {"text": "Bad", "label": 1} + ... + >>> ds = IterableDataset.from_generator(gen) + ``` + + ```py + >>> def gen(shards): + ... for shard in shards: + ... with open(shard) as f: + ... for line in f: + ... yield {"line": line} + ... + >>> shards = [f"data{i}.txt" for i in range(32)] + >>> ds = IterableDataset.from_generator(gen, gen_kwargs={"shards": shards}) + >>> ds = ds.shuffle(seed=42, buffer_size=10_000) # shuffles the shards order + uses a shuffle buffer + >>> from torch.utils.data import DataLoader + >>> dataloader = DataLoader(ds.with_format("torch"), num_workers=4) # give each worker a subset of 32/4=8 shards + ``` + """ + from .io.generator import GeneratorDatasetInputStream + + return GeneratorDatasetInputStream( + generator=generator, features=features, gen_kwargs=gen_kwargs, streaming=True, split=split + ).read() + + @staticmethod + def from_spark( + df: "pyspark.sql.DataFrame", + split: Optional[NamedSplit] = None, + features: Optional[Features] = None, + **kwargs, + ) -> "IterableDataset": + """Create an IterableDataset from Spark DataFrame. The dataset is streamed to the driver in batches. + + Args: + df (`pyspark.sql.DataFrame`): + The DataFrame containing the desired data. + split (`NamedSplit`, *optional*): + Split name to be assigned to the dataset. + features (`Features`, *optional*): + Dataset features. + + Returns: + [`IterableDataset`] + + Example: + + ```py + >>> df = spark.createDataFrame( + >>> data=[[1, "Elia"], [2, "Teo"], [3, "Fang"]], + >>> columns=["id", "name"], + >>> ) + >>> ds = IterableDataset.from_spark(df) + ``` + """ + from .io.spark import SparkDatasetReader + + if sys.platform == "win32": + raise OSError("IterableDataset.from_spark is not currently supported on Windows") + + return SparkDatasetReader( + df, + split=split, + features=features, + streaming=True, + **kwargs, + ).read() + + @staticmethod + def from_file(filename: str) -> "IterableDataset": + """Instantiate a IterableDataset from Arrow table at filename. + + Args: + filename (`str`): + File name of the dataset. + + Returns: + [`IterableDataset`] + """ + pa_table_schema = read_schema_from_file(filename) + inferred_features = Features.from_arrow_schema(pa_table_schema) + ex_iterable = ArrowExamplesIterable(Dataset._generate_tables_from_cache_file, kwargs={"filename": filename}) + return IterableDataset(ex_iterable=ex_iterable, info=DatasetInfo(features=inferred_features)) + + @classmethod + def from_pandas( + cls, + df: pd.DataFrame, + features: Optional[Features] = None, + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + preserve_index: Optional[bool] = None, + num_shards: Optional[int] = 1, + ) -> "IterableDataset": + """ + Convert `pandas.DataFrame` to a `pyarrow.Table` to create an [`IterableDataset`]. + + The column types in the resulting Arrow Table are inferred from the dtypes of the `pandas.Series` in the + DataFrame. In the case of non-object Series, the NumPy dtype is translated to its Arrow equivalent. In the + case of `object`, we need to guess the datatype by looking at the Python objects in this Series. + + Be aware that Series of the `object` dtype don't carry enough information to always lead to a meaningful Arrow + type. In the case that we cannot infer a type, e.g. because the DataFrame is of length 0 or the Series only + contains `None/nan` objects, the type is set to `null`. This behavior can be avoided by constructing explicit + features and passing it to this function. + + Important: a dataset created with from_pandas() lives in memory. + This may change in the future, but in the meantime if you + want to reduce memory usage you should write it on disk + and reload using e.g. to_parquet / from_parquet. + + Args: + df (`pandas.DataFrame`): + Dataframe that contains the dataset. + features ([`Features`], *optional*): + Dataset features. + info (`DatasetInfo`, *optional*): + Dataset information, like description, citation, etc. + split (`NamedSplit`, *optional*): + Name of the dataset split. + preserve_index (`bool`, *optional*): + Whether to store the index as an additional column in the resulting Dataset. + The default of `None` will store the index as a column, except for `RangeIndex` which is stored as metadata only. + Use `preserve_index=True` to force it to be stored as a column. + num_shards (`int`, default to `1`): + Number of shards to define when instantiating the iterable dataset. This is especially useful for big datasets to be able to shuffle properly, + and also to enable fast parallel loading using a PyTorch DataLoader or in distributed setups for example. + + Returns: + [`IterableDataset`] + + Example: + + ```py + >>> ds = IterableDataset.from_pandas(df) + ``` + """ + return Dataset.from_pandas( + df, + features=features, + info=info, + split=split, + preserve_index=preserve_index, + ).to_iterable_dataset(num_shards=num_shards) + + @classmethod + def from_polars( + cls, + df: Union["pl.DataFrame", "pl.LazyFrame"], + features: Optional[Features] = None, + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + ) -> "IterableDataset": + """ + Create an IterableDataset from a polars DataFrame or LazyFrame. + + Iterating over the dataset is mostly zero copy. + Under the hood, the dataset iterates over the polars DataFrame batches/slices. + + Data types that do copy: + * CategoricalType + + Args: + df (`polars.DataFrame`): DataFrame to convert to Arrow Table + features (`Features`, optional): Dataset features. + info (`DatasetInfo`, optional): Dataset information, like description, citation, etc. + split (`NamedSplit`, optional): Name of the dataset split. + + Returns: + [`IterableDataset`] + + Examples: + ```py + >>> ds = IterableDataset.from_polars(df) + ``` + """ + import polars as pl + + if info is not None and features is not None and info.features != features: + raise ValueError( + f"Features specified in `features` and `info.features` can't be different:\n{features}\n{info.features}" + ) + features = features if features is not None else info.features if info is not None else None + if features is not None: + features = _fix_for_backward_compatible_features(features) + if info is None: + info = DatasetInfo() + info.features = features or Features.from_arrow_schema( + (df.collect_schema() if isinstance(df, pl.LazyFrame) else df.schema).to_arrow() + ) + return IterableDataset( + ArrowExamplesIterable(_generate_tables_from_polars, kwargs={"df": df}), + info=info, + split=split, + ) + + @classmethod + def from_dict( + cls, + mapping: dict, + features: Optional[Features] = None, + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + num_shards: Optional[int] = 1, + ) -> "IterableDataset": + """ + Convert `dict` to a `pyarrow.Table` to create an [`IterableDataset`]. + + Important: a dataset created with from_dict() lives in memory. + This may change in the future, but in the meantime if you + want to reduce memory usage you should write it back on disk + and reload using e.g. to_parquet / from_parquet. + + Args: + mapping (`Mapping`): + Mapping of strings to Arrays or Python lists. + features ([`Features`], *optional*): + Dataset features. + info (`DatasetInfo`, *optional*): + Dataset information, like description, citation, etc. + split (`NamedSplit`, *optional*): + Name of the dataset split. + num_shards (`int`, default to `1`): + Number of shards to define when instantiating the iterable dataset. This is especially useful for big datasets to be able to shuffle properly, + and also to enable fast parallel loading using a PyTorch DataLoader or in distributed setups for example. + + Returns: + [`IterableDataset`] + """ + return Dataset.from_dict(mapping, features=features, info=info, split=split).to_iterable_dataset( + num_shards=num_shards + ) + + @classmethod + def from_list( + cls, + mapping: list[dict], + features: Optional[Features] = None, + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + num_shards: Optional[int] = 1, + ) -> "IterableDataset": + """ + Convert a list of dicts to a `pyarrow.Table` to create an [`IterableDataset`]`. + + Note that the keys of the first entry will be used to determine the dataset columns, + regardless of what is passed to features. + + Important: a dataset created with from_list() lives in memory. + This may change in the future, but in the meantime if you + want to reduce memory usage you should write it back on disk + and reload using e.g. from_parquet / to_parquet. + + Args: + mapping (`List[dict]`): A list of mappings of strings to row values. + features (`Features`, optional): Dataset features. + info (`DatasetInfo`, optional): Dataset information, like description, citation, etc. + split (`NamedSplit`, optional): Name of the dataset split. + num_shards (`int`, default to `1`): + Number of shards to define when instantiating the iterable dataset. This is especially useful for big datasets to be able to shuffle properly, + and also to enable fast parallel loading using a PyTorch DataLoader or in distributed setups for example. + + Returns: + [`IterableDataset`] + """ + return Dataset.from_list( + mapping, + features=features, + info=info, + split=split, + ).to_iterable_dataset(num_shards=num_shards) + + @staticmethod + def from_csv( + path_or_paths: Union[PathLike, list[PathLike]], + split: Optional[NamedSplit] = None, + features: Optional[Features] = None, + keep_in_memory: bool = False, + **kwargs, + ) -> "IterableDataset": + """Create an IterableDataset from CSV file(s). + + Args: + path_or_paths (`path-like` or list of `path-like`): + Path(s) of the CSV file(s). + split ([`NamedSplit`], *optional*): + Split name to be assigned to the dataset. + features ([`Features`], *optional*): + Dataset features. + keep_in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + **kwargs (additional keyword arguments): + Keyword arguments to be passed to [`pandas.read_csv`]. + + Returns: + [`IterableDataset`] + + Example: + + ```py + >>> ds = IterableDataset.from_csv('path/to/dataset.csv') + ``` + """ + # Dynamic import to avoid circular dependency + from .io.csv import CsvDatasetReader + + return CsvDatasetReader( + path_or_paths, + split=split, + features=features, + keep_in_memory=keep_in_memory, + streaming=True, + **kwargs, + ).read() + + @staticmethod + def from_json( + path_or_paths: Union[PathLike, list[PathLike]], + split: Optional[NamedSplit] = None, + features: Optional[Features] = None, + keep_in_memory: bool = False, + field: Optional[str] = None, + **kwargs, + ) -> "IterableDataset": + """Create an IterableDataset from JSON or JSON Lines file(s). + + Args: + path_or_paths (`path-like` or list of `path-like`): + Path(s) of the JSON or JSON Lines file(s). + split ([`NamedSplit`], *optional*): + Split name to be assigned to the dataset. + features ([`Features`], *optional*): + Dataset features. + keep_in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + field (`str`, *optional*): + Field name of the JSON file where the dataset is contained in. + **kwargs (additional keyword arguments): + Keyword arguments to be passed to [`JsonConfig`]. + + Returns: + [`IterableDataset`] + + Example: + + ```py + >>> ds = IterableDataset.from_json('path/to/dataset.json') + ``` + """ + # Dynamic import to avoid circular dependency + from .io.json import JsonDatasetReader + + return JsonDatasetReader( + path_or_paths, + split=split, + features=features, + keep_in_memory=keep_in_memory, + field=field, + streaming=True, + **kwargs, + ).read() + + @staticmethod + def from_parquet( + path_or_paths: Union[PathLike, list[PathLike]], + split: Optional[NamedSplit] = None, + features: Optional[Features] = None, + keep_in_memory: bool = False, + columns: Optional[list[str]] = None, + filters: Optional[Union[pds.Expression, list[tuple], list[list[tuple]]]] = None, + fragment_scan_options: Optional[pds.ParquetFragmentScanOptions] = None, + on_bad_files: Literal["error", "warn", "skip"] = "error", + **kwargs, + ) -> "IterableDataset": + """Create an IterableDataset from Parquet file(s). + + Args: + path_or_paths (`path-like` or list of `path-like`): + Path(s) of the Parquet file(s). + split (`NamedSplit`, *optional*): + Split name to be assigned to the dataset. + features (`Features`, *optional*): + Dataset features. + keep_in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + columns (`List[str]`, *optional*): + If not `None`, only these columns will be read from the file. + A column name may be a prefix of a nested field, e.g. 'a' will select + 'a.b', 'a.c', and 'a.d.e'. + filters (`Union[pyarrow.dataset.Expression, list[tuple], list[list[tuple]]]`, *optional*): + Return only the rows matching the filter. + If possible the predicate will be pushed down to exploit the partition information + or internal metadata found in the data source, e.g. Parquet statistics. + Otherwise filters the loaded RecordBatches before yielding them. + fragment_scan_options (`pyarrow.dataset.ParquetFragmentScanOptions`, *optional*) + Scan-specific options for Parquet fragments. + This is especially useful to configure buffering and caching. + + + on_bad_files (`Literal["error", "warn", "skip"]`, *optional*, defaults to "error") + Specify what to do upon encountering a bad file (a file that can't be read). Allowed values are : + * 'error', raise an Exception when a bad file is encountered. + * 'warn', raise a warning when a bad file is encountered and skip that file. + * 'skip', skip bad files without raising or warning when they are encountered. + + + **kwargs (additional keyword arguments): + Keyword arguments to be passed to [`ParquetConfig`]. + + Returns: + [`IterableDataset`] + + Example: + + ```py + >>> ds = IterableDataset.from_parquet('path/to/dataset.parquet') + ``` + + Load a subset of columns: + + ```python + >>> ds = IterableDataset.from_parquet('path/to/dataset.parquet', columns=["col_0", "col_1"]) + ``` + + Efficiently filter data, possibly skipping entire files or row groups: + + ```python + >>> filters = [("col_0", "==", 0)] + >>> ds = IterableDataset.from_parquet(parquet_files_list, filters=filters) + ``` + """ + # Dynamic import to avoid circular dependency + from .io.parquet import ParquetDatasetReader + + return ParquetDatasetReader( + path_or_paths, + split=split, + features=features, + keep_in_memory=keep_in_memory, + columns=columns, + streaming=True, + filters=filters, + fragment_scan_options=fragment_scan_options, + on_bad_files=on_bad_files, + **kwargs, + ).read() + + @staticmethod + def from_text( + path_or_paths: Union[PathLike, list[PathLike]], + split: Optional[NamedSplit] = None, + features: Optional[Features] = None, + keep_in_memory: bool = False, + keep_linebreaks: bool = False, + sample_by: Literal["line", "paragraph", "document"] = "line", + **kwargs, + ) -> "IterableDataset": + """Create an IterableDataset from text file(s). + + Args: + path_or_paths (`path-like` or list of `path-like`): + Path(s) of the text file(s). + split (`NamedSplit`, *optional*): + Split name to be assigned to the dataset. + features (`Features`, *optional*): + Dataset features. + keep_in_memory (`bool`, defaults to `False`): + Whether to copy the data in-memory. + keep_linebreaks: (`bool`, defaults to False): + Whether to keep line breaks. + sample_by (`Literal["line", "paragraph", "document"]`, defaults to "line"): + Whether to load data per line, praragraph or document. + By default one row in the dataset = one line. + **kwargs (additional keyword arguments): + Keyword arguments to be passed to [`TextConfig`]. + + Returns: + [`IterableDataset`] + + Example: + + ```py + >>> ds = IterableDataset.from_text('path/to/dataset.txt') + ``` + """ + # Dynamic import to avoid circular dependency + from .io.text import TextDatasetReader + + return TextDatasetReader( + path_or_paths, + split=split, + features=features, + keep_in_memory=keep_in_memory, + streaming=True, + keep_linebreaks=keep_linebreaks, + sample_by=sample_by, + **kwargs, + ).read() + + def with_format( + self, + type: Optional[str] = None, + ) -> "IterableDataset": + """ + Return a dataset with the specified format. + + Args: + + type (`str`, *optional*): + Either output type selected in `[None, 'numpy', 'torch', 'tensorflow', 'jax', 'arrow', 'pandas', 'polars']`. + `None` means it returns python objects (default). + + Example: + + ```py + >>> from datasets import load_dataset + >>> from transformers import AutoTokenizer + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="validation", streaming=True) + >>> tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") + >>> ds = ds.map(lambda x: tokenizer(x['text'], truncation=True, padding=True), batched=True) + >>> ds = ds.with_format("torch") + >>> next(iter(ds)) + {'text': 'compassionately explores the seemingly irreconcilable situation between conservative christian parents and their estranged gay and lesbian children .', + 'label': tensor(1), + 'input_ids': tensor([ 101, 18027, 16310, 16001, 1103, 9321, 178, 11604, 7235, 6617, + 1742, 2165, 2820, 1206, 6588, 22572, 12937, 1811, 2153, 1105, + 1147, 12890, 19587, 6463, 1105, 15026, 1482, 119, 102, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0]), + 'token_type_ids': tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), + 'attention_mask': tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])} + ``` + """ + type = get_format_type_from_alias(type) + # TODO(QL): add format_kwargs + # TODO(QL): add format_columns and return_all_columns + # TODO(QL): add pandas format + return IterableDataset( + ex_iterable=self._ex_iterable, + info=self._info.copy(), + split=self._split, + formatting=FormattingConfig(format_type=type), + distributed=deepcopy(self._distributed), + token_per_repo_id=self._token_per_repo_id, + ) + + def map( + self, + function: Optional[Callable] = None, + with_indices: bool = False, + input_columns: Optional[Union[str, list[str]]] = None, + batched: bool = False, + batch_size: Optional[int] = 1000, + drop_last_batch: bool = False, + remove_columns: Optional[Union[str, list[str]]] = None, + features: Optional[Features] = None, + fn_kwargs: Optional[dict] = None, + ) -> "IterableDataset": + """ + Apply a function to all the examples in the iterable dataset (individually or in batches) and update them. + If your function returns a column that already exists, then it overwrites it. + The function is applied on-the-fly on the examples when iterating over the dataset. + + You can specify whether the function should be batched or not with the `batched` parameter: + + - If batched is `False`, then the function takes 1 example in and should return 1 example. + An example is a dictionary, e.g. `{"text": "Hello there !"}`. + - If batched is `True` and `batch_size` is 1, then the function takes a batch of 1 example as input and can return a batch with 1 or more examples. + A batch is a dictionary, e.g. a batch of 1 example is {"text": ["Hello there !"]}. + - If batched is `True` and `batch_size` is `n` > 1, then the function takes a batch of `n` examples as input and can return a batch with `n` examples, or with an arbitrary number of examples. + Note that the last batch may have less than `n` examples. + A batch is a dictionary, e.g. a batch of `n` examples is `{"text": ["Hello there !"] * n}`. + + If the function is asynchronous, then `map` will run your function in parallel, with up to one thousand simulatenous calls. + It is recommended to use a `asyncio.Semaphore` in your function if you want to set a maximum number of operations that can run at the same time. + + Args: + function (`Callable`, *optional*, defaults to `None`): + Function applied on-the-fly on the examples when you iterate on the dataset. + It must have one of the following signatures: + + - `function(example: Dict[str, Any]) -> Dict[str, Any]` if `batched=False` and `with_indices=False` + - `function(example: Dict[str, Any], idx: int) -> Dict[str, Any]` if `batched=False` and `with_indices=True` + - `function(batch: Dict[str, List]) -> Dict[str, List]` if `batched=True` and `with_indices=False` + - `function(batch: Dict[str, List], indices: List[int]) -> Dict[str, List]` if `batched=True` and `with_indices=True` + + For advanced usage, the function can also return a `pyarrow.Table`. + If the function is asynchronous, then `map` will run your function in parallel. + Moreover if your function returns nothing (`None`), then `map` will run your function and return the dataset unchanged. + If no function is provided, default to identity function: `lambda x: x`. + with_indices (`bool`, defaults to `False`): + Provide example indices to `function`. Note that in this case the signature of `function` should be `def function(example, idx[, rank]): ...`. + input_columns (`Optional[Union[str, List[str]]]`, defaults to `None`): + The columns to be passed into `function` + as positional arguments. If `None`, a dict mapping to all formatted columns is passed as one argument. + batched (`bool`, defaults to `False`): + Provide batch of examples to `function`. + batch_size (`int`, *optional*, defaults to `1000`): + Number of examples per batch provided to `function` if `batched=True`. + `batch_size <= 0` or `batch_size == None` then provide the full dataset as a single batch to `function`. + drop_last_batch (`bool`, defaults to `False`): + Whether a last batch smaller than the batch_size should be + dropped instead of being processed by the function. + remove_columns (`[List[str]]`, *optional*, defaults to `None`): + Remove a selection of columns while doing the mapping. + Columns will be removed before updating the examples with the output of `function`, i.e. if `function` is adding + columns with names in `remove_columns`, these columns will be kept. + features (`[Features]`, *optional*, defaults to `None`): + Feature types of the resulting dataset. + fn_kwargs (`Dict`, *optional*, default `None`): + Keyword arguments to be passed to `function`. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train", streaming=True) + >>> def add_prefix(example): + ... example["text"] = "Review: " + example["text"] + ... return example + >>> ds = ds.map(add_prefix) + >>> list(ds.take(3)) + [{'label': 1, + 'text': 'Review: the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'}, + {'label': 1, + 'text': 'Review: the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .'}, + {'label': 1, 'text': 'Review: effective but too-tepid biopic'}] + ``` + """ + return self._map( + function=function, + with_indices=with_indices, + input_columns=input_columns, + batched=batched, + batch_size=batch_size, + drop_last_batch=drop_last_batch, + remove_columns=remove_columns, + features=features, + fn_kwargs=fn_kwargs, + ) + + def _map( + self, + function: Optional[Callable] = None, + with_indices: bool = False, + input_columns: Optional[Union[str, list[str]]] = None, + batched: bool = False, + batch_size: Optional[int] = 1000, + drop_last_batch: bool = False, + remove_columns: Optional[Union[str, list[str]]] = None, + features: Optional[Features] = None, + fn_kwargs: Optional[dict] = None, + is_batch_accumulate_arrow_table_function: bool = False, + ) -> "IterableDataset": + if isinstance(input_columns, str): + input_columns = [input_columns] + if isinstance(remove_columns, str): + remove_columns = [remove_columns] + if function is None: + function = identity_func + if fn_kwargs is None: + fn_kwargs = {} + if features is not None: + features = _fix_for_backward_compatible_features(features) + + ex_iterable = self._ex_iterable + # no need to apply features if ex_iterable is typed and if there was no cast_column() + input_features = ( + None + if (ex_iterable.is_typed and (self._info.features is None or self._info.features == ex_iterable.features)) + else self._info.features + ) + + if self._formatting and self._formatting.is_table: + # apply formatting before iter_arrow to keep map examples iterable happy + ex_iterable = FormattedExamplesIterable( + ex_iterable, + formatting=deepcopy(self._formatting), + features=input_features, + token_per_repo_id=self._token_per_repo_id, + ) + ex_iterable = RebatchedArrowExamplesIterable( + ex_iterable, + batch_size=batch_size if batched else 1, + drop_last_batch=drop_last_batch, + force_convert_to_arrow=True, + ) + else: + if self._ex_iterable.iter_arrow: + if self._formatting or input_features: + ex_iterable = RebatchedArrowExamplesIterable( + self._ex_iterable, batch_size=batch_size if batched else 1, drop_last_batch=drop_last_batch + ) + if self._formatting or input_features: + # apply formatting after iter_arrow to avoid re-encoding the examples + ex_iterable = FormattedExamplesIterable( + ex_iterable, + formatting=deepcopy(self._formatting), + features=input_features, + token_per_repo_id=self._token_per_repo_id, + force_convert_to_python=True, + ) + + ex_iterable = MappedExamplesIterable( + ex_iterable, + function=function, + with_indices=with_indices, + input_columns=input_columns, + batched=batched, + batch_size=batch_size, + drop_last_batch=drop_last_batch, + remove_columns=remove_columns, + fn_kwargs=fn_kwargs, + formatting=self._formatting, + features=features, + is_batch_accumulate_arrow_table_function=is_batch_accumulate_arrow_table_function, + ) + info = self.info.copy() + info.features = features + return IterableDataset( + ex_iterable=ex_iterable, + info=info, + split=self._split, + formatting=self._formatting, + distributed=deepcopy(self._distributed), + token_per_repo_id=self._token_per_repo_id, + ) + + def filter( + self, + function: Optional[Callable] = None, + with_indices=False, + input_columns: Optional[Union[str, list[str]]] = None, + batched: bool = False, + batch_size: Optional[int] = 1000, + fn_kwargs: Optional[dict] = None, + ) -> "IterableDataset": + """Apply a filter function to all the elements so that the dataset only includes examples according to the filter function. + The filtering is done on-the-fly when iterating over the dataset. + + If the function is asynchronous, then `filter` will run your function in parallel, with up to one thousand simulatenous calls (configurable). + It is recommended to use a `asyncio.Semaphore` in your function if you want to set a maximum number of operations that can run at the same time. + + Args: + function (`Callable`): + Callable with one of the following signatures: + + - `function(example: Dict[str, Any]) -> bool` if `with_indices=False, batched=False` + - `function(example: Dict[str, Any], indices: int) -> bool` if `with_indices=True, batched=False` + - `function(example: Dict[str, List]) -> List[bool]` if `with_indices=False, batched=True` + - `function(example: Dict[str, List], indices: List[int]) -> List[bool]` if `with_indices=True, batched=True` + + If the function is asynchronous, then `filter` will run your function in parallel. + If no function is provided, defaults to an always True function: `lambda x: True`. + with_indices (`bool`, defaults to `False`): + Provide example indices to `function`. Note that in this case the signature of `function` should be `def function(example, idx): ...`. + input_columns (`str` or `List[str]`, *optional*): + The columns to be passed into `function` as + positional arguments. If `None`, a dict mapping to all formatted columns is passed as one argument. + batched (`bool`, defaults to `False`): + Provide batch of examples to `function`. + batch_size (`int`, *optional*, default `1000`): + Number of examples per batch provided to `function` if `batched=True`. + fn_kwargs (`Dict`, *optional*, default `None`): + Keyword arguments to be passed to `function`. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train", streaming=True) + >>> ds = ds.filter(lambda x: x["label"] == 0) + >>> list(ds.take(3)) + [{'label': 0, 'movie_review': 'simplistic , silly and tedious .'}, + {'label': 0, + 'movie_review': "it's so laddish and juvenile , only teenage boys could possibly find it funny ."}, + {'label': 0, + 'movie_review': 'exploitative and largely devoid of the depth or sophistication that would make watching such a graphic treatment of the crimes bearable .'}] + ``` + """ + if isinstance(input_columns, str): + input_columns = [input_columns] + + # We need the examples to be decoded for certain feature types like Image or Audio, + # format and type before filtering + ex_iterable = self._ex_iterable + if self._info.features or self._formatting: + ex_iterable = FormattedExamplesIterable( + ex_iterable, + formatting=self._formatting, + features=ex_iterable.features if ex_iterable.is_typed else self._info.features, + token_per_repo_id=self._token_per_repo_id, + ) + + ex_iterable = FilteredExamplesIterable( + ex_iterable, + function=function, + with_indices=with_indices, + input_columns=input_columns, + batched=batched, + batch_size=batch_size, + fn_kwargs=fn_kwargs, + formatting=self._formatting, + ) + return IterableDataset( + ex_iterable=ex_iterable, + info=self._info, + split=self._split, + formatting=self._formatting, + distributed=deepcopy(self._distributed), + token_per_repo_id=self._token_per_repo_id, + ) + + def shuffle( + self, + seed=None, + generator: Optional[np.random.Generator] = None, + buffer_size: int = 1000, + max_buffer_input_shards: int = 10, + ) -> "IterableDataset": + """ + Randomly shuffles the elements of this dataset. + + This dataset fills a buffer with `buffer_size` elements, then randomly samples elements from this buffer, + replacing the selected elements with new elements. For perfect shuffling, a buffer size greater than or + equal to the full size of the dataset is required. + + For instance, if your dataset contains 10,000 elements but `buffer_size` is set to 1000, then `shuffle` will + initially select a random element from only the first 1000 elements in the buffer. Once an element is + selected, its space in the buffer is replaced by the next (i.e. 1,001-st) element, + maintaining the 1000 element buffer. + + If the dataset is made of several shards, it fills the buffer using up to `max_buffer_input_shards` shards + at a time and also does shuffle the order of the shards. This greatly improves the quality of the shuffling. + + However if the order has been fixed by using [`~datasets.IterableDataset.skip`] + or [`~datasets.IterableDataset.take`] then the order of the shards is kept unchanged and only one shard at + a time is used to fill the buffer. + + Args: + seed (`int`, *optional*, defaults to `None`): + Random seed that will be used to shuffle the dataset. + It is used to sample from the shuffle buffer and also to shuffle the data shards. + generator (`numpy.random.Generator`, *optional*): + Numpy random Generator to use to compute the permutation of the dataset rows. + If `generator=None` (default), uses `np.random.default_rng` (the default BitGenerator (PCG64) of NumPy). + buffer_size (`int`, defaults to `1000`): + Size of the buffer. + max_buffer_input_shards (`int`, defaults to `101000`): + Maximum number of shards to use to feed the buffer at a time. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train", streaming=True) + >>> list(ds.take(3)) + [{'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .', + 'label': 1}, + {'text': 'the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .', + 'label': 1}, + {'text': 'effective but too-tepid biopic', 'label': 1}] + >>> shuffled_ds = ds.shuffle(seed=42) + >>> list(shuffled_ds.take(3)) + [{'text': "a sports movie with action that's exciting on the field and a story you care about off it .", + 'label': 1}, + {'text': 'at its best , the good girl is a refreshingly adult take on adultery . . .', + 'label': 1}, + {'text': "sam jones became a very lucky filmmaker the day wilco got dropped from their record label , proving that one man's ruin may be another's fortune .", + 'label': 1}] + >>> resharded_ds = ds.reshard() # useful to shard Parquet datasets by row group instead of by file, improving shuffling quality on dataset with one or few files. + >>> shuffled_resharded_ds = resharded_ds.shuffle(seed=42) + >>> list(shuffled_resharded_ds.take(3)) + [{'text': 'this mistaken-identity picture is so film-culture referential that the final product is a ghost .', + 'label': 0}, + {'text': 'woody allen used to ridicule movies like hollywood ending . now he makes them .', + 'label': 0}, + {'text': "not only is undercover brother as funny , if not more so , than both austin powers films , but it's also one of the smarter , savvier spoofs to come along in some time .", + 'label': 1}] + ``` + """ + if generator is None: + generator = np.random.default_rng(seed) + else: + generator = deepcopy(generator) + ex_iterable = self._ex_iterable + try: + ex_iterable = ex_iterable.shuffle_data_sources(generator) + except DataSourcesShufflingDisallowed: + max_buffer_input_shards = 1 + if ex_iterable.iter_arrow: + ex_iterable = RebatchedArrowExamplesIterable(ex_iterable, batch_size=1) + if max_buffer_input_shards > 1: + num_shards_to_interleave = min(ex_iterable.num_shards, max_buffer_input_shards) + ex_iterable = CyclingMultiSourcesExamplesIterable( + [ + ex_iterable.shard_data_sources(num_shards=num_shards_to_interleave, index=index) + for index in range(num_shards_to_interleave) + ], + stopping_strategy="all_exhausted_without_replacement", + ) + ex_iterable = BufferShuffledExamplesIterable(ex_iterable, buffer_size=buffer_size, generator=generator) + return IterableDataset( + ex_iterable, + info=self._info.copy(), + split=self._split, + formatting=self._formatting, + distributed=deepcopy(self._distributed), + token_per_repo_id=self._token_per_repo_id, + ) + + def set_epoch(self, epoch: int): + self._epoch += epoch - self._epoch # update torch value in shared memory in-place + + def skip(self, n: int) -> "IterableDataset": + """ + Create a new [`IterableDataset`] that skips the first `n` elements. + + Args: + n (`int`): + Number of elements to skip. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train", streaming=True) + >>> list(ds.take(3)) + [{'label': 1, + 'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'}, + {'label': 1, + 'text': 'the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .'}, + {'label': 1, 'text': 'effective but too-tepid biopic'}] + >>> ds = ds.skip(1) + >>> list(ds.take(3)) + [{'label': 1, + 'text': 'the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .'}, + {'label': 1, 'text': 'effective but too-tepid biopic'}, + {'label': 1, + 'text': 'if you sometimes like to go to the movies to have fun , wasabi is a good place to start .'}] + ``` + """ + ex_iterable = SkipExamplesIterable( + self._ex_iterable, + n, + split_when_sharding=self._distributed is None, + ) + return IterableDataset( + ex_iterable=ex_iterable, + info=self._info.copy(), + split=self._split, + formatting=self._formatting, + distributed=deepcopy(self._distributed), + token_per_repo_id=self._token_per_repo_id, + ) + + def repeat(self, num_times: Optional[int]) -> "IterableDataset": + """ + Create a new [`IterableDataset`] that repeats the underlying dataset `num_times` times. + + N.B. The effect of calling shuffle after repeat depends significantly on buffer size. + With buffer_size 1, duplicate data is never seen in the same iteration, even after shuffling: + ds.repeat(n).shuffle(seed=42, buffer_size=1) is equivalent to ds.shuffle(seed=42, buffer_size=1).repeat(n), + and only shuffles shard orders within each iteration. + With buffer size >= (num samples in the dataset * num_times), we get full shuffling of the repeated data, i.e. we can observe duplicates in + the same iteration. + + Args: + num_times (`int`) or (`None`): + Number of times to repeat the dataset. If `None`, the dataset will be repeated indefinitely. + + Example: + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train") + >>> ds = ds.take(2).repeat(2) + >>> list(ds) + [{'label': 1, + 'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'}, + {'label': 1, + 'text': 'the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .'}, + {'label': 1, 'text': 'effective but too-tepid biopic'}, + {'label': 1, + 'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'}, + {'label': 1, + 'text': 'the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .'}, + {'label': 1, 'text': 'effective but too-tepid biopic'}] + ``` + """ + return IterableDataset( + ex_iterable=RepeatExamplesIterable(self._ex_iterable, num_times=num_times), + info=self._info, + split=self._split, + formatting=self._formatting, + distributed=deepcopy(self._distributed), + token_per_repo_id=self._token_per_repo_id, + ) + + def take(self, n: int) -> "IterableDataset": + """ + Create a new [`IterableDataset`] with only the first `n` elements. + + Args: + n (`int`): + Number of elements to take. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train", streaming=True) + >>> small_ds = ds.take(2) + >>> list(small_ds) + [{'label': 1, + 'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'}, + {'label': 1, + 'text': 'the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .'}] + ``` + """ + ex_iterable = TakeExamplesIterable( + self._ex_iterable, + n, + split_when_sharding=self._distributed is None, + ) + return IterableDataset( + ex_iterable=ex_iterable, + info=self._info.copy(), + split=self._split, + formatting=self._formatting, + distributed=deepcopy(self._distributed), + token_per_repo_id=self._token_per_repo_id, + ) + + def shard( + self, + num_shards: int, + index: int, + contiguous: bool = True, + ) -> "IterableDataset": + """Return the `index`-nth shard from dataset split into `num_shards` pieces. + + This shards deterministically. `dataset.shard(n, i)` splits the dataset into contiguous chunks, + so it can be easily concatenated back together after processing. If `dataset.num_shards % n == l`, then the + first `l` datasets each have `(dataset.num_shards // n) + 1` shards, and the remaining datasets have `(dataset.num_shards // n)` shards. + `datasets.concatenate_datasets([dset.shard(n, i) for i in range(n)])` returns a dataset with the same order as the original. + In particular, `dataset.shard(dataset.num_shards, i)` returns a dataset with 1 shard. + + Note: n should be less or equal to the number of shards in the dataset `dataset.num_shards`. + + On the other hand, `dataset.shard(n, i, contiguous=False)` contains all the shards of the dataset whose index mod `n = i`. + + Be sure to shard before using any randomizing operator (such as `shuffle`). + It is best if the shard operator is used early in the dataset pipeline. + + Args: + num_shards (`int`): + How many shards to split the dataset into. + index (`int`): + Which shard to select and return. + contiguous: (`bool`, defaults to `True`): + Whether to select contiguous blocks of indices for shards. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("fancyzhx/amazon_polarity", split="train", streaming=True) + >>> ds + IterableDataset({ + features: ['label', 'title', 'content'], + num_shards: 4 + }) + >>> ds.shard(num_shards=2, index=0) + IterableDataset({ + features: ['label', 'title', 'content'], + num_shards: 2 + }) + ``` + """ + ex_iterable = self._ex_iterable.shard_data_sources(num_shards=num_shards, index=index, contiguous=contiguous) + return IterableDataset( + ex_iterable=ex_iterable, + info=self._info.copy(), + split=self._split, + formatting=self._formatting, + distributed=deepcopy(self._distributed), + token_per_repo_id=self._token_per_repo_id, + ) + + def reshard(self) -> "IterableDataset": + """Reshard the dataset if possible, i.e. split the current shards further into more shards. + This increases the number of shards and the resulting dataset has num_shards >= previous_num_shards. + Equality may happen if no shard can be split further. + + The resharding mechanism depends on the dataset file format: + + * Parquet: shard per row group instead of per file + * Other: not implemented yet (contributions are welcome !) + + Be sure to reshard/shard before using any randomizing operator (such as `shuffle`). + It is best if the shard operator is used early in the dataset pipeline. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("fancyzhx/amazon_polarity", split="train", streaming=True) + >>> ds + IterableDataset({ + features: ['label', 'title', 'content'], + num_shards: 4 + }) + >>> ds.reshard() + IterableDataset({ + features: ['label', 'title', 'content'], + num_shards: 3600 + }) + ``` + """ + ex_iterable = self._ex_iterable.reshard_data_sources() + return IterableDataset( + ex_iterable=ex_iterable, + info=self._info.copy(), + split=self._split, + formatting=self._formatting, + distributed=deepcopy(self._distributed), + token_per_repo_id=self._token_per_repo_id, + ) + + def add_column(self, name: str, column: Union[list, np.array]) -> "IterableDataset": + """Add column to Dataset. + + Args: + name (str): Column name. + column (list or np.array): Column data to be added. + + Returns: + `IterableDataset` + """ + return self.map(partial(add_column_fn, name=name, column=column), with_indices=True) + + def rename_column(self, original_column_name: str, new_column_name: str) -> "IterableDataset": + """ + Rename a column in the dataset, and move the features associated to the original column under the new column + name. + + Args: + original_column_name (`str`): + Name of the column to rename. + new_column_name (`str`): + New name for the column. + + Returns: + `IterableDataset`: A copy of the dataset with a renamed column. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train", streaming=True) + >>> next(iter(ds)) + {'label': 1, + 'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'} + >>> ds = ds.rename_column("text", "movie_review") + >>> next(iter(ds)) + {'label': 1, + 'movie_review': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'} + ``` + """ + return self.rename_columns({original_column_name: new_column_name}) + + def rename_columns(self, column_mapping: dict[str, str]) -> "IterableDataset": + """ + Rename several columns in the dataset, and move the features associated to the original columns under + the new column names. + + Args: + column_mapping (`Dict[str, str]`): A mapping of columns to rename to their new names + + Returns: + `IterableDataset`: A copy of the dataset with renamed columns + """ + + original_features = self._info.features.copy() if self._info.features else None + ds_iterable = self.map( + partial(_rename_columns_fn, column_mapping=column_mapping), remove_columns=list(column_mapping) + ) + if original_features is not None: + ds_iterable._info.features = Features( + { + column_mapping[col] if col in column_mapping.keys() else col: feature + for col, feature in original_features.items() + } + ) + return ds_iterable + + def remove_columns(self, column_names: Union[str, list[str]]) -> "IterableDataset": + """ + Remove one or several column(s) in the dataset and the features associated to them. + The removal is done on-the-fly on the examples when iterating over the dataset. + + + Args: + column_names (`Union[str, List[str]]`): + Name of the column(s) to remove. + + Returns: + `IterableDataset`: A copy of the dataset object without the columns to remove. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train", streaming=True) + >>> next(iter(ds)) + {'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .', 'label': 1} + >>> ds = ds.remove_columns("label") + >>> next(iter(ds)) + {'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'} + ``` + """ + original_features = self._info.features.copy() if self._info.features else None + ds_iterable = self.map(remove_columns=column_names) + if original_features is not None: + ds_iterable._info.features = original_features.copy() + for col, _ in original_features.items(): + if col in column_names: + del ds_iterable._info.features[col] + + return ds_iterable + + def select_columns(self, column_names: Union[str, list[str]]) -> "IterableDataset": + """Select one or several column(s) in the dataset and the features + associated to them. The selection is done on-the-fly on the examples + when iterating over the dataset. + + + Args: + column_names (`Union[str, List[str]]`): + Name of the column(s) to select. + + Returns: + `IterableDataset`: A copy of the dataset object with selected columns. + + Example: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train", streaming=True) + >>> next(iter(ds)) + {'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .', 'label': 1} + >>> ds = ds.select_columns("text") + >>> next(iter(ds)) + {'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'} + ``` + """ + if isinstance(column_names, str): + column_names = [column_names] + + if self._info: + info = deepcopy(self._info) + if self._info.features is not None: + missing_columns = set(column_names) - set(self._info.features.keys()) + if missing_columns: + raise ValueError( + f"Column name {list(missing_columns)} not in the " + "dataset. Columns in the dataset: " + f"{list(self._info.features.keys())}." + ) + info.features = Features({c: info.features[c] for c in column_names}) + + ex_iterable = SelectColumnsIterable(self._ex_iterable, column_names) + return IterableDataset( + ex_iterable=ex_iterable, + info=info, + split=self._split, + formatting=self._formatting, + distributed=self._distributed, + token_per_repo_id=self._token_per_repo_id, + ) + + def cast_column(self, column: str, feature: FeatureType) -> "IterableDataset": + """Cast column to feature for decoding. + + Args: + column (`str`): + Column name. + feature (`Feature`): + Target feature. + + Returns: + `IterableDataset` + + Example: + + ```py + >>> from datasets import load_dataset, Audio + >>> ds = load_dataset("PolyAI/minds14", name="en-US", split="train", streaming=True) + >>> ds.features + {'audio': Audio(sampling_rate=8000, mono=True, decode=True, id=None), + 'english_transcription': Value('string'), + 'intent_class': ClassLabel(num_classes=14, names=['abroad', 'address', 'app_error', 'atm_limit', 'balance', 'business_loan', 'card_issues', 'cash_deposit', 'direct_debit', 'freeze', 'high_value_payment', 'joint_account', 'latest_transactions', 'pay_bill']), + 'lang_id': ClassLabel(num_classes=14, names=['cs-CZ', 'de-DE', 'en-AU', 'en-GB', 'en-US', 'es-ES', 'fr-FR', 'it-IT', 'ko-KR', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'zh-CN']), + 'path': Value('string'), + 'transcription': Value('string')} + >>> ds = ds.cast_column("audio", Audio(sampling_rate=16000)) + >>> ds.features + {'audio': Audio(sampling_rate=16000, mono=True, decode=True, id=None), + 'english_transcription': Value('string'), + 'intent_class': ClassLabel(num_classes=14, names=['abroad', 'address', 'app_error', 'atm_limit', 'balance', 'business_loan', 'card_issues', 'cash_deposit', 'direct_debit', 'freeze', 'high_value_payment', 'joint_account', 'latest_transactions', 'pay_bill']), + 'lang_id': ClassLabel(num_classes=14, names=['cs-CZ', 'de-DE', 'en-AU', 'en-GB', 'en-US', 'es-ES', 'fr-FR', 'it-IT', 'ko-KR', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'zh-CN']), + 'path': Value('string'), + 'transcription': Value('string')} + ``` + """ + feature = _fix_for_backward_compatible_features(feature) + info = self._info.copy() + info.features[column] = feature + return IterableDataset( + ex_iterable=self._ex_iterable, + info=info, + split=self._split, + formatting=self._formatting, + distributed=deepcopy(self._distributed), + token_per_repo_id=self._token_per_repo_id, + ) + + def cast( + self, + features: Features, + ) -> "IterableDataset": + """ + Cast the dataset to a new set of features. + + Args: + features ([`Features`]): + New features to cast the dataset to. + The name of the fields in the features must match the current column names. + The type of the data must also be convertible from one type to the other. + For non-trivial conversion, e.g. `string` <-> `ClassLabel` you should use [`~Dataset.map`] to update the Dataset. + + Returns: + `IterableDataset`: A copy of the dataset with casted features. + + Example: + + ```py + >>> from datasets import load_dataset, ClassLabel, Value + >>> ds = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train", streaming=True) + >>> ds.features + {'label': ClassLabel(names=['neg', 'pos']), + 'text': Value('string')} + >>> new_features = ds.features.copy() + >>> new_features["label"] = ClassLabel(names=["bad", "good"]) + >>> new_features["text"] = Value("large_string") + >>> ds = ds.cast(new_features) + >>> ds.features + {'label': ClassLabel(names=['bad', 'good']), + 'text': Value('large_string')} + ``` + """ + features = _fix_for_backward_compatible_features(features) + info = self._info.copy() + info.features = features + return IterableDataset( + ex_iterable=self._ex_iterable, + info=info, + split=self._split, + formatting=self._formatting, + distributed=deepcopy(self._distributed), + token_per_repo_id=self._token_per_repo_id, + ) + + def decode(self, enable: bool = True, num_threads: int = 0) -> "IterableDataset": + """ + Enable or disable the dataset features decoding for audio, image, video. + + When enabled (default), media types are decoded: + + * audio -> dict of "array" and "sampling_rate" and "path" + * image -> PIL.Image + * video -> torchcodec.decoders.VideoDecoder + + You can enable multithreading using `num_threads`. This is especially useful to speed up remote + data streaming. However it can be slower than `num_threads=0` for local data on fast disks. + + Disabling decoding is useful if you want to iterate on the paths or bytes of the media files + without actually decoding their content. To disable decoding you can use `.decode(False)`, which + is equivalent to calling `.cast()` or `.cast_column()` with all the Audio, Image and Video types + set to `decode=False`. + + Args: + enable (`bool`, defaults to `True`): + Enable or disable features decoding. + num_threads (`int`, defaults to `0`): + Enable multithreading for features decoding. + + Returns: + `IterableDataset`: A copy of the dataset with casted features. + + Examples: + + Disable decoding: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset("sshh12/planet-textures", split="train", streaming=True) + >>> next(iter(ds)) + {'image': , + 'text': 'A distant celestial object with an icy crust, displaying a light blue shade, covered with round pits and rugged terrains.'} + >>> ds = ds.decode(False) + >>> ds.features + {'image': Image(mode=None, decode=False, id=None), + 'text': Value('string')} + >>> next(iter(ds)) + { + 'image': { + 'path': 'hf://datasets/sshh12/planet-textures@69dc4cef7a5c4b2cfe387727ec8ea73d4bff7302/train/textures/0000.png', + 'bytes': None + }, + 'text': 'A distant celestial object with an icy crust, displaying a light blue shade, covered with round pits and rugged terrains.' + } + ``` + + Speed up streaming with multithreading: + + ```py + >>> import os + >>> from datasets import load_dataset + >>> from tqdm import tqdm + >>> ds = load_dataset("sshh12/planet-textures", split="train", streaming=True) + >>> num_threads = min(32, (os.cpu_count() or 1) + 4) + >>> ds = ds.decode(num_threads=num_threads) + >>> for _ in tqdm(ds): # 20 times faster ! + ... ... + ``` + """ + if not self.features: + raise ValueError( + "Features decoding is only available for datasets with known features, but features are Unknown. " + "Please set the datasets features with `ds = ds.cast(features)`." + ) + ds = self + + def set_decoding(decode: bool, feature): + if hasattr(feature, "decode"): + feature.decode = decode + + if enable and num_threads > 0: + disabled_decoding_features = self.features.copy() + enabled_decoding_features = self.features.copy() + + _visit(disabled_decoding_features, partial(set_decoding, False)) + _visit(enabled_decoding_features, partial(set_decoding, True)) + ds = ds.cast(disabled_decoding_features) + pool = multiprocessing.pool.ThreadPool(num_threads) + func = partial(_apply_async, pool, enabled_decoding_features.decode_example) + ds = ds.map(func, features=enabled_decoding_features) + assert isinstance(ds._ex_iterable, MappedExamplesIterable) + ds._ex_iterable.max_num_running_async_map_functions_in_parallel = 2 * num_threads + else: + features = ds.features.copy() + _visit(features, partial(set_decoding, enable)) + ds = ds.cast(features) + return ds + + def _step(self, step: int, offset: int) -> "IterableDataset": + ex_iterable = StepExamplesIterable(self._ex_iterable, step=step, offset=offset) + return IterableDataset( + ex_iterable=ex_iterable, + info=self._info.copy(), + split=self._split, + formatting=self._formatting, + distributed=deepcopy(self._distributed), + token_per_repo_id=self._token_per_repo_id, + ) + + def _resolve_features(self): + if self.features is not None: + return self + elif self._ex_iterable.is_typed: + features = self._ex_iterable.features + else: + features = _infer_features_from_batch(self.with_format(None)._head()) + info = self.info.copy() + info.features = features + return IterableDataset( + ex_iterable=self._ex_iterable, + info=info, + split=self._split, + formatting=self._formatting, + distributed=deepcopy(self._distributed), + token_per_repo_id=self._token_per_repo_id, + ) + + def batch( + self, + batch_size: Optional[int] = None, + by_column: Optional[Union[str, list[str]]] = None, + drop_last_batch: bool = False, + ) -> "IterableDataset": + """ + Group samples from the dataset into batches. + + Args: + batch_size (`int`, optional): + The number of samples in each batch. + by_column (`Union[str, list[str]`, optional): + The column used to batch examples together. + Successive examples with the same value for that column are in grouped the same batch. + This can also be a list of columns if you want to batch by multiple columns. + If batching by column, the batch_size is only used to control the size of the batches + to group together or slice during acculumation. + + + drop_last_batch (`bool`, defaults to `False`): + Whether to drop the last incomplete batch. + + Example: + ```py + >>> ds = load_dataset("some_dataset", streaming=True) + >>> batched_ds = ds.batch(batch_size=32) + ``` + """ + if batch_size is None and by_column is None: + raise ValueError("IterableDataset.batch() misses `batch_size` or `by_column` argument.") + if self.features: + features = Features({col: List(feature) for col, feature in self.features.items()}) + else: + features = None + if by_column is not None: + columns = [by_column] if isinstance(by_column, str) else by_column + ds = ( + self.with_format("arrow") + ._map( + partial(_batch_accumulate_arrow_table_by_columns, columns=columns), + with_indices=True, + batched=True, + batch_size=batch_size, + drop_last_batch=drop_last_batch, + features=features, + is_batch_accumulate_arrow_table_function=True, + ) + .with_format(self._formatting.format_type if self._formatting else None) + ) + return ds + if self._formatting and self._formatting.is_table: + return ( + self.with_format("arrow") + .map( + _batch_arrow_table, + batched=True, + batch_size=batch_size, + drop_last_batch=drop_last_batch, + features=features, + ) + .with_format(self._formatting.format_type) + ) + return self.map( + _batch_fn, batched=True, batch_size=batch_size, drop_last_batch=drop_last_batch, features=features + ) + + def to_dict(self, batch_size: Optional[int] = None, batched: bool = False) -> Union[dict, Iterator[dict]]: + """Returns the dataset as a Python dict. Can also return a generator for large datasets. + + Args: + batch_size (`int`, *optional*): The size (number of rows) of the batches if `batched` is `True`. + Defaults to `datasets.config.DEFAULT_MAX_BATCH_SIZE`. + + Returns: + `dict` or `Iterator[dict]` + + Example: + + ```py + >>> ds.to_dict() + ``` + """ + if batched: + for table in self.with_format("arrow").iter(batch_size=batch_size): + yield Dataset(table, fingerprint="unset").to_dict() + else: + table = pa.concat_tables(list(self.with_format("arrow").iter(batch_size=1000))) + return Dataset(table, fingerprint="unset").to_dict() + + def to_list(self) -> list: + """Returns the dataset as a Python list. + + Returns: + `list` + + Example: + + ```py + >>> ds.to_list() + ``` + """ + table = pa.concat_tables(list(self.with_format("arrow").iter(batch_size=1000))) + return Dataset(table, fingerprint="unset").to_list() + + def to_pandas( + self, batch_size: Optional[int] = None, batched: bool = False + ) -> Union[pd.DataFrame, Iterator[pd.DataFrame]]: + """Returns the dataset as a `pandas.DataFrame`. Can also return a generator for large datasets. + + Args: + batch_size (`int`, *optional*): + The size (number of rows) of the batches if `batched` is `True`. + Defaults to `datasets.config.DEFAULT_MAX_BATCH_SIZE`. + batched (`bool`): + Set to `True` to return a generator that yields the dataset as batches + of `batch_size` rows. Defaults to `False` (returns the whole datasets once). + + Returns: + `pandas.DataFrame` or `Iterator[pandas.DataFrame]` + + Example: + + ```py + >>> ds.to_pandas() + ``` + """ + info = DatasetInfo(features=self.features.copy()) if self.features is not None else None + + def maybe_cast_to_declared_features(table: pa.Table): + if self.features is not None and table.schema != self.features.arrow_schema: + return cast_table_to_features(table, self.features) + return table + + if batched: + return ( + Dataset(maybe_cast_to_declared_features(table), info=info, fingerprint="unset").to_pandas() + for table in self.with_format("arrow").iter(batch_size=batch_size) + ) + else: + table = pa.concat_tables( + [maybe_cast_to_declared_features(table) for table in self.with_format("arrow").iter(batch_size=1000)] + ) + return Dataset(table, info=info, fingerprint="unset").to_pandas() + + def to_polars( + self, + batch_size: Optional[int] = None, + batched: bool = False, + schema_overrides: Optional[dict] = None, + rechunk: bool = True, + ) -> Union["pl.DataFrame", Iterator["pl.DataFrame"]]: + """Returns the dataset as a `polars.DataFrame`. Can also return a generator for large datasets. + + Args: + batch_size (`int`, *optional*): + The size (number of rows) of the batches if `batched` is `True`. + Defaults to `datasets.config.DEFAULT_MAX_BATCH_SIZE`. + batched (`bool`): + Set to `True` to return a generator that yields the dataset as batches + of `batch_size` rows. Defaults to `False` (returns the whole datasets once). + schema_overrides (`dict`, *optional*): + Support type specification or override of one or more columns; note that + any dtypes inferred from the schema param will be overridden. + rechunk (`bool`): + Make sure that all data is in contiguous memory. Defaults to `True`. + Returns: + `polars.DataFrame` or `Iterator[polars.DataFrame]` + + Example: + + ```py + >>> ds.to_polars() + ``` + """ + if batched: + for table in self.with_format("arrow").iter(batch_size=batch_size): + yield Dataset(table, fingerprint="unset").to_polars(schema_overrides=schema_overrides, rechunk=rechunk) + else: + table = pa.concat_tables(list(self.with_format("arrow").iter(batch_size=1000))) + return Dataset(table, fingerprint="unset").to_polars(schema_overrides=schema_overrides, rechunk=rechunk) + + def to_csv( + self, + path_or_buf: Union[PathLike, BinaryIO], + batch_size: Optional[int] = None, + storage_options: Optional[dict] = None, + **to_csv_kwargs, + ) -> int: + """Exports the dataset to csv. + + This iterates on the dataset and loads it completely in memory before writing it. + + Args: + path_or_buf (`PathLike` or `FileOrBuffer`): + Either a path to a file (e.g. `file.csv`), a remote URI (e.g. `hf://datasets/username/my_dataset_name/data.csv`), + or a BinaryIO, where the dataset will be saved to in the specified format. + batch_size (`int`, *optional*): + Size of the batch to load in memory and write at once. + Defaults to `datasets.config.DEFAULT_MAX_BATCH_SIZE`. + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the file-system backend, if any. + **to_csv_kwargs (additional keyword arguments): + Parameters to pass to pandas's [`pandas.DataFrame.to_csv`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_csv.html). + The parameter `index` defaults to `False` if not specified. + If you would like to write the index, pass `index=True` and also set a name for the index column by + passing `index_label`. + + Returns: + `int`: The number of characters or bytes written. + + Example: + + ```py + >>> ds.to_csv("path/to/dataset/directory") + ``` + """ + table = pa.concat_tables(list(self.with_format("arrow").iter(batch_size=1000))) + return Dataset(table, fingerprint="unset").to_csv( + path_or_buf, + batch_size=batch_size, + storage_options=storage_options, + **to_csv_kwargs, + ) + + def to_json( + self, + path_or_buf: Union[PathLike, BinaryIO], + batch_size: Optional[int] = None, + storage_options: Optional[dict] = None, + **to_json_kwargs, + ) -> int: + """Export the dataset to JSON Lines or JSON. + + This iterates on the dataset and loads it completely in memory before writing it. + + The default output format is [JSON Lines](https://jsonlines.org/). + To export to [JSON](https://www.json.org), pass `lines=False` argument and the desired `orient`. + + Args: + path_or_buf (`PathLike` or `FileOrBuffer`): + Either a path to a file (e.g. `file.json`), a remote URI (e.g. `hf://datasets/username/my_dataset_name/data.json`), + or a BinaryIO, where the dataset will be saved to in the specified format. + batch_size (`int`, *optional*): + Size of the batch to load in memory and write at once. + Defaults to `datasets.config.DEFAULT_MAX_BATCH_SIZE`. + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the file-system backend, if any. + **to_json_kwargs (additional keyword arguments): + Parameters to pass to pandas's [`pandas.DataFrame.to_json`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_json.html). + Default arguments are `lines=True` and `orient="records". + The parameter `index` defaults to `False` if `orient` is `"split"` or `"table"`. + If you would like to write the index, pass `index=True`. + + Returns: + `int`: The number of characters or bytes written. + + Example: + + ```py + >>> ds.to_json("path/to/dataset/directory/filename.jsonl") + ``` + + ```py + >>> num_shards = dataset.num_shards + >>> for index in range(num_shards): + ... shard = dataset.shard(index, num_shards) + ... shard.to_json(f"path/of/my/dataset/data-{index:05d}.jsonl") + ``` + + """ + table = pa.concat_tables(list(self.with_format("arrow").iter(batch_size=1000))) + return Dataset(table, fingerprint="unset").to_json( + path_or_buf, + batch_size=batch_size, + storage_options=storage_options, + **to_json_kwargs, + ) + + def to_sql( + self, + name: str, + con: Union[str, "sqlalchemy.engine.Connection", "sqlalchemy.engine.Engine", "sqlite3.Connection"], + batch_size: Optional[int] = None, + **sql_writer_kwargs, + ) -> int: + """Exports the dataset to a SQL database. + + Args: + name (`str`): + Name of SQL table. + con (`str` or `sqlite3.Connection` or `sqlalchemy.engine.Connection` or `sqlalchemy.engine.Connection`): + A [URI string](https://docs.sqlalchemy.org/en/13/core/engines.html#database-urls) or a SQLite3/SQLAlchemy connection object used to write to a database. + batch_size (`int`, *optional*): + Size of the batch to load in memory and write at once. + Defaults to `datasets.config.DEFAULT_MAX_BATCH_SIZE`. + **sql_writer_kwargs (additional keyword arguments): + Parameters to pass to pandas's [`pandas.DataFrame.to_sql`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_sql.html). + The parameter `index` defaults to `False` if not specified. + If you would like to write the index, pass `index=True` and also set a name for the index column by + passing `index_label`. + + + Returns: + `int`: The number of records written. + + Example: + + ```py + >>> # con provided as a connection URI string + >>> ds.to_sql("data", "sqlite:///my_own_db.sql") + >>> # con provided as a sqlite3 connection object + >>> import sqlite3 + >>> con = sqlite3.connect("my_own_db.sql") + >>> with con: + ... ds.to_sql("data", con) + ``` + """ + table = pa.concat_tables(list(self.with_format("arrow").iter(batch_size=1000))) + return Dataset(table, fingerprint="unset").to_sql(name, con, batch_size=batch_size, **sql_writer_kwargs) + + def to_parquet( + self, + path_or_buf: Union[PathLike, BinaryIO], + batch_size: Optional[int] = None, + storage_options: Optional[dict] = None, + **parquet_writer_kwargs, + ) -> int: + """Exports the dataset to parquet + + Args: + path_or_buf (`PathLike` or `FileOrBuffer`): + Either a path to a file (e.g. `file.parquet`), a remote URI (e.g. `hf://datasets/username/my_dataset_name/data.parquet`), + or a BinaryIO, where the dataset will be saved to in the specified format. + batch_size (`int`, *optional*): + Size of the batch to load in memory and write at once. + Defaults to `datasets.config.DEFAULT_MAX_BATCH_SIZE`. + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the file-system backend, if any. + + + **parquet_writer_kwargs (additional keyword arguments): + Parameters to pass to PyArrow's `pyarrow.parquet.ParquetWriter`. + + Returns: + `int`: The number of characters or bytes written. + + Example: + + ```py + >>> ds.to_parquet("path/to/dataset/directory") + ``` + + ```py + >>> num_shards = dataset.num_shards + >>> for index in range(num_shards): + ... shard = dataset.shard(index, num_shards) + ... shard.to_parquet(f"path/of/my/dataset/data-{index:05d}.parquet") + ``` + + """ + from .arrow_writer import get_arrow_writer_batch_size_from_features + + batch_size = get_arrow_writer_batch_size_from_features(self.features) or config.DEFAULT_MAX_BATCH_SIZE + table = pa.concat_tables(list(self.with_format("arrow").iter(batch_size=batch_size))) + return Dataset(table, fingerprint="unset").to_parquet( + path_or_buf, storage_options=storage_options, **parquet_writer_kwargs + ) + + def _push_parquet_shards_to_hub_single( + self, + job_id: int, + num_jobs: int, + resolved_output_path: HfFileSystemResolvedPath, + data_dir: str, + split: str, + token: Optional[str], + create_pr: Optional[bool], + # max_shard_size: Optional[Union[int, str]] = None, # TODO(QL): add arg + num_shards: int, + embed_external_files: bool, + ) -> Iterable[tuple[list[CommitOperationAdd], list[str], int, int]]: + """Pushes the dataset shards as Parquet files to the hub. + + Returns: + additions (`List[CommitOperation]`): list of the `CommitOperationAdd` of the uploaded shards + new_parquet_paths (`List[str]`): list of the paths of the uploaded parquet files + features (`Features`): features of the uploaded dataset + dataset_nbytes (`int`): approximate size in bytes of the uploaded dataset after uncompression + num_examples (`int`): number of examples of th euploaded shards + """ + + div = num_shards // num_jobs + mod = num_shards % num_jobs + start = div * job_id + min(job_id, mod) + end = start + div + (1 if job_id < mod else 0) + + index_shards = ( + (start + i, self.shard(num_shards=end - start, index=i, contiguous=True)) for i in range(end - start) + ) + + api = HfApi(endpoint=config.HF_ENDPOINT, token=token, library_name="datasets", library_version=__version__) + + dataset_nbytes = 0 + num_examples = 0 + additions: list[CommitOperationAdd] = [] + new_parquet_paths: list[str] = [] + features = self.features + for index, shard in index_shards: + if embed_external_files: + from .arrow_writer import get_arrow_writer_batch_size_from_features + + shard = shard.with_format("arrow") + shard = shard.map( + partial(embed_table_storage, token_per_repo_id=self._token_per_repo_id), + batched=True, + batch_size=get_arrow_writer_batch_size_from_features(shard.features), + ) + shard_path_in_repo = f"{data_dir}/{split}-{index:05d}-of-{num_shards:05d}.parquet" + tmp_file = tempfile.NamedTemporaryFile(suffix=".parquet", delete=False) + try: + shard.to_parquet(tmp_file) + tmp_file.close() + parquet_metadata = pq.read_metadata(tmp_file.name) + if features is None: + features = Features.from_arrow_schema(parquet_metadata.schema.to_arrow_schema()) + num_examples += parquet_metadata.num_rows + dataset_nbytes += sum( + parquet_metadata.row_group(i).total_byte_size for i in range(parquet_metadata.num_row_groups) + ) + new_parquet_paths.append(shard_path_in_repo) + if ( + isinstance(resolved_output_path, HfFileSystemResolvedRepositoryPath) + and not resolved_output_path.path_in_repo + ): + shard_addition = CommitOperationAdd(path_in_repo=shard_path_in_repo, path_or_fileobj=tmp_file.name) + api.preupload_lfs_files( + repo_id=resolved_output_path.repo_id, + additions=[shard_addition], + repo_type=resolved_output_path.repo_type, + revision=resolved_output_path.revision, + create_pr=create_pr, + ) + additions.append(shard_addition) + elif isinstance(resolved_output_path, HfFileSystemResolvedBucketPath): + if resolved_output_path.path: + shard_path_in_repo = resolved_output_path.path + "/" + shard_path_in_repo + api.batch_bucket_files( + bucket_id=resolved_output_path.bucket_id, add=[(tmp_file.name, shard_path_in_repo)] + ) + else: + raise NotImplementedError(f"Bad HF path: {resolved_output_path}") + except (Exception, KeyboardInterrupt): + tmp_file.close() + Path(tmp_file.name).unlink() + raise + tmp_file.close() + Path(tmp_file.name).unlink() + yield job_id, False, 1 + + yield job_id, True, (additions, new_parquet_paths, features, dataset_nbytes, num_examples) + + def _push_parquet_shards_to_hub( + self, + resolved_output_path: HfFileSystemResolvedPath, + data_dir: str, + split: str, + token: Optional[str], + create_pr: Optional[bool], + max_shard_size: Optional[Union[int, str]], + num_shards: Optional[int], + embed_external_files: bool, + num_proc: Optional[int], + ) -> tuple[list[CommitOperationAdd], list[str], Features, SplitInfo, int]: + """Pushes the dataset shards as Parquet files to the hub. + + Returns: + additions (`List[CommitOperation]`): list of the `CommitOperationAdd` of the uploaded shards + new_parquet_paths (`List[str]`): list of paths of the new files uploaded to the output path, + relative to output path + features (`features`): features of the uploaded dataset + split_info (`int`): info of the uploaded split, including the approximate size in bytes of + the uploaded dataset after uncompression + uploaded_size (`int`): number of uploaded bytes to the repository or bucket + """ + + # Find decodable columns, because if there are any, we need to: + # embed the bytes from the files in the shards + decodable_columns = ( + [k for k, v in self._info.features.items() if require_decoding(v, ignore_decode_attribute=True)] + if embed_external_files + else [] + ) + embed_external_files = embed_external_files and bool(decodable_columns) + + if num_shards is None: + if max_shard_size is None: + num_shards = self.num_shards + else: + max_shard_size = convert_file_size_to_int(max_shard_size or config.MAX_SHARD_SIZE) + estimated_nbytes = 0 + for pa_table in self.with_format("arrow").iter(batch_size=config.DEFAULT_MAX_BATCH_SIZE): + estimated_nbytes += pa_table.nbytes + num_shards = int(estimated_nbytes / max_shard_size) + 1 + num_shards = max(num_shards, num_proc or 1) + + additions: list[CommitOperationAdd] = [] + new_parquet_paths: list[str] = [] + uploaded_size = 0 + dataset_nbytes = 0 + num_examples = 0 + features = self.features + + num_jobs = num_proc or 1 + if num_shards <= 1: + logger.warning( + f"Setting num_proc from {num_jobs} back to 1 for the {split} split to disable multiprocessing as it only contains one shard." + ) + num_proc = None + num_jobs = 1 + elif num_shards < num_jobs: + logger.warning( + f"Setting num_proc from {num_jobs} to {num_shards} for the {split} split as it only contains {num_shards} shards." + ) + num_proc = num_shards + num_jobs = num_shards + kwargs_iterable = [ + { + "self": self.shard(num_shards=num_jobs, index=job_id, contiguous=True), + "job_id": job_id, + "num_jobs": num_jobs, + "resolved_output_path": resolved_output_path, + "data_dir": data_dir, + "split": split, + "token": token, + "create_pr": create_pr, + "num_shards": num_shards, + "embed_external_files": embed_external_files, + } + for job_id in range(num_jobs) + ] + desc = "Uploading the dataset shards" + desc += f" (num_proc={num_proc})" if num_proc is not None and num_proc >= 1 else "" + pbar = hf_tqdm( + unit=" shards", + total=num_shards, + desc=desc, + ) + with ( + contextlib.nullcontext() + if num_proc is None or num_proc < 1 + else mp.get_context("spawn").Pool(num_proc) as pool + ): + update_stream = ( + IterableDataset._push_parquet_shards_to_hub_single(**kwargs_iterable[0]) + if pool is None + else iflatmap_unordered( + pool, + IterableDataset._push_parquet_shards_to_hub_single, + kwargs_iterable=kwargs_iterable, + ) + ) + for job_id, done, content in update_stream: + if not done: + pbar.update(content) + else: + job_additions, job_new_parquet_paths, job_features, job_uploaded_size, job_num_examples = content + additions += job_additions + new_parquet_paths += job_new_parquet_paths + uploaded_size += job_uploaded_size + num_examples += job_num_examples + features = job_features + if pool is not None: + pool.close() + pool.join() + + uploaded_size = sum(addition.upload_info.size for addition in additions) + split_info = SplitInfo(split, num_bytes=dataset_nbytes, num_examples=num_examples) + return additions, new_parquet_paths, features, split_info, uploaded_size + + def push_to_hub( + self, + repo_id: str, + config_name: str = "default", + set_default: Optional[bool] = None, + split: Optional[str] = None, + data_dir: Optional[str] = None, + commit_message: Optional[str] = None, + commit_description: Optional[str] = None, + private: Optional[bool] = None, + token: Optional[str] = None, + revision: Optional[str] = None, + create_pr: Optional[bool] = False, + max_shard_size: Optional[Union[int, str]] = None, + num_shards: Optional[int] = None, + embed_external_files: bool = True, + num_proc: Optional[int] = None, + ) -> CommitInfo: + """Pushes the dataset to the hub as a Parquet dataset. + The dataset is pushed using HTTP requests and does not need to have neither git or git-lfs installed. + + The resulting Parquet files are self-contained by default. If your dataset contains [`Image`], [`Audio`] or [`Video`] + data, the Parquet files will store the bytes of your images or audio files. + You can disable this by setting `embed_external_files` to `False`. + + Args: + repo_id (`str`): + The ID of the repository to push to in the following format: `/` or + `/`. Also accepts ``, which will default to the namespace + of the logged-in user. + + It could also be a location inside a bucket, e.g. `buckets///...` + config_name (`str`, defaults to "default"): + The configuration name (or subset) of a dataset. Defaults to "default". + set_default (`bool`, *optional*): + Whether to set this configuration as the default one. Otherwise, the default configuration is the one + named "default". + split (`str`, *optional*): + The name of the split that will be given to that dataset. Defaults to `self.split`. + data_dir (`str`, *optional*): + Directory name that will contain the uploaded data files. Defaults to the `config_name` if different + from "default", else "data". + commit_message (`str`, *optional*): + Message to commit while pushing. Will default to `"Upload dataset"`. + commit_description (`str`, *optional*): + Description of the commit that will be created. + Additionally, description of the PR if a PR is created (`create_pr` is True). + private (`bool`, *optional*): + Whether to make the repo private. If `None` (default), the repo will be public unless the + organization's default is private. This value is ignored if the repo already exists. + token (`str`, *optional*): + An optional authentication token for the Hugging Face Hub. If no token is passed, will default + to the token saved locally when logging in with `huggingface-cli login`. Will raise an error + if no token is passed and the user is not logged-in. + revision (`str`, *optional*): + Branch to push the uploaded files to. Defaults to the `"main"` branch. + create_pr (`bool`, *optional*, defaults to `False`): + Whether to create a PR with the uploaded files or directly commit. + max_shard_size (`int` or `str`, *optional*): + Optional maximum size of the dataset shards to be uploaded to the hub. If expressed as a string, needs to be digits followed + by a unit (like `"5MB"`). If not provided, shard count defaults to this dataset's `.num_shards`. + num_shards (`int`, *optional*): + Number of shards to write. If `max_shard_size` is provided and `num_shards` is not, then the number of shards is estimated + from `max_shard_size`. + embed_external_files (`bool`, defaults to `True`): + Whether to embed file bytes in the shards. + In particular, this will do the following before the push for the fields of type: + + - [`Audio`] and [`Image`]: remove local path information and embed file content in the Parquet files. + num_proc (`int`, *optional*, defaults to `None`): + Number of processes when preparing and uploading the dataset. + This is helpful if the dataset is made of many samples and transformations. + I uses "spawn" context to work with hf_xet, the rust client for fast uploads to HF. + Multiprocessing is disabled by default. + + Return: + huggingface_hub.CommitInfo + + Example: + + ```python + >>> dataset.push_to_hub("/") + >>> dataset_dict.push_to_hub("/", private=True) + >>> dataset.push_to_hub("/", max_shard_size="1GB") + >>> dataset.push_to_hub("/", num_shards=1024) + ``` + + If your dataset has multiple splits (e.g. train/validation/test): + + ```python + >>> train_dataset.push_to_hub("/", split="train") + >>> val_dataset.push_to_hub("/", split="validation") + >>> # later + >>> dataset = load_dataset("/") + >>> train_dataset = dataset["train"] + >>> val_dataset = dataset["validation"] + ``` + + If you want to add a new configuration (or subset) to a dataset (e.g. if the dataset has multiple tasks/versions/languages): + + ```python + >>> english_dataset.push_to_hub("/", "en") + >>> french_dataset.push_to_hub("/", "fr") + >>> # later + >>> english_dataset = load_dataset("/", "en") + >>> french_dataset = load_dataset("/", "fr") + ``` + """ + if num_proc is not None and num_proc > self.num_shards: + logger.warning( + f"Too many num_proc: {num_proc} (max is dataset.num_shards={self.num_shards}). " + f"Stopping {num_proc - self.num_shards} processes." + ) + logger.info( + f"To parallelize data loading, we give each process some shards (or data sources) to process. " + f"Therefore it's unnecessary to have a number of processes greater than dataset.num_shards={self.num_shards}. " + f"To enable more parallelism, please split the dataset in more files than {self.num_shards}." + ) + num_proc = self.num_shards + + if config_name == "data": + raise ValueError("`config_name` cannot be 'data'. Please, choose another name for configuration.") + + if max_shard_size is not None and num_shards is not None: + raise ValueError( + "Failed to push_to_hub: please specify either max_shard_size or num_shards, but not both." + ) + + if split is None: + split = str(self.split) if self.split is not None else "train" + + if not re.match(_split_re, split): + raise ValueError(f"Split name should match '{_split_re}' but got '{split}'.") + + if not data_dir: + data_dir = config_name if config_name != "default" else "data" # for backward compatibility + + api = HfApi(endpoint=config.HF_ENDPOINT, token=token, library_name="datasets", library_version=__version__) + if repo_id.startswith("buckets/"): + if BucketNotFoundError is None: + raise ImportError("Pushing datasets to buckets requires huggingface_hub>=1.6.0") + _, _namespace, _bucket_name, *_path_segments = repo_id.split("/") + try: + bucket_id = api.bucket_info(_namespace + "/" + _bucket_name).id + except BucketNotFoundError: + bucket_url = api.create_bucket(_namespace + "/" + _bucket_name, private=private, exist_ok=True) + bucket_id = bucket_url.bucket_id + path = "/".join(s for s in _path_segments if s) + return _push_to_bucket( + self, + bucket_id=bucket_id, + path=path, + config_name=config_name, + set_default=set_default, + split=split, + data_dir=data_dir, + token=token, + max_shard_size=max_shard_size, + num_shards=num_shards, + embed_external_files=embed_external_files, + num_proc=num_proc, + ) + else: + try: + repo_id = api.repo_info(repo_id, repo_type="dataset").id + except RepositoryNotFoundError: + repo_url = api.create_repo( + repo_id, + repo_type="dataset", + private=private, + exist_ok=True, + ) + repo_id = repo_url.repo_id + + if revision is not None and not revision.startswith("refs/pr/"): + # We do not call create_branch for a PR reference: 400 Bad Request + api.create_branch(repo_id, branch=revision, repo_type="dataset", exist_ok=True) + return _push_to_repo( + self, + repo_id=repo_id, + config_name=config_name, + set_default=set_default, + split=split, + data_dir=data_dir, + commit_message=commit_message, + commit_description=commit_description, + token=token, + revision=revision, + create_pr=create_pr, + max_shard_size=max_shard_size, + num_shards=num_shards, + embed_external_files=embed_external_files, + num_proc=num_proc, + ) + + +def _concatenate_iterable_datasets( + dsets: list[IterableDataset], + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + axis: int = 0, +) -> IterableDataset: + """ + Converts a list of `IterableDataset` with the same schema into a single `IterableDataset`. + Missing data are filled with None values. + + + + Args: + dsets (`List[datasets.IterableDataset]`): List of Datasets to concatenate. + info (`DatasetInfo`, optional): Dataset information, like description, citation, etc. + split (`NamedSplit`, optional): Name of the dataset split. + axis (``{0, 1}``, default ``0``, meaning over rows): + Axis to concatenate over, where ``0`` means over rows (vertically) and ``1`` means over columns + (horizontally). + + *New in version 1.6.0* + + Example: + + ```py + >>> ds3 = _concatenate_iterable_datasets([ds1, ds2]) + ``` + """ + dsets = [d._resolve_features() for d in dsets] + + # Perform checks (and a potentional cast if axis=0) + if axis == 0: + _check_if_features_can_be_aligned([dset.features for dset in dsets]) + else: + _check_column_names([col_name for dset in dsets for col_name in dset.features]) + + # Check format is consistent; if so, will set format for concatenated dataset + if all(dset._formatting is None for dset in dsets): + formatting = None + elif any(dset._formatting is None for dset in dsets): + formatting = None + logger.info( + "Some of the datasets have disparate format or format not set. Resetting the format of the concatenated dataset." + ) + else: + format_type_set = {dset._formatting.format_type for dset in dsets} + if len(format_type_set) == 1: + format_type = format_type_set.pop() + formatting = FormattingConfig(format_type=format_type) + else: + formatting = None + logger.info( + "Some of the datasets have disparate format or format not set. Resetting the format of the concatenated dataset." + ) + + # TODO: improve this to account for a mix of ClassLabel and Value for example + # right now it would keep the type of the first dataset in the list + features = Features( + {k: v for features in _align_features([dset.features for dset in dsets]) for k, v in features.items()} + ) + + ex_iterables = [deepcopy(d._ex_iterable) for d in dsets] + if axis == 0: + ex_iterable = VerticallyConcatenatedMultiSourcesExamplesIterable(ex_iterables) + else: + if all(ex_iterable.iter_arrow for ex_iterable in ex_iterables): + from .arrow_writer import get_arrow_writer_batch_size_from_features + + batch_size = get_arrow_writer_batch_size_from_features(features) or config.DEFAULT_MAX_BATCH_SIZE + ex_iterables = [ + RebatchedArrowExamplesIterable(ex_iterable, batch_size=batch_size) for ex_iterable in ex_iterables + ] + ex_iterable = HorizontallyConcatenatedMultiSourcesExamplesIterable(ex_iterables) + # Set new info - we update the features + # setting the features also ensures to fill missing columns with None + if info is None: + info = DatasetInfo.from_merge([d.info for d in dsets]) + else: + info = info.copy() + info.features = features + # Get all the auth tokens per repository - in case the datasets come from different private repositories + token_per_repo_id = {repo_id: token for dataset in dsets for repo_id, token in dataset._token_per_repo_id.items()} + # Return new daset + return IterableDataset( + ex_iterable=ex_iterable, + info=info, + split=split, + token_per_repo_id=token_per_repo_id, + formatting=formatting, + ) + + +def _interleave_iterable_datasets( + datasets: list[IterableDataset], + probabilities: Optional[list[float]] = None, + seed: Optional[int] = None, + info: Optional[DatasetInfo] = None, + split: Optional[NamedSplit] = None, + stopping_strategy: Literal[ + "first_exhausted", "all_exhausted", "all_exhausted_without_replacement" + ] = "first_exhausted", +) -> IterableDataset: + """ + Interleave several iterable datasets (sources) into a single iterable dataset. + The new iterable dataset alternates between the sources to yield examples. + If `probabilities = None` (default) the iterable dataset will cycles through the sources in order for each next example in the iteration. + If `probabilities` is not `None, the iterable dataset will sample a random source according to the provided probabilities for each next examples in the iteration. + + + + Args: + datasets (`List[IterableDataset]`): list of datasets to interleave + probabilities (`List[float]`, optional, default None): If specified, the new iterable dataset samples + examples from one source at a time according to these probabilities. + seed (`int`, optional, default None): The random seed used to choose a source for each example. + stopping_strategy (`str`, defaults to `first_exhausted`): + Two strategies are proposed right now. + By default, `first_exhausted` is an undersampling strategy, i.e the dataset construction is stopped as soon as one dataset has ran out of samples. + If the strategy is `all_exhausted`, we use an oversampling strategy, i.e the dataset construction is stopped as soon as every samples of every dataset has been added at least once. + Note that if the strategy is `all_exhausted`, the interleaved dataset size can get enormous: + - with no probabilities, the resulting dataset will have max_length_datasets*nb_dataset samples. + - with given probabilities, the resulting dataset will have more samples if some datasets have really low probability of visiting. + + Output: + `datasets.IterableDataset` + """ + datasets = [d._resolve_features() for d in datasets] + + # Perform checks + _check_if_features_can_be_aligned([dset.features for dset in datasets]) + for i, dset in enumerate(datasets): + if datasets[0]._distributed != dset._distributed: + raise ValueError( + f"Datasets should be identically split_by_node before interleaving, but got {datasets[0]._distributed}!={dset._distributed} at index 0 and {i}" + ) + + # TODO: improve this to account for a mix of ClassLabel and Value for example + # right now it would keep the type of the first dataset in the list + features = Features( + {k: v for features in _align_features([dset.features for dset in datasets]) for k, v in features.items()} + ) + + ex_iterables = [deepcopy(d._ex_iterable) for d in datasets] + if all(ex_iterable.iter_arrow for ex_iterable in ex_iterables): + ex_iterables = [RebatchedArrowExamplesIterable(ex_iterable, batch_size=1) for ex_iterable in ex_iterables] + # Use cycling or random cycling of sources + if probabilities is None: + ex_iterable = CyclingMultiSourcesExamplesIterable(ex_iterables, stopping_strategy=stopping_strategy) + else: + generator = np.random.default_rng(seed) + ex_iterable = RandomlyCyclingMultiSourcesExamplesIterable( + ex_iterables, + generator=generator, + probabilities=probabilities, + stopping_strategy=stopping_strategy, + ) + # Set new info - we update the features + # setting the features also ensures to fill missing columns with None + if info is None: + info = DatasetInfo.from_merge([d.info for d in datasets]) + else: + info = info.copy() + info.features = features + # Get all the auth tokens per repository - in case the datasets come from different private repositories + token_per_repo_id = { + repo_id: token for dataset in datasets for repo_id, token in dataset._token_per_repo_id.items() + } + # Return new daset + return IterableDataset( + ex_iterable=ex_iterable, + info=info, + split=split, + token_per_repo_id=token_per_repo_id, + distributed=datasets[0]._distributed, + ) + + +def _split_by_node_iterable_dataset(dataset: IterableDataset, rank: int, world_size: int) -> IterableDataset: + """ + Split an iterable dataset for the node at rank `rank` in a pool of nodes of size `world_size`. + + If the dataset has a number of shards that is a factor of `world_size` (i.e. if `dataset.num_shards % world_size == 0`), + then the shards are evenly assigned across the nodes, which is the most optimized. + Otherwise, each node keeps 1 example out of `world_size`, skipping the other examples. + + Args: + dataset ([`IterableDataset`]): + The iterable dataset to split by node. + rank (`int`): + Rank of the current node. + world_size (`int`): + Total number of nodes. + + Returns: + [`IterableDataset`]: The iterable dataset to be used on the node at rank `rank`. + """ + if dataset._distributed: + rank = world_size * dataset._distributed.rank + rank + world_size = world_size * dataset._distributed.world_size + distributed = DistributedConfig(rank=rank, world_size=world_size) + return IterableDataset( + ex_iterable=dataset._ex_iterable, + info=dataset._info.copy(), + split=dataset._split, + formatting=dataset._formatting, + distributed=distributed, + token_per_repo_id=dataset._token_per_repo_id, + ) + + +async def _apply_async(pool, func, x): + future = pool.apply_async(func, (x,)) + while True: + if future.ready(): + return future.get() + else: + await asyncio.sleep(0) + + +def _batch_fn(unbatched): + return {k: [v] for k, v in unbatched.items()} + + +def _generate_tables_from_polars(df: Union["pl.DataFrame", "pl.LazyFrame"]) -> Iterator[tuple["BuilderKey", pa.Table]]: + import polars as pl + + from .builder import Key as BuilderKey + + for slice_idx, df_slice in enumerate(df.collect_batches() if isinstance(df, pl.LazyFrame) else df.iter_slices()): + yield BuilderKey(0, slice_idx), df_slice.to_arrow() diff --git a/src/datasets/load.py b/src/datasets/load.py new file mode 100644 index 0000000..0973093 --- /dev/null +++ b/src/datasets/load.py @@ -0,0 +1,1782 @@ +# Copyright 2020 The HuggingFace Datasets Authors and the TensorFlow Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""Access datasets.""" + +import glob +import importlib +import inspect +import json +import os +import posixpath +from collections import Counter +from collections.abc import Mapping, Sequence +from dataclasses import dataclass, field +from pathlib import Path +from typing import Any, Literal, Optional, Union, overload + +import fsspec +import httpx +import requests +import yaml +from fsspec.core import url_to_fs +from huggingface_hub import DatasetCard, DatasetCardData, HfApi, HfFileSystem +from huggingface_hub.utils import ( + EntryNotFoundError, + GatedRepoError, + LocalEntryNotFoundError, + OfflineModeIsEnabled, + RepositoryNotFoundError, + RevisionNotFoundError, + get_session, +) +from packaging import version + +from . import __version__, config +from .arrow_dataset import Dataset +from .builder import BuilderConfig, DatasetBuilder +from .data_files import ( + DataFilesDict, + DataFilesList, + DataFilesPatternsDict, + EmptyDatasetError, + get_data_patterns, + sanitize_patterns, +) +from .dataset_dict import DatasetDict, IterableDatasetDict +from .download.download_config import DownloadConfig +from .download.download_manager import DownloadMode +from .download.streaming_download_manager import StreamingDownloadManager, xbasename, xglob, xjoin +from .exceptions import DataFilesNotFoundError, DatasetNotFoundError +from .features import Features +from .features.features import _fix_for_backward_compatible_features +from .fingerprint import Hasher +from .info import DatasetInfo, DatasetInfosDict +from .iterable_dataset import IterableDataset +from .naming import camelcase_to_snakecase, snakecase_to_camelcase +from .packaged_modules import ( + _ALL_ALLOWED_EXTENSIONS, + _ALL_METADATA_FILENAMES, + _EXTENSION_TO_MODULE, + _MODULE_TO_EXTENSIONS, + _MODULE_TO_METADATA_EXTENSIONS, + _MODULE_TO_METADATA_FILE_NAMES, + _PACKAGED_DATASETS_MODULES, +) +from .splits import Split +from .utils import _dataset_viewer +from .utils.file_utils import ( + _raise_if_offline_mode_is_enabled, + cached_path, + get_datasets_user_agent, + is_relative_path, + relative_to_absolute_path, +) +from .utils.hub import hf_dataset_url +from .utils.info_utils import VerificationMode, is_small_dataset +from .utils.logging import get_logger +from .utils.metadata import MetadataConfigs +from .utils.typing import PathLike +from .utils.version import Version + + +if config.HF_HUB_VERSION >= version.parse("1.6.0"): + from huggingface_hub.errors import BucketNotFoundError + +else: + BucketNotFoundError = None + + +logger = get_logger(__name__) + + +class _InitializeConfiguredDatasetBuilder: + """ + From https://stackoverflow.com/questions/4647566/pickle-a-dynamically-parameterized-sub-class + See also ConfiguredDatasetBuilder.__reduce__ + When called with the param value as the only argument, returns an + un-initialized instance of the parameterized class. Subsequent __setstate__ + will be called by pickle. + """ + + def __call__(self, builder_cls, metadata_configs, default_config_name, name): + # make a simple object which has no complex __init__ (this one will do) + obj = _InitializeConfiguredDatasetBuilder() + obj.__class__ = configure_builder_class( + builder_cls, metadata_configs, default_config_name=default_config_name, dataset_name=name + ) + return obj + + +def configure_builder_class( + builder_cls: type[DatasetBuilder], + builder_configs: list[BuilderConfig], + default_config_name: Optional[str], + dataset_name: str, +) -> type[DatasetBuilder]: + """ + Dynamically create a builder class with custom builder configs parsed from README.md file, + i.e. set BUILDER_CONFIGS class variable of a builder class to custom configs list. + """ + + class ConfiguredDatasetBuilder(builder_cls): + BUILDER_CONFIGS = builder_configs + DEFAULT_CONFIG_NAME = default_config_name + + __module__ = builder_cls.__module__ # so that the actual packaged builder can be imported + + def __reduce__(self): # to make dynamically created class pickable, see _InitializeParameterizedDatasetBuilder + parent_builder_cls = self.__class__.__mro__[1] + return ( + _InitializeConfiguredDatasetBuilder(), + ( + parent_builder_cls, + self.BUILDER_CONFIGS, + self.DEFAULT_CONFIG_NAME, + self.dataset_name, + ), + self.__dict__.copy(), + ) + + ConfiguredDatasetBuilder.__name__ = ( + f"{builder_cls.__name__.lower().capitalize()}{snakecase_to_camelcase(dataset_name)}" + ) + ConfiguredDatasetBuilder.__qualname__ = ( + f"{builder_cls.__name__.lower().capitalize()}{snakecase_to_camelcase(dataset_name)}" + ) + + return ConfiguredDatasetBuilder + + +def import_main_class(module_path) -> Optional[type[DatasetBuilder]]: + """Import a module at module_path and return its main class: a DatasetBuilder""" + module = importlib.import_module(module_path) + # Find the main class in our imported module + module_main_cls = None + for name, obj in module.__dict__.items(): + if inspect.isclass(obj) and issubclass(obj, DatasetBuilder): + if inspect.isabstract(obj): + continue + module_main_cls = obj + obj_module = inspect.getmodule(obj) + if obj_module is not None and module == obj_module: + break + + return module_main_cls + + +def get_dataset_builder_class( + dataset_module: "DatasetModule", dataset_name: Optional[str] = None +) -> type[DatasetBuilder]: + builder_cls = import_main_class(dataset_module.module_path) + if dataset_module.builder_configs_parameters.builder_configs: + dataset_name = dataset_name or dataset_module.builder_kwargs.get("dataset_name") + if dataset_name is None: + raise ValueError("dataset_name should be specified but got None") + builder_cls = configure_builder_class( + builder_cls, + builder_configs=dataset_module.builder_configs_parameters.builder_configs, + default_config_name=dataset_module.builder_configs_parameters.default_config_name, + dataset_name=dataset_name, + ) + return builder_cls + + +def increase_load_count(name: str): + """Update the download count of a dataset.""" + if not config.HF_HUB_OFFLINE and config.HF_UPDATE_DOWNLOAD_COUNTS: + try: + get_session().head( + "/".join((config.S3_DATASETS_BUCKET_PREFIX, name, name + ".py")), + headers={"User-Agent": get_datasets_user_agent()}, + timeout=3, + ) + except Exception: + pass + + +def infer_module_for_data_files_list( + data_files_list: DataFilesList, download_config: Optional[DownloadConfig] = None +) -> tuple[Optional[str], dict]: + """Infer module (and builder kwargs) from list of data files. + + It picks the module based on the most common file extension. + In case of a draw ".parquet" is the favorite, and then alphabetical order. + + Args: + data_files_list (DataFilesList): List of data files. + download_config (bool or str, optional): Mainly use `token` or `storage_options` to support different platforms and auth types. + + Returns: + tuple[str, dict[str, Any]]: Tuple with + - inferred module name + - dict of builder kwargs + """ + extensions_counter = Counter( + ("." + suffix.lower(), xbasename(filepath) in _ALL_METADATA_FILENAMES) + for filepath in data_files_list + for suffix in xbasename(filepath).split(".")[1:] + ) + if extensions_counter: + + def sort_key(ext_count: tuple[tuple[str, bool], int]) -> tuple[int, bool]: + """Sort by count and set ".parquet" as the favorite in case of a draw, and ignore metadata files""" + (ext, is_metadata), count = ext_count + return ( + not is_metadata, + count, + ext == ".parquet", + ext == ".lance", + ext == ".arrow", + ext == ".jsonl", + ext == ".json", + ext == ".csv", + ext, + ) + + for (ext, _), _ in sorted(extensions_counter.items(), key=sort_key, reverse=True): + if ext in _EXTENSION_TO_MODULE: + return _EXTENSION_TO_MODULE[ext] + elif ext == ".zip": + return infer_module_for_data_files_list_in_archives(data_files_list, download_config=download_config) + return None, {} + + +def infer_module_for_data_files_list_in_archives( + data_files_list: DataFilesList, download_config: Optional[DownloadConfig] = None +) -> tuple[Optional[str], dict]: + """Infer module (and builder kwargs) from list of archive data files. + + Args: + data_files_list (DataFilesList): List of data files. + download_config (bool or str, optional): Mainly use `token` or `storage_options` to support different platforms and auth types. + + Returns: + tuple[str, dict[str, Any]]: Tuple with + - inferred module name + - dict of builder kwargs + """ + archived_files = [] + archive_files_counter = 0 + for filepath in data_files_list: + if str(filepath).endswith(".zip"): + archive_files_counter += 1 + if archive_files_counter > config.ARCHIVES_MAX_NUMBER_FOR_MODULE_INFERENCE: + break + extracted = xjoin(StreamingDownloadManager().extract(filepath), "**") + archived_files += [ + f.split("::")[0] for f in xglob(extracted, recursive=True, download_config=download_config) + ] + extensions_counter = Counter( + "." + suffix.lower() for filepath in archived_files for suffix in xbasename(filepath).split(".")[1:] + ) + if extensions_counter: + most_common = extensions_counter.most_common(1)[0][0] + if most_common in _EXTENSION_TO_MODULE: + return _EXTENSION_TO_MODULE[most_common] + return None, {} + + +def infer_module_for_data_files( + data_files: DataFilesDict, path: Optional[str] = None, download_config: Optional[DownloadConfig] = None +) -> tuple[Optional[str], dict[str, Any]]: + """Infer module (and builder kwargs) from data files. Raise if module names for different splits don't match. + + Args: + data_files ([`DataFilesDict`]): Dict of list of data files. + path (str, *optional*): Dataset name or path. + download_config ([`DownloadConfig`], *optional*): + Specific download configuration parameters to authenticate on the Hugging Face Hub for private remote files. + + Returns: + tuple[str, dict[str, Any]]: Tuple with + - inferred module name + - builder kwargs + """ + split_modules = { + split: infer_module_for_data_files_list(data_files_list, download_config=download_config) + for split, data_files_list in data_files.items() + } + module_name, default_builder_kwargs = next(iter(split_modules.values())) + if any((module_name, default_builder_kwargs) != split_module for split_module in split_modules.values()): + raise ValueError(f"Couldn't infer the same data file format for all splits. Got {split_modules}") + if not module_name: + raise DataFilesNotFoundError("No (supported) data files found" + (f" in {path}" if path else "")) + return module_name, default_builder_kwargs + + +def create_builder_configs_from_metadata_configs( + module_path: str, + metadata_configs: MetadataConfigs, + base_path: Optional[str] = None, + default_builder_kwargs: dict[str, Any] = None, + download_config: Optional[DownloadConfig] = None, +) -> tuple[list[BuilderConfig], str]: + builder_cls = import_main_class(module_path) + builder_config_cls = builder_cls.BUILDER_CONFIG_CLASS + default_config_name = metadata_configs.get_default_config_name() + builder_configs = [] + default_builder_kwargs = {} if default_builder_kwargs is None else default_builder_kwargs + + base_path = base_path if base_path is not None else "" + for config_name, config_params in metadata_configs.items(): + config_data_files = config_params.get("data_files") + config_data_dir = config_params.get("data_dir") + config_base_path = xjoin(base_path, config_data_dir) if config_data_dir else base_path + try: + config_patterns = ( + sanitize_patterns(config_data_files) + if config_data_files is not None + else get_data_patterns(config_base_path, download_config=download_config) + ) + config_data_files_dict = DataFilesPatternsDict.from_patterns( + config_patterns, + allowed_extensions=_ALL_ALLOWED_EXTENSIONS, + ) + except EmptyDatasetError as e: + raise EmptyDatasetError( + f"Dataset at '{base_path}' doesn't contain data files matching the patterns for config '{config_name}'," + f" check `data_files` and `data_fir` parameters in the `configs` YAML field in README.md. " + ) from e + ignored_params = [ + param for param in config_params if not hasattr(builder_config_cls, param) and param != "default" + ] + if ignored_params: + logger.warning( + f"Some datasets params were ignored: {ignored_params}. " + "Make sure to use only valid params for the dataset builder and to have " + "a up-to-date version of the `datasets` library." + ) + builder_configs.append( + builder_config_cls( + name=config_name, + data_files=config_data_files_dict, + data_dir=config_data_dir, + **{ + param: value + for param, value in {**default_builder_kwargs, **config_params}.items() + if hasattr(builder_config_cls, param) and param not in ("default", "data_files", "data_dir") + }, + ) + ) + return builder_configs, default_config_name + + +@dataclass +class BuilderConfigsParameters: + """Dataclass containing objects related to creation of builder configurations from yaml's metadata content. + + Attributes: + metadata_configs (`MetadataConfigs`, *optional*): + Configs parsed from yaml's metadata. + builder_configs (`list[BuilderConfig]`, *optional*): + List of BuilderConfig objects created from metadata_configs above. + default_config_name (`str`): + Name of default config taken from yaml's metadata. + """ + + metadata_configs: Optional[MetadataConfigs] = None + builder_configs: Optional[list[BuilderConfig]] = None + default_config_name: Optional[str] = None + + +@dataclass +class DatasetModule: + module_path: str + hash: str + builder_kwargs: dict + builder_configs_parameters: BuilderConfigsParameters = field(default_factory=BuilderConfigsParameters) + dataset_infos: Optional[DatasetInfosDict] = None + + +class _DatasetModuleFactory: + def get_module(self) -> DatasetModule: + raise NotImplementedError + + +class LocalDatasetModuleFactory(_DatasetModuleFactory): + """Get the module of a dataset loaded from the user's data files. The dataset builder module to use is inferred + from the data files extensions.""" + + def __init__( + self, + path: str, + data_dir: Optional[str] = None, + data_files: Optional[Union[str, list, dict]] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + ): + if data_dir and os.path.isabs(data_dir): + raise ValueError(f"`data_dir` must be relative to a dataset directory's root: {path}") + + self.path = Path(path).as_posix() + self.name = Path(path).stem + self.data_files = data_files + self.data_dir = data_dir + self.download_mode = download_mode + + def get_module(self) -> DatasetModule: + readme_path = os.path.join(self.path, config.REPOCARD_FILENAME) + standalone_yaml_path = os.path.join(self.path, config.REPOYAML_FILENAME) + dataset_card_data = DatasetCard.load(readme_path).data if os.path.isfile(readme_path) else DatasetCardData() + if os.path.exists(standalone_yaml_path): + with open(standalone_yaml_path, encoding="utf-8") as f: + standalone_yaml_data = yaml.safe_load(f.read()) + if standalone_yaml_data: + _dataset_card_data_dict = dataset_card_data.to_dict() + _dataset_card_data_dict.update(standalone_yaml_data) + dataset_card_data = DatasetCardData(**_dataset_card_data_dict) + metadata_configs = MetadataConfigs.from_dataset_card_data(dataset_card_data) + dataset_infos = DatasetInfosDict.from_dataset_card_data(dataset_card_data) + # we need a set of data files to find which dataset builder to use + # because we need to infer module name by files extensions + base_path = Path(self.path, self.data_dir or "").expanduser().resolve().as_posix() + if self.data_files is not None: + patterns = sanitize_patterns(self.data_files) + elif metadata_configs and not self.data_dir and "data_files" in next(iter(metadata_configs.values())): + patterns = sanitize_patterns(next(iter(metadata_configs.values()))["data_files"]) + else: + patterns = get_data_patterns(base_path) + data_files = DataFilesDict.from_patterns( + patterns, + base_path=base_path, + allowed_extensions=_ALL_ALLOWED_EXTENSIONS, + ) + module_name, default_builder_kwargs = infer_module_for_data_files( + data_files=data_files, + path=self.path, + ) + data_files = data_files.filter( + extensions=_MODULE_TO_EXTENSIONS[module_name] + _MODULE_TO_METADATA_EXTENSIONS[module_name], + file_names=_MODULE_TO_METADATA_FILE_NAMES[module_name], + ) + module_path, _ = _PACKAGED_DATASETS_MODULES[module_name] + if metadata_configs: + builder_configs, default_config_name = create_builder_configs_from_metadata_configs( + module_path, + metadata_configs, + base_path=base_path, + default_builder_kwargs=default_builder_kwargs, + ) + else: + builder_configs: list[BuilderConfig] = [ + import_main_class(module_path).BUILDER_CONFIG_CLASS( + data_files=data_files, + **default_builder_kwargs, + ) + ] + default_config_name = None + builder_kwargs = { + "base_path": self.path, + "dataset_name": camelcase_to_snakecase(Path(self.path).name), + } + if self.data_dir: + builder_kwargs["data_files"] = data_files + # this file is deprecated and was created automatically in old versions of push_to_hub + if os.path.isfile(os.path.join(self.path, config.DATASETDICT_INFOS_FILENAME)): + with open(os.path.join(self.path, config.DATASETDICT_INFOS_FILENAME), encoding="utf-8") as f: + legacy_dataset_infos = DatasetInfosDict( + { + config_name: DatasetInfo.from_dict(dataset_info_dict) + for config_name, dataset_info_dict in json.load(f).items() + } + ) + if len(legacy_dataset_infos) == 1: + # old config e.g. named "username--dataset_name" + legacy_config_name = next(iter(legacy_dataset_infos)) + legacy_dataset_infos["default"] = legacy_dataset_infos.pop(legacy_config_name) + legacy_dataset_infos.update(dataset_infos) + dataset_infos = legacy_dataset_infos + if default_config_name is None and len(dataset_infos) == 1: + default_config_name = next(iter(dataset_infos)) + + hash = Hasher.hash({"dataset_infos": dataset_infos, "builder_configs": builder_configs}) + return DatasetModule( + module_path, + hash, + builder_kwargs, + dataset_infos=dataset_infos, + builder_configs_parameters=BuilderConfigsParameters( + metadata_configs=metadata_configs, + builder_configs=builder_configs, + default_config_name=default_config_name, + ), + ) + + +class PackagedDatasetModuleFactory(_DatasetModuleFactory): + """Get the dataset builder module from the ones that are packaged with the library: csv, json, etc.""" + + def __init__( + self, + name: str, + data_dir: Optional[str] = None, + data_files: Optional[Union[str, list, dict]] = None, + download_config: Optional[DownloadConfig] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + ): + self.name = name + self.data_files = data_files + self.data_dir = data_dir + self.download_config = download_config + self.download_mode = download_mode + increase_load_count(name) + + def get_module(self) -> DatasetModule: + base_path = Path(self.data_dir or "").expanduser().resolve().as_posix() + patterns = ( + sanitize_patterns(self.data_files) + if self.data_files is not None + else get_data_patterns(base_path, download_config=self.download_config) + ) + data_files = DataFilesDict.from_patterns( + patterns, + download_config=self.download_config, + base_path=base_path, + ) + + module_path, hash = _PACKAGED_DATASETS_MODULES[self.name] + + builder_kwargs = { + "data_files": data_files, + "dataset_name": self.name, + } + + return DatasetModule(module_path, hash, builder_kwargs) + + +class HubDatasetModuleFactory(_DatasetModuleFactory): + """ + Get the module of a dataset loaded from data files of a dataset repository. + The dataset builder module to use is inferred from the data files extensions. + """ + + def __init__( + self, + name: str, + commit_hash: str, + data_dir: Optional[str] = None, + data_files: Optional[Union[str, list, dict]] = None, + download_config: Optional[DownloadConfig] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + use_exported_dataset_infos: bool = False, + ): + self.name = name + self.commit_hash = commit_hash + self.data_files = data_files + self.data_dir = data_dir + self.download_config = download_config or DownloadConfig() + self.download_mode = download_mode + self.use_exported_dataset_infos = use_exported_dataset_infos + increase_load_count(name) + + def get_module(self) -> DatasetModule: + # Get the Dataset Card and fix the revision in case there are new commits in the meantime + api = HfApi( + endpoint=config.HF_ENDPOINT, + token=self.download_config.token, + library_name="datasets", + library_version=__version__, + user_agent=get_datasets_user_agent(self.download_config.user_agent), + ) + try: + dataset_readme_path = api.hf_hub_download( + repo_id=self.name, + filename=config.REPOCARD_FILENAME, + repo_type="dataset", + revision=self.commit_hash, + proxies=self.download_config.proxies, + ) + dataset_card_data = DatasetCard.load(dataset_readme_path).data + except EntryNotFoundError: + dataset_card_data = DatasetCardData() + download_config = self.download_config.copy() + if download_config.download_desc is None: + download_config.download_desc = "Downloading standalone yaml" + try: + standalone_yaml_path = cached_path( + hf_dataset_url(self.name, config.REPOYAML_FILENAME, revision=self.commit_hash), + download_config=download_config, + ) + with open(standalone_yaml_path, encoding="utf-8") as f: + standalone_yaml_data = yaml.safe_load(f.read()) + if standalone_yaml_data: + _dataset_card_data_dict = dataset_card_data.to_dict() + _dataset_card_data_dict.update(standalone_yaml_data) + dataset_card_data = DatasetCardData(**_dataset_card_data_dict) + except FileNotFoundError: + pass + base_path = f"hf://datasets/{self.name}@{self.commit_hash}/{self.data_dir or ''}".rstrip("/") + metadata_configs = MetadataConfigs.from_dataset_card_data(dataset_card_data) + dataset_infos = DatasetInfosDict.from_dataset_card_data(dataset_card_data) + if config.USE_PARQUET_EXPORT and self.use_exported_dataset_infos: + try: + exported_dataset_infos = _dataset_viewer.get_exported_dataset_infos( + dataset=self.name, commit_hash=self.commit_hash, token=self.download_config.token + ) + exported_dataset_infos = DatasetInfosDict( + { + config_name: DatasetInfo.from_dict(exported_dataset_infos[config_name]) + for config_name in exported_dataset_infos + } + ) + except _dataset_viewer.DatasetViewerError: + exported_dataset_infos = None + else: + exported_dataset_infos = None + if exported_dataset_infos: + exported_dataset_infos.update(dataset_infos) + dataset_infos = exported_dataset_infos + # we need a set of data files to find which dataset builder to use + # because we need to infer module name by files extensions + if self.data_files is not None: + patterns = sanitize_patterns(self.data_files) + elif metadata_configs and not self.data_dir and "data_files" in next(iter(metadata_configs.values())): + patterns = sanitize_patterns(next(iter(metadata_configs.values()))["data_files"]) + else: + patterns = get_data_patterns(base_path, download_config=self.download_config) + data_files = DataFilesDict.from_patterns( + patterns, + base_path=base_path, + allowed_extensions=_ALL_ALLOWED_EXTENSIONS, + download_config=self.download_config, + ) + module_name, default_builder_kwargs = infer_module_for_data_files( + data_files=data_files, + path=self.name, + download_config=self.download_config, + ) + data_files = data_files.filter( + extensions=_MODULE_TO_EXTENSIONS[module_name] + _MODULE_TO_METADATA_EXTENSIONS[module_name], + file_names=_MODULE_TO_METADATA_FILE_NAMES[module_name], + ) + module_path, _ = _PACKAGED_DATASETS_MODULES[module_name] + if metadata_configs: + builder_configs, default_config_name = create_builder_configs_from_metadata_configs( + module_path, + metadata_configs, + base_path=base_path, + default_builder_kwargs=default_builder_kwargs, + download_config=self.download_config, + ) + else: + builder_configs: list[BuilderConfig] = [ + import_main_class(module_path).BUILDER_CONFIG_CLASS( + data_files=data_files, + **default_builder_kwargs, + ) + ] + default_config_name = None + builder_kwargs = { + "base_path": base_path, + "repo_id": self.name, + "dataset_name": camelcase_to_snakecase(Path(self.name).name), + } + if self.data_dir: + builder_kwargs["data_files"] = data_files + download_config = self.download_config.copy() + if download_config.download_desc is None: + download_config.download_desc = "Downloading metadata" + try: + # this file is deprecated and was created automatically in old versions of push_to_hub + dataset_infos_path = cached_path( + hf_dataset_url(self.name, config.DATASETDICT_INFOS_FILENAME, revision=self.commit_hash), + download_config=download_config, + ) + with open(dataset_infos_path, encoding="utf-8") as f: + legacy_dataset_infos = DatasetInfosDict( + { + config_name: DatasetInfo.from_dict(dataset_info_dict) + for config_name, dataset_info_dict in json.load(f).items() + } + ) + if len(legacy_dataset_infos) == 1: + # old config e.g. named "username--dataset_name" + legacy_config_name = next(iter(legacy_dataset_infos)) + legacy_dataset_infos["default"] = legacy_dataset_infos.pop(legacy_config_name) + legacy_dataset_infos.update(dataset_infos) + dataset_infos = legacy_dataset_infos + except FileNotFoundError: + pass + if default_config_name is None and len(dataset_infos) == 1: + default_config_name = next(iter(dataset_infos)) + + return DatasetModule( + module_path, + self.commit_hash, + builder_kwargs, + dataset_infos=dataset_infos, + builder_configs_parameters=BuilderConfigsParameters( + metadata_configs=metadata_configs, + builder_configs=builder_configs, + default_config_name=default_config_name, + ), + ) + + +class HubDatasetModuleFactoryWithParquetExport(_DatasetModuleFactory): + """ + Get the module of a dataset loaded from parquet files of a dataset repository parquet export. + """ + + def __init__( + self, + name: str, + commit_hash: str, + download_config: Optional[DownloadConfig] = None, + ): + self.name = name + self.commit_hash = commit_hash + self.download_config = download_config or DownloadConfig() + increase_load_count(name) + + def get_module(self) -> DatasetModule: + exported_parquet_files = _dataset_viewer.get_exported_parquet_files( + dataset=self.name, commit_hash=self.commit_hash, token=self.download_config.token + ) + exported_dataset_infos = _dataset_viewer.get_exported_dataset_infos( + dataset=self.name, commit_hash=self.commit_hash, token=self.download_config.token + ) + dataset_infos = DatasetInfosDict( + { + config_name: DatasetInfo.from_dict(exported_dataset_infos[config_name]) + for config_name in exported_dataset_infos + } + ) + parquet_commit_hash = ( + HfApi( + endpoint=config.HF_ENDPOINT, + token=self.download_config.token, + library_name="datasets", + library_version=__version__, + user_agent=get_datasets_user_agent(self.download_config.user_agent), + ) + .dataset_info( + self.name, + revision="refs/convert/parquet", + token=self.download_config.token, + timeout=100.0, + ) + .sha + ) # fix the revision in case there are new commits in the meantime + metadata_configs = MetadataConfigs._from_exported_parquet_files_and_dataset_infos( + parquet_commit_hash=parquet_commit_hash, + exported_parquet_files=exported_parquet_files, + dataset_infos=dataset_infos, + ) + module_path, _ = _PACKAGED_DATASETS_MODULES["parquet"] + builder_configs, default_config_name = create_builder_configs_from_metadata_configs( + module_path, + metadata_configs, + download_config=self.download_config, + ) + builder_kwargs = { + "repo_id": self.name, + "dataset_name": camelcase_to_snakecase(Path(self.name).name), + } + + return DatasetModule( + module_path, + self.commit_hash, + builder_kwargs, + dataset_infos=dataset_infos, + builder_configs_parameters=BuilderConfigsParameters( + metadata_configs=metadata_configs, + builder_configs=builder_configs, + default_config_name=default_config_name, + ), + ) + + +class CachedDatasetModuleFactory(_DatasetModuleFactory): + """ + Get the module of a dataset that has been loaded once already and cached. + """ + + def __init__( + self, + name: str, + cache_dir: Optional[str] = None, + ): + self.name = name + self.cache_dir = cache_dir + assert self.name.count("/") <= 1 + + def get_module(self) -> DatasetModule: + cache_dir = os.path.expanduser(str(self.cache_dir or config.HF_DATASETS_CACHE)) + namespace_and_dataset_name = self.name.split("/") + namespace_and_dataset_name[-1] = camelcase_to_snakecase(namespace_and_dataset_name[-1]) + cached_relative_path = "___".join(namespace_and_dataset_name) + cached_datasets_directory_path_root = os.path.join(cache_dir, cached_relative_path) + cached_directory_paths = [ + cached_directory_path + for cached_directory_path in glob.glob(os.path.join(cached_datasets_directory_path_root, "*", "*", "*")) + if os.path.isdir(cached_directory_path) + ] + if cached_directory_paths: + builder_kwargs = { + "repo_id": self.name, + "dataset_name": self.name.split("/")[-1], + } + warning_msg = f"Using the latest cached version of the dataset since {self.name} couldn't be found on the Hugging Face Hub" + if config.HF_HUB_OFFLINE: + warning_msg += " (offline mode is enabled)." + logger.warning(warning_msg) + return DatasetModule( + "datasets.packaged_modules.cache.cache", + "auto", + {**builder_kwargs, "version": "auto"}, + ) + raise FileNotFoundError(f"Dataset {self.name} is not cached in {self.cache_dir}") + + +class HubBucketDatasetModuleFactory(_DatasetModuleFactory): + """ + Get the module of a dataset loaded from data files of a a Storage Bucket. + The dataset builder module to use is inferred from the data files extensions. + """ + + def __init__( + self, + path: str, + data_dir: Optional[str] = None, + data_files: Optional[Union[str, list, dict]] = None, + download_config: Optional[DownloadConfig] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + ): + self.path = Path(path).as_posix() + self.name = Path(path).stem + self.data_files = data_files + self.data_dir = data_dir + self.download_config = download_config + self.download_mode = download_mode + + def get_module(self) -> DatasetModule: + hffs = HfFileSystem( + endpoint=config.HF_ENDPOINT, + token=self.download_config.token, + ) + readme_path = xjoin(self.path, config.REPOCARD_FILENAME) + standalone_yaml_path = xjoin(self.path, config.REPOYAML_FILENAME) + try: + dataset_card_data = DatasetCard(hffs.read_text(readme_path, newline="", encoding="utf-8")) + except FileNotFoundError: + dataset_card_data = DatasetCardData() + try: + standalone_yaml_data = yaml.safe_load(hffs.read_text(standalone_yaml_path, newline="", encoding="utf-8")) + except FileNotFoundError: + dataset_card_data = DatasetCardData() + if hffs.exists(standalone_yaml_path): + with hffs.open(standalone_yaml_path, "r", encoding="utf-8") as f: + standalone_yaml_data = yaml.safe_load(f.read()) + if standalone_yaml_data: + _dataset_card_data_dict = dataset_card_data.to_dict() + _dataset_card_data_dict.update(standalone_yaml_data) + dataset_card_data = DatasetCardData(**_dataset_card_data_dict) + metadata_configs = MetadataConfigs.from_dataset_card_data(dataset_card_data) + dataset_infos = DatasetInfosDict.from_dataset_card_data(dataset_card_data) + # we need a set of data files to find which dataset builder to use + # because we need to infer module name by files extensions + base_path = "hf://" + Path(self.path, self.data_dir or "").as_posix() + if self.data_files is not None: + patterns = sanitize_patterns(self.data_files) + elif metadata_configs and not self.data_dir and "data_files" in next(iter(metadata_configs.values())): + patterns = sanitize_patterns(next(iter(metadata_configs.values()))["data_files"]) + else: + patterns = get_data_patterns(base_path, download_config=self.download_config) + data_files = DataFilesDict.from_patterns( + patterns, + base_path=base_path, + allowed_extensions=_ALL_ALLOWED_EXTENSIONS, + ) + module_name, default_builder_kwargs = infer_module_for_data_files( + data_files=data_files, + path=self.path, + ) + data_files = data_files.filter( + extensions=_MODULE_TO_EXTENSIONS[module_name] + _MODULE_TO_METADATA_EXTENSIONS[module_name], + file_names=_MODULE_TO_METADATA_FILE_NAMES[module_name], + ) + module_path, _ = _PACKAGED_DATASETS_MODULES[module_name] + if metadata_configs: + builder_configs, default_config_name = create_builder_configs_from_metadata_configs( + module_path, + metadata_configs, + base_path=base_path, + default_builder_kwargs=default_builder_kwargs, + ) + else: + builder_configs: list[BuilderConfig] = [ + import_main_class(module_path).BUILDER_CONFIG_CLASS( + data_files=data_files, + **default_builder_kwargs, + ) + ] + default_config_name = None + builder_kwargs = { + "base_path": base_path, + "dataset_name": camelcase_to_snakecase(Path(self.path).name), + } + if self.data_dir: + builder_kwargs["data_files"] = data_files + # this file is deprecated and was created automatically in old versions of push_to_hub + if hffs.isfile(xjoin(self.path, config.DATASETDICT_INFOS_FILENAME)): + with hffs.open(xjoin(self.path, config.DATASETDICT_INFOS_FILENAME), "r", encoding="utf-8") as f: + legacy_dataset_infos = DatasetInfosDict( + { + config_name: DatasetInfo.from_dict(dataset_info_dict) + for config_name, dataset_info_dict in json.load(f).items() + } + ) + if len(legacy_dataset_infos) == 1: + # old config e.g. named "username--dataset_name" + legacy_config_name = next(iter(legacy_dataset_infos)) + legacy_dataset_infos["default"] = legacy_dataset_infos.pop(legacy_config_name) + legacy_dataset_infos.update(dataset_infos) + dataset_infos = legacy_dataset_infos + if default_config_name is None and len(dataset_infos) == 1: + default_config_name = next(iter(dataset_infos)) + + hash = Hasher.hash({"dataset_infos": dataset_infos, "builder_configs": builder_configs}) + return DatasetModule( + module_path, + hash, + builder_kwargs, + dataset_infos=dataset_infos, + builder_configs_parameters=BuilderConfigsParameters( + metadata_configs=metadata_configs, + builder_configs=builder_configs, + default_config_name=default_config_name, + ), + ) + + +def dataset_module_factory( + path: str, + revision: Optional[Union[str, Version]] = None, + download_config: Optional[DownloadConfig] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + data_dir: Optional[str] = None, + data_files: Optional[Union[dict, list, str, DataFilesDict]] = None, + cache_dir: Optional[str] = None, + **download_kwargs, +) -> DatasetModule: + """ + Download/extract/cache a dataset module. + + Dataset codes are cached inside the dynamic modules cache to allow easy import (avoid ugly sys.path tweaks). + + Args: + + path (str): Path or name of the dataset. + Depending on ``path``, the dataset builder that is used comes from one of the generic dataset builders (JSON, CSV, Parquet, text etc.). + + For local datasets: + + - if ``path`` is a local directory (containing data files only) + -> load a generic dataset builder (csv, json, text etc.) based on the content of the directory + e.g. ``'./path/to/directory/with/my/csv/data'``. + + For datasets on the Hugging Face Hub (list all available datasets with ``huggingface_hub.list_datasets()``) + + - if ``path`` is a dataset repository on the HF hub (containing data files only) + -> load a generic dataset builder (csv, text etc.) based on the content of the repository + e.g. ``'username/dataset_name'``, a dataset repository on the HF hub containing your data files. + + For datasets in Storage Buckets on the Hugging Face Hub (list all available buckets with ``huggingface_hub.list_buckets()``) + + - if `path` is a directory within a Storage Bucket on the HF Hub (containing data files only) + -> load the dataset from supported files in the directory (csv, json, parquet, etc.) + e.g. `'buckets/username/bucket_name/my_dataset'`. + + revision (:class:`~utils.Version` or :obj:`str`, optional): Version of the dataset to load. + As datasets have their own git repository on the Datasets Hub, the default version "main" corresponds to their "main" branch. + You can specify a different version than the default "main" by using a commit SHA or a git tag of the dataset repository. + download_config (:class:`DownloadConfig`, optional): Specific download configuration parameters. + download_mode (:class:`DownloadMode` or :obj:`str`, default ``REUSE_DATASET_IF_EXISTS``): Download/generate mode. + data_dir (:obj:`str`, optional): Directory with the data files. Used only if `data_files` is not specified, + in which case it's equal to pass `os.path.join(data_dir, "**")` as `data_files`. + data_files (:obj:`Union[Dict, List, str]`, optional): Defining the data_files of the dataset configuration. + cache_dir (`str`, *optional*): + Directory to read/write data. Defaults to `"~/.cache/huggingface/datasets"`. + + + + **download_kwargs (additional keyword arguments): optional attributes for DownloadConfig() which will override + the attributes in download_config if supplied. + + Returns: + DatasetModule + """ + if download_config is None: + download_config = DownloadConfig(**download_kwargs) + download_mode = DownloadMode(download_mode or DownloadMode.REUSE_DATASET_IF_EXISTS) + download_config.extract_compressed_file = True + download_config.force_extract = True + download_config.force_download = download_mode == DownloadMode.FORCE_REDOWNLOAD + + filename = list(filter(lambda x: x, path.replace(os.sep, "/").split("/")))[-1] + if not filename.endswith(".py"): + filename = filename + ".py" + combined_path = os.path.join(path, filename) + + # We have several ways to get a dataset builder: + # + # - if path is the name of a packaged dataset module + # -> use the packaged module (json, csv, etc.) + # + # - if path is a local directory (but no python file) + # -> use a packaged module (csv, text etc.) based on content of the directory + # + # - if path has one "/" and is dataset repository on the HF hub + # -> use a packaged module (csv, text etc.) based on content of the repository + # + # - if path starts with "buckets/" and points to a Storage Bucket on the HF hub + # -> use a packaged module (csv, text etc.) based on content of the directory in the bucket + + if path.startswith("hf://datasets/"): + path = path[len("hf://datasets/") :] + remote_only = True + elif path.startswith("hf://buckets/"): + path = path[len("hf://") :] + remote_only = True + else: + remote_only = False + + # Try packaged + if path in _PACKAGED_DATASETS_MODULES: + return PackagedDatasetModuleFactory( + path, + data_dir=data_dir, + data_files=data_files, + download_config=download_config, + download_mode=download_mode, + ).get_module() + # Try locally + elif path.endswith(filename): + raise RuntimeError(f"Dataset scripts are no longer supported, but found {filename}") + elif os.path.isfile(combined_path): + raise RuntimeError(f"Dataset scripts are no longer supported, but found {filename}") + elif os.path.isdir(path) and not remote_only: + return LocalDatasetModuleFactory( + path, data_dir=data_dir, data_files=data_files, download_mode=download_mode + ).get_module() + # Try remotely + elif path.startswith("buckets/"): + if BucketNotFoundError is None: + raise ImportError("Loading datasets from buckets requires huggingface_hub>=1.6.0") + # We check that the bucket exists, and the directory exists, and authentication in one call + api = HfApi( + endpoint=config.HF_ENDPOINT, + token=download_config.token, + library_name="datasets", + library_version=__version__, + user_agent=get_datasets_user_agent(download_config.user_agent), + ) + _, _namespace, _bucket_name, *_path_segments = path.split("/") + bucket_id = _namespace + "/" + _bucket_name + prefix = "/".join(s for s in _path_segments if s) + try: + next(iter(api.list_bucket_tree(bucket_id, prefix))) + except ( + OfflineModeIsEnabled, + requests.exceptions.Timeout, + requests.exceptions.ConnectionError, + httpx.ConnectError, + httpx.TimeoutException, + ) as e: + raise ConnectionError(f"Couldn't reach '{path}' on the Hub ({e.__class__.__name__})") from e + except StopIteration as e: + raise DatasetNotFoundError(f"Bucket directory at {path} doesn't exist") from e + except BucketNotFoundError as e: + raise DatasetNotFoundError(f"Bucket '{bucket_id}' doesn't exist on the Hub or cannot be accessed.") from e + return HubBucketDatasetModuleFactory( + path, + data_dir=data_dir, + data_files=data_files, + download_config=download_config, + download_mode=download_mode, + ).get_module() + elif is_relative_path(path) and path.count("/") <= 1: + try: + # Get the Dataset Card + get the revision + check authentication all at in one call + # We fix the commit_hash in case there are new commits in the meantime + api = HfApi( + endpoint=config.HF_ENDPOINT, + token=download_config.token, + library_name="datasets", + library_version=__version__, + user_agent=get_datasets_user_agent(download_config.user_agent), + ) + try: + _raise_if_offline_mode_is_enabled() + dataset_readme_path = api.hf_hub_download( + repo_id=path, + filename=config.REPOCARD_FILENAME, + repo_type="dataset", + revision=revision, + proxies=download_config.proxies, + ) + commit_hash = os.path.basename(os.path.dirname(dataset_readme_path)) + except LocalEntryNotFoundError as e: + if isinstance( + e.__cause__, + ( + OfflineModeIsEnabled, + requests.exceptions.Timeout, + requests.exceptions.ConnectionError, + httpx.ConnectError, + httpx.TimeoutException, + ), + ): + raise ConnectionError(f"Couldn't reach '{path}' on the Hub ({e.__class__.__name__})") from e + else: + raise + except EntryNotFoundError: + commit_hash = api.dataset_info( + path, + revision=revision, + timeout=100.0, + ).sha + except ( + OfflineModeIsEnabled, + requests.exceptions.Timeout, + requests.exceptions.ConnectionError, + httpx.ConnectError, + httpx.TimeoutException, + ) as e: + raise ConnectionError(f"Couldn't reach '{path}' on the Hub ({e.__class__.__name__})") from e + except GatedRepoError as e: + message = f"Dataset '{path}' is a gated dataset on the Hub." + if e.response.status_code == 401: + message += " You must be authenticated to access it." + elif e.response.status_code == 403: + message += f" Visit the dataset page at https://huggingface.co/datasets/{path} to ask for access." + raise DatasetNotFoundError(message) from e + except RepositoryNotFoundError as e: + raise DatasetNotFoundError(f"Dataset '{path}' doesn't exist on the Hub or cannot be accessed.") from e + try: + api.hf_hub_download( + repo_id=path, + filename=filename, + repo_type="dataset", + revision=commit_hash, + proxies=download_config.proxies, + ) + raise RuntimeError(f"Dataset scripts are no longer supported, but found {filename}") + except EntryNotFoundError: + # Use the infos from the parquet export except in some cases: + if data_dir or data_files or (revision and revision != "main"): + use_exported_dataset_infos = False + else: + use_exported_dataset_infos = True + return HubDatasetModuleFactory( + path, + commit_hash=commit_hash, + data_dir=data_dir, + data_files=data_files, + download_config=download_config, + download_mode=download_mode, + use_exported_dataset_infos=use_exported_dataset_infos, + ).get_module() + except GatedRepoError as e: + message = f"Dataset '{path}' is a gated dataset on the Hub." + if e.response.status_code == 401: + message += " You must be authenticated to access it." + elif e.response.status_code == 403: + message += f" Visit the dataset page at https://huggingface.co/datasets/{path} to ask for access." + raise DatasetNotFoundError(message) from e + except RevisionNotFoundError as e: + raise DatasetNotFoundError(f"Revision '{revision}' doesn't exist for dataset '{path}' on the Hub.") from e + except Exception as e1: + # All the attempts failed, before raising the error we should check if the module is already cached + try: + return CachedDatasetModuleFactory(path, cache_dir=cache_dir).get_module() + except Exception: + # If it's not in the cache, then it doesn't exist. + if isinstance(e1, OfflineModeIsEnabled): + raise ConnectionError(f"Couldn't reach the Hugging Face Hub for dataset '{path}': {e1}") from None + if isinstance(e1, (DataFilesNotFoundError, DatasetNotFoundError, EmptyDatasetError)): + raise e1 from None + if isinstance(e1, FileNotFoundError): + raise FileNotFoundError( + f"Couldn't find any data file at {relative_to_absolute_path(path)}. " + f"Couldn't find '{path}' on the Hugging Face Hub either: {type(e1).__name__}: {e1}" + ) from None + raise e1 from None + else: + raise FileNotFoundError(f"Couldn't find any data file at {relative_to_absolute_path(path)}.") + + +def load_dataset_builder( + path: str, + name: Optional[str] = None, + data_dir: Optional[str] = None, + data_files: Optional[Union[str, Sequence[str], Mapping[str, Union[str, Sequence[str]]]]] = None, + cache_dir: Optional[str] = None, + features: Optional[Features] = None, + download_config: Optional[DownloadConfig] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + revision: Optional[Union[str, Version]] = None, + token: Optional[Union[bool, str]] = None, + storage_options: Optional[dict] = None, + **config_kwargs, +) -> DatasetBuilder: + """Load a dataset builder which can be used to: + + - Inspect general information that is required to build a dataset (cache directory, config, dataset info, features, data files, etc.) + - Download and prepare the dataset as Arrow files in the cache + - Get a streaming dataset without downloading or caching anything + + You can find the list of datasets on the [Hub](https://huggingface.co/datasets) or with [`huggingface_hub.list_datasets`]. + + A dataset is a directory that contains some data files in generic formats (JSON, CSV, Parquet, etc.) and possibly + in a generic structure (Webdataset, ImageFolder, AudioFolder, VideoFolder, MeshFolder, etc.) + + Args: + + path (`str`): + Path or name of the dataset. + + - if `path` is a dataset repository on the HF hub (list all available datasets with [`huggingface_hub.list_datasets`]) + -> load the dataset builder from supported files in the repository (csv, json, parquet, etc.) + e.g. `'username/dataset_name'`, a dataset repository on the HF hub containing the data files. + + - if `path` is a directory within a Storage Bucket on the HF Hub (list your buckets with [`huggingface_hub.list_buckets`]) + -> load the dataset from supported files in the directory (csv, json, parquet, etc.) + e.g. `'buckets/username/bucket_name/my_dataset'`. + + - if `path` is a local directory + -> load the dataset builder from supported files in the directory (csv, json, parquet, etc.) + e.g. `'./path/to/directory/with/my/csv/data'`. + + - if `path` is the name of a dataset builder and `data_files` or `data_dir` is specified + (available builders are "json", "csv", "parquet", "arrow", "text", "xml", "webdataset", "imagefolder", "audiofolder", "videofolder", "meshfolder") + -> load the dataset builder from the files in `data_files` or `data_dir` + e.g. `'parquet'`. + + Use a `hf://` path like `'hf://datasets/username/dataset_name'` to allow remote only. + Use an absolute path to allow local only. + + name (`str`, *optional*): + Defining the name of the dataset configuration. + data_dir (`str`, *optional*): + Defining the `data_dir` of the dataset configuration. If specified for the generic builders (csv, text etc.) or the Hub datasets and `data_files` is `None`, + the behavior is equal to passing `os.path.join(data_dir, **)` as `data_files` to reference all the files in a directory. + data_files (`str` or `Sequence` or `Mapping`, *optional*): + Path(s) to source data file(s). + cache_dir (`str`, *optional*): + Directory to read/write data. Defaults to `"~/.cache/huggingface/datasets"`. + features ([`Features`], *optional*): + Set the features type to use for this dataset. + download_config ([`DownloadConfig`], *optional*): + Specific download configuration parameters. + download_mode ([`DownloadMode`] or `str`, defaults to `REUSE_DATASET_IF_EXISTS`): + Download/generate mode. + revision ([`Version`] or `str`, *optional*): + Version of the dataset to load. + As datasets have their own git repository on the Datasets Hub, the default version "main" corresponds to their "main" branch. + You can specify a different version than the default "main" by using a commit SHA or a git tag of the dataset repository. + token (`str` or `bool`, *optional*): + Optional string or boolean to use as Bearer token for remote files on the Datasets Hub. + If `True`, or not specified, will get token from `"~/.huggingface"`. + storage_options (`dict`, *optional*, defaults to `None`): + **Experimental**. Key/value pairs to be passed on to the dataset file-system backend, if any. + + + + **config_kwargs (additional keyword arguments): + Keyword arguments to be passed to the [`BuilderConfig`] + and used in the [`DatasetBuilder`]. + + Returns: + [`DatasetBuilder`] + + Example: + + ```py + >>> from datasets import load_dataset_builder + >>> ds_builder = load_dataset_builder('cornell-movie-review-data/rotten_tomatoes') + >>> ds_builder.info.features + {'label': ClassLabel(names=['neg', 'pos']), + 'text': Value('string')} + ``` + """ + download_mode = DownloadMode(download_mode or DownloadMode.REUSE_DATASET_IF_EXISTS) + if token is not None: + download_config = download_config.copy() if download_config else DownloadConfig() + download_config.token = token + if storage_options is not None: + download_config = download_config.copy() if download_config else DownloadConfig() + download_config.storage_options.update(storage_options) + if features is not None: + features = _fix_for_backward_compatible_features(features) + dataset_module = dataset_module_factory( + path, + revision=revision, + download_config=download_config, + download_mode=download_mode, + data_dir=data_dir, + data_files=data_files, + cache_dir=cache_dir, + ) + # Get dataset builder class + builder_kwargs = dataset_module.builder_kwargs + data_dir = builder_kwargs.pop("data_dir", data_dir) + data_files = builder_kwargs.pop("data_files", data_files) + config_name = builder_kwargs.pop( + "config_name", name or dataset_module.builder_configs_parameters.default_config_name + ) + dataset_name = builder_kwargs.pop("dataset_name", None) + info = dataset_module.dataset_infos.get(config_name) if dataset_module.dataset_infos else None + + if ( + path in _PACKAGED_DATASETS_MODULES + and data_files is None + and dataset_module.builder_configs_parameters.builder_configs[0].data_files is None + ): + error_msg = f"Please specify the data files or data directory to load for the {path} dataset builder." + example_extensions = [ + extension for extension in _EXTENSION_TO_MODULE if _EXTENSION_TO_MODULE[extension] == path + ] + if example_extensions: + error_msg += f'\nFor example `data_files={{"train": "path/to/data/train/*.{example_extensions[0]}"}}`' + raise ValueError(error_msg) + + # When users pass config kwargs, they should override module-provided defaults + # instead of colliding at constructor call time. + builder_kwargs = {key: value for key, value in builder_kwargs.items() if key not in config_kwargs} + + builder_cls = get_dataset_builder_class(dataset_module, dataset_name=dataset_name) + # Instantiate the dataset builder + builder_instance: DatasetBuilder = builder_cls( + cache_dir=cache_dir, + dataset_name=dataset_name, + config_name=config_name, + data_dir=data_dir, + data_files=data_files, + hash=dataset_module.hash, + info=info, + features=features, + token=token, + storage_options=storage_options, + **builder_kwargs, + **config_kwargs, + ) + builder_instance._use_legacy_cache_dir_if_possible(dataset_module) + + return builder_instance + + +@overload +def load_dataset( + path: str, + name: Optional[str] = None, + data_dir: Optional[str] = None, + data_files: Optional[Union[str, Sequence[str], Mapping[str, Union[str, Sequence[str]]]]] = None, + split: None = None, + cache_dir: Optional[str] = None, + features: Optional[Features] = None, + download_config: Optional[DownloadConfig] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + verification_mode: Optional[Union[VerificationMode, str]] = None, + keep_in_memory: Optional[bool] = None, + save_infos: bool = False, + revision: Optional[Union[str, Version]] = None, + token: Optional[Union[bool, str]] = None, + streaming: Literal[False] = False, + num_proc: Optional[int] = None, + storage_options: Optional[dict] = None, + **config_kwargs: Any, +) -> DatasetDict: ... + + +@overload +def load_dataset( + path: str, + name: Optional[str] = None, + data_dir: Optional[str] = None, + data_files: Optional[Union[str, Sequence[str], Mapping[str, Union[str, Sequence[str]]]]] = None, + *, + split: Union[str, Split, list[str], list[Split]], + cache_dir: Optional[str] = None, + features: Optional[Features] = None, + download_config: Optional[DownloadConfig] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + verification_mode: Optional[Union[VerificationMode, str]] = None, + keep_in_memory: Optional[bool] = None, + save_infos: bool = False, + revision: Optional[Union[Version, str]] = None, + token: Optional[Union[bool, str]] = None, + streaming: Literal[False] = False, + num_proc: Optional[int] = None, + storage_options: Optional[dict] = None, + **config_kwargs: Any, +) -> Dataset: ... + + +@overload +def load_dataset( + path: str, + name: Optional[str] = None, + data_dir: Optional[str] = None, + data_files: Optional[Union[str, Sequence[str], Mapping[str, Union[str, Sequence[str]]]]] = None, + split: None = None, + cache_dir: Optional[str] = None, + features: Optional[Features] = None, + download_config: Optional[DownloadConfig] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + verification_mode: Optional[Union[VerificationMode, str]] = None, + keep_in_memory: Optional[bool] = None, + save_infos: bool = False, + revision: Optional[Union[Version, str]] = None, + token: Optional[Union[bool, str]] = None, + *, + streaming: Literal[True], + num_proc: Optional[int] = None, + storage_options: Optional[dict] = None, + **config_kwargs: Any, +) -> IterableDatasetDict: ... + + +@overload +def load_dataset( + path: str, + name: Optional[str] = None, + data_dir: Optional[str] = None, + data_files: Optional[Union[str, Sequence[str], Mapping[str, Union[str, Sequence[str]]]]] = None, + *, + split: Union[str, Split, list[str], list[Split]], + cache_dir: Optional[str] = None, + features: Optional[Features] = None, + download_config: Optional[DownloadConfig] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + verification_mode: Optional[Union[VerificationMode, str]] = None, + keep_in_memory: Optional[bool] = None, + save_infos: bool = False, + revision: Optional[Union[Version, str]] = None, + token: Optional[Union[bool, str]] = None, + streaming: Literal[True], + num_proc: Optional[int] = None, + storage_options: Optional[dict] = None, + **config_kwargs: Any, +) -> IterableDataset: ... + + +def load_dataset( + path: str, + name: Optional[str] = None, + data_dir: Optional[str] = None, + data_files: Optional[Union[str, Sequence[str], Mapping[str, Union[str, Sequence[str]]]]] = None, + split: Optional[Union[str, Split, list[str], list[Split]]] = None, + cache_dir: Optional[str] = None, + features: Optional[Features] = None, + download_config: Optional[DownloadConfig] = None, + download_mode: Optional[Union[DownloadMode, str]] = None, + verification_mode: Optional[Union[VerificationMode, str]] = None, + keep_in_memory: Optional[bool] = None, + save_infos: bool = False, + revision: Optional[Union[str, Version]] = None, + token: Optional[Union[bool, str]] = None, + streaming: bool = False, + num_proc: Optional[int] = None, + storage_options: Optional[dict] = None, + **config_kwargs, +) -> Union[DatasetDict, Dataset, IterableDatasetDict, IterableDataset]: + """Load a dataset from the Hugging Face Hub, or a local dataset. + + You can find the list of datasets on the [Hub](https://huggingface.co/datasets) or with [`huggingface_hub.list_datasets`]. + + A dataset is a directory that contains some data files in generic formats (JSON, CSV, Parquet, etc.) and possibly + in a generic structure (Webdataset, ImageFolder, AudioFolder, VideoFolder, MeshFolder, etc.) + + This function does the following under the hood: + + 1. Load a dataset builder: + + * Find the most common data format in the dataset and pick its associated builder (JSON, CSV, Parquet, Webdataset, ImageFolder, AudioFolder, MeshFolder, etc.) + * Find which file goes into which split (e.g. train/test) based on file and directory names or on the YAML configuration + * It is also possible to specify `data_files` manually, and which dataset builder to use (e.g. "parquet"). + + 2. Run the dataset builder: + + In the general case: + + * Download the data files from the dataset if they are not already available locally or cached. + * Process and cache the dataset in typed Arrow tables for caching. + + Arrow table are arbitrarily long, typed tables which can store nested objects and be mapped to numpy/pandas/python generic types. + They can be directly accessed from disk, loaded in RAM or even streamed over the web. + + In the streaming case: + + * Don't download or cache anything. Instead, the dataset is lazily loaded and will be streamed on-the-fly when iterating on it. + + 3. Return a dataset built from the requested splits in `split` (default: all). + + Args: + + path (`str`): + Path or name of the dataset. + + - if `path` is a dataset repository on the HF hub (list all available datasets with [`huggingface_hub.list_datasets`]) + -> load the dataset from supported files in the repository (csv, json, parquet, etc.) + e.g. `'username/dataset_name'`, a dataset repository on the HF hub containing the data files. + + - if `path` is a directory within a Storage Bucket on the HF Hub (list your buckets with [`huggingface_hub.list_buckets`]) + -> load the dataset from supported files in the directory (csv, json, parquet, etc.) + e.g. `'buckets/username/bucket_name/my_dataset'`. + + - if `path` is a local directory + -> load the dataset from supported files in the directory (csv, json, parquet, etc.) + e.g. `'./path/to/directory/with/my/csv/data'`. + + - if `path` is the name of a dataset builder and `data_files` or `data_dir` is specified + (available builders are "json", "csv", "parquet", "arrow", "text", "xml", "webdataset", "imagefolder", "audiofolder", "videofolder", "meshfolder") + -> load the dataset from the files in `data_files` or `data_dir` + e.g. `'parquet'`. + + Use a `hf://` path like `'hf://datasets/username/dataset_name'` to allow remote only. + Use an absolute path to allow local only. + + name (`str`, *optional*): + Defining the name of the dataset configuration. + data_dir (`str`, *optional*): + Defining the `data_dir` of the dataset configuration. If specified for the generic builders (csv, text etc.) or the Hub datasets and `data_files` is `None`, + the behavior is equal to passing `os.path.join(data_dir, **)` as `data_files` to reference all the files in a directory. + data_files (`str` or `Sequence` or `Mapping`, *optional*): + Path(s) to source data file(s). + split (`Split` or `str`): + Which split of the data to load. + If `None`, will return a `dict` with all splits (typically `datasets.Split.TRAIN` and `datasets.Split.TEST`). + If given, will return a single Dataset. + Splits can be combined and specified like in tensorflow-datasets. + cache_dir (`str`, *optional*): + Directory to read/write data. Defaults to `"~/.cache/huggingface/datasets"`. + features (`Features`, *optional*): + Set the features type to use for this dataset. + download_config ([`DownloadConfig`], *optional*): + Specific download configuration parameters. + download_mode ([`DownloadMode`] or `str`, defaults to `REUSE_DATASET_IF_EXISTS`): + Download/generate mode. + verification_mode ([`VerificationMode`] or `str`, defaults to `BASIC_CHECKS`): + Verification mode determining the checks to run on the downloaded/processed dataset information (checksums/size/splits/...). + + + keep_in_memory (`bool`, defaults to `None`): + Whether to copy the dataset in-memory. If `None`, the dataset + will not be copied in-memory unless explicitly enabled by setting `datasets.config.IN_MEMORY_MAX_SIZE` to + nonzero. See more details in the [improve performance](../cache#improve-performance) section. + revision ([`Version`] or `str`, *optional*): + Version of the dataset to load. + As datasets have their own git repository on the Datasets Hub, the default version "main" corresponds to their "main" branch. + You can specify a different version than the default "main" by using a commit SHA or a git tag of the dataset repository. + token (`str` or `bool`, *optional*): + Optional string or boolean to use as Bearer token for remote files on the Datasets Hub. + If `True`, or not specified, will get token from `"~/.huggingface"`. + streaming (`bool`, defaults to `False`): + If set to `True`, don't download the data files. Instead, it streams the data progressively while + iterating on the dataset. An [`IterableDataset`] or [`IterableDatasetDict`] is returned instead in this case. + + Note that streaming works for datasets that use data formats that support being iterated over like txt, csv, jsonl for example. + Json files may be downloaded completely. Also streaming from remote zip or gzip files is supported but other compressed formats + like rar and xz are not yet supported. The tgz format doesn't allow streaming. + num_proc (`int`, *optional*, defaults to `None`): + Number of processes when downloading and generating the dataset locally. + Multiprocessing is disabled by default. + + + storage_options (`dict`, *optional*, defaults to `None`): + **Experimental**. Key/value pairs to be passed on to the dataset file-system backend, if any. + + + **config_kwargs (additional keyword arguments): + Keyword arguments to be passed to the `BuilderConfig` + and used in the [`DatasetBuilder`]. + + Returns: + [`Dataset`] or [`DatasetDict`]: + - if `split` is not `None`: the dataset requested, + - if `split` is `None`, a [`~datasets.DatasetDict`] with each split. + + or [`IterableDataset`] or [`IterableDatasetDict`]: if `streaming=True` + + - if `split` is not `None`, the dataset is requested + - if `split` is `None`, a [`~datasets.streaming.IterableDatasetDict`] with each split. + + Example: + + Load a dataset from the Hugging Face Hub: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset('cornell-movie-review-data/rotten_tomatoes', split='train') + + # Load a subset or dataset configuration (here 'sst2') + >>> from datasets import load_dataset + >>> ds = load_dataset('nyu-mll/glue', 'sst2', split='train') + + # Manual mapping of data files to splits + >>> data_files = {'train': 'train.csv', 'test': 'test.csv'} + >>> ds = load_dataset('namespace/your_dataset_name', data_files=data_files) + + # Manual selection of a directory to load + >>> ds = load_dataset('namespace/your_dataset_name', data_dir='folder_name') + ``` + + Load a dataset from a Storage Bucket on the Hugging Face Hub: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset('buckets/username/bucket_name/rotten_tomatoes', split='train') + ``` + + Load a local dataset: + + ```py + # Load a CSV file + >>> from datasets import load_dataset + >>> ds = load_dataset('csv', data_files='path/to/local/my_dataset.csv') + + # Load a JSON file + >>> from datasets import load_dataset + >>> ds = load_dataset('json', data_files='path/to/local/my_dataset.json') + ``` + + Load an [`~datasets.IterableDataset`]: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset('cornell-movie-review-data/rotten_tomatoes', split='train', streaming=True) + ``` + + Load an image dataset with the `ImageFolder` dataset builder: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset('imagefolder', data_dir='/path/to/images', split='train') + ``` + """ + if "trust_remote_code" in config_kwargs: + if config_kwargs.pop("trust_remote_code"): + logger.error( + "`trust_remote_code` is not supported anymore.\n" + f"Please check that the Hugging Face dataset '{path}' isn't based on a loading script and remove `trust_remote_code`.\n" + "If the dataset is based on a loading script, please ask the dataset author to remove it and convert it to a standard format like Parquet." + ) + if data_files is not None and not data_files: + raise ValueError(f"Empty 'data_files': '{data_files}'. It should be either non-empty or None (default).") + if Path(path, config.DATASET_STATE_JSON_FILENAME).exists(): + raise ValueError( + "You are trying to load a dataset that was saved using `save_to_disk`. " + "Please use `load_from_disk` instead." + ) + + if streaming and num_proc is not None: + raise NotImplementedError( + "Loading a streaming dataset in parallel with `num_proc` is not implemented. " + "To parallelize streaming, you can wrap the dataset with a PyTorch DataLoader using `num_workers` > 1 instead." + ) + + download_mode = DownloadMode(download_mode or DownloadMode.REUSE_DATASET_IF_EXISTS) + verification_mode = VerificationMode( + (verification_mode or VerificationMode.BASIC_CHECKS) if not save_infos else VerificationMode.ALL_CHECKS + ) + + # Create a dataset builder + builder_instance = load_dataset_builder( + path=path, + name=name, + data_dir=data_dir, + data_files=data_files, + cache_dir=cache_dir, + features=features, + download_config=download_config, + download_mode=download_mode, + revision=revision, + token=token, + storage_options=storage_options, + **config_kwargs, + ) + + # Return iterable dataset in case of streaming + if streaming: + return builder_instance.as_streaming_dataset(split=split) + + # Download and prepare data + builder_instance.download_and_prepare( + download_config=download_config, + download_mode=download_mode, + verification_mode=verification_mode, + num_proc=num_proc, + storage_options=storage_options, + ) + + # Build dataset for splits + keep_in_memory = ( + keep_in_memory if keep_in_memory is not None else is_small_dataset(builder_instance.info.dataset_size) + ) + ds = builder_instance.as_dataset(split=split, in_memory=keep_in_memory) + + return ds + + +def load_from_disk( + dataset_path: PathLike, keep_in_memory: Optional[bool] = None, storage_options: Optional[dict] = None +) -> Union[Dataset, DatasetDict]: + """ + Loads a dataset that was previously saved using [`~Dataset.save_to_disk`] from a dataset directory, or + from a filesystem using any implementation of `fsspec.spec.AbstractFileSystem`. + + Args: + dataset_path (`path-like`): + Path (e.g. `"dataset/train"`) or remote URI (e.g. `"s3://my-bucket/dataset/train"`) + of the [`Dataset`] or [`DatasetDict`] directory where the dataset/dataset-dict will be + loaded from. + keep_in_memory (`bool`, defaults to `None`): + Whether to copy the dataset in-memory. If `None`, the dataset + will not be copied in-memory unless explicitly enabled by setting `datasets.config.IN_MEMORY_MAX_SIZE` to + nonzero. See more details in the [improve performance](../cache#improve-performance) section. + + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the file-system backend, if any. + + + + Returns: + [`Dataset`] or [`DatasetDict`]: + - If `dataset_path` is a path of a dataset directory: the dataset requested. + - If `dataset_path` is a path of a dataset dict directory, a [`DatasetDict`] with each split. + + Example: + + ```py + >>> from datasets import load_from_disk + >>> ds = load_from_disk('path/to/dataset/directory') + ``` + """ + fs: fsspec.AbstractFileSystem + fs, *_ = url_to_fs(dataset_path, **(storage_options or {})) + if not fs.exists(dataset_path): + raise FileNotFoundError(f"Directory {dataset_path} not found") + if fs.isfile(posixpath.join(dataset_path, config.DATASET_INFO_FILENAME)) and fs.isfile( + posixpath.join(dataset_path, config.DATASET_STATE_JSON_FILENAME) + ): + return Dataset.load_from_disk(dataset_path, keep_in_memory=keep_in_memory, storage_options=storage_options) + elif fs.isfile(posixpath.join(dataset_path, config.DATASETDICT_JSON_FILENAME)): + return DatasetDict.load_from_disk(dataset_path, keep_in_memory=keep_in_memory, storage_options=storage_options) + else: + raise FileNotFoundError( + f"Directory {dataset_path} is neither a `Dataset` directory nor a `DatasetDict` directory." + ) diff --git a/src/datasets/naming.py b/src/datasets/naming.py new file mode 100644 index 0000000..29216bb --- /dev/null +++ b/src/datasets/naming.py @@ -0,0 +1,84 @@ +# Copyright 2020 The HuggingFace Datasets Authors and the TensorFlow Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""Utilities for file names.""" + +import itertools +import os +import re + + +_uppercase_uppercase_re = re.compile(r"([A-Z]+)([A-Z][a-z])") +_lowercase_uppercase_re = re.compile(r"([a-z\d])([A-Z])") + +_single_underscore_re = re.compile(r"(?:/\|?*" + + +def camelcase_to_snakecase(name): + """Convert camel-case string to snake-case.""" + name = _uppercase_uppercase_re.sub(r"\1_\2", name) + name = _lowercase_uppercase_re.sub(r"\1_\2", name) + return name.lower() + + +def snakecase_to_camelcase(name): + """Convert snake-case string to camel-case string.""" + name = _single_underscore_re.split(name) + name = [_multiple_underscores_re.split(n) for n in name] + return "".join(n.capitalize() for n in itertools.chain.from_iterable(name) if n != "") + + +def filename_prefix_for_name(name): + if os.path.basename(name) != name: + raise ValueError(f"Should be a dataset name, not a path: {name}") + return camelcase_to_snakecase(name) + + +def filename_prefix_for_split(name, split): + if os.path.basename(name) != name: + raise ValueError(f"Should be a dataset name, not a path: {name}") + if not re.match(_split_re, split): + raise ValueError(f"Split name should match '{_split_re}'' but got '{split}'.") + return f"{filename_prefix_for_name(name)}-{split}" + + +def filepattern_for_dataset_split(dataset_name, split, data_dir, filetype_suffix=None): + prefix = filename_prefix_for_split(dataset_name, split) + if filetype_suffix: + prefix += f".{filetype_suffix}" + filepath = os.path.join(data_dir, prefix) + return f"{filepath}*" + + +def filenames_for_dataset_split(path, dataset_name, split, filetype_suffix=None, shard_lengths=None): + prefix = filename_prefix_for_split(dataset_name, split) + prefix = os.path.join(path, prefix) + + if shard_lengths and len(shard_lengths) > 1: + num_shards = len(shard_lengths) + filenames = [f"{prefix}-{shard_id:05d}-of-{num_shards:05d}" for shard_id in range(num_shards)] + if filetype_suffix: + filenames = [filename + f".{filetype_suffix}" for filename in filenames] + return filenames + else: + filename = prefix + if filetype_suffix: + filename += f".{filetype_suffix}" + return [filename] diff --git a/src/datasets/packaged_modules/__init__.py b/src/datasets/packaged_modules/__init__.py new file mode 100644 index 0000000..0de63b9 --- /dev/null +++ b/src/datasets/packaged_modules/__init__.py @@ -0,0 +1,148 @@ +import inspect +import re +from typing import Dict, List, Tuple + +from huggingface_hub.utils import insecure_hashlib + +from .arrow import arrow +from .audiofolder import audiofolder +from .cache import cache +from .conll import conll +from .csv import csv +from .eval import eval +from .hdf5 import hdf5 +from .iceberg import iceberg +from .imagefolder import imagefolder +from .json import json +from .lance import lance +from .meshfolder import meshfolder +from .niftifolder import niftifolder +from .pandas import pandas +from .parquet import parquet +from .pdffolder import pdffolder +from .sql import sql +from .text import text +from .tsfile import tsfile +from .videofolder import videofolder +from .webdataset import webdataset +from .xml import xml + + +def _hash_python_lines(lines: list[str]) -> str: + filtered_lines = [] + for line in lines: + line = re.sub(r"#.*", "", line) # remove comments + if line: + filtered_lines.append(line) + full_str = "\n".join(filtered_lines) + + # Make a hash from all this code + full_bytes = full_str.encode("utf-8") + return insecure_hashlib.sha256(full_bytes).hexdigest() + + +# get importable module names and hash for caching +_PACKAGED_DATASETS_MODULES = { + "csv": (csv.__name__, _hash_python_lines(inspect.getsource(csv).splitlines())), + "json": (json.__name__, _hash_python_lines(inspect.getsource(json).splitlines())), + "pandas": (pandas.__name__, _hash_python_lines(inspect.getsource(pandas).splitlines())), + "parquet": (parquet.__name__, _hash_python_lines(inspect.getsource(parquet).splitlines())), + "arrow": (arrow.__name__, _hash_python_lines(inspect.getsource(arrow).splitlines())), + "text": (text.__name__, _hash_python_lines(inspect.getsource(text).splitlines())), + "conll": (conll.__name__, _hash_python_lines(inspect.getsource(conll).splitlines())), + "imagefolder": (imagefolder.__name__, _hash_python_lines(inspect.getsource(imagefolder).splitlines())), + "audiofolder": (audiofolder.__name__, _hash_python_lines(inspect.getsource(audiofolder).splitlines())), + "videofolder": (videofolder.__name__, _hash_python_lines(inspect.getsource(videofolder).splitlines())), + "meshfolder": (meshfolder.__name__, _hash_python_lines(inspect.getsource(meshfolder).splitlines())), + "pdffolder": (pdffolder.__name__, _hash_python_lines(inspect.getsource(pdffolder).splitlines())), + "niftifolder": (niftifolder.__name__, _hash_python_lines(inspect.getsource(niftifolder).splitlines())), + "webdataset": (webdataset.__name__, _hash_python_lines(inspect.getsource(webdataset).splitlines())), + "xml": (xml.__name__, _hash_python_lines(inspect.getsource(xml).splitlines())), + "hdf5": (hdf5.__name__, _hash_python_lines(inspect.getsource(hdf5).splitlines())), + "eval": (eval.__name__, _hash_python_lines(inspect.getsource(eval).splitlines())), + "lance": (lance.__name__, _hash_python_lines(inspect.getsource(lance).splitlines())), + "tsfile": (tsfile.__name__, _hash_python_lines(inspect.getsource(tsfile).splitlines())), + "iceberg": (iceberg.__name__, _hash_python_lines(inspect.getsource(iceberg).splitlines())), +} + +# get importable module names and hash for caching +_PACKAGED_DATASETS_MODULES_2_15_HASHES = { + "csv": "eea64c71ca8b46dd3f537ed218fc9bf495d5707789152eb2764f5c78fa66d59d", + "json": "8bb11242116d547c741b2e8a1f18598ffdd40a1d4f2a2872c7a28b697434bc96", + "pandas": "3ac4ffc4563c796122ef66899b9485a3f1a977553e2d2a8a318c72b8cc6f2202", + "parquet": "ca31c69184d9832faed373922c2acccec0b13a0bb5bbbe19371385c3ff26f1d1", + "arrow": "74f69db2c14c2860059d39860b1f400a03d11bf7fb5a8258ca38c501c878c137", + "text": "c4a140d10f020282918b5dd1b8a49f0104729c6177f60a6b49ec2a365ec69f34", + "imagefolder": "7b7ce5247a942be131d49ad4f3de5866083399a0f250901bd8dc202f8c5f7ce5", + "audiofolder": "d3c1655c66c8f72e4efb5c79e952975fa6e2ce538473a6890241ddbddee9071c", +} + +# Used to infer the module to use based on the data files extensions +_EXTENSION_TO_MODULE: dict[str, tuple[str, dict]] = { + ".csv": ("csv", {}), + ".tsv": ("csv", {"sep": "\t"}), + ".json": ("json", {}), + ".jsonl": ("json", {}), + # ndjson is no longer maintained (see: https://github.com/ndjson/ndjson-spec/issues/35#issuecomment-1285673417) + ".ndjson": ("json", {}), + ".parquet": ("parquet", {}), + ".geoparquet": ("parquet", {}), + ".gpq": ("parquet", {}), + ".arrow": ("arrow", {}), + ".txt": ("text", {}), + ".conll": ("conll", {}), + ".conllu": ("conll", {"comment_prefix": "#"}), + ".tar": ("webdataset", {}), + ".xml": ("xml", {}), + ".hdf5": ("hdf5", {}), + ".h5": ("hdf5", {}), + ".eval": ("eval", {}), + ".lance": ("lance", {}), + ".tsfile": ("tsfile", {}), +} +_EXTENSION_TO_MODULE.update({ext: ("imagefolder", {}) for ext in imagefolder.ImageFolder.EXTENSIONS}) +_EXTENSION_TO_MODULE.update({ext.upper(): ("imagefolder", {}) for ext in imagefolder.ImageFolder.EXTENSIONS}) +_EXTENSION_TO_MODULE.update({ext: ("audiofolder", {}) for ext in audiofolder.AudioFolder.EXTENSIONS}) +_EXTENSION_TO_MODULE.update({ext.upper(): ("audiofolder", {}) for ext in audiofolder.AudioFolder.EXTENSIONS}) +_EXTENSION_TO_MODULE.update({ext: ("videofolder", {}) for ext in videofolder.VideoFolder.EXTENSIONS}) +_EXTENSION_TO_MODULE.update({ext.upper(): ("videofolder", {}) for ext in videofolder.VideoFolder.EXTENSIONS}) +_EXTENSION_TO_MODULE.update({ext: ("meshfolder", {}) for ext in meshfolder.MeshFolder.EXTENSIONS}) +_EXTENSION_TO_MODULE.update({ext.upper(): ("meshfolder", {}) for ext in meshfolder.MeshFolder.EXTENSIONS}) +_EXTENSION_TO_MODULE.update({ext: ("pdffolder", {}) for ext in pdffolder.PdfFolder.EXTENSIONS}) +_EXTENSION_TO_MODULE.update({ext.upper(): ("pdffolder", {}) for ext in pdffolder.PdfFolder.EXTENSIONS}) +_EXTENSION_TO_MODULE.update({ext: ("niftifolder", {}) for ext in niftifolder.NiftiFolder.EXTENSIONS}) +_EXTENSION_TO_MODULE.update({ext.upper(): ("niftifolder", {}) for ext in niftifolder.NiftiFolder.EXTENSIONS}) + +# Used to filter data files based on extensions given a module name +_MODULE_TO_EXTENSIONS: dict[str, list[str]] = {} +for _ext, (_module, _) in _EXTENSION_TO_MODULE.items(): + _MODULE_TO_EXTENSIONS.setdefault(_module, []).append(_ext) + +for _module in _MODULE_TO_EXTENSIONS: + _MODULE_TO_EXTENSIONS[_module].append(".zip") + +# Used to filter data files based on file names +_MODULE_TO_METADATA_FILE_NAMES: Dict[str, List[str]] = {} +for _module in _MODULE_TO_EXTENSIONS: + _MODULE_TO_METADATA_FILE_NAMES[_module] = [] +_MODULE_TO_METADATA_FILE_NAMES["imagefolder"] = imagefolder.ImageFolder.METADATA_FILENAMES +_MODULE_TO_METADATA_FILE_NAMES["audiofolder"] = imagefolder.ImageFolder.METADATA_FILENAMES +_MODULE_TO_METADATA_FILE_NAMES["videofolder"] = imagefolder.ImageFolder.METADATA_FILENAMES +_MODULE_TO_METADATA_FILE_NAMES["meshfolder"] = meshfolder.MeshFolder.METADATA_FILENAMES +_MODULE_TO_METADATA_FILE_NAMES["pdffolder"] = imagefolder.ImageFolder.METADATA_FILENAMES +_MODULE_TO_METADATA_FILE_NAMES["niftifolder"] = imagefolder.ImageFolder.METADATA_FILENAMES +_MODULE_TO_METADATA_FILE_NAMES["lance"] = lance.Lance.METADATA_FILE_NAMES + +_MODULE_TO_METADATA_EXTENSIONS: Dict[str, List[str]] = {} +for _module in _MODULE_TO_EXTENSIONS: + _MODULE_TO_METADATA_EXTENSIONS[_module] = [] +_MODULE_TO_METADATA_EXTENSIONS["lance"] = lance.Lance.METADATA_EXTENSIONS + +# Total + +_ALL_EXTENSIONS = list(_EXTENSION_TO_MODULE.keys()) + [".zip"] +_ALL_METADATA_EXTENSIONS = sorted({_ext for _exts in _MODULE_TO_METADATA_EXTENSIONS.values() for _ext in _exts}) +_ALL_ALLOWED_EXTENSIONS = _ALL_EXTENSIONS + _ALL_METADATA_EXTENSIONS +_ALL_METADATA_FILENAMES = sorted( + {file_name for file_names in _MODULE_TO_METADATA_FILE_NAMES.values() for file_name in file_names} +) diff --git a/src/datasets/packaged_modules/arrow/__init__.py b/src/datasets/packaged_modules/arrow/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/arrow/arrow.py b/src/datasets/packaged_modules/arrow/arrow.py new file mode 100644 index 0000000..7a655d9 --- /dev/null +++ b/src/datasets/packaged_modules/arrow/arrow.py @@ -0,0 +1,77 @@ +from dataclasses import dataclass +from typing import Optional + +import pyarrow as pa + +import datasets +from datasets.builder import Key +from datasets.table import table_cast + + +logger = datasets.utils.logging.get_logger(__name__) + + +@dataclass +class ArrowConfig(datasets.BuilderConfig): + """BuilderConfig for Arrow.""" + + features: Optional[datasets.Features] = None + + def __post_init__(self): + super().__post_init__() + + +class Arrow(datasets.ArrowBasedBuilder): + BUILDER_CONFIG_CLASS = ArrowConfig + + def _info(self): + return datasets.DatasetInfo(features=self.config.features) + + def _split_generators(self, dl_manager): + """We handle string, list and dicts in datafiles""" + if not self.config.data_files: + raise ValueError(f"At least one data file must be specified, but got data_files={self.config.data_files}") + data_files = dl_manager.download(self.config.data_files) + splits = [] + for split_name, files in data_files.items(): + # Infer features if they are stored in the arrow schema + if self.info.features is None: + for file in files: + with open(file, "rb") as f: + try: + reader = pa.ipc.open_stream(f) + except (OSError, pa.lib.ArrowInvalid): + reader = pa.ipc.open_file(f) + self.info.features = datasets.Features.from_arrow_schema(reader.schema) + break + splits.append(datasets.SplitGenerator(name=split_name, gen_kwargs={"files": files})) + return splits + + def _cast_table(self, pa_table: pa.Table) -> pa.Table: + if self.info.features is not None: + # more expensive cast to support nested features with keys in a different order + # allows str <-> int/float or str to Audio for example + pa_table = table_cast(pa_table, self.info.features.arrow_schema) + return pa_table + + def _generate_shards(self, files): + yield from files + + def _generate_tables(self, files): + for file_idx, file in enumerate(files): + with open(file, "rb") as f: + try: + try: + batches = pa.ipc.open_stream(f) + except (OSError, pa.lib.ArrowInvalid): + reader = pa.ipc.open_file(f) + batches = (reader.get_batch(i) for i in range(reader.num_record_batches)) + for batch_idx, record_batch in enumerate(batches): + pa_table = pa.Table.from_batches([record_batch]) + # Uncomment for debugging (will print the Arrow table size and elements) + # logger.warning(f"pa_table: {pa_table} num rows: {pa_table.num_rows}") + # logger.warning('\n'.join(str(pa_table.slice(i, 1).to_pydict()) for i in range(pa_table.num_rows))) + yield Key(file_idx, batch_idx), self._cast_table(pa_table) + except ValueError as e: + logger.error(f"Failed to read file '{file}' with error {type(e)}: {e}") + raise diff --git a/src/datasets/packaged_modules/audiofolder/__init__.py b/src/datasets/packaged_modules/audiofolder/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/audiofolder/audiofolder.py b/src/datasets/packaged_modules/audiofolder/audiofolder.py new file mode 100644 index 0000000..9e71a6b --- /dev/null +++ b/src/datasets/packaged_modules/audiofolder/audiofolder.py @@ -0,0 +1,86 @@ +import datasets + +from ..folder_based_builder import folder_based_builder + + +logger = datasets.utils.logging.get_logger(__name__) + + +class AudioFolderConfig(folder_based_builder.FolderBasedBuilderConfig): + """Builder Config for AudioFolder.""" + + drop_labels: bool = None + drop_metadata: bool = None + + def __post_init__(self): + super().__post_init__() + + +class AudioFolder(folder_based_builder.FolderBasedBuilder): + BASE_FEATURE = datasets.Audio + BASE_COLUMN_NAME = "audio" + BUILDER_CONFIG_CLASS = AudioFolderConfig + EXTENSIONS: list[str] # definition at the bottom of the script + + +# Obtained with: +# ``` +# import soundfile as sf +# +# AUDIO_EXTENSIONS = [f".{format.lower()}" for format in sf.available_formats().keys()] +# +# # .opus decoding is supported if libsndfile >= 1.0.31: +# AUDIO_EXTENSIONS.extend([".opus"]) +# ``` +# We intentionally did not run this code on launch because: +# (1) Soundfile was an optional dependency, so importing it in global namespace is not allowed +# (2) To ensure the list of supported extensions is deterministic +# (3) We use TorchCodec now anyways instead of Soundfile +AUDIO_EXTENSIONS = [ + ".aiff", + ".au", + ".avr", + ".caf", + ".flac", + ".htk", + ".svx", + ".mat4", + ".mat5", + ".mpc2k", + ".ogg", + ".paf", + ".pvf", + ".raw", + ".rf64", + ".sd2", + ".sds", + ".ircam", + ".voc", + ".w64", + ".wav", + ".nist", + ".wavex", + ".wve", + ".xi", + ".mp3", + ".opus", + ".3gp", + ".3g2", + ".avi", + ".asf", + ".flv", + ".mp4", + ".mov", + ".m4v", + ".mkv", + ".mpg", + ".webm", + ".f4v", + ".wmv", + ".wma", + ".ogg", + ".ogm", + ".mxf", + ".nut", +] +AudioFolder.EXTENSIONS = AUDIO_EXTENSIONS diff --git a/src/datasets/packaged_modules/cache/__init__.py b/src/datasets/packaged_modules/cache/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/cache/cache.py b/src/datasets/packaged_modules/cache/cache.py new file mode 100644 index 0000000..a5d9f35 --- /dev/null +++ b/src/datasets/packaged_modules/cache/cache.py @@ -0,0 +1,195 @@ +import glob +import json +import os +import shutil +import time +from pathlib import Path +from typing import Optional, Union + +import pyarrow as pa + +import datasets +import datasets.config +import datasets.data_files +from datasets.builder import Key +from datasets.naming import camelcase_to_snakecase, filenames_for_dataset_split + + +logger = datasets.utils.logging.get_logger(__name__) + + +def _get_modification_time(cached_directory_path): + return (Path(cached_directory_path)).stat().st_mtime + + +def _find_hash_in_cache( + dataset_name: str, + config_name: Optional[str], + cache_dir: Optional[str], + config_kwargs: dict, + custom_features: Optional[datasets.Features], +) -> tuple[str, str, str]: + if config_name or config_kwargs or custom_features: + config_id = datasets.BuilderConfig(config_name or "default").create_config_id( + config_kwargs=config_kwargs, custom_features=custom_features + ) + else: + config_id = None + cache_dir = os.path.expanduser(str(cache_dir or datasets.config.HF_DATASETS_CACHE)) + namespace_and_dataset_name = dataset_name.split("/") + namespace_and_dataset_name[-1] = camelcase_to_snakecase(namespace_and_dataset_name[-1]) + cached_relative_path = "___".join(namespace_and_dataset_name) + cached_datasets_directory_path_root = os.path.join(cache_dir, cached_relative_path) + cached_directory_paths = [ + cached_directory_path + for cached_directory_path in glob.glob( + os.path.join(cached_datasets_directory_path_root, config_id or "*", "*", "*") + ) + if os.path.isdir(cached_directory_path) + and ( + config_kwargs + or custom_features + or json.loads(Path(cached_directory_path, "dataset_info.json").read_text(encoding="utf-8"))["config_name"] + == Path(cached_directory_path).parts[-3] # no extra params => config_id == config_name + ) + ] + if not cached_directory_paths: + cached_directory_paths = [ + cached_directory_path + for cached_directory_path in glob.glob(os.path.join(cached_datasets_directory_path_root, "*", "*", "*")) + if os.path.isdir(cached_directory_path) + ] + available_configs = sorted( + {Path(cached_directory_path).parts[-3] for cached_directory_path in cached_directory_paths} + ) + raise ValueError( + f"Couldn't find cache for {dataset_name}" + + (f" for config '{config_id}'" if config_id else "") + + (f"\nAvailable configs in the cache: {available_configs}" if available_configs else "") + ) + # get most recent + cached_directory_path = Path(sorted(cached_directory_paths, key=_get_modification_time)[-1]) + version, hash = cached_directory_path.parts[-2:] + other_configs = [ + Path(_cached_directory_path).parts[-3] + for _cached_directory_path in glob.glob(os.path.join(cached_datasets_directory_path_root, "*", version, hash)) + if os.path.isdir(_cached_directory_path) + and ( + config_kwargs + or custom_features + or json.loads(Path(_cached_directory_path, "dataset_info.json").read_text(encoding="utf-8"))["config_name"] + == Path(_cached_directory_path).parts[-3] # no extra params => config_id == config_name + ) + ] + if not config_id and len(other_configs) > 1: + raise ValueError( + f"There are multiple '{dataset_name}' configurations in the cache: {', '.join(other_configs)}" + f"\nPlease specify which configuration to reload from the cache, e.g." + f"\n\tload_dataset('{dataset_name}', '{other_configs[0]}')" + ) + config_name = cached_directory_path.parts[-3] + warning_msg = ( + f"Found the latest cached dataset configuration '{config_name}' at {cached_directory_path} " + f"(last modified on {time.ctime(_get_modification_time(cached_directory_path))})." + ) + logger.warning(warning_msg) + return config_name, version, hash + + +class Cache(datasets.ArrowBasedBuilder): + def __init__( + self, + cache_dir: Optional[str] = None, + dataset_name: Optional[str] = None, + config_name: Optional[str] = None, + version: Optional[str] = "0.0.0", + hash: Optional[str] = None, + base_path: Optional[str] = None, + info: Optional[datasets.DatasetInfo] = None, + features: Optional[datasets.Features] = None, + token: Optional[Union[bool, str]] = None, + repo_id: Optional[str] = None, + data_files: Optional[Union[str, list, dict, datasets.data_files.DataFilesDict]] = None, + data_dir: Optional[str] = None, + storage_options: Optional[dict] = None, + writer_batch_size: Optional[int] = None, + **config_kwargs, + ): + if repo_id is None and dataset_name is None: + raise ValueError("repo_id or dataset_name is required for the Cache dataset builder") + if data_files is not None: + config_kwargs["data_files"] = data_files + if data_dir is not None: + config_kwargs["data_dir"] = data_dir + if hash == "auto" and version == "auto": + config_name, version, hash = _find_hash_in_cache( + dataset_name=repo_id or dataset_name, + config_name=config_name, + cache_dir=cache_dir, + config_kwargs=config_kwargs, + custom_features=features, + ) + elif hash == "auto" or version == "auto": + raise NotImplementedError("Pass both hash='auto' and version='auto' instead") + super().__init__( + cache_dir=cache_dir, + dataset_name=dataset_name, + config_name=config_name, + version=version, + hash=hash, + base_path=base_path, + info=info, + token=token, + repo_id=repo_id, + storage_options=storage_options, + writer_batch_size=writer_batch_size, + ) + + def _info(self) -> datasets.DatasetInfo: + return datasets.DatasetInfo() + + def download_and_prepare(self, output_dir: Optional[str] = None, *args, **kwargs): + if not os.path.exists(self.cache_dir): + raise ValueError(f"Cache directory for {self.dataset_name} doesn't exist at {self.cache_dir}") + if output_dir is not None and output_dir != self.cache_dir: + shutil.copytree(self.cache_dir, output_dir) + + def _split_generators(self, dl_manager): + # used to stream from cache + if isinstance(self.info.splits, datasets.SplitDict): + split_infos: list[datasets.SplitInfo] = list(self.info.splits.values()) + else: + raise ValueError(f"Missing splits info for {self.dataset_name} in cache directory {self.cache_dir}") + return [ + datasets.SplitGenerator( + name=split_info.name, + gen_kwargs={ + "files": filenames_for_dataset_split( + self.cache_dir, + dataset_name=self.dataset_name, + split=split_info.name, + filetype_suffix="arrow", + shard_lengths=split_info.shard_lengths, + ) + }, + ) + for split_info in split_infos + ] + + def _generate_shards(self, files): + yield from files + + def _generate_tables(self, files): + # used to stream from cache + for file_idx, file in enumerate(files): + with open(file, "rb") as f: + try: + for batch_idx, record_batch in enumerate(pa.ipc.open_stream(f)): + pa_table = pa.Table.from_batches([record_batch]) + # Uncomment for debugging (will print the Arrow table size and elements) + # logger.warning(f"pa_table: {pa_table} num rows: {pa_table.num_rows}") + # logger.warning('\n'.join(str(pa_table.slice(i, 1).to_pydict()) for i in range(pa_table.num_rows))) + yield Key(file_idx, batch_idx), pa_table + except ValueError as e: + logger.error(f"Failed to read file '{file}' with error {type(e)}: {e}") + raise diff --git a/src/datasets/packaged_modules/conll/__init__.py b/src/datasets/packaged_modules/conll/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/conll/conll.py b/src/datasets/packaged_modules/conll/conll.py new file mode 100644 index 0000000..d86d4b4 --- /dev/null +++ b/src/datasets/packaged_modules/conll/conll.py @@ -0,0 +1,155 @@ +"""CoNLL format dataset builder. + +Reads CoNLL-style files where each line carries one token plus its tag columns, +columns are whitespace-separated, and empty lines mark sentence boundaries. +Each example is one sentence, with each configured column produced as a list +aligned with the tokens list. + +Supports CoNLL-2000 (chunking), CoNLL-2003 (NER), CoNLL-U (Universal +Dependencies), and any custom column schema by overriding ``column_names``. +""" + +from dataclasses import dataclass, field +from typing import Optional + +import pyarrow as pa + +import datasets +from datasets.builder import Key +from datasets.features.features import require_storage_cast +from datasets.table import table_cast + + +logger = datasets.utils.logging.get_logger(__name__) + + +DEFAULT_COLUMN_NAMES = ["tokens"] + + +@dataclass +class ConllConfig(datasets.BuilderConfig): + """BuilderConfig for CoNLL-style files. + + Args: + features: (`Features`, *optional*): + Cast the data to `features`. + column_names: (`list[str]`, defaults to `["tokens"]`): + Names for each whitespace-separated column. The first name is the + token column; subsequent names cover the tag columns. Common + schemas: + + - CoNLL-2003 NER: `["tokens", "pos_tags", "chunk_tags", "ner_tags"]` + - CoNLL-2000 chunking: `["tokens", "pos_tags", "chunk_tags"]` + - CoNLL-U: `["id", "form", "lemma", "upos", "xpos", "feats", + "head", "deprel", "deps", "misc"]` + delimiter: (`str`, *optional*): + Column delimiter inside each line. If `None` (default), any + whitespace is used, matching the standard CoNLL convention. + encoding: (`str`, defaults to `"utf-8"`): + Encoding to decode the file. + encoding_errors: (`str`, *optional*): + Argument to define what to do in case of encoding error. Same as + the `errors` argument in `open()`. + skip_docstart: (`bool`, defaults to `True`): + Skip CoNLL-2003 `-DOCSTART-` document-boundary marker lines. + comment_prefix: (`str`, *optional*): + If set, lines starting with this prefix are skipped. CoNLL-U + comments start with `#`. + """ + + features: Optional[datasets.Features] = None + column_names: list[str] = field(default_factory=lambda: list(DEFAULT_COLUMN_NAMES)) + delimiter: Optional[str] = None + encoding: str = "utf-8" + encoding_errors: Optional[str] = None + skip_docstart: bool = True + comment_prefix: Optional[str] = None + + +class Conll(datasets.ArrowBasedBuilder): + BUILDER_CONFIG_CLASS = ConllConfig + + def _info(self): + return datasets.DatasetInfo(features=self.config.features) + + def _split_generators(self, dl_manager): + """The `data_files` kwarg in load_dataset() can be a str, List[str], + Dict[str,str], or Dict[str,List[str]]. + + If str or List[str], then the dataset returns only the 'train' split. + If dict, then keys should be from the `datasets.Split` enum. + """ + if not self.config.data_files: + raise ValueError(f"At least one data file must be specified, but got data_files={self.config.data_files}") + dl_manager.download_config.extract_on_the_fly = True + base_data_files = dl_manager.download(self.config.data_files) + extracted_data_files = dl_manager.extract(base_data_files) + splits = [] + for split_name, files in extracted_data_files.items(): + files_iterables = [dl_manager.iter_files(file) for file in files] + splits.append( + datasets.SplitGenerator( + name=split_name, + gen_kwargs={ + "files_iterables": files_iterables, + "base_files": base_data_files[split_name], + }, + ) + ) + return splits + + def _cast_table(self, pa_table: pa.Table) -> pa.Table: + if self.config.features is not None: + schema = self.config.features.arrow_schema + if all(not require_storage_cast(feature) for feature in self.config.features.values()): + pa_table = pa_table.cast(schema) + else: + pa_table = table_cast(pa_table, schema) + return pa_table + + def _generate_shards(self, base_files, files_iterables): + yield from base_files + + def _generate_tables(self, base_files, files_iterables): + column_names = list(self.config.column_names) + if not column_names: + raise ValueError("ConllConfig.column_names must be a non-empty list") + num_cols = len(column_names) + delimiter = self.config.delimiter + skip_docstart = self.config.skip_docstart + comment_prefix = self.config.comment_prefix + + for shard_idx, files_iterable in enumerate(files_iterables): + for file in files_iterable: + sentences: list[list[list[str]]] = [] + current: list[list[str]] = [[] for _ in range(num_cols)] + with open(file, encoding=self.config.encoding, errors=self.config.encoding_errors) as f: + for raw_line in f: + # Strip the trailing newline only — preserve embedded whitespace + line = raw_line.rstrip("\r\n") + if not line.strip(): + # Sentence boundary + if current[0]: + sentences.append(current) + current = [[] for _ in range(num_cols)] + continue + if skip_docstart and line.startswith("-DOCSTART-"): + continue + if comment_prefix is not None and line.startswith(comment_prefix): + continue + parts = line.split(delimiter) if delimiter is not None else line.split() + # Pad or truncate to num_cols so column alignment is preserved + if len(parts) < num_cols: + parts = parts + [""] * (num_cols - len(parts)) + elif len(parts) > num_cols: + parts = parts[:num_cols] + for i, val in enumerate(parts): + current[i].append(val) + # Tail sentence with no trailing blank line + if current[0]: + sentences.append(current) + + if sentences: + arrays = [pa.array([sentence[col_idx] for sentence in sentences]) for col_idx in range(num_cols)] + pa_table = pa.Table.from_arrays(arrays, names=column_names) + yield Key(shard_idx, 0), self._cast_table(pa_table) diff --git a/src/datasets/packaged_modules/csv/__init__.py b/src/datasets/packaged_modules/csv/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/csv/csv.py b/src/datasets/packaged_modules/csv/csv.py new file mode 100644 index 0000000..249df36 --- /dev/null +++ b/src/datasets/packaged_modules/csv/csv.py @@ -0,0 +1,206 @@ +from dataclasses import dataclass +from typing import Any, Callable, Optional, Union + +import pandas as pd +import pyarrow as pa + +import datasets +import datasets.config +from datasets.builder import Key +from datasets.features.features import require_storage_cast +from datasets.table import table_cast +from datasets.utils.py_utils import Literal + + +logger = datasets.utils.logging.get_logger(__name__) + +_PANDAS_READ_CSV_NO_DEFAULT_PARAMETERS = ["names", "prefix"] +_PANDAS_READ_CSV_DEPRECATED_PARAMETERS = ["warn_bad_lines", "error_bad_lines", "mangle_dupe_cols"] +_PANDAS_READ_CSV_NEW_1_3_0_PARAMETERS = ["encoding_errors", "on_bad_lines"] +_PANDAS_READ_CSV_NEW_2_0_0_PARAMETERS = ["date_format"] +_PANDAS_READ_CSV_DEPRECATED_2_2_0_PARAMETERS = ["verbose"] + + +@dataclass +class CsvConfig(datasets.BuilderConfig): + """BuilderConfig for CSV.""" + + sep: str = "," + delimiter: Optional[str] = None + header: Optional[Union[int, list[int], str]] = "infer" + names: Optional[list[str]] = None + column_names: Optional[list[str]] = None + index_col: Optional[Union[int, str, list[int], list[str]]] = None + usecols: Optional[Union[list[int], list[str]]] = None + prefix: Optional[str] = None + mangle_dupe_cols: bool = True + engine: Optional[Literal["c", "python", "pyarrow"]] = None + converters: dict[Union[int, str], Callable[[Any], Any]] = None + true_values: Optional[list] = None + false_values: Optional[list] = None + skipinitialspace: bool = False + skiprows: Optional[Union[int, list[int]]] = None + nrows: Optional[int] = None + na_values: Optional[Union[str, list[str]]] = None + keep_default_na: bool = True + na_filter: bool = True + verbose: bool = False + skip_blank_lines: bool = True + thousands: Optional[str] = None + decimal: str = "." + lineterminator: Optional[str] = None + quotechar: str = '"' + quoting: int = 0 + escapechar: Optional[str] = None + comment: Optional[str] = None + encoding: Optional[str] = None + dialect: Optional[str] = None + error_bad_lines: bool = True + warn_bad_lines: bool = True + skipfooter: int = 0 + doublequote: bool = True + memory_map: bool = False + float_precision: Optional[str] = None + chunksize: int = 10_000 + features: Optional[datasets.Features] = None + encoding_errors: Optional[str] = "strict" + on_bad_lines: Literal["error", "warn", "skip"] = "error" + date_format: Optional[str] = None + + def __post_init__(self): + super().__post_init__() + if self.delimiter is not None: + self.sep = self.delimiter + if self.column_names is not None: + self.names = self.column_names + + @property + def pd_read_csv_kwargs(self): + pd_read_csv_kwargs = { + "sep": self.sep, + "header": self.header, + "names": self.names, + "index_col": self.index_col, + "usecols": self.usecols, + "prefix": self.prefix, + "mangle_dupe_cols": self.mangle_dupe_cols, + "engine": self.engine, + "converters": self.converters, + "true_values": self.true_values, + "false_values": self.false_values, + "skipinitialspace": self.skipinitialspace, + "skiprows": self.skiprows, + "nrows": self.nrows, + "na_values": self.na_values, + "keep_default_na": self.keep_default_na, + "na_filter": self.na_filter, + "verbose": self.verbose, + "skip_blank_lines": self.skip_blank_lines, + "thousands": self.thousands, + "decimal": self.decimal, + "lineterminator": self.lineterminator, + "quotechar": self.quotechar, + "quoting": self.quoting, + "escapechar": self.escapechar, + "comment": self.comment, + "encoding": self.encoding, + "dialect": self.dialect, + "error_bad_lines": self.error_bad_lines, + "warn_bad_lines": self.warn_bad_lines, + "skipfooter": self.skipfooter, + "doublequote": self.doublequote, + "memory_map": self.memory_map, + "float_precision": self.float_precision, + "chunksize": self.chunksize, + "encoding_errors": self.encoding_errors, + "on_bad_lines": self.on_bad_lines, + "date_format": self.date_format, + } + + # some kwargs must not be passed if they don't have a default value + # some others are deprecated and we can also not pass them if they are the default value + for pd_read_csv_parameter in _PANDAS_READ_CSV_NO_DEFAULT_PARAMETERS + _PANDAS_READ_CSV_DEPRECATED_PARAMETERS: + if pd_read_csv_kwargs[pd_read_csv_parameter] == getattr(CsvConfig(), pd_read_csv_parameter): + del pd_read_csv_kwargs[pd_read_csv_parameter] + + # Remove 1.3 new arguments + if not (datasets.config.PANDAS_VERSION.major >= 1 and datasets.config.PANDAS_VERSION.minor >= 3): + for pd_read_csv_parameter in _PANDAS_READ_CSV_NEW_1_3_0_PARAMETERS: + del pd_read_csv_kwargs[pd_read_csv_parameter] + + # Remove 2.0 new arguments + if not (datasets.config.PANDAS_VERSION.major >= 2): + for pd_read_csv_parameter in _PANDAS_READ_CSV_NEW_2_0_0_PARAMETERS: + del pd_read_csv_kwargs[pd_read_csv_parameter] + + # Remove 2.2 deprecated arguments + if datasets.config.PANDAS_VERSION.release >= (2, 2): + for pd_read_csv_parameter in _PANDAS_READ_CSV_DEPRECATED_2_2_0_PARAMETERS: + if pd_read_csv_kwargs[pd_read_csv_parameter] == getattr(CsvConfig(), pd_read_csv_parameter): + del pd_read_csv_kwargs[pd_read_csv_parameter] + + return pd_read_csv_kwargs + + +class Csv(datasets.ArrowBasedBuilder): + BUILDER_CONFIG_CLASS = CsvConfig + + def _info(self): + return datasets.DatasetInfo(features=self.config.features) + + def _split_generators(self, dl_manager): + """We handle string, list and dicts in datafiles""" + if not self.config.data_files: + raise ValueError(f"At least one data file must be specified, but got data_files={self.config.data_files}") + dl_manager.download_config.extract_on_the_fly = True + base_data_files = dl_manager.download(self.config.data_files) + extracted_data_files = dl_manager.extract(base_data_files) + splits = [] + for split_name, extracted_files in extracted_data_files.items(): + files_iterables = [dl_manager.iter_files(extracted_file) for extracted_file in extracted_files] + splits.append( + datasets.SplitGenerator( + name=split_name, + gen_kwargs={"files_iterables": files_iterables, "base_files": base_data_files[split_name]}, + ) + ) + return splits + + def _cast_table(self, pa_table: pa.Table) -> pa.Table: + if self.config.features is not None: + schema = self.config.features.arrow_schema + if all(not require_storage_cast(feature) for feature in self.config.features.values()): + # cheaper cast + pa_table = pa.Table.from_arrays([pa_table[field.name] for field in schema], schema=schema) + else: + # more expensive cast; allows str <-> int/float or str to Audio for example + pa_table = table_cast(pa_table, schema) + return pa_table + + def _generate_shards(self, base_files, files_iterables): + yield from base_files + + def _generate_tables(self, base_files, files_iterables): + schema = self.config.features.arrow_schema if self.config.features else None + # dtype allows reading an int column as str + dtype = ( + { + name: dtype.to_pandas_dtype() if not require_storage_cast(feature) else object + for name, dtype, feature in zip(schema.names, schema.types, self.config.features.values()) + } + if schema is not None + else None + ) + for shard_idx, files_iterable in enumerate(files_iterables): + for file in files_iterable: + csv_file_reader = pd.read_csv(file, iterator=True, dtype=dtype, **self.config.pd_read_csv_kwargs) + try: + for batch_idx, df in enumerate(csv_file_reader): + pa_table = pa.Table.from_pandas(df) + # Uncomment for debugging (will print the Arrow table size and elements) + # logger.warning(f"pa_table: {pa_table} num rows: {pa_table.num_rows}") + # logger.warning('\n'.join(str(pa_table.slice(i, 1).to_pydict()) for i in range(pa_table.num_rows))) + yield Key(shard_idx, batch_idx), self._cast_table(pa_table) + except ValueError as e: + logger.error(f"Failed to read file '{file}' with error {type(e)}: {e}") + raise diff --git a/src/datasets/packaged_modules/eval/__init__.py b/src/datasets/packaged_modules/eval/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/eval/eval.py b/src/datasets/packaged_modules/eval/eval.py new file mode 100644 index 0000000..f2198dd --- /dev/null +++ b/src/datasets/packaged_modules/eval/eval.py @@ -0,0 +1,77 @@ +import json +import os +from itertools import islice +from typing import Iterable + +import pyarrow as pa + +import datasets +from datasets.builder import Key + + +logger = datasets.utils.logging.get_logger(__name__) + + +class Eval(datasets.GeneratorBasedBuilder): + NUM_EXAMPLES_FOR_FEATURES_INFERENCE = 5 + + def _info(self): + return datasets.DatasetInfo() + + def _split_generators(self, dl_manager): + """We handle string, list and dicts in datafiles""" + if not self.config.data_files: + raise ValueError(f"At least one data file must be specified, but got data_files={self.config.data_files}") + dl_manager.download_config.extract_on_the_fly = True + base_data_files = dl_manager.download(self.config.data_files) + extracted_data_files = dl_manager.extract(base_data_files) + splits = [] + for split_name, logs in extracted_data_files.items(): + logs_files_iterables = [dl_manager.iter_files(log) for log in logs] + splits.append( + datasets.SplitGenerator( + name=split_name, + gen_kwargs={ + "logs_files_iterables": logs_files_iterables, + "base_files": base_data_files[split_name], + }, + ) + ) + if not self.info.features: + first_examples = list( + islice( + self._iter_samples_from_log_files(logs_files_iterables[0]), + self.NUM_EXAMPLES_FOR_FEATURES_INFERENCE, + ) + ) + pa_tables = [pa.Table.from_pylist([example]) for example in first_examples] + inferred_arrow_schema = pa.concat_tables(pa_tables, promote_options="default").schema + self.info.features = datasets.Features.from_arrow_schema(inferred_arrow_schema) + + return splits + + def _sort_samples_key(self, sample_path: str): + # looks like "{sample_idx}_epoch_{epoch_idx}"" + (sample_idx_str, epoch_idx_str) = os.path.splitext(os.path.basename(sample_path))[0].split("_epoch_") + return (int(epoch_idx_str), int(sample_idx_str)) + + def _iter_samples_from_log_files(self, log_files: Iterable[str]): + sample_files = [log_file for log_file in log_files if os.path.basename(os.path.dirname(log_file)) == "samples"] + sample_files.sort(key=self._sort_samples_key) + for sample_file in sample_files: + with open(sample_file) as f: + sample = json.load(f) + for field in sample: + if isinstance(sample[field], dict): + sample[field] = json.dumps(sample[field]) + if isinstance(sample[field], list): + sample[field] = [json.dumps(x) for x in sample[field]] + yield sample + + def _generate_shards(self, base_files, logs_files_iterables): + yield from base_files + + def _generate_examples(self, base_files, logs_files_iterables): + for file_idx, log_files in enumerate(logs_files_iterables): + for sample_idx, sample in enumerate(self._iter_samples_from_log_files(log_files)): + yield Key(file_idx, sample_idx), sample diff --git a/src/datasets/packaged_modules/folder_based_builder/__init__.py b/src/datasets/packaged_modules/folder_based_builder/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/folder_based_builder/folder_based_builder.py b/src/datasets/packaged_modules/folder_based_builder/folder_based_builder.py new file mode 100644 index 0000000..82586c6 --- /dev/null +++ b/src/datasets/packaged_modules/folder_based_builder/folder_based_builder.py @@ -0,0 +1,444 @@ +import collections +import io +import itertools +import os +from dataclasses import dataclass +from typing import Any, Callable, Iterator, Optional, Union + +import pandas as pd +import pyarrow as pa +import pyarrow.dataset as ds +import pyarrow.json as paj +import pyarrow.parquet as pq + +import datasets +from datasets import config +from datasets.builder import Key +from datasets.features.features import FeatureType, _visit, _visit_with_path, _VisitPath, require_storage_cast +from datasets.utils.file_utils import readline + + +logger = datasets.utils.logging.get_logger(__name__) + + +def count_path_segments(path): + return path.replace("\\", "/").count("/") + + +@dataclass +class FolderBasedBuilderConfig(datasets.BuilderConfig): + """BuilderConfig for AutoFolder.""" + + features: Optional[datasets.Features] = None + drop_labels: bool = None + drop_metadata: bool = None + metadata_filenames: list[str] = None + filters: Optional[Union[ds.Expression, list[tuple], list[list[tuple]]]] = None + + def __post_init__(self): + super().__post_init__() + + +class FolderBasedBuilder(datasets.GeneratorBasedBuilder): + """ + Base class for generic data loaders for vision and image data. + + + Abstract class attributes to be overridden by a child class: + BASE_FEATURE: feature object to decode data (i.e. datasets.Image, datasets.Audio, ...) + BASE_COLUMN_NAME: string key name of a base feature (i.e. "image", "audio", ...) + BUILDER_CONFIG_CLASS: builder config inherited from `folder_based_builder.FolderBasedBuilderConfig` + EXTENSIONS: list of allowed extensions (only files with these extensions and METADATA_FILENAME files + will be included in a dataset) + """ + + BASE_FEATURE: type[FeatureType] + BASE_COLUMN_NAME: str + BUILDER_CONFIG_CLASS: FolderBasedBuilderConfig + EXTENSIONS: list[str] + + METADATA_FILENAMES: list[str] = ["metadata.csv", "metadata.jsonl", "metadata.parquet"] + + def _info(self): + if not self.config.data_dir and not self.config.data_files: + raise ValueError( + "Folder-based datasets require either `data_dir` or `data_files` to be specified. " + "Neither was provided." + ) + + return datasets.DatasetInfo(features=self.config.features) + + def _split_generators(self, dl_manager): + if not self.config.data_files: + raise ValueError(f"At least one data file must be specified, but got data_files={self.config.data_files}") + dl_manager.download_config.extract_on_the_fly = True + # Do an early pass if: + # * `drop_labels` is None (default) or False, to infer the class labels + # * `drop_metadata` is None (default) or False, to find the metadata files + do_analyze = not self.config.drop_labels or not self.config.drop_metadata + labels, path_depths = set(), set() + all_metadata_files = collections.defaultdict(set) + metadata_filenames = self.config.metadata_filenames or self.METADATA_FILENAMES + + def analyze(files_or_archives, downloaded_files_or_dirs, split): + if len(downloaded_files_or_dirs) == 0: + return + # The files are separated from the archives at this point, so check the first sample + # to see if it's a file or a directory and iterate accordingly + if os.path.isfile(downloaded_files_or_dirs[0]): + original_files, downloaded_files = files_or_archives, downloaded_files_or_dirs + for original_file, downloaded_file in zip(original_files, downloaded_files): + original_file, downloaded_file = str(original_file), str(downloaded_file) + _, original_file_ext = os.path.splitext(original_file) + if original_file_ext.lower() in self.EXTENSIONS: + if not self.config.drop_labels: + labels.add(os.path.basename(os.path.dirname(original_file))) + path_depths.add(count_path_segments(original_file)) + elif os.path.basename(original_file) in metadata_filenames: + all_metadata_files[split].add((original_file, None, downloaded_file)) + else: + original_file_name = os.path.basename(original_file) + logger.debug( + f"The file '{original_file_name}' was ignored: it is not a {self.BASE_COLUMN_NAME}, and is not {metadata_filenames} either." + ) + else: + archives, downloaded_dirs = files_or_archives, downloaded_files_or_dirs + for archive, downloaded_dir in zip(archives, downloaded_dirs): + archive, downloaded_dir = str(archive), str(downloaded_dir) + for downloaded_dir_file in dl_manager.iter_files(downloaded_dir): + _, downloaded_dir_file_ext = os.path.splitext(downloaded_dir_file) + if downloaded_dir_file_ext in self.EXTENSIONS: + if not self.config.drop_labels: + labels.add(os.path.basename(os.path.dirname(downloaded_dir_file))) + path_depths.add(count_path_segments(downloaded_dir_file)) + elif os.path.basename(downloaded_dir_file) in metadata_filenames: + all_metadata_files[split].add((None, downloaded_dir, downloaded_dir_file)) + else: + archive_file_name = os.path.basename(archive) + original_file_name = os.path.basename(downloaded_dir_file) + logger.debug( + f"The file '{original_file_name}' from the archive '{archive_file_name}' was ignored: it is not a {self.BASE_COLUMN_NAME}, and is not {metadata_filenames} either." + ) + + data_files = self.config.data_files + splits = [] + for split_name, files in data_files.items(): + files, metadata_files, archives = self._split_files_and_metadata_and_archives(files) + downloaded_files = dl_manager.download(files) + downloaded_metadata_files = dl_manager.download(metadata_files) + downloaded_dirs = dl_manager.download_and_extract(archives) + if do_analyze: # drop_metadata is None or False, drop_labels is None or False + logger.info(f"Searching for labels and/or metadata files in {split_name} data files...") + analyze(files, downloaded_files, split_name) + analyze(metadata_files, downloaded_metadata_files, split_name) + analyze(archives, downloaded_dirs, split_name) + + if all_metadata_files: + # add metadata if `all_metadata_files` are found and `drop_metadata` is None (default) or False + add_metadata = not self.config.drop_metadata + # if `all_metadata_files` are found, don't add labels + add_labels = False + else: + # if `all_metadata_files` are not found, don't add metadata + add_metadata = False + # if `all_metadata_files` are not found and `drop_labels` is None (default) - + # add labels if files are on the same level in directory hierarchy and there is more than one label + add_labels = ( + (len(labels) > 1 and len(path_depths) == 1) + if self.config.drop_labels is None + else not self.config.drop_labels + ) + + if add_labels: + logger.info("Adding the labels inferred from data directories to the dataset's features...") + if add_metadata: + logger.info("Adding metadata to the dataset...") + else: + add_labels, add_metadata, all_metadata_files = False, False, {} + + # files info (original_file, None, downloaded_file) + files = tuple(zip(files, [None] * len(files), downloaded_files)) + # archives info (original_archive_file, downloaded_dir, downloaded_files) + files += tuple( + (archive, downloaded_dir, dl_manager.iter_files(downloaded_dir)) + for archive, downloaded_dir in zip(archives, downloaded_dirs) + ) + splits.append( + datasets.SplitGenerator( + name=split_name, + gen_kwargs={ + "files": files, + "metadata_files": all_metadata_files.get(split_name, []), + "add_labels": add_labels, + "add_metadata": add_metadata, + }, + ) + ) + + if add_metadata: + # Verify that: + # * all metadata files have the same set of features in each split + # * the `file_name` key is one of the metadata keys and is of type string + features_per_metadata_file: list[tuple[str, datasets.Features]] = [] + + # Check that all metadata files share the same format + metadata_ext = { + os.path.splitext(original_metadata_file or downloaded_metadata_file)[-1] + for original_metadata_file, _, downloaded_metadata_file in itertools.chain.from_iterable( + all_metadata_files.values() + ) + } + if len(metadata_ext) > 1: + raise ValueError(f"Found metadata files with different extensions: {list(metadata_ext)}") + metadata_ext = metadata_ext.pop() + + for split_metadata_files in all_metadata_files.values(): + pa_metadata_table = None + for _, _, downloaded_metadata_file in split_metadata_files: + for pa_metadata_table in self._read_metadata(downloaded_metadata_file, metadata_ext=metadata_ext): + break # just fetch the first rows + if pa_metadata_table is not None: + features_per_metadata_file.append( + (downloaded_metadata_file, datasets.Features.from_arrow_schema(pa_metadata_table.schema)) + ) + break # no need to fetch all the files + for downloaded_metadata_file, metadata_features in features_per_metadata_file: + if metadata_features != features_per_metadata_file[0][1]: + raise ValueError( + f"Metadata files {downloaded_metadata_file} and {features_per_metadata_file[0][0]} have different features: {features_per_metadata_file[0]} != {metadata_features}" + ) + metadata_features = features_per_metadata_file[0][1] + feature_not_found = True + + def _set_feature(feature): + nonlocal feature_not_found + if isinstance(feature, dict): + out = type(feature)() + for key in feature: + if (key == "file_name" or key.endswith("_file_name")) and ( + feature[key] == datasets.Value("string") or feature[key] == datasets.Value("large_string") + ): + key = key[: -len("_file_name")] or self.BASE_COLUMN_NAME + out[key] = self.BASE_FEATURE() + feature_not_found = False + elif (key == "file_names" or key.endswith("_file_names")) and ( + feature[key] + in [datasets.List(datasets.Value("string")), datasets.List(datasets.Value("large_string"))] + ): + key = key[: -len("_file_names")] or (self.BASE_COLUMN_NAME + "s") + out[key] = datasets.List(self.BASE_FEATURE()) + feature_not_found = False + elif (key == "file_names" or key.endswith("_file_names")) and ( + feature[key] == [datasets.Value("string")] + or feature[key] == [datasets.Value("large_string")] + ): + key = key[: -len("_file_names")] or (self.BASE_COLUMN_NAME + "s") + out[key] = [self.BASE_FEATURE()] + feature_not_found = False + else: + out[key] = feature[key] + return out + return feature + + metadata_features = _visit(metadata_features, _set_feature) + + if feature_not_found: + raise ValueError( + "`file_name`, `*_file_name`, `file_names` or `*_file_names` must be present as dictionary key in metadata files" + ) + else: + metadata_features = None + + # Normally, we would do this in _info, but we need to know the labels and/or metadata + # before building the features + if self.config.features is None: + if add_metadata: + self.info.features = metadata_features + elif add_labels: + self.info.features = datasets.Features( + { + self.BASE_COLUMN_NAME: self.BASE_FEATURE(), + "label": datasets.ClassLabel(names=sorted(labels)), + } + ) + else: + self.info.features = datasets.Features({self.BASE_COLUMN_NAME: self.BASE_FEATURE()}) + + return splits + + def _split_files_and_metadata_and_archives(self, data_files): + files, metadata_files, archives = [], [], [] + metadata_filenames = self.config.metadata_filenames or self.METADATA_FILENAMES + for data_file in data_files: + data_file_root, data_file_ext = os.path.splitext(data_file) + _, second_data_file_ext = os.path.splitext(data_file_root) + if data_file_ext.lower() in self.EXTENSIONS or second_data_file_ext.lower() in self.EXTENSIONS: + files.append(data_file) + elif os.path.basename(data_file) in metadata_filenames: + metadata_files.append(data_file) + elif data_file_ext.lower() == ".zip": + archives.append(data_file) + return files, metadata_files, archives + + def _read_metadata(self, metadata_file: str, metadata_ext: str = "") -> Iterator[pa.Table]: + """using the same logic as the Csv, Json and Parquet dataset builders to stream the data""" + if self.config.filters is not None: + filter_expr = ( + pq.filters_to_expression(self.config.filters) + if isinstance(self.config.filters, list) + else self.config.filters + ) + else: + filter_expr = None + if metadata_ext == ".csv": + chunksize = 10_000 # 10k lines + schema = self.config.features.arrow_schema if self.config.features else None + # dtype allows reading an int column as str + dtype = ( + { + name: dtype.to_pandas_dtype() if not require_storage_cast(feature) else object + for name, dtype, feature in zip(schema.names, schema.types, self.config.features.values()) + } + if schema is not None + else None + ) + csv_file_reader = pd.read_csv(metadata_file, iterator=True, dtype=dtype, chunksize=chunksize) + for df in csv_file_reader: + pa_table = pa.Table.from_pandas(df) + if self.config.filters is not None: + pa_table = pa_table.filter(filter_expr) + if len(pa_table) > 0: + yield pa_table + elif metadata_ext == ".jsonl": + with open(metadata_file, "rb") as f: + chunksize: int = 10 << 20 # 10MB + # Use block_size equal to the chunk size divided by 32 to leverage multithreading + # Set a default minimum value of 16kB if the chunk size is really small + block_size = max(chunksize // 32, 16 << 10) + while True: + batch = f.read(chunksize) + if not batch: + break + # Finish current line + try: + batch += f.readline() + except (AttributeError, io.UnsupportedOperation): + batch += readline(f) + while True: + try: + pa_table = paj.read_json( + io.BytesIO(batch), read_options=paj.ReadOptions(block_size=block_size) + ) + break + except (pa.ArrowInvalid, pa.ArrowNotImplementedError) as e: + if ( + isinstance(e, pa.ArrowInvalid) + and "straddling" not in str(e) + or block_size > len(batch) + ): + raise + else: + # Increase the block size in case it was too small. + # The block size will be reset for the next file. + logger.debug( + f"Batch of {len(batch)} bytes couldn't be parsed with block_size={block_size}. Retrying with block_size={block_size * 2}." + ) + block_size *= 2 + if self.config.filters is not None: + pa_table = pa_table.filter(filter_expr) + if len(pa_table) > 0: + yield pa_table + else: + with open(metadata_file, "rb") as f: + parquet_fragment = ds.ParquetFileFormat().make_fragment(f) + if parquet_fragment.row_groups: + batch_size = parquet_fragment.row_groups[0].num_rows + else: + batch_size = config.DEFAULT_MAX_BATCH_SIZE + for record_batch in parquet_fragment.to_batches( + batch_size=batch_size, + filter=filter_expr, + batch_readahead=0, + fragment_readahead=0, + ): + yield pa.Table.from_batches([record_batch]) + + def _generate_shards(self, files, metadata_files, add_metadata, add_labels): + if add_metadata: + for _, _, downloaded_metadata_file in metadata_files: + yield downloaded_metadata_file + else: + for _, downloaded_dir, downloaded_file in files: + yield downloaded_dir or downloaded_file + + def _generate_examples(self, files, metadata_files, add_metadata, add_labels): + if add_metadata: + feature_paths = [] + + def find_feature_path(feature, feature_path): + nonlocal feature_paths + if feature_path and isinstance(feature, self.BASE_FEATURE): + feature_paths.append(feature_path) + + _visit_with_path(self.info.features, find_feature_path) + + for shard_idx, metadata_file_info in enumerate(metadata_files): + if len(metadata_file_info) == 2: + original_metadata_file, downloaded_metadata_file = metadata_file_info + else: + original_metadata_file, downloaded_metadata_dir, downloaded_metadata_file = metadata_file_info + metadata_ext = os.path.splitext(original_metadata_file or downloaded_metadata_file)[-1] + downloaded_metadata_dir = os.path.dirname(downloaded_metadata_file) + + def set_feature(item, feature_path: _VisitPath): + if len(feature_path) == 2 and isinstance(feature_path[0], str) and feature_path[1] == 0: + item[feature_path[0]] = item.pop("file_names", None) or item.pop( + feature_path[0] + "_file_names", None + ) + elif len(feature_path) == 1 and isinstance(feature_path[0], str): + item[feature_path[0]] = item.pop("file_name", None) or item.pop( + feature_path[0] + "_file_name", None + ) + elif len(feature_path) == 0: + if item is not None: + file_relpath = os.path.normpath(item).replace("\\", "/") + item = os.path.join(downloaded_metadata_dir, file_relpath) + return item + + for pa_metadata_table in self._read_metadata(downloaded_metadata_file, metadata_ext=metadata_ext): + for sample_idx, sample in enumerate(pa_metadata_table.to_pylist()): + for feature_path in feature_paths: + _nested_apply(sample, feature_path, set_feature) + yield Key(shard_idx, sample_idx), sample + else: + if self.config.filters is not None: + filter_expr = ( + pq.filters_to_expression(self.config.filters) + if isinstance(self.config.filters, list) + else self.config.filters + ) + for shard_idx, (original_file, _, downloaded_files) in enumerate(files): + if isinstance(downloaded_files, str): + downloaded_files = [downloaded_files] + for sample_idx, downloaded_file in enumerate(downloaded_files): + sample = {self.BASE_COLUMN_NAME: downloaded_file} + if add_labels: + sample["label"] = os.path.basename(os.path.dirname(original_file or downloaded_file)) + if self.config.filters is not None: + pa_table = pa.Table.from_pylist([sample]).filter(filter_expr) + if len(pa_table) == 0: + continue + yield Key(shard_idx, sample_idx), sample + + +def _nested_apply(item: Any, feature_path: _VisitPath, func: Callable[[Any, _VisitPath], Any]): + # see _visit_with_path() to see how feature paths are constructed + item = func(item, feature_path) + if feature_path: + key = feature_path[0] + if key == 0: + for i in range(len(item)): + item[i] = _nested_apply(item[i], feature_path[1:], func) + else: + item[key] = _nested_apply(item[key], feature_path[1:], func) + return item diff --git a/src/datasets/packaged_modules/generator/__init__.py b/src/datasets/packaged_modules/generator/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/generator/generator.py b/src/datasets/packaged_modules/generator/generator.py new file mode 100644 index 0000000..e20cada --- /dev/null +++ b/src/datasets/packaged_modules/generator/generator.py @@ -0,0 +1,38 @@ +from dataclasses import dataclass +from typing import Callable, Optional + +import datasets +from datasets.builder import Key +from datasets.utils.sharding import _number_of_shards_in_gen_kwargs, _split_gen_kwargs + + +@dataclass +class GeneratorConfig(datasets.BuilderConfig): + generator: Optional[Callable] = None + gen_kwargs: Optional[dict] = None + features: Optional[datasets.Features] = None + split: datasets.NamedSplit = datasets.Split.TRAIN + + def __post_init__(self): + super().__post_init__() + if self.generator is None: + raise ValueError("generator must be specified") + + if self.gen_kwargs is None: + self.gen_kwargs = {} + + +class Generator(datasets.GeneratorBasedBuilder): + BUILDER_CONFIG_CLASS = GeneratorConfig + + def _info(self): + return datasets.DatasetInfo(features=self.config.features) + + def _split_generators(self, dl_manager): + return [datasets.SplitGenerator(name=self.config.split, gen_kwargs=self.config.gen_kwargs)] + + def _generate_examples(self, **gen_kwargs): + num_shards = _number_of_shards_in_gen_kwargs(gen_kwargs) + for shard_idx, shard_gen_kwargs in enumerate(_split_gen_kwargs(gen_kwargs, max_num_jobs=num_shards)): + for sample_idx, sample in enumerate(self.config.generator(**shard_gen_kwargs)): + yield Key(shard_idx, sample_idx), sample diff --git a/src/datasets/packaged_modules/hdf5/__init__.py b/src/datasets/packaged_modules/hdf5/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/hdf5/hdf5.py b/src/datasets/packaged_modules/hdf5/hdf5.py new file mode 100644 index 0000000..e06b2bb --- /dev/null +++ b/src/datasets/packaged_modules/hdf5/hdf5.py @@ -0,0 +1,389 @@ +from dataclasses import dataclass, field +from typing import TYPE_CHECKING, Optional + +import numpy as np +import pyarrow as pa + +import datasets +from datasets.builder import Key +from datasets.features.features import ( + Array2D, + Array3D, + Array4D, + Array5D, + Features, + LargeList, + List, + Value, + _ArrayXD, + _arrow_to_datasets_dtype, +) +from datasets.table import cast_table_to_features + + +if TYPE_CHECKING: + import h5py + +logger = datasets.utils.logging.get_logger(__name__) + +EXTENSIONS = [".h5", ".hdf5"] + + +@dataclass +class HDF5Config(datasets.BuilderConfig): + """BuilderConfig for HDF5.""" + + batch_size: Optional[int] = None + features: Optional[datasets.Features] = None + + +class HDF5(datasets.ArrowBasedBuilder): + """ArrowBasedBuilder that converts HDF5 files to Arrow tables using the HF extension types.""" + + BUILDER_CONFIG_CLASS = HDF5Config + + def _info(self): + return datasets.DatasetInfo(features=self.config.features) + + def _split_generators(self, dl_manager): + import h5py + + if not self.config.data_files: + raise ValueError(f"At least one data file must be specified, but got data_files={self.config.data_files}") + data_files = dl_manager.download(self.config.data_files) + splits = [] + for split_name, files in data_files.items(): + # Infer features from first file + if self.info.features is None: + for first_file in files: + with open(first_file, "rb") as f: + with h5py.File(f, "r") as h5: + self.info.features = _recursive_infer_features(h5) + break + splits.append(datasets.SplitGenerator(name=split_name, gen_kwargs={"files": files})) + return splits + + def _generate_shards(self, files): + yield from files + + def _generate_tables(self, files): + import h5py + + batch_size_cfg = self.config.batch_size + for file_idx, file in enumerate(files): + try: + with open(file, "rb") as f: + with h5py.File(f, "r") as h5: + # Infer features and lengths from first file + if self.info.features is None: + self.info.features = _recursive_infer_features(h5) + num_rows = _check_dataset_lengths(h5, self.info.features) + if num_rows is None: + logger.warning(f"File {file} contains no data, skipping...") + continue + effective_batch = batch_size_cfg or self._writer_batch_size or num_rows + for batch_idx, start in enumerate(range(0, num_rows, effective_batch)): + end = min(start + effective_batch, num_rows) + pa_table = _recursive_load_arrays(h5, self.info.features, start, end) + if pa_table is None: + logger.warning(f"File {file} contains no data, skipping...") + continue + yield Key(file_idx, batch_idx), cast_table_to_features(pa_table, self.info.features) + except ValueError as e: + logger.error(f"Failed to read file '{file}' with error {type(e)}: {e}") + raise + + +# ┌───────────┐ +# │ Complex │ +# └───────────┘ + + +def _is_complex_dtype(dtype: np.dtype) -> bool: + if dtype.kind == "c": + return True + if dtype.subdtype is not None: + return _is_complex_dtype(dtype.subdtype[0]) + return False + + +def _create_complex_features(dset) -> Features: + if dset.dtype.subdtype is not None: + dtype, data_shape = dset.dtype.subdtype + else: + data_shape = dset.shape[1:] + dtype = dset.dtype + + if dtype == np.complex64: + # two float32s + value_type = Value("float32") + elif dtype == np.complex128: + # two float64s + value_type = Value("float64") + else: + logger.warning(f"Found complex dtype {dtype} that is not supported. Converting to float64...") + value_type = Value("float64") + + return Features( + { + "real": _create_sized_feature_impl(data_shape, value_type), + "imag": _create_sized_feature_impl(data_shape, value_type), + } + ) + + +def _convert_complex_to_nested(arr: np.ndarray) -> pa.StructArray: + data = { + "real": datasets.features.features.numpy_to_pyarrow_listarray(arr.real), + "imag": datasets.features.features.numpy_to_pyarrow_listarray(arr.imag), + } + return pa.StructArray.from_arrays([data["real"], data["imag"]], names=["real", "imag"]) + + +# ┌────────────┐ +# │ Compound │ +# └────────────┘ + + +def _is_compound_dtype(dtype: np.dtype) -> bool: + return dtype.kind == "V" + + +@dataclass +class _CompoundGroup: + dset: "h5py.Dataset" + data: np.ndarray = None + + def items(self): + for field_name in self.dset.dtype.names: + field_dtype = self.dset.dtype[field_name] + yield field_name, _CompoundField(self.data, field_name, field_dtype) + + +@dataclass +class _CompoundField: + data: Optional[np.ndarray] + name: str + dtype: np.dtype + shape: tuple[int, ...] = field(init=False) + + def __post_init__(self): + self.shape = (len(self.data) if self.data is not None else 0,) + self.dtype.shape + + def __getitem__(self, key): + return self.data[key][self.name] + + +def _create_compound_features(dset) -> Features: + mock_group = _CompoundGroup(dset) + return _recursive_infer_features(mock_group) + + +def _convert_compound_to_nested(arr, dset) -> pa.StructArray: + mock_group = _CompoundGroup(dset, data=arr) + features = _create_compound_features(dset) + return _recursive_load_arrays(mock_group, features, 0, len(arr)) + + +# ┌───────────────────┐ +# │ Variable-Length │ +# └───────────────────┘ + + +def _is_vlen_dtype(dtype: np.dtype) -> bool: + if dtype.metadata and "vlen" in dtype.metadata: + return True + return False + + +def _create_vlen_features(dset) -> Features: + vlen_dtype = dset.dtype.metadata["vlen"] + if vlen_dtype in (str, bytes): + return Value("string") + inner_feature = _np_to_pa_to_hf_value(vlen_dtype) + return List(inner_feature) + + +def _convert_vlen_to_array(arr: np.ndarray) -> pa.Array: + return datasets.features.features.numpy_to_pyarrow_listarray(arr) + + +# ┌───────────┐ +# │ Generic │ +# └───────────┘ + + +def _recursive_infer_features(h5_obj) -> Features: + features_dict = {} + for path, dset in h5_obj.items(): + if _is_group(dset): + features = _recursive_infer_features(dset) + if features: + features_dict[path] = features + elif _is_dataset(dset): + features = _infer_feature(dset) + if features: + features_dict[path] = features + + return Features(features_dict) + + +def _infer_feature(dset): + if _is_complex_dtype(dset.dtype): + return _create_complex_features(dset) + elif _is_compound_dtype(dset.dtype) or dset.dtype.kind == "V": + return _create_compound_features(dset) + elif _is_vlen_dtype(dset.dtype): + return _create_vlen_features(dset) + return _create_sized_feature(dset) + + +def _load_array(dset, path: str, start: int, end: int) -> pa.Array: + arr = dset[start:end] + + if _is_vlen_dtype(dset.dtype): + return _convert_vlen_to_array(arr) + elif _is_complex_dtype(dset.dtype): + return _convert_complex_to_nested(arr) + elif _is_compound_dtype(dset.dtype): + return _convert_compound_to_nested(arr, dset) + elif dset.dtype.kind == "O": + raise ValueError( + f"Object dtype dataset '{path}' is not supported. " + f"For variable-length data, please use h5py.vlen_dtype() " + f"when creating the HDF5 file. " + f"See: https://docs.h5py.org/en/stable/special.html#variable-length-strings" + ) + else: + # If any non-batch dimension is zero, emit an unsized pa.list_ + # to avoid creating FixedSizeListArray with list_size=0. + if any(dim == 0 for dim in dset.shape[1:]): + inner_type = pa.from_numpy_dtype(dset.dtype) + return pa.array([[] for _ in arr], type=pa.list_(inner_type)) + else: + return datasets.features.features.numpy_to_pyarrow_listarray(arr) + + +def _recursive_load_arrays(h5_obj, features: Features, start: int, end: int): + batch_dict = {} + for path, dset in h5_obj.items(): + if path not in features: + continue + if _is_group(dset): + arr = _recursive_load_arrays(dset, features[path], start, end) + elif _is_dataset(dset): + arr = _load_array(dset, path, start, end) + else: + raise ValueError(f"Unexpected type {type(dset)}") + + if arr is not None: + batch_dict[path] = arr + + if _is_file(h5_obj): + return pa.Table.from_pydict(batch_dict) + + if batch_dict: + should_chunk, keys, values = False, [], [] + for k, v in batch_dict.items(): + if isinstance(v, pa.ChunkedArray): + should_chunk = True + v = v.combine_chunks() + keys.append(k) + values.append(v) + + sarr = pa.StructArray.from_arrays(values, names=keys) + return pa.chunked_array(sarr) if should_chunk else sarr + + +# ┌─────────────┐ +# │ Utilities │ +# └─────────────┘ + + +def _create_sized_feature(dset): + dset_shape = dset.shape[1:] + value_feature = _np_to_pa_to_hf_value(dset.dtype) + return _create_sized_feature_impl(dset_shape, value_feature) + + +def _create_sized_feature_impl(dset_shape, value_feature): + dtype_str = value_feature.dtype + if any(dim == 0 for dim in dset_shape): + logger.warning( + f"HDF5 to Arrow: Found a dataset with shape {dset_shape} and dtype {dtype_str} that has a dimension with size 0. Shape information will be lost in the conversion to List({value_feature})." + ) + return List(value_feature) + + rank = len(dset_shape) + if rank == 0: + return value_feature + elif rank == 1: + return List(value_feature, length=dset_shape[0]) + elif rank <= 5: + return _sized_arrayxd(rank)(shape=dset_shape, dtype=dtype_str) + else: + raise TypeError(f"Array{rank}D not supported. Maximum 5 dimensions allowed.") + + +def _sized_arrayxd(rank: int): + return {2: Array2D, 3: Array3D, 4: Array4D, 5: Array5D}[rank] + + +def _np_to_pa_to_hf_value(numpy_dtype: np.dtype) -> Value: + return Value(dtype=_arrow_to_datasets_dtype(pa.from_numpy_dtype(numpy_dtype))) + + +def _first_dataset(h5_obj, features: Features, prefix=""): + for path, dset in h5_obj.items(): + if path not in features: + continue + if _is_group(dset): + found = _first_dataset(dset, features[path], prefix=f"{prefix}{path}/") + if found is not None: + return found + elif _is_dataset(dset): + return f"{prefix}{path}" + + +def _check_dataset_lengths(h5_obj, features: Features) -> int: + first_path = _first_dataset(h5_obj, features) + if first_path is None: + return None + + num_rows = h5_obj[first_path].shape[0] + for path, dset in h5_obj.items(): + if path not in features: + continue + if _is_dataset(dset): + if dset.shape[0] != num_rows: + raise ValueError(f"Dataset '{path}' has length {dset.shape[0]} but expected {num_rows}") + return num_rows + + +def _is_group(h5_obj) -> bool: + import h5py + + return isinstance(h5_obj, h5py.Group) or isinstance(h5_obj, _CompoundGroup) + + +def _is_dataset(h5_obj) -> bool: + import h5py + + return isinstance(h5_obj, h5py.Dataset) or isinstance(h5_obj, _CompoundField) + + +def _is_file(h5_obj) -> bool: + import h5py + + return isinstance(h5_obj, h5py.File) + + +def _has_zero_dimensions(feature): + if isinstance(feature, _ArrayXD): + return any(dim == 0 for dim in feature.shape) + elif isinstance(feature, List): + return feature.length == 0 or _has_zero_dimensions(feature.feature) + elif isinstance(feature, LargeList): + return _has_zero_dimensions(feature.feature) + else: + return False diff --git a/src/datasets/packaged_modules/iceberg/__init__.py b/src/datasets/packaged_modules/iceberg/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/iceberg/iceberg.py b/src/datasets/packaged_modules/iceberg/iceberg.py new file mode 100644 index 0000000..447ed10 --- /dev/null +++ b/src/datasets/packaged_modules/iceberg/iceberg.py @@ -0,0 +1,173 @@ +from dataclasses import dataclass +from typing import TYPE_CHECKING, Dict, List, Optional, Union + +import pyarrow as pa + +import datasets +from datasets.builder import Key +from datasets.features import Features +from datasets.table import table_cast + + +if TYPE_CHECKING: + from pyiceberg.catalog import Catalog + from pyiceberg.expressions import BooleanExpression + from pyiceberg.table import FileScanTask + +logger = datasets.utils.logging.get_logger(__name__) + + +@dataclass +class IcebergConfig(datasets.BuilderConfig): + """BuilderConfig for Apache Iceberg format. + + Args: + catalog (`pyiceberg.catalog.Catalog`): + A pre-configured pyiceberg Catalog object. + table (`str` or `Dict[str, str]`): + Iceberg table identifier, e.g. ``"db.my_table"``. + Pass a dict to map split names to table identifiers, + e.g. ``{"train": "db.train", "test": "db.test"}``. + features (`Features`, *optional*): + Cast the data to these features. + columns (`List[str]`, *optional*): + List of columns to load; others are ignored. + filters (`str` or `BooleanExpression`, *optional*): + Row filter with predicate pushdown. Accepts a SQL-style string + (``"col > 1 AND col2 == 'foo'"``), or a pyiceberg + ``BooleanExpression`` object. Parsed by pyiceberg internally. + batch_size (`int`, defaults to ``131072``): + Number of rows per RecordBatch when reading. + snapshot_id (`int`, *optional*): + Load a specific snapshot for time-travel queries. + """ + + catalog: Optional["Catalog"] = None + table: Optional[Union[str, Dict[str, str]]] = None + features: Optional[datasets.Features] = None + columns: Optional[List[str]] = None + filters: Optional[Union[str, "BooleanExpression"]] = None + batch_size: int = 131072 + snapshot_id: Optional[int] = None + + def __post_init__(self): + super().__post_init__() + if self.catalog is None: + raise ValueError("`catalog` must be a pyiceberg Catalog object, but got None.") + if self.table is None: + raise ValueError("`table` must be specified, e.g. table='db.my_table'") + # Normalize table to Dict[split_name, table_identifier] + if isinstance(self.table, str): + self.table = {"train": self.table} + # Generate a stable config name for caching + if self.name == "default": + catalog_id = f"{self.catalog.__class__.__name__}_{self.catalog.name}" + table_id = "_".join(sorted(self.table.values())) + self.name = f"{catalog_id}_{table_id}" + + def create_config_id( + self, + config_kwargs: dict, + custom_features: Optional[Features] = None, + ) -> str: + # The catalog object is not picklable (contains SQLAlchemy engines, etc.), + # so we replace it with a hashable string representation before the + # parent class hashes config_kwargs via dill. + config_kwargs = config_kwargs.copy() + catalog = config_kwargs.pop("catalog", None) + if catalog is not None: + config_kwargs["_catalog_id"] = f"{catalog.__class__.__name__}_{catalog.name}" + # filters may contain pyiceberg Expression objects that are not picklable + filters = config_kwargs.pop("filters", None) + if filters is not None: + config_kwargs["_filters_repr"] = repr(filters) + return super().create_config_id(config_kwargs, custom_features=custom_features) + + +class Iceberg(datasets.ArrowBasedBuilder, datasets.builder._CountableBuilderMixin): + BUILDER_CONFIG_CLASS = IcebergConfig + + def _info(self): + return datasets.DatasetInfo(features=self.config.features) + + def _split_generators(self, dl_manager): + splits = [] + for split_name, table_id in self.config.table.items(): + iceberg_table = self.config.catalog.load_table(table_id) + + scan_kwargs = {} + if self.config.filters is not None: + scan_kwargs["row_filter"] = self.config.filters + if self.config.columns: + scan_kwargs["selected_fields"] = tuple(self.config.columns) + if self.config.snapshot_id is not None: + scan_kwargs["snapshot_id"] = self.config.snapshot_id + + scan = iceberg_table.scan(**scan_kwargs) + + # Infer features from Arrow schema if not user-provided + if self.info.features is None: + arrow_schema = scan.projection().as_arrow() + self.info.features = datasets.Features.from_arrow_schema(arrow_schema) + + # Plan files for parallel processing: passing a list in gen_kwargs + # enables _split_gen_kwargs to distribute tasks across num_proc workers. + tasks = list(scan.plan_files()) + + # Extract picklable scan context for multiprocessing compatibility. + # The scan object itself is not picklable (holds catalog connections), + # but these components are individually serializable. + scan_context = ( + scan.table_metadata, + scan.io, + scan.projection(), + scan.row_filter, + scan.case_sensitive, + scan.limit, + ) + + splits.append( + datasets.SplitGenerator( + name=split_name, + gen_kwargs={"tasks": tasks, "scan_context": scan_context}, + ) + ) + + # Drop the catalog reference so the builder becomes picklable for num_proc > 1. + # All data needed for reading has been extracted into scan_context above. + self.config.catalog = None + self.config_kwargs.pop("catalog", None) + + return splits + + def _cast_table(self, pa_table: pa.Table) -> pa.Table: + if self.info.features is not None: + # More expensive cast to support nested features with keys in a different order + # allows str <-> int/float or str to Audio for example + pa_table = table_cast(pa_table, self.info.features.arrow_schema) + return pa_table + + def _generate_shards(self, tasks: List["FileScanTask"], scan_context): + for task in tasks: + yield task.file.file_path + + def _generate_num_examples(self, tasks: List["FileScanTask"], scan_context): + for task in tasks: + yield task.file.record_count + + def _generate_tables(self, tasks: List["FileScanTask"], scan_context): + from pyiceberg.io.pyarrow import ArrowScan + + table_metadata, io, projected_schema, row_filter, case_sensitive, limit = scan_context + arrow_scan = ArrowScan( + table_metadata, + io, + projected_schema, + row_filter, + case_sensitive=case_sensitive, + limit=limit, + ) + for task_idx, task in enumerate(tasks): + for batch_idx, batch in enumerate(arrow_scan.to_record_batches([task])): + pa_table = pa.Table.from_batches([batch]) + yield Key(task_idx, batch_idx), self._cast_table(pa_table) diff --git a/src/datasets/packaged_modules/imagefolder/__init__.py b/src/datasets/packaged_modules/imagefolder/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/imagefolder/imagefolder.py b/src/datasets/packaged_modules/imagefolder/imagefolder.py new file mode 100644 index 0000000..aba9452 --- /dev/null +++ b/src/datasets/packaged_modules/imagefolder/imagefolder.py @@ -0,0 +1,103 @@ +import datasets + +from ..folder_based_builder import folder_based_builder + + +logger = datasets.utils.logging.get_logger(__name__) + + +class ImageFolderConfig(folder_based_builder.FolderBasedBuilderConfig): + """BuilderConfig for ImageFolder.""" + + drop_labels: bool = None + drop_metadata: bool = None + + def __post_init__(self): + super().__post_init__() + + +class ImageFolder(folder_based_builder.FolderBasedBuilder): + BASE_FEATURE = datasets.Image + BASE_COLUMN_NAME = "image" + BUILDER_CONFIG_CLASS = ImageFolderConfig + EXTENSIONS: list[str] # definition at the bottom of the script + + +# Obtained with: +# ``` +# import PIL.Image +# IMAGE_EXTENSIONS = [] +# PIL.Image.init() +# for ext, format in PIL.Image.EXTENSION.items(): +# if format in PIL.Image.OPEN: +# IMAGE_EXTENSIONS.append(ext[1:]) +# ``` +# We intentionally do not run this code on launch because: +# (1) Pillow is an optional dependency, so importing Pillow in global namespace is not allowed +# (2) To ensure the list of supported extensions is deterministic +IMAGE_EXTENSIONS = [ + ".blp", + ".bmp", + ".dib", + ".bufr", + ".cur", + ".pcx", + ".dcx", + ".dds", + ".ps", + ".eps", + ".fit", + ".fits", + ".fli", + ".flc", + ".ftc", + ".ftu", + ".gbr", + ".gif", + ".grib", + # ".h5", # may contain zero or several images + # ".hdf", # may contain zero or several images + ".png", + ".apng", + ".jp2", + ".j2k", + ".jpc", + ".jpf", + ".jpx", + ".j2c", + ".icns", + ".ico", + ".im", + ".iim", + ".tif", + ".tiff", + ".jfif", + ".jpe", + ".jpg", + ".jpeg", + ".mpg", + ".mpeg", + ".msp", + ".pcd", + ".pxr", + ".pbm", + ".pgm", + ".ppm", + ".pnm", + ".psd", + ".bw", + ".rgb", + ".rgba", + ".sgi", + ".ras", + ".tga", + ".icb", + ".vda", + ".vst", + ".webp", + ".wmf", + ".emf", + ".xbm", + ".xpm", +] +ImageFolder.EXTENSIONS = IMAGE_EXTENSIONS diff --git a/src/datasets/packaged_modules/json/__init__.py b/src/datasets/packaged_modules/json/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/json/json.py b/src/datasets/packaged_modules/json/json.py new file mode 100644 index 0000000..9845dd6 --- /dev/null +++ b/src/datasets/packaged_modules/json/json.py @@ -0,0 +1,536 @@ +import codecs +import io +import os +from dataclasses import dataclass +from datetime import datetime, timezone +from pathlib import Path +from typing import Literal, Optional + +import pandas as pd +import pyarrow as pa +import pyarrow.json as paj + +import datasets +import datasets.config +from datasets import List, Value +from datasets.builder import Key +from datasets.table import table_cast +from datasets.utils.file_utils import readline +from datasets.utils.json import ( + find_mixed_struct_types_field_paths, + get_json_field_path_from_pyarrow_json_error, + get_json_field_paths_from_feature, + insert_json_field_path, + json_encode_field, + json_encode_fields_in_json_lines, + set_json_types_in_feature, + ujson_dumps, + ujson_loads, +) + + +logger = datasets.utils.logging.get_logger(__name__) + + +def pandas_read_json(path_or_buf, **kwargs): + if datasets.config.PANDAS_VERSION.major >= 2: + kwargs["dtype_backend"] = "pyarrow" + return pd.read_json(path_or_buf, **kwargs) + + +class FullReadDisallowed(Exception): + pass + + +@dataclass +class JsonConfig(datasets.BuilderConfig): + """BuilderConfig for JSON.""" + + features: Optional[datasets.Features] = None + encoding: str = "utf-8" + encoding_errors: Optional[str] = None + field: Optional[str] = None + use_threads: bool = True # deprecated + block_size: Optional[int] = None # deprecated + chunksize: int = 10 << 20 # 10MB + newlines_in_values: Optional[bool] = None + on_mixed_types: Optional[Literal["use_json"]] = "use_json" + parse_agent_traces: bool = True + + def __post_init__(self): + super().__post_init__() + + +class Json(datasets.ArrowBasedBuilder): + BUILDER_CONFIG_CLASS = JsonConfig + + def _info(self): + if self.config.block_size is not None: + logger.warning("The JSON loader parameter `block_size` is deprecated. Please use `chunksize` instead") + self.config.chunksize = self.config.block_size + if self.config.use_threads is not True: + logger.warning( + "The JSON loader parameter `use_threads` is deprecated and doesn't have any effect anymore." + ) + if self.config.newlines_in_values is not None: + raise ValueError("The JSON loader parameter `newlines_in_values` is no longer supported") + return datasets.DatasetInfo(features=self.config.features) + + def _split_generators(self, dl_manager): + """We handle string, list and dicts in datafiles""" + if not self.config.data_files: + raise ValueError(f"At least one data file must be specified, but got data_files={self.config.data_files}") + dl_manager.download_config.extract_on_the_fly = True + base_data_files = dl_manager.download(self.config.data_files) + extracted_data_files = dl_manager.extract(base_data_files) + splits = [] + for split_name, extracted_files in extracted_data_files.items(): + files_iterables = [dl_manager.iter_files(extracted_file) for extracted_file in extracted_files] + splits.append( + datasets.SplitGenerator( + name=split_name, + gen_kwargs={ + "files_iterables": files_iterables, + "base_files": base_data_files[split_name], + "original_files": self.config.data_files[split_name], + }, + ) + ) + if self.info.features is None: + try: + pa_table = next(iter(self._generate_tables(**splits[0].gen_kwargs, allow_full_read=False)))[1] + self.info.features = datasets.Features.from_arrow_schema(pa_table.schema) + if self.config.parse_agent_traces and has_agent_traces_markers(self.info.features): + self.info.features = AGENT_TRACES_FEATURES + except FullReadDisallowed: + pass + return splits + + def _cast_table(self, pa_table: pa.Table, json_field_paths=()) -> pa.Table: + if self.info.features is not None: + # adding missing columns + for column_name in set(self.info.features) - set(pa_table.column_names): + type = self.info.features.arrow_schema.field(column_name).type + pa_table = pa_table.append_column(column_name, pa.array([None] * len(pa_table), type=type)) + # convert to string when needed + for i, column_name in enumerate(pa_table.column_names): + if pa.types.is_struct(pa_table[column_name].type) and self.info.features.get( + column_name, None + ) == Value("string"): + jsonl = ( + pa_table[column_name] + .to_pandas(types_mapper=pd.ArrowDtype) + .to_json(orient="records", lines=True) + ) + string_array = pa.array( + (None if x.strip() == "null" else x.strip() for x in jsonl.split("\n") if x.strip()), + type=pa.string(), + ) + pa_table = pa_table.set_column(i, column_name, string_array) + # more expensive cast to support nested structures with keys in a different order + # allows str <-> int/float or str to Audio for example + pa_table = table_cast(pa_table, self.info.features.arrow_schema) + elif json_field_paths: + features = datasets.Features.from_arrow_schema(pa_table.schema) + features = set_json_types_in_feature(features, json_field_paths) + pa_table = table_cast(pa_table, features.arrow_schema) + return pa_table + + def _generate_shards(self, base_files, files_iterables, original_files): + yield from base_files + + def _generate_tables(self, base_files, files_iterables, original_files, allow_full_read=True): + json_field_paths = [] + is_agent_traces = False + + if self.info.features is not None: + if self.info.features == AGENT_TRACES_FEATURES: + is_agent_traces = True + if datasets.config.TEICH_AVAILABLE: + from teich import convert_traces_to_training_data + else: + raise ImportError("To support decoding agent traces, please install 'teich'.") + json_field_paths = get_json_field_paths_from_feature(self.info.features) + + for shard_idx, files_iterable in enumerate(files_iterables): + for file in files_iterable: + # If the file is one json object and if we need to look at the items in one specific field + if self.config.field is not None: + if not allow_full_read: + raise FullReadDisallowed() + with open(file, encoding=self.config.encoding, errors=self.config.encoding_errors) as f: + dataset = ujson_loads(f.read()) + # We keep only the field we are interested in + dataset = dataset[self.config.field] + df = pandas_read_json(io.StringIO(ujson_dumps(dataset))) + if df.columns.tolist() == [0]: + df.columns = list(self.config.features) if self.config.features else ["text"] + pa_table = pa.Table.from_pandas(df, preserve_index=False) + yield Key(shard_idx, 0), self._cast_table(pa_table) + + # If the files are agent traces (one row = one file except for hermes which can have multiple sessions per file) + elif is_agent_traces: + trace_file = Path(file) + trace = trace_file.read_text(encoding="utf-8") + lines = trace.splitlines() + file_path = original_files[shard_idx] + if self.base_path is not None and file_path.startswith(self.base_path): + file_path = os.path.relpath(file_path, self.base_path) + training_examples = convert_traces_to_training_data(trace_file) + examples = [] + for i, training_example in enumerate(training_examples): + if training_example["metadata"]["trace_type"] == "hermes": + timestamp = ujson_loads(lines[i])["started_at"] + milliseconds = timestamp if timestamp <= 10_000_000_000 else timestamp * 1_000 + sent_at = ( + datetime.fromtimestamp(milliseconds, tz=timezone.utc) + .isoformat(timespec="milliseconds") + .replace("+00:00", "Z") + ) + bonus_fields = { + "harness": training_example["metadata"]["trace_type"], + "session_id": training_example["metadata"]["session_id"], + "sent_at": sent_at, + "num_user_messages": training_example["metadata"]["turn_count"], + "num_tool_calls": training_example["metadata"]["tool_call_count"], + "trace": lines[i], + } + else: + harness, session_id, prompt, sent_at, num_user_messages, num_tool_calls = ( + parse_traces_info(lines) + ) + bonus_fields = { + "harness": harness, + "session_id": session_id, + "prompt": prompt, + "sent_at": sent_at, + "num_user_messages": num_user_messages, + "num_tool_calls": num_tool_calls, + "trace": trace, + } + example = { + **dict.fromkeys(AGENT_TRACES_FEATURES), + **training_example, + **bonus_fields, + "file_path": file_path, + } + for json_field_path in json_field_paths: + example = json_encode_field(example, json_field_path) + examples.append(example) + pa_table = pa.Table.from_pylist(examples) + yield Key(shard_idx, 0), self._cast_table(pa_table) + + # If the file has one json object per line + else: + with open(file, "rb") as f: + batch_idx = 0 + # Use block_size equal to the chunk size divided by 32 to leverage multithreading + # Set a default minimum value of 16kB if the chunk size is really small + block_size = max(self.config.chunksize // 32, 16 << 10) + encoding_errors = ( + self.config.encoding_errors if self.config.encoding_errors is not None else "strict" + ) + while True: + batch = f.read(self.config.chunksize) + if not batch: + break + # A leading UTF-8 BOM makes the ujson pre-scan below raise + # ValueError, silently skipping mixed-struct detection, while + # PyArrow tolerates the BOM -- so the inferred schema differed + # depending on whether the file started with a BOM. Strip it so + # both see the same bytes (a BOM only appears at the start of the file). + if shard_idx == 0 and batch_idx == 0 and batch.startswith(codecs.BOM_UTF8): + batch = batch[len(codecs.BOM_UTF8) :] + if batch.startswith(b"["): + if not allow_full_read: + raise FullReadDisallowed() + else: + # convert to JSON Lines + full_data = batch + f.read() + if b"{" in batch[:100].split(b'"', 1)[0]: # list of objects + batch = "\n".join(ujson_dumps(x) for x in ujson_loads(full_data)).encode() + else: # list of strings + batch = "\n".join( + ujson_dumps({"text": x}) for x in ujson_loads(full_data) + ).encode() + # Finish current line + try: + batch += f.readline() + except (AttributeError, io.UnsupportedOperation): + batch += readline(f) + # PyArrow only accepts utf-8 encoded bytes + if self.config.encoding != "utf-8": + batch = batch.decode(self.config.encoding, errors=encoding_errors).encode("utf-8") + # On first batch we check for lists of objects with arbitrary fields + if ( + shard_idx == 0 + and batch_idx == 0 + and self.info.features is None + and self.config.on_mixed_types == "use_json" + ): + try: + examples = [ujson_loads(line) for line in batch.splitlines()] + except ValueError: + # the file is likely not JSON Lines and may contain one single multi-line JSON object + pass + else: + json_field_paths += find_mixed_struct_types_field_paths(examples) + # Re-encode JSON fields + original_batch = batch + if json_field_paths: + examples = [ujson_loads(line) for line in batch.splitlines()] + for json_field_path in json_field_paths: + examples = [json_encode_field(example, json_field_path) for example in examples] + batch = "\n".join(ujson_dumps(example) for example in examples).encode() + # Disable parallelism if block size is ~ len(batch) to avoid segfault + block_size = len(batch) if len(batch) // 8 > block_size else block_size + try: + while True: + try: + pa_table = paj.read_json( + io.BytesIO(batch), read_options=paj.ReadOptions(block_size=block_size) + ) + break + except (pa.ArrowInvalid, pa.ArrowNotImplementedError) as e: + if batch.startswith(b"["): # paj.read_json only supports json lines + raise + elif self.config.on_mixed_types == "use_json" and ( + isinstance(e, pa.ArrowInvalid) + and "JSON parse error: Column(" in str(e) + and ") changed from" in str(e) + ): + json_field_path = get_json_field_path_from_pyarrow_json_error(str(e)) + insert_json_field_path(json_field_paths, json_field_path) + batch = json_encode_fields_in_json_lines(original_batch, json_field_paths) + elif ( + "straddling" in str(e) or "JSON conversion to" in str(e) + ) and block_size < len(batch): + # Increase the block size in case it was too small. + # The block size will be reset for the next file. + # this is needed in case of "stradding" or for some JSON conversions (see https://github.com/huggingface/datasets/issues/2799) + logger.debug( + f"Batch of {len(batch)} bytes couldn't be parsed with block_size={block_size}. Retrying with block_size={block_size * 2}." + ) + block_size *= 2 + else: + raise + except pa.ArrowInvalid as e: + if not allow_full_read: + raise FullReadDisallowed() + try: + with open( + file, encoding=self.config.encoding, errors=self.config.encoding_errors + ) as f: + df = pandas_read_json(f) + except ValueError: + logger.error(f"Failed to load JSON from file '{file}' with error {type(e)}: {e}") + raise e + if df.columns.tolist() == [0]: + df.columns = list(self.config.features) if self.config.features else ["text"] + try: + pa_table = pa.Table.from_pandas(df, preserve_index=False) + except pa.ArrowInvalid as e: + logger.error( + f"Failed to convert pandas DataFrame to Arrow Table from file '{file}' with error {type(e)}: {e}" + ) + raise ValueError( + f"Failed to convert pandas DataFrame to Arrow Table from file {file}." + ) from None + yield Key(shard_idx, 0), self._cast_table(pa_table) + break + yield ( + Key(shard_idx, batch_idx), + self._cast_table(pa_table, json_field_paths=json_field_paths), + ) + batch_idx += 1 + + +AGENT_TRACES_TYPES_VALUES = { + "claude_code": ["user", "assistant", "system"], + "pi": ["session", "message"], + "codex": ["session_meta", "turn_context", "response_item", "event_msg"], + # droid message events share pi's "message" type, but droid traces always start with a session_start event + "droid": ["session_start"], +} +AGENT_TRACES_TYPE_TO_HARNESS = {} +for _harness, _trace_types in AGENT_TRACES_TYPES_VALUES.items(): + for _trace_type in _trace_types: + AGENT_TRACES_TYPE_TO_HARNESS[_trace_type] = _harness + + +AGENT_TRACES_FEATURES_MARKERS = { + "claude_code_or_pi_or_openclaw": datasets.Features( + { + "type": lambda f: f == Value("string"), + "message": lambda f: f == datasets.Json(), + } + ), + "codex": datasets.Features( + { + "type": lambda f: f == Value("string"), + "payload": lambda f: f == datasets.Json(), + } + ), + "hermes": datasets.Features( + { + "id": lambda f: f == Value("string"), + "source": lambda f: f == datasets.Value("string"), + "model": lambda f: f == datasets.Value("string"), + "system_prompt": lambda f: f == datasets.Value("string"), + "messages": lambda f: isinstance(f, (datasets.List, datasets.Json)), + } + ), + "droid": datasets.Features( + { + "type": lambda f: f == Value("string"), + "id": lambda f: f == Value("string"), + "version": lambda f: f == Value("int64"), + "cwd": lambda f: f == Value("string"), + } + ), +} + +AGENT_TRACES_FEATURES = datasets.Features( + { + # basic features + "harness": Value("string"), + "session_id": Value("string"), + # teich features + "prompt": Value("string"), + "messages": List(datasets.Json()), + "tools": List(datasets.Json()), + "metadata": datasets.Json(), + # bonus features + "sent_at": Value("string"), + "num_user_messages": Value("int64"), + "num_tool_calls": Value("int64"), + "trace": datasets.Json(), + "file_path": Value("string"), + } +) + + +def has_agent_traces_markers(features: datasets.Features) -> bool: + for agent_traces_features_marker in AGENT_TRACES_FEATURES_MARKERS.values(): + if all(feature_marker(features.get(key)) for key, feature_marker in agent_traces_features_marker.items()): + return True + return False + + +def parse_traces_info( + trace_events: list[str], +) -> tuple[Optional[str], Optional[str], Optional[str], Optional[str], int, int]: + harness, session_id, prompt, sent_at = None, None, None, None + # prompt/sent_at describe the first user message; the counters summarize the whole trace file. + # Codex response_item user messages can include context files (for example AGENTS.md), so only event_msg + # user_message records are treated as Codex user messages. + num_user_messages = 0 + num_tool_calls = 0 + for event in trace_events: + decoded_event = ujson_loads(event) + if harness is None: + if "type" in decoded_event and isinstance(decoded_event["type"], str): + harness = AGENT_TRACES_TYPE_TO_HARNESS.get(decoded_event["type"]) + if session_id is None: + session_id = get_session_id(decoded_event) + if ( + session_id is not None + and decoded_event.get("type") == "session" + and isinstance(decoded_event.get("cwd"), str) + and "/.openclaw/" in decoded_event["cwd"] + ): + harness = "openclaw" + user_prompt = get_user_prompt(decoded_event) + if user_prompt is not None: + num_user_messages += 1 + if prompt is None: + prompt = user_prompt + sent_at = get_trace_event_timestamp(decoded_event) + num_tool_calls += get_tool_call_count(decoded_event) + return harness, session_id, prompt, sent_at, num_user_messages, num_tool_calls + + +def get_session_id(trace: dict) -> Optional[str]: + # claude + if isinstance(trace.get("sessionId"), str): + return trace["sessionId"] + # claude (not sure but this format does exist online) + if isinstance(trace.get("session_id"), str): + return trace["session_id"] + # codex + if isinstance(trace.get("payload"), dict) and isinstance(trace["payload"].get("id"), str): + return trace["payload"]["id"] + # pi / openclaw on "session" (openclaw embeds pi-agent; distinguish via cwd), droid on "session_start" + if trace.get("type") in ("session", "session_start") and isinstance(trace.get("id"), str): + return trace["id"] + return None + + +def get_user_prompt(trace_event: dict) -> Optional[str]: + if trace_event.get("type") == "user" and isinstance(trace_event.get("message"), dict): + message = trace_event["message"] + if message.get("role") == "user": + return get_content_text(message.get("content")) + + if trace_event.get("type") == "message": + if isinstance(trace_event.get("message"), dict): + message = trace_event["message"] + # droid marks injected context as llm_only and local-only notes as user_only, neither is a real user prompt + if message.get("role") == "user" and message.get("visibility") not in ("llm_only", "user_only"): + return get_content_text(message.get("content")) + if trace_event.get("role") == "user": + return get_content_text(trace_event.get("content")) + + if trace_event.get("type") == "event_msg" and isinstance(trace_event.get("payload"), dict): + payload = trace_event["payload"] + if payload.get("type") == "user_message": + return get_content_text(payload.get("message")) + + return None + + +def get_tool_call_count(trace_event: dict) -> int: + trace_type = trace_event.get("type") + if trace_type == "response_item": + payload = trace_event.get("payload") + if isinstance(payload, dict) and payload.get("type") == "function_call": + return 1 + return 0 + + if trace_type not in {"assistant", "message"} or not isinstance(trace_event.get("message"), dict): + return 0 + message = trace_event["message"] + if message.get("role") != "assistant": + return 0 + content = message.get("content") + if not isinstance(content, list): + return 0 + return sum( + 1 + for content_part in content + if isinstance(content_part, dict) and content_part.get("type") in {"tool_use", "toolCall"} + ) + + +def get_trace_event_timestamp(trace_event: dict) -> Optional[str]: + timestamp = trace_event.get("timestamp") + if isinstance(timestamp, str): + return timestamp + return None + + +def get_content_text(content) -> Optional[str]: + if isinstance(content, str): + return content + if isinstance(content, list): + content_parts = [] + for content_part in content: + if isinstance(content_part, str): + content_parts.append(content_part) + elif isinstance(content_part, dict): + text = content_part.get("text") + if isinstance(text, str): + content_parts.append(text) + if content_parts: + return "\n".join(content_parts) + return None diff --git a/src/datasets/packaged_modules/lance/__init__.py b/src/datasets/packaged_modules/lance/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/lance/lance.py b/src/datasets/packaged_modules/lance/lance.py new file mode 100644 index 0000000..e7310e0 --- /dev/null +++ b/src/datasets/packaged_modules/lance/lance.py @@ -0,0 +1,240 @@ +import re +from dataclasses import dataclass +from pathlib import Path +from typing import TYPE_CHECKING, Dict, List, Optional + +import pyarrow as pa +from huggingface_hub import HfApi, get_token + +import datasets +from datasets import Audio, Image, Video +from datasets.builder import Key +from datasets.table import table_cast +from datasets.utils.file_utils import is_local_path + + +if TYPE_CHECKING: + import lance + import lance.file + +logger = datasets.utils.logging.get_logger(__name__) + +MAGIC_BYTES_EXTENSION_AND_FEATURE_TYPES = [ + ("1A 45 DF A3", ".mkv", Video()), + ("66 74 79 70 69 73 6F 6D", ".mp4", Video()), + ("66 74 79 70 4D 53 4E 56", ".mp4", Video()), + ("52 49 46 46", ".avi", Video()), + ("00 00 01 BA", ".mpeg", Video()), + ("00 00 01 BA", ".mpeg", Video()), + ("00 00 01 B3", ".mov", Video()), + ("89 50 4E 47", ".png", Image()), + ("FF D8", ".jpg", Image()), + ("49 49", ".tif", Image()), + ("47 49 46 38", ".gif", Image()), + ("52 49 46 46", ".wav", Audio()), + ("49 44 33", ".mp3", Audio()), + ("66 4C 61 43", ".flac", Audio()), +] + + +@dataclass +class LanceConfig(datasets.BuilderConfig): + """ + BuilderConfig for Lance format. + + Args: + features: (`Features`, *optional*): + Cast the data to `features`. + columns: (`List[str]`, *optional*): + List of columns to load, the other ones are ignored. + batch_size: (`int`, *optional*): + Size of the RecordBatches to iterate on. Default to 256. + token: (`str`, *optional*): + Optional HF token to use to download datasets. + """ + + features: Optional[datasets.Features] = None + columns: Optional[List[str]] = None + batch_size: Optional[int] = 256 + token: Optional[str] = None + + +def resolve_dataset_uris(files: List[str]) -> Dict[str, List[str]]: + dataset_uris = set() + for file_path in files: + path = Path(file_path) + if path.parent.name in {"_transactions", "_indices", "_versions"}: + dataset_root = path.parent.parent + dataset_uris.add(str(dataset_root)) + return list(dataset_uris) + + +def _fix_hf_uri(uri: str) -> str: + # replace the revision tag from hf uri + if "@" in uri: + matched = re.match(r"(hf://.+?)(@[0-9a-f]+)(/.*)", uri) + if matched: + uri = matched.group(1) + matched.group(3) + return uri + + +def _fix_local_version_file(uri: str) -> str: + # replace symlinks with real files for _version + if "/_versions/" in uri and is_local_path(uri): + path = Path(uri) + if path.is_symlink(): + data = path.read_bytes() + path.unlink() + path.write_bytes(data) + return uri + + +class Lance(datasets.ArrowBasedBuilder, datasets.builder._CountableBuilderMixin): + BUILDER_CONFIG_CLASS = LanceConfig + METADATA_EXTENSIONS = [".idx", ".txn", ".manifest"] + METADATA_FILE_NAMES = ["latest_version_hint.json"] + + def _info(self): + return datasets.DatasetInfo(features=self.config.features) + + def _split_generators(self, dl_manager): + import lance + import lance.file + + if not self.config.data_files: + raise ValueError(f"At least one data file must be specified, but got data_files={self.config.data_files}") + if self.repo_id: + api = HfApi(**dl_manager.download_config.storage_options.get("hf", {})) + dataset_sha = api.dataset_info(self.repo_id).sha + if dataset_sha != self.hash: + raise NotImplementedError( + f"lance doesn't support loading other revisions than 'main' yet, but got {self.hash}" + ) + data_files = dl_manager.download(self.config.data_files) + + # TODO: remove once Lance supports HF links with revisions + data_files = {split: [_fix_hf_uri(file) for file in files] for split, files in data_files.items()} + # TODO: remove once Lance supports symlinks for _version files + data_files = {split: [_fix_local_version_file(file) for file in files] for split, files in data_files.items()} + + splits: list[datasets.SplitGenerator] = [] + for split_name, files in data_files.items(): + protocol = files[0].split("://", 1)[0] + storage_options = dict(dl_manager.download_config.storage_options.get(protocol, {})) + # lance doesn't allow "token": None for hf and expects a string + if protocol == "hf" and storage_options.get("token") is None: + storage_options["token"] = get_token() + + lance_dataset_uris = resolve_dataset_uris(files) + if lance_dataset_uris: + lance_datasets = [lance.dataset(uri, storage_options=storage_options) for uri in lance_dataset_uris] + fragments = [frag for lance_dataset in lance_datasets for frag in lance_dataset.get_fragments()] + if self.info.features is None: + pa_schema = fragments[0]._ds.schema + first_row_first_bytes = {} + for field in pa_schema: + if self.config.columns is not None and field.name not in self.config.columns: + continue + if pa.types.is_binary(field.type) or pa.types.is_large_binary(field.type): + try: + first_row_first_bytes[field.name] = ( + lance_datasets[0].take_blobs(field.name, [0])[0].read(16) + ) + except ValueError: + first_row_first_bytes[field.name] = ( + lance_datasets[0].take([0], [field.name]).to_pylist()[0][field.name][:16] + ) + splits.append( + datasets.SplitGenerator( + name=split_name, + gen_kwargs={"fragments": fragments, "lance_files_paths": None, "lance_files": None}, + ) + ) + else: + lance_files = [ + lance.file.LanceFileReader(file, storage_options=storage_options, columns=self.config.columns) + for file in files + ] + if self.info.features is None: + pa_schema = lance_files[0].metadata().schema + first_row_first_bytes = { + field_name: value[:16] + for field_name, value in lance_files[0].take_rows([0]).to_table().to_pylist()[0].items() + if isinstance(value, bytes) + } + splits.append( + datasets.SplitGenerator( + name=split_name, + gen_kwargs={"fragments": None, "lance_files_paths": files, "lance_files": lance_files}, + ) + ) + if self.info.features is None: + if self.config.columns: + fields = [ + pa_schema.field(name) for name in self.config.columns if pa_schema.get_field_index(name) != -1 + ] + pa_schema = pa.schema(fields) + features = datasets.Features.from_arrow_schema(pa_schema) + for field_name, first_bytes in first_row_first_bytes.items(): + for magic_bytes_hex, _, feature_type in MAGIC_BYTES_EXTENSION_AND_FEATURE_TYPES: + magic_bytes = bytes.fromhex(magic_bytes_hex) + if magic_bytes in first_bytes[: len(magic_bytes) * 2]: # allow some padding + features[field_name] = feature_type + break + self.info.features = features + + return splits + + def _cast_table(self, pa_table: pa.Table) -> pa.Table: + if self.info.features is not None: + # more expensive cast to support nested features with keys in a different order + # allows str <-> int/float or str to Audio for example + pa_table = table_cast(pa_table, self.info.features.arrow_schema) + return pa_table + + def _generate_shards( + self, + fragments: Optional[List["lance.LanceFragment"]], + lance_files_paths: Optional[list[str]], + lance_files: Optional[List["lance.file.LanceFileReader"]], + ): + if fragments: + for fragment in fragments: + paths = [data_file.path for data_file in fragment.metadata.data_files()] + yield paths[0] if len(paths) == 1 else {"fragment_data_files": paths} + else: + yield from lance_files_paths + + def _generate_num_examples( + self, + fragments: Optional[List["lance.LanceFragment"]], + lance_files_paths: Optional[list[str]], + lance_files: Optional[List["lance.file.LanceFileReader"]], + ): + if fragments: + for fragment in fragments: + yield fragment.count_rows() + else: + for lance_file in lance_files: + yield lance_file.num_rows() + + def _generate_tables( + self, + fragments: Optional[List["lance.LanceFragment"]], + lance_files_paths: Optional[list[str]], + lance_files: Optional[List["lance.file.LanceFileReader"]], + ): + if fragments: + for frag_idx, fragment in enumerate(fragments): + for batch_idx, batch in enumerate( + fragment.to_batches( + columns=self.config.columns, batch_size=self.config.batch_size, blob_handling="all_binary" + ) + ): + table = pa.Table.from_batches([batch]) + yield Key(frag_idx, batch_idx), self._cast_table(table) + else: + for file_idx, lance_file in enumerate(lance_files): + for batch_idx, batch in enumerate(lance_file.read_all(batch_size=self.config.batch_size).to_batches()): + table = pa.Table.from_batches([batch]) + yield Key(file_idx, batch_idx), self._cast_table(table) diff --git a/src/datasets/packaged_modules/meshfolder/__init__.py b/src/datasets/packaged_modules/meshfolder/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/meshfolder/meshfolder.py b/src/datasets/packaged_modules/meshfolder/meshfolder.py new file mode 100644 index 0000000..293c66f --- /dev/null +++ b/src/datasets/packaged_modules/meshfolder/meshfolder.py @@ -0,0 +1,31 @@ +import datasets + +from ..folder_based_builder import folder_based_builder + + +logger = datasets.utils.logging.get_logger(__name__) + + +class MeshFolderConfig(folder_based_builder.FolderBasedBuilderConfig): + """BuilderConfig for MeshFolder.""" + + drop_labels: bool = None + drop_metadata: bool = None + + def __post_init__(self): + super().__post_init__() + + +class MeshFolder(folder_based_builder.FolderBasedBuilder): + BASE_FEATURE = datasets.Mesh + BASE_COLUMN_NAME = "mesh" + BUILDER_CONFIG_CLASS = MeshFolderConfig + EXTENSIONS: list[str] # definition at the bottom of the script + + +MESH_EXTENSIONS = [ + ".glb", + ".ply", + ".stl", +] +MeshFolder.EXTENSIONS = MESH_EXTENSIONS diff --git a/src/datasets/packaged_modules/niftifolder/__init__.py b/src/datasets/packaged_modules/niftifolder/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/niftifolder/niftifolder.py b/src/datasets/packaged_modules/niftifolder/niftifolder.py new file mode 100644 index 0000000..9c9dea0 --- /dev/null +++ b/src/datasets/packaged_modules/niftifolder/niftifolder.py @@ -0,0 +1,23 @@ +import datasets + +from ..folder_based_builder import folder_based_builder + + +logger = datasets.utils.logging.get_logger(__name__) + + +class NiftiFolderConfig(folder_based_builder.FolderBasedBuilderConfig): + """BuilderConfig for NiftiFolder.""" + + drop_labels: bool = None + drop_metadata: bool = None + + def __post_init__(self): + super().__post_init__() + + +class NiftiFolder(folder_based_builder.FolderBasedBuilder): + BASE_FEATURE = datasets.Nifti + BASE_COLUMN_NAME = "nifti" + BUILDER_CONFIG_CLASS = NiftiFolderConfig + EXTENSIONS: list[str] = [".nii"] diff --git a/src/datasets/packaged_modules/pandas/__init__.py b/src/datasets/packaged_modules/pandas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/pandas/pandas.py b/src/datasets/packaged_modules/pandas/pandas.py new file mode 100644 index 0000000..1357794 --- /dev/null +++ b/src/datasets/packaged_modules/pandas/pandas.py @@ -0,0 +1,57 @@ +import warnings +from dataclasses import dataclass +from typing import Optional + +import pandas as pd +import pyarrow as pa + +import datasets +from datasets.builder import Key +from datasets.table import table_cast + + +@dataclass +class PandasConfig(datasets.BuilderConfig): + """BuilderConfig for Pandas.""" + + features: Optional[datasets.Features] = None + + def __post_init__(self): + super().__post_init__() + + +class Pandas(datasets.ArrowBasedBuilder): + BUILDER_CONFIG_CLASS = PandasConfig + + def _info(self): + warnings.warn( + "The Pandas builder is deprecated and will be removed in the next major version of datasets.", + FutureWarning, + ) + return datasets.DatasetInfo(features=self.config.features) + + def _split_generators(self, dl_manager): + """We handle string, list and dicts in datafiles""" + if not self.config.data_files: + raise ValueError(f"At least one data file must be specified, but got data_files={self.config.data_files}") + data_files = dl_manager.download(self.config.data_files) + splits = [] + for split_name, files in data_files.items(): + splits.append(datasets.SplitGenerator(name=split_name, gen_kwargs={"files": files})) + return splits + + def _cast_table(self, pa_table: pa.Table) -> pa.Table: + if self.config.features is not None: + # more expensive cast to support nested features with keys in a different order + # allows str <-> int/float or str to Audio for example + pa_table = table_cast(pa_table, self.config.features.arrow_schema) + return pa_table + + def _generate_shards(self, files): + yield from files + + def _generate_tables(self, files): + for i, file in enumerate(files): + with open(file, "rb") as f: + pa_table = pa.Table.from_pandas(pd.read_pickle(f)) + yield Key(i, 0), self._cast_table(pa_table) diff --git a/src/datasets/packaged_modules/parquet/__init__.py b/src/datasets/packaged_modules/parquet/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/parquet/parquet.py b/src/datasets/packaged_modules/parquet/parquet.py new file mode 100644 index 0000000..d05ba18 --- /dev/null +++ b/src/datasets/packaged_modules/parquet/parquet.py @@ -0,0 +1,234 @@ +import gc +from dataclasses import dataclass +from typing import Literal, Optional, Union + +import pyarrow as pa +import pyarrow.dataset as ds +import pyarrow.parquet as pq +from packaging import version + +import datasets +import datasets.config +from datasets.builder import Key +from datasets.table import table_cast + + +logger = datasets.utils.logging.get_logger(__name__) + + +@dataclass +class ParquetConfig(datasets.BuilderConfig): + """ + BuilderConfig for Parquet. + + Args: + batch_size (`int`, *optional*): + Size of the RecordBatches to iterate on. + The default is the row group size (defined by the first row group). + columns (`list[str]`, *optional*) + List of columns to load, the other ones are ignored. + All columns are loaded by default. + features: (`Features`, *optional*): + Cast the data to `features`. + filters (`Union[pyarrow.dataset.Expression, list[tuple], list[list[tuple]]]`, *optional*): + Return only the rows matching the filter. + If possible the predicate will be pushed down to exploit the partition information + or internal metadata found in the data source, e.g. Parquet statistics. + Otherwise filters the loaded RecordBatches before yielding them. + fragment_scan_options (`pyarrow.dataset.ParquetFragmentScanOptions`, *optional*) + Scan-specific options for Parquet fragments. + This is especially useful to configure buffering and caching. + + + on_bad_files (`Literal["error", "warn", "skip"]`, *optional*, defaults to "error") + Specify what to do upon encountering a bad file (a file that can't be read). Allowed values are : + * 'error', raise an Exception when a bad file is encountered. + * 'warn', raise a warning when a bad file is encountered and skip that file. + * 'skip', skip bad files without raising or warning when they are encountered. + + + + Example: + + Load a subset of columns: + + ```python + >>> ds = load_dataset(parquet_dataset_id, columns=["col_0", "col_1"]) + ``` + + Stream data and efficiently filter data, possibly skipping entire files or row groups: + + ```python + >>> filters = [("col_0", "==", 0)] + >>> ds = load_dataset(parquet_dataset_id, streaming=True, filters=filters) + ``` + + Increase the minimum request size when streaming from 32MiB (default) to 128MiB and enable prefetching: + + ```python + >>> import pyarrow + >>> import pyarrow.dataset + >>> fragment_scan_options = pyarrow.dataset.ParquetFragmentScanOptions( + ... cache_options=pyarrow.CacheOptions( + ... prefetch_limit=1, + ... range_size_limit=128 << 20 + ... ), + ... ) + >>> ds = load_dataset(parquet_dataset_id, streaming=True, fragment_scan_options=fragment_scan_options) + ``` + + """ + + batch_size: Optional[int] = None + columns: Optional[list[str]] = None + features: Optional[datasets.Features] = None + filters: Optional[Union[ds.Expression, list[tuple], list[list[tuple]]]] = None + fragment_scan_options: Optional[ds.ParquetFragmentScanOptions] = None + on_bad_files: Literal["error", "warn", "skip"] = "error" + + def __post_init__(self): + super().__post_init__() + + +class Parquet(datasets.ArrowBasedBuilder): + BUILDER_CONFIG_CLASS = ParquetConfig + SLEEP_ON_THREADS_SHUTDOWNS = True # Related to https://github.com/apache/arrow/issues/45214 + + def _info(self): + if ( + self.config.columns is not None + and self.config.features is not None + and set(self.config.columns) != set(self.config.features) + ): + if any(col not in self.config.features for col in self.config.columns): + raise ValueError( + "The columns and features argument must match, but got ", + f"{self.config.columns} and {self.config.features}", + ) + else: + features = datasets.Features({col: self.config.features[col] for col in self.config.columns}) + else: + features = self.config.features + return datasets.DatasetInfo(features=features) + + def _split_generators(self, dl_manager): + """We handle string, list and dicts in datafiles""" + if not self.config.data_files: + raise ValueError(f"At least one data file must be specified, but got data_files={self.config.data_files}") + dl_manager.download_config.extract_on_the_fly = True + data_files = dl_manager.download(self.config.data_files) + splits = [] + for split_name, files in data_files.items(): + # Infer features if they are stored in the arrow schema + if self.info.features is None: + for file in files: + try: + with open(file, "rb") as f: + self.info.features = datasets.Features.from_arrow_schema(pq.read_schema(f)) + break + except pa.ArrowInvalid as e: + if self.config.on_bad_files == "error": + logger.error(f"Failed to read schema from '{file}' with error {type(e).__name__}: {e}") + raise + elif self.config.on_bad_files == "warn": + logger.warning(f"Skipping bad schema from '{file}'. {type(e).__name__}: {e}`") + else: + logger.debug(f"Skipping bad schema from '{file}'. {type(e).__name__}: {e}`") + if self.info.features is None: + raise ValueError( + f"At least one valid data file must be specified, all the data_files are invalid: {self.config.data_files}" + ) + splits.append( + datasets.SplitGenerator( + name=split_name, gen_kwargs={"files": files, "row_groups_list": [None] * len(files)} + ) + ) + if self.config.columns is not None and set(self.config.columns) != set(self.info.features): + self.info.features = datasets.Features( + {col: feat for col, feat in self.info.features.items() if col in self.config.columns} + ) + return splits + + def _cast_table(self, pa_table: pa.Table) -> pa.Table: + if self.info.features is not None: + # more expensive cast to support nested features with keys in a different order + # allows str <-> int/float or str to Audio for example + pa_table = table_cast(pa_table, self.info.features.arrow_schema) + return pa_table + + def _generate_shards(self, files, row_groups_list): + if not row_groups_list: + yield from files + else: + for file, row_groups in zip(files, row_groups_list): + yield { + "fragment_data_file": file, + "fragment_row_groups": row_groups, + } + + def _generate_more_gen_kwargs(self, files, row_groups_list): + if not row_groups_list or any(row_group is None for row_group in row_groups_list): + parquet_file_format = ds.ParquetFileFormat(default_fragment_scan_options=self.config.fragment_scan_options) + for file in files: + with open(file, "rb") as f: + parquet_fragment = parquet_file_format.make_fragment(f) + yield { + "files": [file] * parquet_fragment.num_row_groups, + "row_groups_list": [ + (row_group_id,) for row_group_id in range(parquet_fragment.num_row_groups) + ], + } + else: + for file, row_groups in zip(files, row_groups_list): + yield {"files": [file], "row_groups_list": [row_groups]} + + def _generate_tables(self, files, row_groups_list): + if self.config.features is not None and self.config.columns is not None: + if sorted(field.name for field in self.info.features.arrow_schema) != sorted(self.config.columns): + raise ValueError( + f"Tried to load parquet data with columns '{self.config.columns}' with mismatching features '{self.info.features}'" + ) + filter_expr = ( + pq.filters_to_expression(self.config.filters) + if isinstance(self.config.filters, list) + else self.config.filters + ) + parquet_file_format = ds.ParquetFileFormat(default_fragment_scan_options=self.config.fragment_scan_options) + for file_idx, (file, row_groups) in enumerate(zip(files, row_groups_list)): + try: + with open(file, "rb") as f: + parquet_fragment = parquet_file_format.make_fragment(f) + fragment_is_closed = False + try: + if row_groups is not None: + parquet_fragment = parquet_fragment.subset(row_group_ids=row_groups) + if parquet_fragment.row_groups: + batch_size = self.config.batch_size or parquet_fragment.row_groups[0].num_rows + for batch_idx, record_batch in enumerate( + parquet_fragment.to_batches( + batch_size=batch_size, + columns=self.config.columns, + filter=filter_expr, + batch_readahead=0, + fragment_readahead=0, + ) + ): + pa_table = pa.Table.from_batches([record_batch]) + # Uncomment for debugging (will print the Arrow table size and elements) + # logger.warning(f"pa_table: {pa_table} num rows: {pa_table.num_rows}") + # logger.warning('\n'.join(str(pa_table.slice(i, 1).to_pydict()) for i in range(pa_table.num_rows))) + yield Key(file_idx, batch_idx), self._cast_table(pa_table) + fragment_is_closed = True + finally: + # Fix for https://github.com/apache/arrow/issues/45214 + if not fragment_is_closed and datasets.config.PYARROW_VERSION <= version.parse("24.0.0"): + del parquet_fragment + gc.collect() + except (pa.ArrowInvalid, ValueError) as e: + if self.config.on_bad_files == "error": + logger.error(f"Failed to read file '{file}' with error {type(e).__name__}: {e}") + raise + elif self.config.on_bad_files == "warn": + logger.warning(f"Skipping bad file '{file}'. {type(e).__name__}: {e}`") + else: + logger.debug(f"Skipping bad file '{file}'. {type(e).__name__}: {e}`") diff --git a/src/datasets/packaged_modules/pdffolder/__init__.py b/src/datasets/packaged_modules/pdffolder/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/pdffolder/pdffolder.py b/src/datasets/packaged_modules/pdffolder/pdffolder.py new file mode 100644 index 0000000..5aaf9c7 --- /dev/null +++ b/src/datasets/packaged_modules/pdffolder/pdffolder.py @@ -0,0 +1,23 @@ +import datasets + +from ..folder_based_builder import folder_based_builder + + +logger = datasets.utils.logging.get_logger(__name__) + + +class PdfFolderConfig(folder_based_builder.FolderBasedBuilderConfig): + """BuilderConfig for ImageFolder.""" + + drop_labels: bool = None + drop_metadata: bool = None + + def __post_init__(self): + super().__post_init__() + + +class PdfFolder(folder_based_builder.FolderBasedBuilder): + BASE_FEATURE = datasets.Pdf + BASE_COLUMN_NAME = "pdf" + BUILDER_CONFIG_CLASS = PdfFolderConfig + EXTENSIONS: list[str] = [".pdf"] diff --git a/src/datasets/packaged_modules/spark/__init__.py b/src/datasets/packaged_modules/spark/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/spark/spark.py b/src/datasets/packaged_modules/spark/spark.py new file mode 100644 index 0000000..47ba9cf --- /dev/null +++ b/src/datasets/packaged_modules/spark/spark.py @@ -0,0 +1,367 @@ +import os +import posixpath +import uuid +from collections.abc import Iterable +from dataclasses import dataclass +from itertools import islice +from typing import TYPE_CHECKING, Optional, Union + +import numpy as np +import pyarrow as pa + +import datasets +from datasets.arrow_writer import ArrowWriter, ParquetWriter +from datasets.config import MAX_SHARD_SIZE +from datasets.filesystems import ( + is_remote_filesystem, + rename, +) +from datasets.iterable_dataset import _BaseExamplesIterable +from datasets.utils import experimental +from datasets.utils.py_utils import convert_file_size_to_int + + +logger = datasets.utils.logging.get_logger(__name__) + +if TYPE_CHECKING: + import pyspark + import pyspark.sql + + +@dataclass +class SparkConfig(datasets.BuilderConfig): + """BuilderConfig for Spark.""" + + features: Optional[datasets.Features] = None + + def __post_init__(self): + super().__post_init__() + + +def _reorder_dataframe_by_partition(df: "pyspark.sql.DataFrame", new_partition_order: list[int]): + df_combined = df.select("*").where(f"part_id = {new_partition_order[0]}") + for partition_id in new_partition_order[1:]: + partition_df = df.select("*").where(f"part_id = {partition_id}") + df_combined = df_combined.union(partition_df) + return df_combined + + +def _generate_iterable_examples( + df: "pyspark.sql.DataFrame", + partition_order: list[int], + state_dict: Optional[dict] = None, +): + import pyspark + + df_with_partition_id = df.select("*", pyspark.sql.functions.spark_partition_id().alias("part_id")) + partition_idx_start = state_dict["partition_idx"] if state_dict else 0 + partition_df = _reorder_dataframe_by_partition(df_with_partition_id, partition_order[partition_idx_start:]) + # pipeline next partition in parallel to hide latency + rows = partition_df.toLocalIterator(prefetchPartitions=True) + curr_partition = None + row_id = state_dict["partition_example_idx"] if state_dict else 0 + for row in islice(rows, row_id, None): + row_as_dict = row.asDict() + part_id = row_as_dict["part_id"] + row_as_dict.pop("part_id") + if curr_partition != part_id: + if state_dict and curr_partition is not None: + state_dict["partition_idx"] += 1 + curr_partition = part_id + row_id = 0 + if state_dict: + state_dict["partition_example_idx"] = row_id + 1 + yield (part_id, row_id), row_as_dict + row_id += 1 + + +class SparkExamplesIterable(_BaseExamplesIterable): + def __init__( + self, + df: "pyspark.sql.DataFrame", + partition_order=None, + ): + super().__init__() + self.df = df + self.partition_order = partition_order or range(self.df.rdd.getNumPartitions()) + + def _init_state_dict(self) -> dict: + self._state_dict = {"partition_idx": 0, "partition_example_idx": 0} + return self._state_dict + + @experimental + def load_state_dict(self, state_dict: dict) -> dict: + return super().load_state_dict(state_dict) + + def __iter__(self): + yield from _generate_iterable_examples(self.df, self.partition_order, self._state_dict) + + def shuffle_data_sources(self, generator: np.random.Generator) -> "SparkExamplesIterable": + partition_order = list(range(self.df.rdd.getNumPartitions())) + generator.shuffle(partition_order) + return SparkExamplesIterable(self.df, partition_order=partition_order) + + def shard_data_sources(self, num_shards: int, index: int, contiguous=True) -> "SparkExamplesIterable": + partition_order = self.split_shard_indices_by_worker(num_shards=num_shards, index=index, contiguous=contiguous) + return SparkExamplesIterable(self.df, partition_order=partition_order) + + @property + def num_shards(self) -> int: + return len(self.partition_order) + + +class Spark(datasets.DatasetBuilder): + BUILDER_CONFIG_CLASS = SparkConfig + + def __init__( + self, + df: "pyspark.sql.DataFrame", + cache_dir: str = None, + working_dir: str = None, + **config_kwargs, + ): + import pyspark + + self._spark = pyspark.sql.SparkSession.builder.getOrCreate() + self.df = df + self._working_dir = working_dir + + super().__init__( + cache_dir=cache_dir, + config_name=str(self.df.semanticHash()), + **config_kwargs, + ) + + def _validate_cache_dir(self): + # Define this so that we don't reference self in create_cache_and_write_probe, which will result in a pickling + # error due to pickling the SparkContext. + cache_dir = self._cache_dir + + # Returns the path of the created file. + def create_cache_and_write_probe(context): + # makedirs with exist_ok will recursively create the directory. It will not throw an error if directories + # already exist. + os.makedirs(cache_dir, exist_ok=True) + probe_file = os.path.join(cache_dir, "fs_test" + uuid.uuid4().hex) + # Opening the file in append mode will create a new file unless it already exists, in which case it will not + # change the file contents. + open(probe_file, "a") + return [probe_file] + + if self._spark.conf.get("spark.master", "").startswith("local"): + return + + # If the cluster is multi-node, make sure that the user provided a cache_dir and that it is on an NFS + # accessible to the driver. + # TODO: Stream batches to the driver using ArrowCollectSerializer instead of throwing an error. + if self._cache_dir: + probe = ( + self._spark.sparkContext.parallelize(range(1), 1).mapPartitions(create_cache_and_write_probe).collect() + ) + if os.path.isfile(probe[0]): + return + + raise ValueError( + "When using Dataset.from_spark on a multi-node cluster, the driver and all workers should be able to access cache_dir" + ) + + def _info(self): + return datasets.DatasetInfo(features=self.config.features) + + def _split_generators(self, dl_manager: datasets.download.download_manager.DownloadManager): + return [datasets.SplitGenerator(name=datasets.Split.TRAIN)] + + def _repartition_df_if_needed(self, max_shard_size): + import pyspark + + def get_arrow_batch_size(it): + for batch in it: + yield pa.RecordBatch.from_pydict({"batch_bytes": [batch.nbytes]}) + + df_num_rows = self.df.count() + sample_num_rows = df_num_rows if df_num_rows <= 100 else 100 + # Approximate the size of each row (in Arrow format) by averaging over a max-100-row sample. + approx_bytes_per_row = ( + self.df.limit(sample_num_rows) + .repartition(1) + .mapInArrow(get_arrow_batch_size, "batch_bytes: long") + .agg(pyspark.sql.functions.sum("batch_bytes").alias("sample_bytes")) + .collect()[0] + .sample_bytes + / sample_num_rows + ) + approx_total_size = approx_bytes_per_row * df_num_rows + if approx_total_size > max_shard_size: + # Make sure there is at least one row per partition. + new_num_partitions = min(df_num_rows, int(approx_total_size / max_shard_size)) + self.df = self.df.repartition(new_num_partitions) + + def _prepare_split_single( + self, + fpath: str, + file_format: str, + max_shard_size: int, + ) -> Iterable[tuple[int, bool, Union[int, tuple]]]: + import pyspark + + writer_class = ParquetWriter if file_format == "parquet" else ArrowWriter + working_fpath = os.path.join(self._working_dir, os.path.basename(fpath)) if self._working_dir else fpath + embed_local_files = file_format == "parquet" + + # Define these so that we don't reference self in write_arrow, which will result in a pickling error due to + # pickling the SparkContext. + features = self.config.features + writer_batch_size = self._writer_batch_size + storage_options = self._fs.storage_options + + def write_arrow(it): + # Within the same SparkContext, no two task attempts will share the same attempt ID. + task_id = pyspark.TaskContext().taskAttemptId() + first_batch = next(it, None) + if first_batch is None: + # Some partitions might not receive any data. + return pa.RecordBatch.from_arrays( + [[task_id], [0], [0]], + names=["task_id", "num_examples", "num_bytes"], + ) + shard_id = 0 + writer = writer_class( + features=features, + path=working_fpath.replace("SSSSS", f"{shard_id:05d}").replace("TTTTT", f"{task_id:05d}"), + writer_batch_size=writer_batch_size, + storage_options=storage_options, + embed_local_files=embed_local_files, + ) + table = pa.Table.from_batches([first_batch]) + writer.write_table(table) + for batch in it: + if max_shard_size is not None and writer._num_bytes >= max_shard_size: + num_examples, num_bytes = writer.finalize() + writer.close() + yield pa.RecordBatch.from_arrays( + [[task_id], [num_examples], [num_bytes]], + names=["task_id", "num_examples", "num_bytes"], + ) + shard_id += 1 + writer = writer_class( + features=writer._features, + path=working_fpath.replace("SSSSS", f"{shard_id:05d}").replace("TTTTT", f"{task_id:05d}"), + writer_batch_size=writer_batch_size, + storage_options=storage_options, + embed_local_files=embed_local_files, + ) + table = pa.Table.from_batches([batch]) + writer.write_table(table) + + if writer._num_bytes > 0: + num_examples, num_bytes = writer.finalize() + writer.close() + yield pa.RecordBatch.from_arrays( + [[task_id], [num_examples], [num_bytes]], + names=["task_id", "num_examples", "num_bytes"], + ) + + if working_fpath != fpath: + for file in os.listdir(os.path.dirname(working_fpath)): + dest = os.path.join(os.path.dirname(fpath), os.path.basename(file)) + shutil.move(file, dest) + + stats = ( + self.df.mapInArrow(write_arrow, "task_id: long, num_examples: long, num_bytes: long") + .groupBy("task_id") + .agg( + pyspark.sql.functions.sum("num_examples").alias("total_num_examples"), + pyspark.sql.functions.sum("num_bytes").alias("total_num_bytes"), + pyspark.sql.functions.count("num_bytes").alias("num_shards"), + pyspark.sql.functions.collect_list("num_examples").alias("shard_lengths"), + ) + .collect() + ) + for row in stats: + yield row.task_id, (row.total_num_examples, row.total_num_bytes, row.num_shards, row.shard_lengths) + + def _prepare_split( + self, + split_generator: "datasets.SplitGenerator", + file_format: str = "arrow", + max_shard_size: Optional[Union[str, int]] = None, + num_proc: Optional[int] = None, + **kwargs, + ): + self._validate_cache_dir() + + max_shard_size = convert_file_size_to_int(max_shard_size or MAX_SHARD_SIZE) + self._repartition_df_if_needed(max_shard_size) + is_local = not is_remote_filesystem(self._fs) + path_join = os.path.join if is_local else posixpath.join + + SUFFIX = "-TTTTT-SSSSS-of-NNNNN" + fname = f"{self.name}-{split_generator.name}{SUFFIX}.{file_format}" + fpath = path_join(self._output_dir, fname) + + total_num_examples = 0 + total_num_bytes = 0 + total_shards = 0 + task_id_and_num_shards = [] + all_shard_lengths = [] + + for task_id, content in self._prepare_split_single(fpath, file_format, max_shard_size): + ( + num_examples, + num_bytes, + num_shards, + shard_lengths, + ) = content + if num_bytes > 0: + total_num_examples += num_examples + total_num_bytes += num_bytes + total_shards += num_shards + task_id_and_num_shards.append((task_id, num_shards)) + all_shard_lengths.extend(shard_lengths) + + split_generator.split_info.num_examples = total_num_examples + split_generator.split_info.num_bytes = total_num_bytes + + # should rename everything at the end + logger.debug(f"Renaming {total_shards} shards.") + if total_shards > 1: + split_generator.split_info.shard_lengths = all_shard_lengths + + # Define fs outside of _rename_shard so that we don't reference self in the function, which will result in a + # pickling error due to pickling the SparkContext. + fs = self._fs + + # use the -SSSSS-of-NNNNN pattern + def _rename_shard( + task_id: int, + shard_id: int, + global_shard_id: int, + ): + rename( + fs, + fpath.replace("SSSSS", f"{shard_id:05d}").replace("TTTTT", f"{task_id:05d}"), + fpath.replace("TTTTT-SSSSS", f"{global_shard_id:05d}").replace("NNNNN", f"{total_shards:05d}"), + ) + + args = [] + global_shard_id = 0 + for i in range(len(task_id_and_num_shards)): + task_id, num_shards = task_id_and_num_shards[i] + for shard_id in range(num_shards): + args.append([task_id, shard_id, global_shard_id]) + global_shard_id += 1 + self._spark.sparkContext.parallelize(args, len(args)).map(lambda args: _rename_shard(*args)).collect() + else: + # don't use any pattern + shard_id = 0 + task_id = task_id_and_num_shards[0][0] + self._rename( + fpath.replace("SSSSS", f"{shard_id:05d}").replace("TTTTT", f"{task_id:05d}"), + fpath.replace(SUFFIX, ""), + ) + + def _get_examples_iterable_for_split( + self, + split_generator: "datasets.SplitGenerator", + ) -> SparkExamplesIterable: + return SparkExamplesIterable(self.df) diff --git a/src/datasets/packaged_modules/sql/__init__.py b/src/datasets/packaged_modules/sql/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/sql/sql.py b/src/datasets/packaged_modules/sql/sql.py new file mode 100644 index 0000000..deebd41 --- /dev/null +++ b/src/datasets/packaged_modules/sql/sql.py @@ -0,0 +1,120 @@ +import sys +from dataclasses import dataclass +from typing import TYPE_CHECKING, Optional, Union + +import pandas as pd +import pyarrow as pa + +import datasets +import datasets.config +from datasets.builder import Key +from datasets.features.features import require_storage_cast +from datasets.table import table_cast + + +if TYPE_CHECKING: + import sqlite3 + + import sqlalchemy + + +logger = datasets.utils.logging.get_logger(__name__) + + +@dataclass +class SqlConfig(datasets.BuilderConfig): + """BuilderConfig for SQL.""" + + sql: Union[str, "sqlalchemy.sql.Selectable"] = None + con: Union[str, "sqlalchemy.engine.Connection", "sqlalchemy.engine.Engine", "sqlite3.Connection"] = None + index_col: Optional[Union[str, list[str]]] = None + coerce_float: bool = True + params: Optional[Union[list, tuple, dict]] = None + parse_dates: Optional[Union[list, dict]] = None + columns: Optional[list[str]] = None + chunksize: Optional[int] = 10_000 + features: Optional[datasets.Features] = None + + def __post_init__(self): + super().__post_init__() + if self.sql is None: + raise ValueError("sql must be specified") + if self.con is None: + raise ValueError("con must be specified") + + def create_config_id( + self, + config_kwargs: dict, + custom_features: Optional[datasets.Features] = None, + ) -> str: + config_kwargs = config_kwargs.copy() + # We need to stringify the Selectable object to make its hash deterministic + + # The process of stringifying is explained here: http://docs.sqlalchemy.org/en/latest/faq/sqlexpressions.html + sql = config_kwargs["sql"] + if not isinstance(sql, str): + if datasets.config.SQLALCHEMY_AVAILABLE and "sqlalchemy" in sys.modules: + import sqlalchemy + + if isinstance(sql, sqlalchemy.sql.Selectable): + engine = sqlalchemy.create_engine(config_kwargs["con"].split("://")[0] + "://") + sql_str = str(sql.compile(dialect=engine.dialect)) + config_kwargs["sql"] = sql_str + else: + raise TypeError( + f"Supported types for 'sql' are string and sqlalchemy.sql.Selectable but got {type(sql)}: {sql}" + ) + else: + raise TypeError( + f"Supported types for 'sql' are string and sqlalchemy.sql.Selectable but got {type(sql)}: {sql}" + ) + con = config_kwargs["con"] + if not isinstance(con, str): + config_kwargs["con"] = id(con) + logger.info( + f"SQL connection 'con' of type {type(con)} couldn't be hashed properly. To enable hashing, specify 'con' as URI string instead." + ) + + return super().create_config_id(config_kwargs, custom_features=custom_features) + + @property + def pd_read_sql_kwargs(self): + pd_read_sql_kwargs = { + "index_col": self.index_col, + "columns": self.columns, + "params": self.params, + "coerce_float": self.coerce_float, + "parse_dates": self.parse_dates, + } + return pd_read_sql_kwargs + + +class Sql(datasets.ArrowBasedBuilder): + BUILDER_CONFIG_CLASS = SqlConfig + + def _info(self): + return datasets.DatasetInfo(features=self.config.features) + + def _split_generators(self, dl_manager): + return [datasets.SplitGenerator(name=datasets.Split.TRAIN, gen_kwargs={})] + + def _cast_table(self, pa_table: pa.Table) -> pa.Table: + if self.config.features is not None: + schema = self.config.features.arrow_schema + if all(not require_storage_cast(feature) for feature in self.config.features.values()): + # cheaper cast + pa_table = pa.Table.from_arrays([pa_table[field.name] for field in schema], schema=schema) + else: + # more expensive cast; allows str <-> int/float or str to Audio for example + pa_table = table_cast(pa_table, schema) + return pa_table + + def _generate_tables(self): + chunksize = self.config.chunksize + sql_reader = pd.read_sql( + self.config.sql, self.config.con, chunksize=chunksize, **self.config.pd_read_sql_kwargs + ) + sql_reader = [sql_reader] if chunksize is None else sql_reader + for chunk_idx, df in enumerate(sql_reader): + pa_table = pa.Table.from_pandas(df) + yield Key(0, chunk_idx), self._cast_table(pa_table) diff --git a/src/datasets/packaged_modules/text/__init__.py b/src/datasets/packaged_modules/text/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/text/text.py b/src/datasets/packaged_modules/text/text.py new file mode 100644 index 0000000..5c6ac72 --- /dev/null +++ b/src/datasets/packaged_modules/text/text.py @@ -0,0 +1,137 @@ +from dataclasses import dataclass +from io import StringIO +from typing import Literal, Optional + +import pyarrow as pa + +import datasets +from datasets.builder import Key +from datasets.features.features import require_storage_cast +from datasets.table import table_cast + + +logger = datasets.utils.logging.get_logger(__name__) + + +@dataclass +class TextConfig(datasets.BuilderConfig): + """BuilderConfig for text files. + + Args: + features: (`Features`, *optional*): + Cast the data to `features`. + encoding: (`str`, defaults to "utf-8"): + Encoding to decode the file. + encoding_errors: (`str`, *optional*): + Argument to define what to do in case of encoding error. + This is the same as the `error` argument in `open()`. + chunksize: (`Features`, *optional*, defaults to "10MB"): + Chunk size to read the data. + keep_linebreaks: (`bool`, defaults to False): + Whether to keep line breaks. + sample_by (`Literal["line", "paragraph", "document"]`, defaults to "line"): + Whether to load data per line, praragraph or document. + By default one row in the dataset = one line. + """ + + features: Optional[datasets.Features] = None + encoding: str = "utf-8" + encoding_errors: Optional[str] = None + chunksize: int = 10 << 20 # 10MB + keep_linebreaks: bool = False + sample_by: Literal["line", "paragraph", "document"] = "line" + + +class Text(datasets.ArrowBasedBuilder): + BUILDER_CONFIG_CLASS = TextConfig + + def _info(self): + return datasets.DatasetInfo(features=self.config.features) + + def _split_generators(self, dl_manager): + """The `data_files` kwarg in load_dataset() can be a str, List[str], Dict[str,str], or Dict[str,List[str]]. + + If str or List[str], then the dataset returns only the 'train' split. + If dict, then keys should be from the `datasets.Split` enum. + """ + if not self.config.data_files: + raise ValueError(f"At least one data file must be specified, but got data_files={self.config.data_files}") + dl_manager.download_config.extract_on_the_fly = True + base_data_files = dl_manager.download(self.config.data_files) + extracted_data_files = dl_manager.extract(base_data_files) + splits = [] + for split_name, files in extracted_data_files.items(): + files_iterables = [dl_manager.iter_files(file) for file in files] + splits.append( + datasets.SplitGenerator( + name=split_name, + gen_kwargs={"files_iterables": files_iterables, "base_files": base_data_files[split_name]}, + ) + ) + return splits + + def _cast_table(self, pa_table: pa.Table) -> pa.Table: + if self.config.features is not None: + schema = self.config.features.arrow_schema + if all(not require_storage_cast(feature) for feature in self.config.features.values()): + # cheaper cast + pa_table = pa_table.cast(schema) + else: + # more expensive cast; allows str <-> int/float or str to Audio for example + pa_table = table_cast(pa_table, schema) + return pa_table + else: + return pa_table.cast(pa.schema({"text": pa.string()})) + + def _generate_shards(self, base_files, files_iterables): + yield from base_files + + def _generate_tables(self, base_files, files_iterables): + pa_table_names = list(self.config.features) if self.config.features is not None else ["text"] + for shard_idx, files_iterable in enumerate(files_iterables): + for file in files_iterable: + # open in text mode, by default translates universal newlines ("\n", "\r\n" and "\r") into "\n" + with open(file, encoding=self.config.encoding, errors=self.config.encoding_errors) as f: + if self.config.sample_by == "line": + batch_idx = 0 + while True: + batch = f.read(self.config.chunksize) + if not batch: + break + batch += f.readline() # finish current line + # StringIO.readlines, by default splits only on "\n" (and keeps line breaks) + batch = StringIO(batch).readlines() + if not self.config.keep_linebreaks: + batch = [line.rstrip("\n") for line in batch] + pa_table = pa.Table.from_arrays([pa.array(batch)], names=pa_table_names) + # Uncomment for debugging (will print the Arrow table size and elements) + # logger.warning(f"pa_table: {pa_table} num rows: {pa_table.num_rows}") + # logger.warning('\n'.join(str(pa_table.slice(i, 1).to_pydict()) for i in range(pa_table.num_rows))) + yield Key(shard_idx, batch_idx), self._cast_table(pa_table) + batch_idx += 1 + elif self.config.sample_by == "paragraph": + batch_idx = 0 + batch = "" + while True: + new_batch = f.read(self.config.chunksize) + if not new_batch: + break + batch += new_batch + batch += f.readline() # finish current line + batch = batch.split("\n\n") + pa_table = pa.Table.from_arrays( + [pa.array([example for example in batch[:-1] if example])], names=pa_table_names + ) + # Uncomment for debugging (will print the Arrow table size and elements) + # logger.warning(f"pa_table: {pa_table} num rows: {pa_table.num_rows}") + # logger.warning('\n'.join(str(pa_table.slice(i, 1).to_pydict()) for i in range(pa_table.num_rows))) + yield Key(shard_idx, batch_idx), self._cast_table(pa_table) + batch_idx += 1 + batch = batch[-1] + if batch: + pa_table = pa.Table.from_arrays([pa.array([batch])], names=pa_table_names) + yield (shard_idx, batch_idx), self._cast_table(pa_table) + elif self.config.sample_by == "document": + text = f.read() + pa_table = pa.Table.from_arrays([pa.array([text])], names=pa_table_names) + yield Key(shard_idx, 0), self._cast_table(pa_table) diff --git a/src/datasets/packaged_modules/tsfile/__init__.py b/src/datasets/packaged_modules/tsfile/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/tsfile/tsfile.py b/src/datasets/packaged_modules/tsfile/tsfile.py new file mode 100644 index 0000000..96712b4 --- /dev/null +++ b/src/datasets/packaged_modules/tsfile/tsfile.py @@ -0,0 +1,773 @@ +"""TsFile (table model) packaged builder — per-device wide format. + +Each output row corresponds to a single device (identified by its TAG values). +The ``time`` column and every FIELD column are Arrow ``list<...>`` columns +holding the entire time series for that device. When the same device is +present in multiple TsFiles within a split, its data is merged across files +and the resulting lists are sorted in ascending time order. + +Output schema layout:: + + : string + : string (one column per TAG) + ... + time: list + : list (one column per FIELD) + : list + ... + +Reading model +------------- +Data is fetched **per device** via ``TsFileReader.query_table`` with a +push-down ``tag_filter``. For each split the builder: + +1. Opens every input file once, calls ``get_all_devices`` to enumerate the + ``(tag-tuple) → [files]`` index across all shards. +2. Iterates the index in stable order. For each device, streams Arrow + batches from every contributing file, concatenates and sorts by time, + and emits one wide row. + +Peak memory is bounded by **one device's** total payload across the split, +not by the split's total size. +""" + +from __future__ import annotations + +import datetime as _dt +from dataclasses import dataclass +from typing import Any, Literal, Optional + +import numpy as np +import pyarrow as pa + +import datasets +from datasets.builder import Key +from datasets.table import table_cast +from datasets.utils.tqdm import tqdm + + +logger = datasets.utils.logging.get_logger(__name__) + + +# --------------------------------------------------------------------------- +# Type helpers +# --------------------------------------------------------------------------- + + +def _arrow_type(ts_dtype, *, unit: str, tz: Optional[str]) -> pa.DataType: + """Map a tsfile ``TSDataType`` to its Arrow representation.""" + from tsfile.constants import TSDataType + + return { + TSDataType.BOOLEAN: pa.bool_(), + TSDataType.INT32: pa.int32(), + TSDataType.INT64: pa.int64(), + TSDataType.FLOAT: pa.float32(), + TSDataType.DOUBLE: pa.float64(), + TSDataType.TEXT: pa.string(), + TSDataType.STRING: pa.string(), + TSDataType.TIMESTAMP: pa.timestamp(unit, tz=tz), + TSDataType.DATE: pa.date32(), + TSDataType.BLOB: pa.binary(), + }.get(ts_dtype, pa.string()) + + +def _promote_tsdatatype(a, b): + """Return the widest of two ``TSDataType`` values. + + Mirrors IoTDB's ``ALTER COLUMN ... SET DATA TYPE`` rules: + + - ``INT32 → INT64 → DOUBLE`` + - ``INT32 → FLOAT → DOUBLE`` + + ``INT64`` and ``FLOAT`` cannot widen losslessly into either, so their + join is ``DOUBLE``. Non-numeric or otherwise unrelated pairs raise. + """ + if a == b: + return a + + from tsfile.constants import TSDataType + + table = { + (TSDataType.INT32, TSDataType.INT64): TSDataType.INT64, + (TSDataType.INT32, TSDataType.FLOAT): TSDataType.FLOAT, + (TSDataType.INT32, TSDataType.DOUBLE): TSDataType.DOUBLE, + (TSDataType.INT64, TSDataType.FLOAT): TSDataType.DOUBLE, + (TSDataType.INT64, TSDataType.DOUBLE): TSDataType.DOUBLE, + (TSDataType.FLOAT, TSDataType.DOUBLE): TSDataType.DOUBLE, + } + if (a, b) in table: + return table[(a, b)] + if (b, a) in table: + return table[(b, a)] + raise ValueError( + f"Incompatible column types across files: {a.name} vs {b.name}. " + "Only numeric widening (INT32→INT64→DOUBLE, INT32→FLOAT→DOUBLE) is supported." + ) + + +def _to_epoch(value: Any, unit: str) -> int: + """Coerce a timestamp boundary to an integer epoch in ``unit``. + + Accepts ``int`` (raw epoch in ``unit``), ``datetime``/``date``, + ISO-8601 ``str``, or any ``pa.Scalar`` of timestamp type. + """ + if isinstance(value, bool): # bool is a subclass of int; reject explicitly + raise TypeError(f"start_time/end_time must be a timestamp, got bool: {value!r}") + if isinstance(value, int): + return value + try: + # Normalize the various input shapes into something pa.scalar() can absorb + # under a `timestamp[unit]` target type. + if isinstance(value, _dt.datetime): + if value.tzinfo is not None: + value = value.astimezone(_dt.timezone.utc).replace(tzinfo=None) + elif isinstance(value, _dt.date): + value = _dt.datetime(value.year, value.month, value.day) + elif isinstance(value, str): + value = _dt.datetime.fromisoformat(value) + return pa.scalar(value, type=pa.timestamp(unit)).value + except (pa.ArrowInvalid, pa.ArrowTypeError, TypeError, ValueError) as e: + raise TypeError( + f"start_time/end_time must be a datetime, date, pa.TimestampScalar, " + f"ISO-8601 str, or int epoch; got {type(value).__name__}: {value!r}" + ) from e + + +# --------------------------------------------------------------------------- +# Config +# --------------------------------------------------------------------------- + + +@dataclass +class TsFileConfig(datasets.BuilderConfig): + """BuilderConfig for TsFile (table model) — per-device wide format. + + Args: + table_name (`str`, *optional*): + Name of the table to read. When unset, the first table found in + the first valid file is used. Lookups are case-insensitive. + columns (`list[str]`, *optional*): + Subset of FIELD columns to keep. TAG columns and the TIME column + are *always* returned (they identify the device / its timeline + and cannot be excluded). Names that refer to TAG or TIME columns, + or to fields absent from every file, resolve quietly: TAGs/TIME + are emitted as usual, and never-seen fields become all-null list + columns. When unset, all FIELDs are returned. + start_time, end_time (`datetime`, `date`, `pa.TimestampScalar`, ISO-8601 `str`, or `int`, *optional*): + Inclusive timestamp range. Either bound may be omitted. + ``datetime`` values are taken in their own tz (UTC if naive); + ``int`` is interpreted as a raw epoch in ``timestamp_unit``. + input_batch_size (`int`, *optional*, defaults to 65_536): + Maximum number of rows fetched per Arrow batch from + ``TsFileReader.query_table``. Controls peak memory while + streaming a single device. + output_batch_size (`int`, *optional*, defaults to 32): + Number of devices (output dataset rows) packed into each Arrow + record batch yielded to the writer. Also the granularity at + which the dataset progress bar advances; smaller values give + more responsive feedback on slow per-device reads, larger ones + reduce per-batch overhead. + features (`Features`, *optional*): + Final Features schema. When provided, the metadata scan over + input files is skipped. + on_bad_files (`Literal["error", "warn", "skip"]`, *optional*, defaults to "error"): + What to do if a file cannot be opened or lacks the requested table. + timestamp_unit (`Literal["s", "ms", "us", "ns"]`, *optional*, defaults to "ms"): + Time unit for the timestamp column. IoTDB defaults to milliseconds. + timestamp_tz (`str`, *optional*): + Time zone for the timestamp column. ``None`` means timezone-naive. + """ + + table_name: Optional[str] = None + columns: Optional[list[str]] = None + start_time: Optional[Any] = None + end_time: Optional[Any] = None + input_batch_size: int = 65_536 + output_batch_size: int = 32 + features: Optional[datasets.Features] = None + on_bad_files: Literal["error", "warn", "skip"] = "error" + timestamp_unit: Literal["s", "ms", "us", "ns"] = "ms" + timestamp_tz: Optional[str] = None + + def __post_init__(self): + super().__post_init__() + if self.input_batch_size is None or self.input_batch_size <= 0: + raise ValueError(f"`input_batch_size` must be a positive integer, got {self.input_batch_size}") + if self.output_batch_size is None or self.output_batch_size <= 0: + raise ValueError(f"`output_batch_size` must be a positive integer, got {self.output_batch_size}") + if self.columns is not None and len(self.columns) == 0: + raise ValueError("`columns` must be a non-empty list when provided.") + if self.timestamp_unit not in ("s", "ms", "us", "ns"): + raise ValueError(f"`timestamp_unit` must be one of 's', 'ms', 'us', 'ns', got {self.timestamp_unit!r}") + if self.on_bad_files not in ("error", "warn", "skip"): + raise ValueError(f"`on_bad_files` must be one of 'error', 'warn', 'skip', got {self.on_bad_files!r}") + if self.start_time is not None: + self.start_time = _to_epoch(self.start_time, self.timestamp_unit) + if self.end_time is not None: + self.end_time = _to_epoch(self.end_time, self.timestamp_unit) + + +# --------------------------------------------------------------------------- +# Internal sentinels +# --------------------------------------------------------------------------- + + +class _SkipSplit(Exception): + """Raised internally to abort emitting a split entirely.""" + + +class _MissingTableError(ValueError): + def __init__(self, table: Optional[str], available): + super().__init__(f"Table {table!r} not found in file. Available tables: {available}") + + +_TSFILE_MAGIC = b"TsFile" + + +# --------------------------------------------------------------------------- +# Builder +# --------------------------------------------------------------------------- + + +class TsFile(datasets.ArrowBasedBuilder): + """Per-device wide-format builder for TsFile (table model).""" + + BUILDER_CONFIG_CLASS = TsFileConfig + + # ----- builder hooks ------------------------------------------------ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._table: Optional[str] = None + self._time_col: str = "time" + self._tag_cols: list[str] = [] + self._field_inner: dict[str, pa.DataType] = {} + self._requested_fields: Optional[list[str]] = None # lowercased + + def _info(self): + if ( + self.config.columns is not None + and self.config.features is not None + and not set(self.config.columns).issubset(set(self.config.features)) + ): + raise ValueError( + "Every entry in `columns` must also appear in `features`, but got " + f"columns={self.config.columns} and features={list(self.config.features)}" + ) + return datasets.DatasetInfo(features=self.config.features) + + def _split_generators(self, dl_manager): + if not self.config.data_files: + raise ValueError(f"At least one data file must be specified, but got data_files={self.config.data_files}") + dl_manager.download_config.extract_on_the_fly = True + data_files = dl_manager.download(self.config.data_files) + + # Lowercase user-facing names to match tsfile's case-insensitive convention. + self._table = self.config.table_name.lower() if self.config.table_name else None + self._requested_fields = [c.lower() for c in self.config.columns] if self.config.columns else None + + all_files = [f for files in data_files.values() for f in files] + scan = self._scan_metadata(all_files) + if scan is None: + raise ValueError( + "Could not infer schema from any of the provided files. " + "Set `features` explicitly or check the input files." + ) + self._table = scan["table"] + self._time_col = scan["time_col"] + self._tag_cols = scan["tag_cols"] + self._field_inner = scan["field_inner"] + + if self.info.features is None: + self.info.features = self._build_features() + + return [ + datasets.SplitGenerator(name=split, gen_kwargs={"files": list(files)}) + for split, files in data_files.items() + ] + + def _generate_shards(self, files): + yield from files + + def _generate_tables(self, files): + target_schema = self.info.features.arrow_schema + try: + yield from self._fold_split(files, target_schema) + except _SkipSplit: + return + + # ----- metadata scan ------------------------------------------------ + + def _scan_metadata(self, files) -> Optional[dict]: + """Walk every file and unify table name, TAG columns, FIELD types.""" + from tsfile.constants import TIME_COLUMN, ColumnCategory + + wanted_table = self._table + wanted_fields = set(self._requested_fields) if self._requested_fields is not None else None + + table: Optional[str] = wanted_table + time_col: Optional[str] = None + tag_cols: list[str] = [] + tag_seen: set[str] = set() + # Per-field widest TSDataType seen so far (we map to Arrow at the end). + field_widest: dict = {} + + for file in files: + try: + with self._open_reader(file) as reader: + schemas = self._schemas_by_lc(reader) + self._require_table_model(file, schemas) + if table is None: + table = next(iter(schemas)) + if table not in schemas: + raise _MissingTableError(table, list(schemas)) + for col in schemas[table].get_columns(): + name = col.get_column_name() + cat = col.get_category() + ts_dtype = col.get_data_type() + if cat == ColumnCategory.TIME: + time_col = name + elif cat == ColumnCategory.TAG: + if name not in tag_seen: + tag_seen.add(name) + tag_cols.append(name) + else: # FIELD + if wanted_fields is not None and name not in wanted_fields: + continue + prev = field_widest.get(name) + field_widest[name] = ts_dtype if prev is None else _promote_tsdatatype(prev, ts_dtype) + except Exception as e: + if self._should_reraise(file, e): + raise + continue + + if table is None: + return None + + unit = self.config.timestamp_unit + tz = self.config.timestamp_tz + + if self._requested_fields is not None: + # Honor user order; silently drop names that turned out to be TAGs + # or the TIME column (TAGs are emitted as their own scalar columns + # and TIME is always emitted as a list column — neither may also + # appear as a list-typed field, which would collide on schema name). + reserved = tag_seen | {time_col} if time_col is not None else tag_seen + field_inner: dict[str, pa.DataType] = {} + for name in self._requested_fields: + if name in reserved: + continue + ts_dtype = field_widest.get(name) + if ts_dtype is not None: + field_inner[name] = _arrow_type(ts_dtype, unit=unit, tz=tz) + else: + # Field never appeared in any file — keep as a nullable + # float64 list, fully filled with nulls at read time. + field_inner[name] = pa.float64() + else: + field_inner = {n: _arrow_type(d, unit=unit, tz=tz) for n, d in field_widest.items()} + + return { + "table": table, + "time_col": time_col or TIME_COLUMN, + "tag_cols": tag_cols, + "field_inner": field_inner, + } + + def _build_features(self) -> datasets.Features: + unit = self.config.timestamp_unit + tz = self.config.timestamp_tz + fields: list[pa.Field] = [pa.field(t, pa.string()) for t in self._tag_cols] + fields.append(pa.field(self._time_col, pa.list_(pa.timestamp(unit, tz=tz)))) + for name, inner in self._field_inner.items(): + fields.append(pa.field(name, pa.list_(inner))) + return datasets.Features.from_arrow_schema(pa.schema(fields)) + + # ----- per-split folding ------------------------------------------- + + def _fold_split(self, files, target_schema: pa.Schema): + """Stream every device in this split via per-device tag-filter pushdown. + + Open one ``TsFileReader`` per file, build a cross-file device index + keyed by ``(tag-tuple)``, then iterate devices in stable order. For + each device, ``query_table(tag_filter=...)`` reads only that device's + rows from each contributing file, so peak memory is bounded by one + device's payload across the split — never the split's total size. + """ + if self._table is None: + raise _SkipSplit + + readers: dict[str, Any] = {} + try: + for file in files: + try: + readers[file] = self._open_reader(file) + except Exception as e: + if self._should_reraise(file, e): + raise + continue + + device_index, file_meta = self._build_device_index(readers) + if not device_index: + return + + yield from self._iter_device_batches(device_index, file_meta, readers, target_schema) + finally: + for reader in readers.values(): + try: + reader.close() + except Exception: + pass + + def _build_device_index(self, readers: dict): + """Walk every open reader and build the cross-file device index. + + Returns ``(device_index, file_meta)``: + + - ``device_index``: list of ``(device_key, [file_path, ...])`` pairs + in stable first-seen order. ``device_key`` is a tuple aligned to + ``self._tag_cols`` (the unified tag-column order). + - ``file_meta``: maps each readable file to its per-file context + (``tag_cols``, ``field_cols``, ``time_col``). + """ + from tsfile.constants import ColumnCategory + + device_to_files: dict[tuple, list[str]] = {} + device_order: list[tuple] = [] + file_meta: dict[str, dict] = {} + # ``self._table`` was lowercased either by user-input normalization in + # ``_split_generators`` or by ``_schemas_by_lc`` during auto-detect. + table_lc = self._table + + files_iter = tqdm( + readers.items(), + total=len(readers), + desc="Indexing TsFile devices", + unit="file", + ) + + for file, reader in files_iter: + try: + schemas = self._schemas_by_lc(reader) + self._require_table_model(file, schemas) + if table_lc not in schemas: + raise _MissingTableError(table_lc, list(schemas)) + schema = schemas[table_lc] + + file_tag_cols: list[str] = [] + file_field_cols: set[str] = set() + time_col = self._time_col + for col in schema.get_columns(): + name = col.get_column_name() + cat = col.get_category() + if cat == ColumnCategory.TIME: + time_col = name + elif cat == ColumnCategory.TAG: + file_tag_cols.append(name) + elif cat == ColumnCategory.FIELD: + file_field_cols.add(name) + + file_meta[file] = { + "tag_cols": file_tag_cols, + "field_cols": file_field_cols, + "time_col": time_col, + } + + for device in reader.get_all_devices(): + if device.table_name is None or device.table_name.lower() != table_lc: + continue + file_tag_values = list(device.segments[1 : 1 + len(file_tag_cols)]) + file_tag_dict = dict(zip(file_tag_cols, file_tag_values)) + unified_key = tuple(file_tag_dict.get(c) for c in self._tag_cols) + if any(v is None for v in unified_key): + raise ValueError( + f"Device in file '{file}' has missing tag values: " + f"{dict(zip(self._tag_cols, unified_key))}. " + "Schema-evolution devices with NULL tag values are not " + "supported because tsfile lacks an IS NULL tag filter." + ) + if unified_key not in device_to_files: + device_to_files[unified_key] = [] + device_order.append(unified_key) + device_to_files[unified_key].append(file) + except Exception as e: + if self._should_reraise(file, e): + raise + file_meta.pop(file, None) + continue + + device_index = [(key, device_to_files[key]) for key in device_order] + return device_index, file_meta + + def _iter_device_batches(self, device_index, file_meta, readers, target_schema: pa.Schema): + """Materialize devices in order and emit packed Arrow tables.""" + field_names = list(self._field_inner.keys()) + rows: list[dict] = [] + batch_idx = 0 + for device_key, contributing_files in device_index: + time_chunks: list[np.ndarray] = [] + field_chunks: dict[str, list] = {f: [] for f in field_names} + for file in contributing_files: + if file not in file_meta: + continue + try: + ts_arr, vals = self._read_device_from_file(readers[file], file_meta[file], device_key) + except Exception as e: + if self._should_reraise(file, e): + raise + continue + if len(ts_arr) == 0: + continue + time_chunks.append(ts_arr) + for f in field_names: + field_chunks[f].append(vals.get(f)) # None → all-null contribution + if not time_chunks: + continue # device produced no rows in time range → skip + + row = self._finalize_device(device_key, time_chunks, field_chunks, field_names) + rows.append(row) + if len(rows) >= self.config.output_batch_size: + yield Key(0, batch_idx), self._rows_to_table(rows, target_schema) + rows = [] + batch_idx += 1 + if rows: + yield Key(0, batch_idx), self._rows_to_table(rows, target_schema) + + def _read_device_from_file(self, reader, meta: dict, device_key: tuple) -> tuple: + """Stream one device's rows from one file via ``query_table`` pushdown. + + Returns ``(timestamps, {field_name: values})``. The dict only includes + field columns that this file owns *and* that the builder requested; + callers fill missing fields with all-null contributions. + """ + from tsfile import tag_eq + + file_tag_cols: list[str] = meta["tag_cols"] + file_field_cols: set[str] = meta["field_cols"] + time_col: str = meta["time_col"] + + # Build the tag filter only over this file's tag columns. The unified + # device key carries one value per builder tag; map back by name. + unified_to_value = dict(zip(self._tag_cols, device_key)) + tag_filter = None + for c in file_tag_cols: + v = unified_to_value.get(c) + if v is None: + # Caught earlier in _build_device_index; defensive guard. + return np.array([], dtype=np.int64), {} + expr = tag_eq(c, str(v)) + tag_filter = expr if tag_filter is None else tag_filter & expr + + # Project: requested fields ∩ this file's fields. ``query_table`` + # always returns the time column, but it requires at least one + # non-time column — fall back to any owned field if the user's + # selection has nothing in this file. + requested = list(self._field_inner.keys()) + fields_to_query = [f for f in requested if f in file_field_cols] + fallback_only = False + if not fields_to_query: + if not file_field_cols: + return np.array([], dtype=np.int64), {} + fields_to_query = [next(iter(file_field_cols))] + fallback_only = True + + kwargs: dict = {"tag_filter": tag_filter, "batch_size": self.config.input_batch_size} + if self.config.start_time is not None: + kwargs["start_time"] = self.config.start_time + if self.config.end_time is not None: + kwargs["end_time"] = self.config.end_time + + ts_parts: list[np.ndarray] = [] + field_parts: dict[str, list] = {f: [] for f in fields_to_query} + with reader.query_table(self._table, fields_to_query, **kwargs) as rs: + while True: + batch = rs.read_arrow_batch() + if batch is None: + break + if batch.num_rows == 0: + continue + ts_parts.append(np.asarray(batch.column(time_col).to_numpy(), dtype=np.int64)) + for f in fields_to_query: + col = batch.column(f) + # tsfile's arrow reader tags TIMESTAMP / DATE field columns + # with a fixed unit (e.g. ``timestamp[ns]``) regardless of + # the value's original write unit. Reinterpret as raw + # int64/int32 ticks so the downstream + # ``pa.array(type=timestamp[])`` treats them as + # ticks in the unit declared by our schema, instead of + # cross-unit casting (which would raise on data loss). + if pa.types.is_timestamp(col.type): + field_parts[f].append(col.cast(pa.int64()).to_numpy(zero_copy_only=False)) + elif pa.types.is_date(col.type): + field_parts[f].append(col.cast(pa.int32()).to_numpy(zero_copy_only=False)) + else: + field_parts[f].append(col.to_numpy(zero_copy_only=False)) + + if not ts_parts: + return np.array([], dtype=np.int64), {} + ts_full = np.concatenate(ts_parts) if len(ts_parts) > 1 else ts_parts[0] + vals_full = {f: (np.concatenate(parts) if len(parts) > 1 else parts[0]) for f, parts in field_parts.items()} + + # Defensive boundary mask: native query paths may emit rows just + # outside the requested window in some chunk-boundary cases. + if self.config.start_time is not None or self.config.end_time is not None: + lo = self.config.start_time if self.config.start_time is not None else np.iinfo(np.int64).min + hi = self.config.end_time if self.config.end_time is not None else np.iinfo(np.int64).max + mask = (ts_full >= lo) & (ts_full <= hi) + if not mask.all(): + ts_full = ts_full[mask] + vals_full = {f: arr[mask] for f, arr in vals_full.items()} + + # Drop the fallback "pick one" column from the user-visible payload. + if fallback_only: + vals_full = {} + return ts_full, vals_full + + def _finalize_device( + self, + device_key: tuple, + time_chunks: list, + field_chunks: dict, + field_names: list[str], + ) -> dict: + """Concatenate per-file chunks, sort by time, and return one row. + + Raises ``ValueError`` if the same timestamp appears more than once + for a device (within or across files) — tsfile's per-device timeline + is required to be unique-by-timestamp. + """ + time_arr = np.concatenate(time_chunks) if time_chunks else np.array([], dtype=np.int64) + n_total = len(time_arr) + + if n_total > 0: + sort_idx = np.argsort(time_arr, kind="stable") + time_sorted = time_arr[sort_idx] + if n_total > 1: + dup_mask = time_sorted[1:] == time_sorted[:-1] + if dup_mask.any(): + dup_ts = int(time_sorted[1:][dup_mask][0]) + raise ValueError( + f"Duplicate timestamp {dup_ts} for device " + f"{dict(zip(self._tag_cols, device_key))}. " + "Cross-file or within-file duplicate timestamps are not supported." + ) + else: + sort_idx = None + time_sorted = time_arr + + row: dict = {} + for tag_name, tag_val in zip(self._tag_cols, device_key): + row[tag_name] = None if tag_val is None else str(tag_val) + row[self._time_col] = time_sorted + + for fname in field_names: + chunks = field_chunks.get(fname, []) + materialized: list = [] + for tchunk, fchunk in zip(time_chunks, chunks): + if fchunk is None: + materialized.append(np.full(len(tchunk), None, dtype=object)) + else: + materialized.append(fchunk) + arr = np.concatenate(materialized) if materialized else np.array([], dtype=object) + if sort_idx is not None and len(arr) == n_total: + arr = arr[sort_idx] + row[fname] = arr + return row + + # ----- arrow assembly ---------------------------------------------- + + def _rows_to_table(self, rows: list[dict], target_schema: pa.Schema) -> pa.Table: + """Convert a batch of row dicts into an Arrow table matching ``target_schema``.""" + arrays: list[pa.Array] = [] + for f in target_schema: + values = [r[f.name] for r in rows] + if pa.types.is_list(f.type): + arrays.append(self._build_list_array(values, f.type)) + else: + arrays.append(pa.array(values, type=f.type)) + pa_table = pa.Table.from_arrays(arrays, names=[f.name for f in target_schema]) + return table_cast(pa_table, target_schema) + + @staticmethod + def _build_list_array(values: list, list_type: pa.ListType) -> pa.ListArray: + """Build a ``ListArray`` from a list of per-row 1D arrays / sequences.""" + inner_type = list_type.value_type + offsets = [0] + flat_chunks: list = [] + total = 0 + for v in values: + if v is None: + length = 0 + else: + length = len(v) + flat_chunks.append(v) + total += length + offsets.append(total) + + if flat_chunks: + try: + flat = np.concatenate([np.asarray(c) for c in flat_chunks]) + except ValueError: + # Heterogeneous shapes / dtypes → fall back to a Python list. + flat = [] + for c in flat_chunks: + flat.extend(list(c)) + flat_arr = pa.array(flat, type=inner_type, from_pandas=True) + else: + flat_arr = pa.array([], type=inner_type) + + return pa.ListArray.from_arrays(pa.array(offsets, type=pa.int32()), flat_arr) + + # ----- file / error handling --------------------------------------- + + @staticmethod + def _open_reader(file: str): + """Open a file as a ``TsFileReader`` after verifying its magic header. + + The C library's ``TsFileReader`` constructor silently returns an + invalid handle for non-tsfile inputs, and any subsequent call on it + segfaults. The 6-byte ``TsFile`` magic header is checked first to + bail out cleanly. + """ + from tsfile import TsFileReader + + try: + with open(file, "rb") as fh: + header = fh.read(len(_TSFILE_MAGIC)) + except OSError as e: + raise ValueError(f"Cannot open file {file!r}: {e}") from e + if header != _TSFILE_MAGIC: + raise ValueError(f"File {file!r} is not a valid TsFile (bad magic header).") + return TsFileReader(file) + + @staticmethod + def _require_table_model(file: str, schemas) -> None: + if not schemas: + raise ValueError( + f"File {file!r} is a tree-model TsFile, which is not supported. " + "Only table-model TsFiles can be loaded." + ) + + @staticmethod + def _schemas_by_lc(reader) -> dict: + """Return ``get_all_table_schemas()`` keyed by lowercased table name. + + TsFile / IoTDB treat table names case-insensitively, but the Python + binding's ``get_all_table_schemas()`` returns a dict keyed by whatever + casing the file was written with. Lowercasing the keys here lets all + downstream lookups use a single canonical form. + """ + return {name.lower(): schema for name, schema in reader.get_all_table_schemas().items()} + + def _should_reraise(self, file: str, exc: BaseException) -> bool: + """Apply ``on_bad_files`` policy. Returns True iff the caller should re-raise.""" + mode = self.config.on_bad_files + if mode == "error": + logger.error(f"Failed to read file '{file}' with error {type(exc).__name__}: {exc}") + return True + if mode == "warn": + logger.warning(f"Skipping bad file '{file}'. {type(exc).__name__}: {exc}") + else: + logger.debug(f"Skipping bad file '{file}'. {type(exc).__name__}: {exc}") + return False diff --git a/src/datasets/packaged_modules/videofolder/__init__.py b/src/datasets/packaged_modules/videofolder/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/videofolder/videofolder.py b/src/datasets/packaged_modules/videofolder/videofolder.py new file mode 100644 index 0000000..099a17a --- /dev/null +++ b/src/datasets/packaged_modules/videofolder/videofolder.py @@ -0,0 +1,34 @@ +import datasets + +from ..folder_based_builder import folder_based_builder + + +logger = datasets.utils.logging.get_logger(__name__) + + +class VideoFolderConfig(folder_based_builder.FolderBasedBuilderConfig): + """BuilderConfig for ImageFolder.""" + + drop_labels: bool = None + drop_metadata: bool = None + + def __post_init__(self): + super().__post_init__() + + +class VideoFolder(folder_based_builder.FolderBasedBuilder): + BASE_FEATURE = datasets.Video + BASE_COLUMN_NAME = "video" + BUILDER_CONFIG_CLASS = VideoFolderConfig + EXTENSIONS: list[str] # definition at the bottom of the script + + +# TODO: initial list, we should check the compatibility of other formats +VIDEO_EXTENSIONS = [ + ".mkv", + ".mp4", + ".avi", + ".mpeg", + ".mov", +] +VideoFolder.EXTENSIONS = VIDEO_EXTENSIONS diff --git a/src/datasets/packaged_modules/webdataset/__init__.py b/src/datasets/packaged_modules/webdataset/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/webdataset/_tenbin.py b/src/datasets/packaged_modules/webdataset/_tenbin.py new file mode 100644 index 0000000..cd8c054 --- /dev/null +++ b/src/datasets/packaged_modules/webdataset/_tenbin.py @@ -0,0 +1,285 @@ +# +# Copyright (c) 2017-2021 NVIDIA CORPORATION. All rights reserved. +# This file coems from the WebDataset library. +# See the LICENSE file for licensing terms (BSD-style). +# + +""" +Binary tensor encodings for PyTorch and NumPy. + +This defines efficient binary encodings for tensors. The format is 8 byte +aligned and can be used directly for computations when transmitted, say, +via RDMA. The format is supported by WebDataset with the `.ten` filename +extension. It is also used by Tensorcom, Tensorcom RDMA, and can be used +for fast tensor storage with LMDB and in disk files (which can be memory +mapped) + +Data is encoded as a series of chunks: + +- magic number (int64) +- length in bytes (int64) +- bytes (multiple of 64 bytes long) + +Arrays are a header chunk followed by a data chunk. +Header chunks have the following structure: + +- dtype (int64) +- 8 byte array name +- ndim (int64) +- dim[0] +- dim[1] +- ... +""" + +import struct +import sys + +import numpy as np + + +def bytelen(a): + """Determine the length of a in bytes.""" + if hasattr(a, "nbytes"): + return a.nbytes + elif isinstance(a, (bytearray, bytes)): + return len(a) + else: + raise ValueError(a, "cannot determine nbytes") + + +def bytedata(a): + """Return a the raw data corresponding to a.""" + if isinstance(a, (bytearray, bytes, memoryview)): + return a + elif hasattr(a, "data"): + return a.data + else: + raise ValueError(a, "cannot return bytedata") + + +# tables for converting between long/short NumPy dtypes + +long_to_short = """ +float16 f2 +float32 f4 +float64 f8 +int8 i1 +int16 i2 +int32 i4 +int64 i8 +uint8 u1 +uint16 u2 +unit32 u4 +uint64 u8 +""".strip() +long_to_short = [x.split() for x in long_to_short.split("\n")] +long_to_short = {x[0]: x[1] for x in long_to_short} +short_to_long = {v: k for k, v in long_to_short.items()} + + +def check_acceptable_input_type(data, allow64): + """Check that the data has an acceptable type for tensor encoding. + + :param data: array + :param allow64: allow 64 bit types + """ + for a in data: + if a.dtype.name not in long_to_short: + raise ValueError("unsupported dataypte") + if not allow64 and a.dtype.name not in ["float64", "int64", "uint64"]: + raise ValueError("64 bit datatypes not allowed unless explicitly enabled") + + +def str64(s): + """Convert a string to an int64.""" + s = s + "\0" * (8 - len(s)) + s = s.encode("ascii") + return struct.unpack("@q", s)[0] + + +def unstr64(i): + """Convert an int64 to a string.""" + b = struct.pack("@q", i) + return b.decode("ascii").strip("\0") + + +def check_infos(data, infos, required_infos=None): + """Verify the info strings.""" + if required_infos is False or required_infos is None: + return data + if required_infos is True: + return data, infos + if not isinstance(required_infos, (tuple, list)): + raise ValueError("required_infos must be tuple or list") + for required, actual in zip(required_infos, infos): + raise ValueError(f"actual info {actual} doesn't match required info {required}") + return data + + +def encode_header(a, info=""): + """Encode an array header as a byte array.""" + if a.ndim >= 10: + raise ValueError("too many dimensions") + if a.nbytes != np.prod(a.shape) * a.itemsize: + raise ValueError("mismatch between size and shape") + if a.dtype.name not in long_to_short: + raise ValueError("unsupported array type") + header = [str64(long_to_short[a.dtype.name]), str64(info), len(a.shape)] + list(a.shape) + return bytedata(np.array(header, dtype="i8")) + + +def decode_header(h): + """Decode a byte array into an array header.""" + h = np.frombuffer(h, dtype="i8") + if unstr64(h[0]) not in short_to_long: + raise ValueError("unsupported array type") + dtype = np.dtype(short_to_long[unstr64(h[0])]) + info = unstr64(h[1]) + rank = int(h[2]) + shape = tuple(h[3 : 3 + rank]) + return shape, dtype, info + + +def encode_list(l, infos=None): # noqa: E741 + """Given a list of arrays, encode them into a list of byte arrays.""" + if infos is None: + infos = [""] + else: + if len(l) != len(infos): + raise ValueError(f"length of list {l} must muatch length of infos {infos}") + result = [] + for i, a in enumerate(l): + header = encode_header(a, infos[i % len(infos)]) + result += [header, bytedata(a)] + return result + + +def decode_list(l, infos=False): # noqa: E741 + """Given a list of byte arrays, decode them into arrays.""" + result = [] + infos0 = [] + for header, data in zip(l[::2], l[1::2]): + shape, dtype, info = decode_header(header) + a = np.frombuffer(data, dtype=dtype, count=np.prod(shape)).reshape(*shape) + result += [a] + infos0 += [info] + return check_infos(result, infos0, infos) + + +magic_str = "~TenBin~" +magic = str64(magic_str) +magic_bytes = unstr64(magic).encode("ascii") + + +def roundup(n, k=64): + """Round up to the next multiple of 64.""" + return k * ((n + k - 1) // k) + + +def encode_chunks(l): # noqa: E741 + """Encode a list of chunks into a single byte array, with lengths and magics..""" + size = sum(16 + roundup(b.nbytes) for b in l) + result = bytearray(size) + offset = 0 + for b in l: + result[offset : offset + 8] = magic_bytes + offset += 8 + result[offset : offset + 8] = struct.pack("@q", b.nbytes) + offset += 8 + result[offset : offset + bytelen(b)] = b + offset += roundup(bytelen(b)) + return result + + +def decode_chunks(buf): + """Decode a byte array into a list of chunks.""" + result = [] + offset = 0 + total = bytelen(buf) + while offset < total: + if magic_bytes != buf[offset : offset + 8]: + raise ValueError("magic bytes mismatch") + offset += 8 + nbytes = struct.unpack("@q", buf[offset : offset + 8])[0] + offset += 8 + b = buf[offset : offset + nbytes] + offset += roundup(nbytes) + result.append(b) + return result + + +def encode_buffer(l, infos=None): # noqa: E741 + """Encode a list of arrays into a single byte array.""" + if not isinstance(l, list): + raise ValueError("requires list") + return encode_chunks(encode_list(l, infos=infos)) + + +def decode_buffer(buf, infos=False): + """Decode a byte array into a list of arrays.""" + return decode_list(decode_chunks(buf), infos=infos) + + +def write_chunk(stream, buf): + """Write a byte chunk to the stream with magics, length, and padding.""" + nbytes = bytelen(buf) + stream.write(magic_bytes) + stream.write(struct.pack("@q", nbytes)) + stream.write(bytedata(buf)) + padding = roundup(nbytes) - nbytes + if padding > 0: + stream.write(b"\0" * padding) + + +def read_chunk(stream): + """Read a byte chunk from a stream with magics, length, and padding.""" + magic = stream.read(8) + if magic == b"": + return None + if magic != magic_bytes: + raise ValueError("magic number does not match") + nbytes = stream.read(8) + nbytes = struct.unpack("@q", nbytes)[0] + if nbytes < 0: + raise ValueError("negative nbytes") + data = stream.read(nbytes) + padding = roundup(nbytes) - nbytes + if padding > 0: + stream.read(padding) + return data + + +def write(stream, l, infos=None): # noqa: E741 + """Write a list of arrays to a stream, with magics, length, and padding.""" + for chunk in encode_list(l, infos=infos): + write_chunk(stream, chunk) + + +def read(stream, n=sys.maxsize, infos=False): + """Read a list of arrays from a stream, with magics, length, and padding.""" + chunks = [] + for _ in range(n): + header = read_chunk(stream) + if header is None: + break + data = read_chunk(stream) + if data is None: + raise ValueError("premature EOF") + chunks += [header, data] + return decode_list(chunks, infos=infos) + + +def save(fname, *args, infos=None, nocheck=False): + """Save a list of arrays to a file, with magics, length, and padding.""" + if not nocheck and not fname.endswith(".ten"): + raise ValueError("file name should end in .ten") + with open(fname, "wb") as stream: + write(stream, args, infos=infos) + + +def load(fname, infos=False, nocheck=False): + """Read a list of arrays from a file, with magics, length, and padding.""" + if not nocheck and not fname.endswith(".ten"): + raise ValueError("file name should end in .ten") + with open(fname, "rb") as stream: + return read(stream, infos=infos) diff --git a/src/datasets/packaged_modules/webdataset/webdataset.py b/src/datasets/packaged_modules/webdataset/webdataset.py new file mode 100644 index 0000000..4c8c21b --- /dev/null +++ b/src/datasets/packaged_modules/webdataset/webdataset.py @@ -0,0 +1,367 @@ +import io +import json +import re +from itertools import islice +from typing import Any, Callable + +import fsspec +import numpy as np +import pyarrow as pa + +import datasets +from datasets.builder import Key +from datasets.features.features import cast_to_python_objects +from datasets.utils.file_utils import SINGLE_FILE_COMPRESSION_EXTENSION_TO_PROTOCOL, xbasename + + +logger = datasets.utils.logging.get_logger(__name__) + + +class WebDataset(datasets.GeneratorBasedBuilder): + DEFAULT_WRITER_BATCH_SIZE = 100 + IMAGE_EXTENSIONS: list[str] # definition at the bottom of the script + AUDIO_EXTENSIONS: list[str] # definition at the bottom of the script + VIDEO_EXTENSIONS: list[str] # definition at the bottom of the script + MESH_EXTENSIONS: list[str] # definition at the bottom of the script + DECODERS: dict[str, Callable[[Any], Any]] # definition at the bottom of the script + NUM_EXAMPLES_FOR_FEATURES_INFERENCE = 5 + + @classmethod + def _get_pipeline_from_tar(cls, tar_path, tar_iterator): + current_example = {} + fs: fsspec.AbstractFileSystem = fsspec.filesystem("memory") + streaming_download_manager = datasets.StreamingDownloadManager() + for filename, f in tar_iterator: + example_key, field_name = base_plus_ext(filename) + if example_key is None: + continue + if current_example and current_example["__key__"] != example_key: + # reposition some keys in last position + current_example["__key__"] = current_example.pop("__key__") + current_example["__url__"] = current_example.pop("__url__") + yield current_example + current_example = {} + current_example["__key__"] = example_key + current_example["__url__"] = tar_path + current_example[field_name] = f.read() + if field_name.split(".")[-1].lower() in SINGLE_FILE_COMPRESSION_EXTENSION_TO_PROTOCOL: + fs.write_bytes(filename, current_example[field_name]) + extracted_file_path = streaming_download_manager.extract(f"memory://{filename}") + with fsspec.open(extracted_file_path) as f: + current_example[field_name] = f.read() + fs.delete(filename) + data_extension = xbasename(extracted_file_path).split(".")[-1].lower() + else: + data_extension = field_name.split(".")[-1].lower() + if data_extension in cls.DECODERS: + current_example[field_name] = cls.DECODERS[data_extension](current_example[field_name]) + if current_example: + yield current_example + + def _info(self) -> datasets.DatasetInfo: + return datasets.DatasetInfo() + + def _split_generators(self, dl_manager): + """We handle string, list and dicts in datafiles""" + # Download the data files + if not self.config.data_files: + raise ValueError(f"At least one data file must be specified, but got data_files={self.config.data_files}") + data_files = dl_manager.download(self.config.data_files) + splits = [] + for split_name, tar_paths in data_files.items(): + tar_iterators = [dl_manager.iter_archive(tar_path) for tar_path in tar_paths] + splits.append( + datasets.SplitGenerator( + name=split_name, gen_kwargs={"tar_paths": tar_paths, "tar_iterators": tar_iterators} + ) + ) + if not self.info.features: + # Get one example to get the feature types + pipeline = self._get_pipeline_from_tar(tar_paths[0], tar_iterators[0]) + first_examples = list(islice(pipeline, self.NUM_EXAMPLES_FOR_FEATURES_INFERENCE)) + if any(example.keys() != first_examples[0].keys() for example in first_examples): + raise ValueError( + "The TAR archives of the dataset should be in WebDataset format, " + "but the files in the archive don't share the same prefix or the same types." + ) + pa_tables = [ + pa.Table.from_pylist(cast_to_python_objects([example], only_1d_for_numpy=True)) + for example in first_examples + ] + inferred_arrow_schema = pa.concat_tables(pa_tables, promote_options="default").schema + features = datasets.Features.from_arrow_schema(inferred_arrow_schema) + + for field_name in first_examples[0]: + extension = field_name.rsplit(".", 1)[-1].lower() + # Set Image types + if extension in self.IMAGE_EXTENSIONS: + features[field_name] = datasets.Image() + # Set Audio types + if extension in self.AUDIO_EXTENSIONS: + features[field_name] = datasets.Audio() + # Set Video types + if extension in self.VIDEO_EXTENSIONS: + features[field_name] = datasets.Video() + # Set Mesh types + if extension in self.MESH_EXTENSIONS: + features[field_name] = datasets.Mesh() + self.info.features = features + + return splits + + def _generate_shards(self, tar_paths, tar_iterators): + yield from tar_paths + + def _generate_examples(self, tar_paths, tar_iterators): + image_field_names = [ + field_name for field_name, feature in self.info.features.items() if isinstance(feature, datasets.Image) + ] + audio_field_names = [ + field_name for field_name, feature in self.info.features.items() if isinstance(feature, datasets.Audio) + ] + video_field_names = [ + field_name for field_name, feature in self.info.features.items() if isinstance(feature, datasets.Video) + ] + mesh_field_names = [ + field_name for field_name, feature in self.info.features.items() if isinstance(feature, datasets.Mesh) + ] + all_field_names = list(self.info.features.keys()) + for tar_idx, (tar_path, tar_iterator) in enumerate(zip(tar_paths, tar_iterators)): + for example_idx, example in enumerate(self._get_pipeline_from_tar(tar_path, tar_iterator)): + for field_name in all_field_names: + if field_name not in example: + example[field_name] = None + for field_name in image_field_names + audio_field_names + video_field_names + mesh_field_names: + if example[field_name] is not None: + example[field_name] = { + "path": example["__key__"] + "." + field_name, + "bytes": example[field_name], + } + yield Key(tar_idx, example_idx), example + + +# Source: https://github.com/webdataset/webdataset/blob/87bd5aa41602d57f070f65a670893ee625702f2f/webdataset/tariterators.py#L25 +def base_plus_ext(path): + """Split off all file extensions. + + Returns base, allext. + """ + match = re.match(r"^((?:.*/|)[^.]+)[.]([^/]*)$", path) + if not match: + return None, None + return match.group(1), match.group(2) + + +# Obtained with: +# ``` +# import PIL.Image +# IMAGE_EXTENSIONS = [] +# PIL.Image.init() +# for ext, format in PIL.Image.EXTENSION.items(): +# if format in PIL.Image.OPEN: +# IMAGE_EXTENSIONS.append(ext[1:]) +# ``` +# We intentionally do not run this code on launch because: +# (1) Pillow is an optional dependency, so importing Pillow in global namespace is not allowed +# (2) To ensure the list of supported extensions is deterministic +IMAGE_EXTENSIONS = [ + "blp", + "bmp", + "dib", + "bufr", + "cur", + "pcx", + "dcx", + "dds", + "ps", + "eps", + "fit", + "fits", + "fli", + "flc", + "ftc", + "ftu", + "gbr", + "gif", + "grib", + "h5", + "hdf", + "png", + "apng", + "jp2", + "j2k", + "jpc", + "jpf", + "jpx", + "j2c", + "icns", + "ico", + "im", + "iim", + "tif", + "tiff", + "jfif", + "jpe", + "jpg", + "jpeg", + "mpg", + "mpeg", + "msp", + "pcd", + "pxr", + "pbm", + "pgm", + "ppm", + "pnm", + "psd", + "bw", + "rgb", + "rgba", + "sgi", + "ras", + "tga", + "icb", + "vda", + "vst", + "webp", + "wmf", + "emf", + "xbm", + "xpm", +] +WebDataset.IMAGE_EXTENSIONS = IMAGE_EXTENSIONS + + +# Obtained with: +# ``` +# import soundfile as sf +# +# AUDIO_EXTENSIONS = [f".{format.lower()}" for format in sf.available_formats().keys()] +# +# # .opus decoding is supported if libsndfile >= 1.0.31: +# AUDIO_EXTENSIONS.extend([".mp3", ".opus"]) +# ``` +# We intentionally did not run this code on launch because: +# (1) Soundfile was an optional dependency, so importing it in global namespace is not allowed +# (2) To ensure the list of supported extensions is deterministic +# (3) We use TorchCodec now anyways instead of Soundfile +AUDIO_EXTENSIONS = [ + "aiff", + "au", + "avr", + "caf", + "flac", + "htk", + "svx", + "mat4", + "mat5", + "mpc2k", + "ogg", + "paf", + "pvf", + "raw", + "rf64", + "sd2", + "sds", + "ircam", + "voc", + "w64", + "wav", + "nist", + "wavex", + "wve", + "xi", + "mp3", + "opus", +] +WebDataset.AUDIO_EXTENSIONS = AUDIO_EXTENSIONS + + +# TODO: initial list, we should check the compatibility of other formats +VIDEO_EXTENSIONS = [ + "mkv", + "mp4", + "avi", + "mpeg", + "mov", +] +WebDataset.VIDEO_EXTENSIONS = VIDEO_EXTENSIONS + + +MESH_EXTENSIONS = [ + "glb", + "ply", + "stl", +] +WebDataset.MESH_EXTENSIONS = MESH_EXTENSIONS + + +def text_loads(data: bytes): + return data.decode("utf-8") + + +def tenbin_loads(data: bytes): + from . import _tenbin + + return _tenbin.decode_buffer(data) + + +def msgpack_loads(data: bytes): + import msgpack + + return msgpack.unpackb(data) + + +def npy_loads(data: bytes): + import numpy.lib.format + + stream = io.BytesIO(data) + return numpy.lib.format.read_array(stream, allow_pickle=False) + + +def npz_loads(data: bytes): + return np.load(io.BytesIO(data), allow_pickle=False) + + +def cbor_loads(data: bytes): + import cbor + + return cbor.loads(data) + + +def torch_loads(data: bytes): + import torch + + return torch.load(io.BytesIO(data), weights_only=True) + + +# Obtained by checking `decoders` in `webdataset.autodecode` +# and removing unsafe extension decoders. +# Removed Pickle decoders: +# - "pyd": lambda data: pickle.loads(data) +# - "pickle": lambda data: pickle.loads(data) +# Modified NumPy decoders to fix CVE-2019-6446 (add allow_pickle=False and weights_only=True): +# - "npy": npy_loads, +# - "npz": lambda data: np.load(io.BytesIO(data)), +# - "pth": lambda data: torch_loads(data) +DECODERS = { + "txt": text_loads, + "text": text_loads, + "transcript": text_loads, + "cls": int, + "cls2": int, + "index": int, + "inx": int, + "id": int, + "json": json.loads, + "jsn": json.loads, + "ten": tenbin_loads, + "tb": tenbin_loads, + "mp": msgpack_loads, + "msg": msgpack_loads, + "npy": npy_loads, + "npz": npz_loads, + "cbor": cbor_loads, + "pth": torch_loads, +} +WebDataset.DECODERS = DECODERS diff --git a/src/datasets/packaged_modules/xml/__init__.py b/src/datasets/packaged_modules/xml/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/packaged_modules/xml/xml.py b/src/datasets/packaged_modules/xml/xml.py new file mode 100644 index 0000000..769ca7c --- /dev/null +++ b/src/datasets/packaged_modules/xml/xml.py @@ -0,0 +1,70 @@ +from dataclasses import dataclass +from typing import Optional + +import pyarrow as pa + +import datasets +from datasets.features.features import require_storage_cast +from datasets.table import table_cast + + +logger = datasets.utils.logging.get_logger(__name__) + + +@dataclass +class XmlConfig(datasets.BuilderConfig): + """BuilderConfig for xml files.""" + + features: Optional[datasets.Features] = None + encoding: str = "utf-8" + encoding_errors: Optional[str] = None + + +class Xml(datasets.ArrowBasedBuilder): + BUILDER_CONFIG_CLASS = XmlConfig + + def _info(self): + return datasets.DatasetInfo(features=self.config.features) + + def _split_generators(self, dl_manager): + """The `data_files` kwarg in load_dataset() can be a str, List[str], Dict[str,str], or Dict[str,List[str]]. + + If str or List[str], then the dataset returns only the 'train' split. + If dict, then keys should be from the `datasets.Split` enum. + """ + if not self.config.data_files: + raise ValueError(f"At least one data file must be specified, but got data_files={self.config.data_files}") + dl_manager.download_config.extract_on_the_fly = True + data_files = dl_manager.download_and_extract(self.config.data_files) + splits = [] + for split_name, files in data_files.items(): + if isinstance(files, str): + files = [files] + files = [dl_manager.iter_files(file) for file in files] + splits.append(datasets.SplitGenerator(name=split_name, gen_kwargs={"files": files})) + return splits + + def _cast_table(self, pa_table: pa.Table) -> pa.Table: + if self.config.features is not None: + schema = self.config.features.arrow_schema + if all(not require_storage_cast(feature) for feature in self.config.features.values()): + # cheaper cast + pa_table = pa_table.cast(schema) + else: + # more expensive cast; allows str <-> int/float or str to Audio for example + pa_table = table_cast(pa_table, schema) + return pa_table + else: + return pa_table.cast(pa.schema({"xml": pa.string()})) + + def _generate_shards(self, files): + yield from files + + def _generate_tables(self, files): + pa_table_names = list(self.config.features) if self.config.features is not None else ["xml"] + for file_idx, file in enumerate(files): + # open in text mode, by default translates universal newlines ("\n", "\r\n" and "\r") into "\n" + with open(file, encoding=self.config.encoding, errors=self.config.encoding_errors) as f: + xml = f.read() + pa_table = pa.Table.from_arrays([pa.array([xml])], names=pa_table_names) + yield (file_idx, 0), self._cast_table(pa_table) diff --git a/src/datasets/parallel/__init__.py b/src/datasets/parallel/__init__.py new file mode 100644 index 0000000..a8d527f --- /dev/null +++ b/src/datasets/parallel/__init__.py @@ -0,0 +1 @@ +from .parallel import ParallelBackendConfig, parallel_backend, parallel_map diff --git a/src/datasets/parallel/parallel.py b/src/datasets/parallel/parallel.py new file mode 100644 index 0000000..5cad2c4 --- /dev/null +++ b/src/datasets/parallel/parallel.py @@ -0,0 +1,120 @@ +import contextlib +from multiprocessing import Pool, RLock + +from tqdm.auto import tqdm + +from ..utils import experimental, logging + + +logger = logging.get_logger(__name__) + + +class ParallelBackendConfig: + backend_name = None + + +@experimental +def parallel_map(function, iterable, num_proc, batched, batch_size, types, disable_tqdm, desc, single_map_nested_func): + """ + **Experimental.** Apply a function to iterable elements in parallel, where the implementation uses either + multiprocessing.Pool or joblib for parallelization. + + Args: + function (`Callable[[Any], Any]`): Function to be applied to `iterable`. + iterable (`list`, `tuple` or `np.ndarray`): Iterable elements to apply function to. + num_proc (`int`): Number of processes (if no backend specified) or jobs (using joblib). + types (`tuple`): Additional types (besides `dict` values) to apply `function` recursively to their elements. + disable_tqdm (`bool`): Whether to disable the tqdm progressbar. + desc (`str`): Prefix for the tqdm progressbar. + single_map_nested_func (`Callable`): Map function that applies `function` to an element from `iterable`. + Takes a tuple of function, data_struct, types, rank, disable_tqdm, desc as input, where data_struct is an + element of `iterable`, and `rank` is used for progress bar. + """ + if ParallelBackendConfig.backend_name is None: + return _map_with_multiprocessing_pool( + function, iterable, num_proc, batched, batch_size, types, disable_tqdm, desc, single_map_nested_func + ) + + return _map_with_joblib( + function, iterable, num_proc, batched, batch_size, types, disable_tqdm, desc, single_map_nested_func + ) + + +def _map_with_multiprocessing_pool( + function, iterable, num_proc, batched, batch_size, types, disable_tqdm, desc, single_map_nested_func +): + num_proc = num_proc if num_proc <= len(iterable) else len(iterable) + split_kwds = [] # We organize the splits ourselve (contiguous splits) + for index in range(num_proc): + div = len(iterable) // num_proc + mod = len(iterable) % num_proc + start = div * index + min(index, mod) + end = start + div + (1 if index < mod else 0) + split_kwds.append((function, iterable[start:end], batched, batch_size, types, index, disable_tqdm, desc)) + + if len(iterable) != sum(len(i[1]) for i in split_kwds): + raise ValueError( + f"Error dividing inputs iterable among processes. " + f"Total number of objects {len(iterable)}, " + f"length: {sum(len(i[1]) for i in split_kwds)}" + ) + + logger.info( + f"Spawning {num_proc} processes for {len(iterable)} objects in slices of {[len(i[1]) for i in split_kwds]}" + ) + initargs, initializer = None, None + if not disable_tqdm: + initargs, initializer = (RLock(),), tqdm.set_lock + with Pool(num_proc, initargs=initargs, initializer=initializer) as pool: + mapped = pool.map(single_map_nested_func, split_kwds) + logger.info(f"Finished {num_proc} processes") + mapped = [obj for proc_res in mapped for obj in proc_res] + logger.info(f"Unpacked {len(mapped)} objects") + + return mapped + + +def _map_with_joblib( + function, iterable, num_proc, batched, batch_size, types, disable_tqdm, desc, single_map_nested_func +): + # progress bar is not yet supported for _map_with_joblib, because tqdm couldn't accurately be applied to joblib, + # and it requires monkey-patching joblib internal classes which is subject to change + import joblib + + with joblib.parallel_backend(ParallelBackendConfig.backend_name, n_jobs=num_proc): + return joblib.Parallel()( + joblib.delayed(single_map_nested_func)((function, obj, batched, batch_size, types, None, True, None)) + for obj in iterable + ) + + +@experimental +@contextlib.contextmanager +def parallel_backend(backend_name: str): + """ + **Experimental.** Configures the parallel backend for parallelized dataset loading, which uses the parallelization + implemented by joblib. + + Args: + backend_name (str): Name of backend for parallelization implementation, has to be supported by joblib. + + Example usage: + ```py + with parallel_backend('spark'): + dataset = load_dataset(..., num_proc=2) + ``` + """ + ParallelBackendConfig.backend_name = backend_name + + if backend_name == "spark": + from joblibspark import register_spark + + register_spark() + + # TODO: call create_cache_and_write_probe if "download" in steps + # TODO: raise NotImplementedError when Dataset.map etc is called + + try: + yield + finally: + ParallelBackendConfig.backend_name = None diff --git a/src/datasets/search.py b/src/datasets/search.py new file mode 100644 index 0000000..cb994d2 --- /dev/null +++ b/src/datasets/search.py @@ -0,0 +1,785 @@ +import importlib.util +import os +import tempfile +from pathlib import PurePath +from typing import TYPE_CHECKING, NamedTuple, Optional, Union + +import fsspec +import numpy as np + +from .features import List +from .utils import logging +from .utils import tqdm as hf_tqdm + + +if TYPE_CHECKING: + from .arrow_dataset import Dataset # noqa: F401 + + try: + from elasticsearch import Elasticsearch # noqa: F401 + + except ImportError: + pass + try: + import faiss # noqa: F401 + + except ImportError: + pass + +_has_elasticsearch = importlib.util.find_spec("elasticsearch") is not None +_has_faiss = importlib.util.find_spec("faiss") is not None + + +logger = logging.get_logger(__name__) + + +class MissingIndex(Exception): + pass + + +class SearchResults(NamedTuple): + scores: list[float] + indices: list[int] + + +class BatchedSearchResults(NamedTuple): + total_scores: list[list[float]] + total_indices: list[list[int]] + + +class NearestExamplesResults(NamedTuple): + scores: list[float] + examples: dict + + +class BatchedNearestExamplesResults(NamedTuple): + total_scores: list[list[float]] + total_examples: list[dict] + + +class BaseIndex: + """Base class for indexing""" + + def search(self, query, k: int = 10, **kwargs) -> SearchResults: + """ + To implement. + This method has to return the scores and the indices of the retrieved examples given a certain query. + """ + raise NotImplementedError + + def search_batch(self, queries, k: int = 10, **kwargs) -> BatchedSearchResults: + """Find the nearest examples indices to the query. + + Args: + queries (`Union[List[str], np.ndarray]`): The queries as a list of strings if `column` is a text index or as a numpy array if `column` is a vector index. + k (`int`): The number of examples to retrieve per query. + + Output: + total_scores (`List[List[float]`): The retrieval scores of the retrieved examples per query. + total_indices (`List[List[int]]`): The indices of the retrieved examples per query. + """ + total_scores, total_indices = [], [] + for query in queries: + scores, indices = self.search(query, k) + total_scores.append(scores) + total_indices.append(indices) + return BatchedSearchResults(total_scores, total_indices) + + def save(self, file: Union[str, PurePath]): + """Serialize the index on disk""" + raise NotImplementedError + + @classmethod + def load(cls, file: Union[str, PurePath]) -> "BaseIndex": + """Deserialize the index from disk""" + raise NotImplementedError + + +class ElasticSearchIndex(BaseIndex): + """ + Sparse index using Elasticsearch. It is used to index text and run queries based on BM25 similarity. + An Elasticsearch server needs to be accessible, and a python client is declared with + ``` + es_client = Elasticsearch([{'host': 'localhost', 'port': '9200'}]) + ``` + for example. + """ + + def __init__( + self, + host: Optional[str] = None, + port: Optional[int] = None, + es_client: Optional["Elasticsearch"] = None, + es_index_name: Optional[str] = None, + es_index_config: Optional[dict] = None, + ): + if not _has_elasticsearch: + raise ImportError( + "You must install ElasticSearch to use ElasticSearchIndex. To do so you can run `pip install elasticsearch==7.7.1 for example`" + ) + if es_client is not None and (host is not None or port is not None): + raise ValueError("Please specify either `es_client` or `(host, port)`, but not both.") + host = host or "localhost" + port = port or 9200 + + import elasticsearch.helpers # noqa: F401 - need this to properly load all the es features + from elasticsearch import Elasticsearch # noqa: F811 + + self.es_client = es_client if es_client is not None else Elasticsearch([{"host": host, "port": str(port)}]) + self.es_index_name = ( + es_index_name + if es_index_name is not None + else "huggingface_datasets_" + os.path.basename(tempfile.NamedTemporaryFile().name) + ) + self.es_index_config = ( + es_index_config + if es_index_config is not None + else { + "settings": { + "number_of_shards": 1, + "analysis": {"analyzer": {"stop_standard": {"type": "standard", " stopwords": "_english_"}}}, + }, + "mappings": {"properties": {"text": {"type": "text", "analyzer": "standard", "similarity": "BM25"}}}, + } + ) + + def add_documents(self, documents: Union[list[str], "Dataset"], column: Optional[str] = None): + """ + Add documents to the index. + If the documents are inside a certain column, you can specify it using the `column` argument. + """ + index_name = self.es_index_name + index_config = self.es_index_config + self.es_client.indices.create(index=index_name, body=index_config) + number_of_docs = len(documents) + progress = hf_tqdm(unit="docs", total=number_of_docs) + successes = 0 + + def passage_generator(): + if column is not None: + for i, example in enumerate(documents): + yield {"text": example[column], "_id": i} + else: + for i, example in enumerate(documents): + yield {"text": example, "_id": i} + + # create the ES index + import elasticsearch as es + + for ok, action in es.helpers.streaming_bulk( + client=self.es_client, + index=index_name, + actions=passage_generator(), + ): + progress.update(1) + successes += ok + if successes != len(documents): + logger.warning( + f"Some documents failed to be added to ElasticSearch. Failures: {len(documents) - successes}/{len(documents)}" + ) + logger.info(f"Indexed {successes:d} documents") + + def search(self, query: str, k=10, **kwargs) -> SearchResults: + """Find the nearest examples indices to the query. + + Args: + query (`str`): The query as a string. + k (`int`): The number of examples to retrieve. + + Output: + scores (`List[List[float]`): The retrieval scores of the retrieved examples. + indices (`List[List[int]]`): The indices of the retrieved examples. + """ + response = self.es_client.search( + index=self.es_index_name, + body={"query": {"multi_match": {"query": query, "fields": ["text"], "type": "cross_fields"}}, "size": k}, + **kwargs, + ) + hits = response["hits"]["hits"] + return SearchResults([hit["_score"] for hit in hits], [int(hit["_id"]) for hit in hits]) + + def search_batch(self, queries, k: int = 10, max_workers=10, **kwargs) -> BatchedSearchResults: + import concurrent.futures + + total_scores, total_indices = [None] * len(queries), [None] * len(queries) + with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: + future_to_index = {executor.submit(self.search, query, k, **kwargs): i for i, query in enumerate(queries)} + for future in concurrent.futures.as_completed(future_to_index): + index = future_to_index[future] + results: SearchResults = future.result() + total_scores[index] = results.scores + total_indices[index] = results.indices + return BatchedSearchResults(total_indices=total_indices, total_scores=total_scores) + + +class FaissIndex(BaseIndex): + """ + Dense index using Faiss. It is used to index vectors. + Faiss is a library for efficient similarity search and clustering of dense vectors. + It contains algorithms that search in sets of vectors of any size, up to ones that possibly do not fit in RAM. + You can find more information about Faiss here: + - For index types and the string factory: https://github.com/facebookresearch/faiss/wiki/The-index-factory + - For GPU settings: https://github.com/facebookresearch/faiss/wiki/Faiss-on-the-GPU + """ + + def __init__( + self, + device: Optional[Union[int, list[int]]] = None, + string_factory: Optional[str] = None, + metric_type: Optional[int] = None, + custom_index: Optional["faiss.Index"] = None, + ): + """ + Create a Dense index using Faiss. You can specify `device` if you want to run it on GPU (`device` must be the GPU index). + You can find more information about Faiss here: + - For `string factory`: https://github.com/facebookresearch/faiss/wiki/The-index-factory + """ + if string_factory is not None and custom_index is not None: + raise ValueError("Please specify either `string_factory` or `custom_index` but not both.") + if device is not None and custom_index is not None: + raise ValueError( + "Cannot pass both 'custom_index' and 'device'. " + "Pass 'custom_index' already transferred to the target device instead." + ) + self.device = device + self.string_factory = string_factory + self.metric_type = metric_type + self.faiss_index = custom_index + if not _has_faiss: + raise ImportError( + "You must install Faiss to use FaissIndex. To do so you can run `conda install -c pytorch faiss-cpu` or `conda install -c pytorch faiss-gpu`. " + "A community supported package is also available on pypi: `pip install faiss-cpu` or `pip install faiss-gpu`. " + "Note that pip may not have the latest version of FAISS, and thus, some of the latest features and bug fixes may not be available." + ) + + def add_vectors( + self, + vectors: Union[np.array, "Dataset"], + column: Optional[str] = None, + batch_size: int = 1000, + train_size: Optional[int] = None, + faiss_verbose: Optional[bool] = None, + ): + """ + Add vectors to the index. + If the arrays are inside a certain column, you can specify it using the `column` argument. + """ + import faiss # noqa: F811 + + if column and not isinstance(vectors.features[column], List): + raise ValueError( + f"Wrong feature type for column '{column}'. Expected 1d array, got {vectors.features[column]}" + ) + + # Create index + if self.faiss_index is None: + size = len(vectors[0]) if column is None else len(vectors[0][column]) + if self.string_factory is not None: + if self.metric_type is None: + index = faiss.index_factory(size, self.string_factory) + else: + index = faiss.index_factory(size, self.string_factory, self.metric_type) + else: + if self.metric_type is None: + index = faiss.IndexFlat(size) + else: + index = faiss.IndexFlat(size, self.metric_type) + + self.faiss_index = self._faiss_index_to_device(index, self.device) + logger.info(f"Created faiss index of type {type(self.faiss_index)}") + + # Set verbosity level + if faiss_verbose is not None: + self.faiss_index.verbose = faiss_verbose + if hasattr(self.faiss_index, "index") and self.faiss_index.index is not None: + self.faiss_index.index.verbose = faiss_verbose + if hasattr(self.faiss_index, "quantizer") and self.faiss_index.quantizer is not None: + self.faiss_index.quantizer.verbose = faiss_verbose + if hasattr(self.faiss_index, "clustering_index") and self.faiss_index.clustering_index is not None: + self.faiss_index.clustering_index.verbose = faiss_verbose + + # Train + if train_size is not None: + train_vecs = vectors[:train_size] if column is None else vectors[:train_size][column] + logger.info(f"Training the index with the first {len(train_vecs)} vectors") + self.faiss_index.train(train_vecs) + else: + logger.info("Ignored the training step of the faiss index as `train_size` is None.") + + # Add vectors + logger.info(f"Adding {len(vectors)} vectors to the faiss index") + for i in hf_tqdm(range(0, len(vectors), batch_size)): + vecs = vectors[i : i + batch_size] if column is None else vectors[i : i + batch_size][column] + self.faiss_index.add(vecs) + + @staticmethod + def _faiss_index_to_device(index: "faiss.Index", device: Optional[Union[int, list[int]]] = None) -> "faiss.Index": + """ + Sends a faiss index to a device. + A device can either be a positive integer (GPU id), a negative integer (all GPUs), + or a list of positive integers (select GPUs to use), or `None` for CPU. + """ + + # If device is not specified, then it runs on CPU. + if device is None: + return index + + import faiss # noqa: F811 + + # If the device id is given as an integer + if isinstance(device, int): + # Positive integers are directly mapped to GPU ids + if device > -1: + faiss_res = faiss.StandardGpuResources() + index = faiss.index_cpu_to_gpu(faiss_res, device, index) + # And negative integers mean using all GPUs + else: + index = faiss.index_cpu_to_all_gpus(index) + # Device ids given as a list mean mapping to those devices specified. + elif isinstance(device, (list, tuple)): + index = faiss.index_cpu_to_gpus_list(index, gpus=list(device)) + else: + raise TypeError( + f"The argument type: {type(device)} is not expected. " + + "Please pass in either nothing, a positive int, a negative int, or a list of positive ints." + ) + + return index + + def search(self, query: np.array, k=10, **kwargs) -> SearchResults: + """Find the nearest examples indices to the query. + + Args: + query (`np.array`): The query as a numpy array. + k (`int`): The number of examples to retrieve. + + Output: + scores (`List[List[float]`): The retrieval scores of the retrieved examples. + indices (`List[List[int]]`): The indices of the retrieved examples. + """ + if len(query.shape) != 1 and (len(query.shape) != 2 or query.shape[0] != 1): + raise ValueError("Shape of query is incorrect, it has to be either a 1D array or 2D (1, N)") + + queries = query.reshape(1, -1) + if not queries.flags.c_contiguous: + queries = np.asarray(queries, order="C") + scores, indices = self.faiss_index.search(queries, k, **kwargs) + return SearchResults(scores[0], indices[0].astype(int)) + + def search_batch(self, queries: np.array, k=10, **kwargs) -> BatchedSearchResults: + """Find the nearest examples indices to the queries. + + Args: + queries (`np.array`): The queries as a numpy array. + k (`int`): The number of examples to retrieve. + + Output: + total_scores (`List[List[float]`): The retrieval scores of the retrieved examples per query. + total_indices (`List[List[int]]`): The indices of the retrieved examples per query. + """ + if len(queries.shape) != 2: + raise ValueError("Shape of query must be 2D") + if not queries.flags.c_contiguous: + queries = np.asarray(queries, order="C") + scores, indices = self.faiss_index.search(queries, k, **kwargs) + return BatchedSearchResults(scores, indices.astype(int)) + + def save(self, file: Union[str, PurePath], storage_options: Optional[dict] = None): + """Serialize the FaissIndex on disk""" + import faiss # noqa: F811 + + if self.device is not None and isinstance(self.device, (int, list, tuple)): + index = faiss.index_gpu_to_cpu(self.faiss_index) + else: + index = self.faiss_index + + with fsspec.open(str(file), "wb", **(storage_options or {})) as f: + faiss.write_index(index, faiss.BufferedIOWriter(faiss.PyCallbackIOWriter(f.write))) + + @classmethod + def load( + cls, + file: Union[str, PurePath], + device: Optional[Union[int, list[int]]] = None, + storage_options: Optional[dict] = None, + ) -> "FaissIndex": + """Deserialize the FaissIndex from disk""" + import faiss # noqa: F811 + + # Instances of FaissIndex is essentially just a wrapper for faiss indices. + faiss_index = cls(device=device) + with fsspec.open(str(file), "rb", **(storage_options or {})) as f: + index = faiss.read_index(faiss.BufferedIOReader(faiss.PyCallbackIOReader(f.read))) + faiss_index.faiss_index = faiss_index._faiss_index_to_device(index, faiss_index.device) + return faiss_index + + +class IndexableMixin: + """Add indexing features to `datasets.Dataset`""" + + def __init__(self): + self._indexes: dict[str, BaseIndex] = {} + + def __len__(self): + raise NotImplementedError + + def __getitem__(self, key): + raise NotImplementedError + + def is_index_initialized(self, index_name: str) -> bool: + return index_name in self._indexes + + def _check_index_is_initialized(self, index_name: str): + if not self.is_index_initialized(index_name): + raise MissingIndex( + f"Index with index_name '{index_name}' not initialized yet. Please make sure that you call `add_faiss_index` or `add_elasticsearch_index` first." + ) + + def list_indexes(self) -> list[str]: + """List the `colindex_nameumns`/identifiers of all the attached indexes.""" + return list(self._indexes) + + def get_index(self, index_name: str) -> BaseIndex: + """List the `index_name`/identifiers of all the attached indexes. + + Args: + index_name (`str`): Index name. + + Returns: + [`BaseIndex`] + """ + self._check_index_is_initialized(index_name) + return self._indexes[index_name] + + def add_faiss_index( + self, + column: str, + index_name: Optional[str] = None, + device: Optional[Union[int, list[int]]] = None, + string_factory: Optional[str] = None, + metric_type: Optional[int] = None, + custom_index: Optional["faiss.Index"] = None, + batch_size: int = 1000, + train_size: Optional[int] = None, + faiss_verbose: bool = False, + ): + """Add a dense index using Faiss for fast retrieval. + The index is created using the vectors of the specified column. + You can specify `device` if you want to run it on GPU (`device` must be the GPU index, see more below). + You can find more information about Faiss here: + - For `string factory`: https://github.com/facebookresearch/faiss/wiki/The-index-factory + + Args: + column (`str`): The column of the vectors to add to the index. + index_name (Optional `str`): The index_name/identifier of the index. This is the index_name that is used to call `.get_nearest` or `.search`. + By default it corresponds to `column`. + device (Optional `Union[int, List[int]]`): If positive integer, this is the index of the GPU to use. If negative integer, use all GPUs. + If a list of positive integers is passed in, run only on those GPUs. By default it uses the CPU. + string_factory (Optional `str`): This is passed to the index factory of Faiss to create the index. Default index class is IndexFlatIP. + metric_type (Optional `int`): Type of metric. Ex: `faiss.METRIC_INNER_PRODUCT` or `faiss.METRIC_L2`. + custom_index (Optional `faiss.Index`): Custom Faiss index that you already have instantiated and configured for your needs. + batch_size (Optional `int`): Size of the batch to use while adding vectors to the FaissIndex. Default value is 1000. + + train_size (Optional `int`): If the index needs a training step, specifies how many vectors will be used to train the index. + faiss_verbose (`bool`, defaults to False): Enable the verbosity of the Faiss index. + """ + index_name = index_name if index_name is not None else column + faiss_index = FaissIndex( + device=device, string_factory=string_factory, metric_type=metric_type, custom_index=custom_index + ) + faiss_index.add_vectors( + self, column=column, batch_size=batch_size, train_size=train_size, faiss_verbose=faiss_verbose + ) + self._indexes[index_name] = faiss_index + + def add_faiss_index_from_external_arrays( + self, + external_arrays: np.array, + index_name: str, + device: Optional[Union[int, list[int]]] = None, + string_factory: Optional[str] = None, + metric_type: Optional[int] = None, + custom_index: Optional["faiss.Index"] = None, + batch_size: int = 1000, + train_size: Optional[int] = None, + faiss_verbose: bool = False, + ): + """Add a dense index using Faiss for fast retrieval. + The index is created using the vectors of `external_arrays`. + You can specify `device` if you want to run it on GPU (`device` must be the GPU index). + You can find more information about Faiss here: + - For `string factory`: https://github.com/facebookresearch/faiss/wiki/The-index-factory + + Args: + external_arrays (`np.array`): If you want to use arrays from outside the lib for the index, you can set `external_arrays`. + It will use `external_arrays` to create the Faiss index instead of the arrays in the given `column`. + index_name (`str`): The index_name/identifier of the index. This is the index_name that is used to call `.get_nearest` or `.search`. + device (Optional `Union[int, List[int]]`): If positive integer, this is the index of the GPU to use. If negative integer, use all GPUs. + If a list of positive integers is passed in, run only on those GPUs. By default it uses the CPU. + string_factory (Optional `str`): This is passed to the index factory of Faiss to create the index. Default index class is IndexFlatIP. + metric_type (Optional `int`): Type of metric. Ex: `faiss.METRIC_INNER_PRODUCT` or `faiss.METRIC_L2`. + custom_index (Optional `faiss.Index`): Custom Faiss index that you already have instantiated and configured for your needs. + batch_size (Optional `int`): Size of the batch to use while adding vectors to the FaissIndex. Default value is 1000. + + train_size (Optional `int`): If the index needs a training step, specifies how many vectors will be used to train the index. + faiss_verbose (`bool`, defaults to False): Enable the verbosity of the Faiss index. + """ + faiss_index = FaissIndex( + device=device, string_factory=string_factory, metric_type=metric_type, custom_index=custom_index + ) + faiss_index.add_vectors( + external_arrays, column=None, batch_size=batch_size, train_size=train_size, faiss_verbose=faiss_verbose + ) + self._indexes[index_name] = faiss_index + + def save_faiss_index(self, index_name: str, file: Union[str, PurePath], storage_options: Optional[dict] = None): + """Save a FaissIndex on disk. + + Args: + index_name (`str`): The index_name/identifier of the index. This is the index_name that is used to call `.get_nearest` or `.search`. + file (`str`): The path to the serialized faiss index on disk or remote URI (e.g. `"s3://my-bucket/index.faiss"`). + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the file-system backend, if any. + + + + """ + index = self.get_index(index_name) + if not isinstance(index, FaissIndex): + raise ValueError(f"Index '{index_name}' is not a FaissIndex but a '{type(index)}'") + index.save(file, storage_options=storage_options) + logger.info(f"Saved FaissIndex {index_name} at {file}") + + def load_faiss_index( + self, + index_name: str, + file: Union[str, PurePath], + device: Optional[Union[int, list[int]]] = None, + storage_options: Optional[dict] = None, + ): + """Load a FaissIndex from disk. + + If you want to do additional configurations, you can have access to the faiss index object by doing + `.get_index(index_name).faiss_index` to make it fit your needs. + + Args: + index_name (`str`): The index_name/identifier of the index. This is the index_name that is used to + call `.get_nearest` or `.search`. + file (`str`): The path to the serialized faiss index on disk or remote URI (e.g. `"s3://my-bucket/index.faiss"`). + device (Optional `Union[int, List[int]]`): If positive integer, this is the index of the GPU to use. If negative integer, use all GPUs. + If a list of positive integers is passed in, run only on those GPUs. By default it uses the CPU. + storage_options (`dict`, *optional*): + Key/value pairs to be passed on to the file-system backend, if any. + + + + """ + index = FaissIndex.load(file, device=device, storage_options=storage_options) + if index.faiss_index.ntotal != len(self): + raise ValueError( + f"Index size should match Dataset size, but Index '{index_name}' at {file} has {index.faiss_index.ntotal} elements while the dataset has {len(self)} examples." + ) + self._indexes[index_name] = index + logger.info(f"Loaded FaissIndex {index_name} from {file}") + + def add_elasticsearch_index( + self, + column: str, + index_name: Optional[str] = None, + host: Optional[str] = None, + port: Optional[int] = None, + es_client: Optional["Elasticsearch"] = None, + es_index_name: Optional[str] = None, + es_index_config: Optional[dict] = None, + ): + """Add a text index using ElasticSearch for fast retrieval. + + Args: + column (`str`): The column of the documents to add to the index. + index_name (Optional `str`): The index_name/identifier of the index. This is the index name that is used to call `.get_nearest` or `.search`. + By default it corresponds to `column`. + host (Optional `str`, defaults to localhost): + host of where ElasticSearch is running + port (Optional `str`, defaults to 9200): + port of where ElasticSearch is running + es_client (Optional `elasticsearch.Elasticsearch`): + The elasticsearch client used to create the index if host and port are None. + es_index_name (Optional `str`): The elasticsearch index name used to create the index. + es_index_config (Optional `dict`): + The configuration of the elasticsearch index. + Default config is: + + Config:: + + { + "settings": { + "number_of_shards": 1, + "analysis": {"analyzer": {"stop_standard": {"type": "standard", " stopwords": "_english_"}}}, + }, + "mappings": { + "properties": { + "text": { + "type": "text", + "analyzer": "standard", + "similarity": "BM25" + }, + } + }, + } + """ + index_name = index_name if index_name is not None else column + es_index = ElasticSearchIndex( + host=host, port=port, es_client=es_client, es_index_name=es_index_name, es_index_config=es_index_config + ) + es_index.add_documents(self, column=column) + self._indexes[index_name] = es_index + + def load_elasticsearch_index( + self, + index_name: str, + es_index_name: str, + host: Optional[str] = None, + port: Optional[int] = None, + es_client: Optional["Elasticsearch"] = None, + es_index_config: Optional[dict] = None, + ): + """Load an existing text index using ElasticSearch for fast retrieval. + + Args: + index_name (`str`): + The `index_name`/identifier of the index. This is the index name that is used to call `get_nearest` or `search`. + es_index_name (`str`): + The name of elasticsearch index to load. + host (`str`, *optional*, defaults to `localhost`): + Host of where ElasticSearch is running. + port (`str`, *optional*, defaults to `9200`): + Port of where ElasticSearch is running. + es_client (`elasticsearch.Elasticsearch`, *optional*): + The elasticsearch client used to create the index if host and port are `None`. + es_index_config (`dict`, *optional*): + The configuration of the elasticsearch index. + Default config is: + ``` + { + "settings": { + "number_of_shards": 1, + "analysis": {"analyzer": {"stop_standard": {"type": "standard", " stopwords": "_english_"}}}, + }, + "mappings": { + "properties": { + "text": { + "type": "text", + "analyzer": "standard", + "similarity": "BM25" + }, + } + }, + } + ``` + """ + self._indexes[index_name] = ElasticSearchIndex( + host=host, port=port, es_client=es_client, es_index_name=es_index_name, es_index_config=es_index_config + ) + + def drop_index(self, index_name: str): + """Drop the index with the specified column. + + Args: + index_name (`str`): + The `index_name`/identifier of the index. + """ + del self._indexes[index_name] + + def search(self, index_name: str, query: Union[str, np.array], k: int = 10, **kwargs) -> SearchResults: + """Find the nearest examples indices in the dataset to the query. + + Args: + index_name (`str`): + The name/identifier of the index. + query (`Union[str, np.ndarray]`): + The query as a string if `index_name` is a text index or as a numpy array if `index_name` is a vector index. + k (`int`): + The number of examples to retrieve. + + Returns: + `(scores, indices)`: + A tuple of `(scores, indices)` where: + - **scores** (`List[List[float]`): the retrieval scores from either FAISS (`IndexFlatL2` by default) or ElasticSearch of the retrieved examples + - **indices** (`List[List[int]]`): the indices of the retrieved examples + """ + self._check_index_is_initialized(index_name) + return self._indexes[index_name].search(query, k, **kwargs) + + def search_batch( + self, index_name: str, queries: Union[list[str], np.array], k: int = 10, **kwargs + ) -> BatchedSearchResults: + """Find the nearest examples indices in the dataset to the query. + + Args: + index_name (`str`): + The `index_name`/identifier of the index. + queries (`Union[List[str], np.ndarray]`): + The queries as a list of strings if `index_name` is a text index or as a numpy array if `index_name` is a vector index. + k (`int`): + The number of examples to retrieve per query. + + Returns: + `(total_scores, total_indices)`: + A tuple of `(total_scores, total_indices)` where: + - **total_scores** (`List[List[float]`): the retrieval scores from either FAISS (`IndexFlatL2` by default) or ElasticSearch of the retrieved examples per query + - **total_indices** (`List[List[int]]`): the indices of the retrieved examples per query + """ + self._check_index_is_initialized(index_name) + return self._indexes[index_name].search_batch(queries, k, **kwargs) + + def get_nearest_examples( + self, index_name: str, query: Union[str, np.array], k: int = 10, **kwargs + ) -> NearestExamplesResults: + """Find the nearest examples in the dataset to the query. + + Args: + index_name (`str`): + The index_name/identifier of the index. + query (`Union[str, np.ndarray]`): + The query as a string if `index_name` is a text index or as a numpy array if `index_name` is a vector index. + k (`int`): + The number of examples to retrieve. + + Returns: + `(scores, examples)`: + A tuple of `(scores, examples)` where: + - **scores** (`List[float]`): the retrieval scores from either FAISS (`IndexFlatL2` by default) or ElasticSearch of the retrieved examples + - **examples** (`dict`): the retrieved examples + """ + self._check_index_is_initialized(index_name) + scores, indices = self.search(index_name, query, k, **kwargs) + top_indices = [i for i in indices if i >= 0] + return NearestExamplesResults(scores[: len(top_indices)], self[top_indices]) + + def get_nearest_examples_batch( + self, index_name: str, queries: Union[list[str], np.array], k: int = 10, **kwargs + ) -> BatchedNearestExamplesResults: + """Find the nearest examples in the dataset to the query. + + Args: + index_name (`str`): + The `index_name`/identifier of the index. + queries (`Union[List[str], np.ndarray]`): + The queries as a list of strings if `index_name` is a text index or as a numpy array if `index_name` is a vector index. + k (`int`): + The number of examples to retrieve per query. + + Returns: + `(total_scores, total_examples)`: + A tuple of `(total_scores, total_examples)` where: + - **total_scores** (`List[List[float]`): the retrieval scores from either FAISS (`IndexFlatL2` by default) or ElasticSearch of the retrieved examples per query + - **total_examples** (`List[dict]`): the retrieved examples per query + """ + self._check_index_is_initialized(index_name) + total_scores, total_indices = self.search_batch(index_name, queries, k, **kwargs) + total_scores = [ + scores_i[: len([i for i in indices_i if i >= 0])] + for scores_i, indices_i in zip(total_scores, total_indices) + ] + total_samples = [self[[i for i in indices if i >= 0]] for indices in total_indices] + return BatchedNearestExamplesResults(total_scores, total_samples) diff --git a/src/datasets/splits.py b/src/datasets/splits.py new file mode 100644 index 0000000..7e8ea95 --- /dev/null +++ b/src/datasets/splits.py @@ -0,0 +1,647 @@ +# Copyright 2020 The HuggingFace Datasets Authors and the TensorFlow Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""Splits related API.""" + +import abc +import collections +import copy +import dataclasses +import re +from dataclasses import dataclass +from typing import Optional, Union + +from .arrow_reader import FileInstructions, make_file_instructions +from .naming import _split_re +from .utils.py_utils import NonMutableDict, asdict + + +@dataclass +class SplitInfo: + name: str = dataclasses.field(default="", metadata={"include_in_asdict_even_if_is_default": True}) + num_bytes: int = dataclasses.field(default=0, metadata={"include_in_asdict_even_if_is_default": True}) + num_examples: int = dataclasses.field(default=0, metadata={"include_in_asdict_even_if_is_default": True}) + shard_lengths: Optional[list[int]] = None + original_shard_lengths: Optional[list[int]] = None + + # Deprecated + # For backward compatibility, this field needs to always be included in files like + # dataset_infos.json and dataset_info.json files + # To do so, we always include it in the output of datasets.utils.py_utils.asdict(split_info) + dataset_name: Optional[str] = dataclasses.field( + default=None, metadata={"include_in_asdict_even_if_is_default": True} + ) + + @property + def file_instructions(self): + """Returns the list of dict(filename, take, skip).""" + # `self.dataset_name` is assigned in `SplitDict.add()`. + instructions = make_file_instructions( + name=self.dataset_name, + split_infos=[self], + instruction=str(self.name), + ) + return instructions.file_instructions + + def __repr__(self): + return ( + self.__class__.__qualname__ + + "(" + + ", ".join( + [f"{f.name}={repr(getattr(self, f.name))}" for f in dataclasses.fields(self) if getattr(self, f.name)] + ) + + ")" + ) + + +@dataclass +class SubSplitInfo: + """Wrapper around a sub split info. + This class exposes info on the subsplit: + ``` + ds, info = datasets.load_dataset(..., split='train[75%:]', with_info=True) + info.splits['train[75%:]'].num_examples + ``` + """ + + instructions: FileInstructions + + @property + def num_examples(self): + """Returns the number of examples in the subsplit.""" + return self.instructions.num_examples + + @property + def file_instructions(self): + """Returns the list of dict(filename, take, skip).""" + return self.instructions.file_instructions + + +class SplitBase(metaclass=abc.ABCMeta): + # pylint: disable=line-too-long + """Abstract base class for Split compositionality. + + See the + [guide on splits](../loading#slice-splits) + for more information. + + There are three parts to the composition: + 1) The splits are composed (defined, merged, split,...) together before + calling the `.as_dataset()` function. This is done with the `__add__`, + `__getitem__`, which return a tree of `SplitBase` (whose leaf + are the `NamedSplit` objects) + + ``` + split = datasets.Split.TRAIN + datasets.Split.TEST.subsplit(datasets.percent[:50]) + ``` + + 2) The `SplitBase` is forwarded to the `.as_dataset()` function + to be resolved into actual read instruction. This is done by the + `.get_read_instruction()` method which takes the real dataset splits + (name, number of shards,...) and parse the tree to return a + `SplitReadInstruction()` object + + ``` + read_instruction = split.get_read_instruction(self.info.splits) + ``` + + 3) The `SplitReadInstruction` is then used in the `tf.data.Dataset` pipeline + to define which files to read and how to skip examples within file. + + """ + + # pylint: enable=line-too-long + + @abc.abstractmethod + def get_read_instruction(self, split_dict): + """Parse the descriptor tree and compile all read instructions together. + + Args: + split_dict: `dict`, The `dict[split_name, SplitInfo]` of the dataset + + Returns: + split_read_instruction: `SplitReadInstruction` + """ + raise NotImplementedError("Abstract method") + + def __eq__(self, other): + """Equality: datasets.Split.TRAIN == 'train'.""" + if isinstance(other, (NamedSplit, str)): + return False + raise NotImplementedError("Equality is not implemented between merged/sub splits.") + + def __ne__(self, other): + """InEquality: datasets.Split.TRAIN != 'test'.""" + return not self.__eq__(other) + + def __add__(self, other): + """Merging: datasets.Split.TRAIN + datasets.Split.TEST.""" + return _SplitMerged(self, other) + + def subsplit(self, arg=None, k=None, percent=None, weighted=None): # pylint: disable=redefined-outer-name + """Divides this split into subsplits. + + There are 3 ways to define subsplits, which correspond to the 3 + arguments `k` (get `k` even subsplits), `percent` (get a slice of the + dataset with `datasets.percent`), and `weighted` (get subsplits with proportions + specified by `weighted`). + + Example:: + + ``` + # 50% train, 50% test + train, test = split.subsplit(k=2) + # 50% train, 25% test, 25% validation + train, test, validation = split.subsplit(weighted=[2, 1, 1]) + # Extract last 20% + subsplit = split.subsplit(datasets.percent[-20:]) + ``` + + Warning: k and weighted will be converted into percent which mean that + values below the percent will be rounded up or down. The final split may be + bigger to deal with remainders. For instance: + + ``` + train, test, valid = split.subsplit(k=3) # 33%, 33%, 34% + s1, s2, s3, s4 = split.subsplit(weighted=[2, 2, 1, 1]) # 33%, 33%, 16%, 18% + ``` + + Args: + arg: If no kwargs are given, `arg` will be interpreted as one of + `k`, `percent`, or `weighted` depending on the type. + For example: + ``` + split.subsplit(10) # Equivalent to split.subsplit(k=10) + split.subsplit(datasets.percent[:-20]) # percent=datasets.percent[:-20] + split.subsplit([1, 1, 2]) # weighted=[1, 1, 2] + ``` + k: `int` If set, subdivide the split into `k` equal parts. + percent: `datasets.percent slice`, return a single subsplit corresponding to + a slice of the original split. For example: + `split.subsplit(datasets.percent[-20:]) # Last 20% of the dataset`. + weighted: `list[int]`, return a list of subsplits whose proportions match + the normalized sum of the list. For example: + `split.subsplit(weighted=[1, 1, 2]) # 25%, 25%, 50%`. + + Returns: + A subsplit or list of subsplits extracted from this split object. + """ + # Note that the percent kwargs redefine the outer name datasets.percent. This + # is done for consistency (.subsplit(percent=datasets.percent[:40])) + if sum(bool(x) for x in (arg, k, percent, weighted)) != 1: + raise ValueError("Only one argument of subsplit should be set.") + + # Auto deduce k + if isinstance(arg, int): + k = arg + elif isinstance(arg, slice): + percent = arg + elif isinstance(arg, list): + weighted = arg + + if not (k or percent or weighted): + raise ValueError( + f"Invalid split argument {arg}. Only list, slice and int supported. " + "One of k, weighted or percent should be set to a non empty value." + ) + + def assert_slices_coverage(slices): + # Ensure that the expended slices cover all percents. + assert sum((list(range(*s.indices(100))) for s in slices), []) == list(range(100)) + + if k: + if not 0 < k <= 100: + raise ValueError(f"Subsplit k should be between 0 and 100, got {k}") + shift = 100 // k + slices = [slice(i * shift, (i + 1) * shift) for i in range(k)] + # Round up last element to ensure all elements are taken + slices[-1] = slice(slices[-1].start, 100) + # Internal check to ensure full coverage + assert_slices_coverage(slices) + return tuple(_SubSplit(self, s) for s in slices) + elif percent: + return _SubSplit(self, percent) + elif weighted: + # Normalize the weighted sum + total = sum(weighted) + weighted = [100 * x // total for x in weighted] + # Create the slice for each of the elements + start = 0 + stop = 0 + slices = [] + for v in weighted: + stop += v + slices.append(slice(start, stop)) + start = stop + # Round up last element to ensure all elements are taken + slices[-1] = slice(slices[-1].start, 100) + # Internal check to ensure full coverage + assert_slices_coverage(slices) + return tuple(_SubSplit(self, s) for s in slices) + else: + # Should not be possible + raise ValueError("Could not determine the split") + + +# 2 requirements: +# 1. datasets.percent be sliceable +# 2. datasets.percent be documented +# +# Instances are not documented, so we want datasets.percent to be a class, but to +# have it be sliceable, we need this metaclass. +class PercentSliceMeta(type): + def __getitem__(cls, slice_value): + if not isinstance(slice_value, slice): + raise ValueError(f"datasets.percent should only be called with slice, not {slice_value}") + return slice_value + + +class PercentSlice(metaclass=PercentSliceMeta): + # pylint: disable=line-too-long + """Syntactic sugar for defining slice subsplits: `datasets.percent[75:-5]`. + + See the + [guide on splits](../loading#slice-splits) + for more information. + """ + + # pylint: enable=line-too-long + pass + + +percent = PercentSlice # pylint: disable=invalid-name + + +class _SplitMerged(SplitBase): + """Represent two split descriptors merged together.""" + + def __init__(self, split1, split2): + self._split1 = split1 + self._split2 = split2 + + def get_read_instruction(self, split_dict): + read_instruction1 = self._split1.get_read_instruction(split_dict) + read_instruction2 = self._split2.get_read_instruction(split_dict) + return read_instruction1 + read_instruction2 + + def __repr__(self): + return f"({repr(self._split1)} + {repr(self._split2)})" + + +class _SubSplit(SplitBase): + """Represent a sub split of a split descriptor.""" + + def __init__(self, split, slice_value): + self._split = split + self._slice_value = slice_value + + def get_read_instruction(self, split_dict): + return self._split.get_read_instruction(split_dict)[self._slice_value] + + def __repr__(self): + slice_str = "{start}:{stop}" + if self._slice_value.step is not None: + slice_str += ":{step}" + slice_str = slice_str.format( + start="" if self._slice_value.start is None else self._slice_value.start, + stop="" if self._slice_value.stop is None else self._slice_value.stop, + step=self._slice_value.step, + ) + return f"{repr(self._split)}(datasets.percent[{slice_str}])" + + +class NamedSplit(SplitBase): + """Descriptor corresponding to a named split (train, test, ...). + + Example: + Each descriptor can be composed with other using addition or slice: + + ```py + split = datasets.Split.TRAIN.subsplit(datasets.percent[0:25]) + datasets.Split.TEST + ``` + + The resulting split will correspond to 25% of the train split merged with + 100% of the test split. + + A split cannot be added twice, so the following will fail: + + ```py + split = ( + datasets.Split.TRAIN.subsplit(datasets.percent[:25]) + + datasets.Split.TRAIN.subsplit(datasets.percent[75:]) + ) # Error + split = datasets.Split.TEST + datasets.Split.ALL # Error + ``` + + The slices can be applied only one time. So the following are valid: + + ```py + split = ( + datasets.Split.TRAIN.subsplit(datasets.percent[:25]) + + datasets.Split.TEST.subsplit(datasets.percent[:50]) + ) + split = (datasets.Split.TRAIN + datasets.Split.TEST).subsplit(datasets.percent[:50]) + ``` + + But this is not valid: + + ```py + train = datasets.Split.TRAIN + test = datasets.Split.TEST + split = train.subsplit(datasets.percent[:25]).subsplit(datasets.percent[:25]) + split = (train.subsplit(datasets.percent[:25]) + test).subsplit(datasets.percent[:50]) + ``` + """ + + def __init__(self, name: str): + self._name = name + split_names_from_instruction = [split_instruction.split("[")[0] for split_instruction in name.split("+")] + for split_name in split_names_from_instruction: + if not re.match(_split_re, split_name): + raise ValueError(f"Split name should match '{_split_re}' but got '{split_name}'.") + + def __str__(self): + return self._name + + def __repr__(self): + return f"NamedSplit({self._name!r})" + + def __eq__(self, other): + """Equality: datasets.Split.TRAIN == 'train'.""" + if isinstance(other, NamedSplit): + return self._name == other._name # pylint: disable=protected-access + elif isinstance(other, SplitBase): + return False + elif isinstance(other, str): # Other should be string + return self._name == other + else: + return False + + def __lt__(self, other): + return self._name < other._name # pylint: disable=protected-access + + def __hash__(self): + return hash(self._name) + + def get_read_instruction(self, split_dict): + return SplitReadInstruction(split_dict[self._name]) + + +class NamedSplitAll(NamedSplit): + """Split corresponding to the union of all defined dataset splits.""" + + def __init__(self): + super().__init__("all") + + def __repr__(self): + return "NamedSplitAll()" + + def get_read_instruction(self, split_dict): + # Merge all dataset splits together + read_instructions = [SplitReadInstruction(s) for s in split_dict.values()] + return sum(read_instructions, SplitReadInstruction()) + + +class Split: + # pylint: disable=line-too-long + """`Enum` for dataset splits. + + Datasets are typically split into different subsets to be used at various + stages of training and evaluation. + + - `TRAIN`: the training data. + - `VALIDATION`: the validation data. If present, this is typically used as + evaluation data while iterating on a model (e.g. changing hyperparameters, + model architecture, etc.). + - `TEST`: the testing data. This is the data to report metrics on. Typically + you do not want to use this during model iteration as you may overfit to it. + - `ALL`: the union of all defined dataset splits. + + All splits, including compositions inherit from `datasets.SplitBase`. + + See the [guide](../load_hub#splits) on splits for more information. + + Example: + + ```py + >>> datasets.SplitGenerator( + ... name=datasets.Split.TRAIN, + ... gen_kwargs={"split_key": "train", "files": dl_manager.download_and extract(url)}, + ... ), + ... datasets.SplitGenerator( + ... name=datasets.Split.VALIDATION, + ... gen_kwargs={"split_key": "validation", "files": dl_manager.download_and extract(url)}, + ... ), + ... datasets.SplitGenerator( + ... name=datasets.Split.TEST, + ... gen_kwargs={"split_key": "test", "files": dl_manager.download_and extract(url)}, + ... ) + ``` + """ + + # pylint: enable=line-too-long + TRAIN = NamedSplit("train") + TEST = NamedSplit("test") + VALIDATION = NamedSplit("validation") + ALL = NamedSplitAll() + + def __new__(cls, name): + """Create a custom split with datasets.Split('custom_name').""" + return NamedSplitAll() if name == "all" else NamedSplit(name) + + +# Similar to SplitInfo, but contain an additional slice info +SlicedSplitInfo = collections.namedtuple( + "SlicedSplitInfo", + [ + "split_info", + "slice_value", + ], +) # noqa: E231 + + +class SplitReadInstruction: + """Object containing the reading instruction for the dataset. + + Similarly to `SplitDescriptor` nodes, this object can be composed with itself, + but the resolution happens instantaneously, instead of keeping track of the + tree, such as all instructions are compiled and flattened in a single + SplitReadInstruction object containing the list of files and slice to use. + + Once resolved, the instructions can be accessed with: + + ``` + read_instructions.get_list_sliced_split_info() # List of splits to use + ``` + + """ + + def __init__(self, split_info=None): + self._splits = NonMutableDict(error_msg="Overlap between splits. Split {key} has been added with itself.") + + if split_info: + self.add(SlicedSplitInfo(split_info=split_info, slice_value=None)) + + def add(self, sliced_split): + """Add a SlicedSplitInfo the read instructions.""" + # TODO(epot): Check that the number of examples per shard % 100 == 0 + # Otherwise the slices value may be unbalanced and not exactly reflect the + # requested slice. + self._splits[sliced_split.split_info.name] = sliced_split + + def __add__(self, other): + """Merging split together.""" + # Will raise error if a split has already be added (NonMutableDict) + # TODO(epot): If a split is already added but there is no overlap between + # the slices, should merge the slices (ex: [:10] + [80:]) + split_instruction = SplitReadInstruction() + split_instruction._splits.update(self._splits) # pylint: disable=protected-access + split_instruction._splits.update(other._splits) # pylint: disable=protected-access + return split_instruction + + def __getitem__(self, slice_value): + """Sub-splits.""" + # Will raise an error if a split has already been sliced + split_instruction = SplitReadInstruction() + for v in self._splits.values(): + if v.slice_value is not None: + raise ValueError(f"Trying to slice Split {v.split_info.name} which has already been sliced") + v = v._asdict() + v["slice_value"] = slice_value + split_instruction.add(SlicedSplitInfo(**v)) + return split_instruction + + def get_list_sliced_split_info(self): + return list(self._splits.values()) + + +class SplitDict(dict[str, SplitInfo]): + """Split info object.""" + + def __init__(self, *args, dataset_name=None, **kwargs): + super().__init__(*args, **kwargs) + self.dataset_name = dataset_name + + def __getitem__(self, key: Union[SplitBase, str]): + # 1st case: The key exists: `info.splits['train']` + if str(key) in self: + return super().__getitem__(str(key)) + # 2nd case: Uses instructions: `info.splits['train[50%]']` + else: + instructions = make_file_instructions( + name=self.dataset_name, + split_infos=self.values(), + instruction=key, + ) + return SubSplitInfo(instructions) + + def __setitem__(self, key: Union[SplitBase, str], value: SplitInfo): + if key != value.name: + raise ValueError(f"Cannot add elem. (key mismatch: '{key}' != '{value.name}')") + super().__setitem__(key, value) + + def add(self, split_info: SplitInfo): + """Add the split info.""" + if split_info.name in self: + raise ValueError(f"Split {split_info.name} already present") + split_info.dataset_name = self.dataset_name + super().__setitem__(split_info.name, split_info) + + @property + def total_num_examples(self): + """Return the total number of examples.""" + return sum(s.num_examples for s in self.values()) + + @classmethod + def from_split_dict(cls, split_infos: Union[list, dict], dataset_name: Optional[str] = None): + """Returns a new SplitDict initialized from a Dict or List of `split_infos`.""" + if isinstance(split_infos, dict): + split_infos = list(split_infos.values()) + + if dataset_name is None: + dataset_name = split_infos[0].get("dataset_name") if split_infos else None + + split_dict = cls(dataset_name=dataset_name) + + for split_info in split_infos: + if isinstance(split_info, dict): + split_info = SplitInfo(**split_info) + split_dict.add(split_info) + + return split_dict + + def to_split_dict(self): + """Returns a list of SplitInfo protos that we have.""" + out = [] + for split_name, split_info in self.items(): + split_info = copy.deepcopy(split_info) + split_info.name = split_name + out.append(split_info) + return out + + def copy(self): + return SplitDict.from_split_dict(self.to_split_dict(), self.dataset_name) + + def _to_yaml_list(self) -> list: + out = [asdict(s) for s in self.to_split_dict()] + # we don't need the shard lengths in YAML + for split_info_dict in out: + split_info_dict.pop("shard_lengths", None) + split_info_dict.pop("original_shard_lengths", None) + # we don't need the dataset_name attribute that is deprecated + for split_info_dict in out: + split_info_dict.pop("dataset_name", None) + return out + + @classmethod + def _from_yaml_list(cls, yaml_data: list) -> "SplitDict": + return cls.from_split_dict(yaml_data) + + +@dataclass +class SplitGenerator: + """Defines the split information for the generator. + + This should be used as returned value of + `GeneratorBasedBuilder._split_generators`. + See `GeneratorBasedBuilder._split_generators` for more info and example + of usage. + + Args: + name (`str`): + Name of the `Split` for which the generator will + create the examples. + **gen_kwargs (additional keyword arguments): + Keyword arguments to forward to the `DatasetBuilder._generate_examples` method + of the builder. + + Example: + + ```py + >>> datasets.SplitGenerator( + ... name=datasets.Split.TRAIN, + ... gen_kwargs={"split_key": "train", "files": dl_manager.download_and_extract(url)}, + ... ) + ``` + """ + + name: str + gen_kwargs: dict = dataclasses.field(default_factory=dict) + split_info: SplitInfo = dataclasses.field(init=False) + + def __post_init__(self): + self.name = str(self.name) # Make sure we convert NamedSplits in strings + NamedSplit(self.name) # check that it's a valid split name + self.split_info = SplitInfo(name=self.name) diff --git a/src/datasets/streaming.py b/src/datasets/streaming.py new file mode 100644 index 0000000..6e5e8ee --- /dev/null +++ b/src/datasets/streaming.py @@ -0,0 +1,131 @@ +import importlib +from functools import wraps +from typing import TYPE_CHECKING, Optional + +from .download.download_config import DownloadConfig +from .utils.file_utils import ( + xbasename, + xdirname, + xet_parse, + xexists, + xgetsize, + xglob, + xgzip_open, + xisdir, + xisfile, + xjoin, + xlistdir, + xnumpy_load, + xopen, + xpandas_read_csv, + xpandas_read_excel, + xPath, + xpyarrow_parquet_read_table, + xrelpath, + xsio_loadmat, + xsplit, + xsplitext, + xwalk, + xxml_dom_minidom_parse, +) +from .utils.logging import get_logger +from .utils.patching import patch_submodule + + +logger = get_logger(__name__) + + +if TYPE_CHECKING: + from .builder import DatasetBuilder + + +def extend_module_for_streaming(module_path, download_config: Optional[DownloadConfig] = None): + """Extend the module to support streaming. + + We patch some functions in the module to use `fsspec` to support data streaming: + - We use `fsspec.open` to open and read remote files. We patch the module function: + - `open` + - We use the "::" hop separator to join paths and navigate remote compressed/archive files. We patch the module + functions: + - `os.path.join` + - `pathlib.Path.joinpath` and `pathlib.Path.__truediv__` (called when using the "/" operator) + + The patched functions are replaced with custom functions defined to work with the + :class:`~download.streaming_download_manager.StreamingDownloadManager`. + + Args: + module_path: Path to the module to be extended. + download_config: Mainly use `token` or `storage_options` to support different platforms and auth types. + """ + + module = importlib.import_module(module_path) + + # TODO(QL): always update the module to add subsequent new authentication without removing old ones + if hasattr(module, "_patched_for_streaming") and module._patched_for_streaming: + if isinstance(module._patched_for_streaming, DownloadConfig): + module._patched_for_streaming.token = download_config.token + module._patched_for_streaming.storage_options = download_config.storage_options + return + + def wrap_auth(function): + @wraps(function) + def wrapper(*args, **kwargs): + return function(*args, download_config=download_config, **kwargs) + + wrapper._decorator_name_ = "wrap_auth" + return wrapper + + # open files in a streaming fashion + patch_submodule(module, "open", wrap_auth(xopen)).start() + patch_submodule(module, "os.listdir", wrap_auth(xlistdir)).start() + patch_submodule(module, "os.walk", wrap_auth(xwalk)).start() + patch_submodule(module, "glob.glob", wrap_auth(xglob)).start() + # allow to navigate in remote zip files + patch_submodule(module, "os.path.join", xjoin).start() + patch_submodule(module, "os.path.dirname", xdirname).start() + patch_submodule(module, "os.path.basename", xbasename).start() + patch_submodule(module, "os.path.relpath", xrelpath).start() + patch_submodule(module, "os.path.split", xsplit).start() + patch_submodule(module, "os.path.splitext", xsplitext).start() + # allow checks on paths + patch_submodule(module, "os.path.exists", wrap_auth(xexists)).start() + patch_submodule(module, "os.path.isdir", wrap_auth(xisdir)).start() + patch_submodule(module, "os.path.isfile", wrap_auth(xisfile)).start() + patch_submodule(module, "os.path.getsize", wrap_auth(xgetsize)).start() + patch_submodule(module, "pathlib.Path", xPath).start() + # file readers + patch_submodule(module, "gzip.open", wrap_auth(xgzip_open)).start() + patch_submodule(module, "numpy.load", wrap_auth(xnumpy_load)).start() + patch_submodule(module, "pandas.read_csv", wrap_auth(xpandas_read_csv), attrs=["__version__"]).start() + patch_submodule(module, "pandas.read_excel", wrap_auth(xpandas_read_excel), attrs=["__version__"]).start() + patch_submodule(module, "scipy.io.loadmat", wrap_auth(xsio_loadmat), attrs=["__version__"]).start() + patch_submodule(module, "xml.etree.ElementTree.parse", wrap_auth(xet_parse)).start() + patch_submodule(module, "xml.dom.minidom.parse", wrap_auth(xxml_dom_minidom_parse)).start() + # pyarrow: do not patch pyarrow attribute in packaged modules + if not module.__name__.startswith("datasets.packaged_modules."): + patch_submodule(module, "pyarrow.parquet.read_table", wrap_auth(xpyarrow_parquet_read_table)).start() + module._patched_for_streaming = download_config + + +def extend_dataset_builder_for_streaming(builder: "DatasetBuilder"): + """Extend the dataset builder module and the modules imported by it to support streaming. + + Args: + builder (:class:`DatasetBuilder`): Dataset builder instance. + """ + # this extends the open and os.path.join functions for data streaming + download_config = DownloadConfig(storage_options=builder.storage_options, token=builder.token) + extend_module_for_streaming(builder.__module__, download_config=download_config) + + # builders can inherit from other builders that might use streaming functionality + # (for example, ImageFolder and AudioFolder inherit from FolderBuilder which implements examples generation) + # but these parents builders are not patched automatically as they are not instantiated, so we patch them here + from .builder import DatasetBuilder + + parent_builder_modules = [ + cls.__module__ + for cls in type(builder).__mro__[1:] # make sure it's not the same module we've already patched + if issubclass(cls, DatasetBuilder) and cls.__module__ != DatasetBuilder.__module__ + ] # check it's not a standard builder from datasets.builder + for module in parent_builder_modules: + extend_module_for_streaming(module, download_config=download_config) diff --git a/src/datasets/table.py b/src/datasets/table.py new file mode 100644 index 0000000..31aeede --- /dev/null +++ b/src/datasets/table.py @@ -0,0 +1,2482 @@ +import copy +import os +from collections.abc import Iterator +from functools import partial +from itertools import groupby +from typing import TYPE_CHECKING, Any, Callable, Optional, TypeVar, Union + +import numpy as np +import pyarrow as pa +import pyarrow.compute as pc + +from .utils.logging import get_logger + + +if TYPE_CHECKING: + from .features.features import Features, FeatureType + + +logger = get_logger(__name__) + + +def inject_arrow_table_documentation(arrow_table_method): + def wrapper(fn): + fn.__doc__ = arrow_table_method.__doc__ + (fn.__doc__ if fn.__doc__ is not None else "") + fn.__doc__ = fn.__doc__.replace("pyarrow.Table", "Table") + if hasattr(arrow_table_method, "__annotations__"): + fn.__annotations__ = arrow_table_method.__annotations__ + return fn + + return wrapper + + +def _in_memory_arrow_table_from_file(filename: str) -> pa.Table: + in_memory_stream = pa.input_stream(filename) + opened_stream = pa.ipc.open_stream(in_memory_stream) + pa_table = opened_stream.read_all() + return pa_table + + +def _in_memory_arrow_table_from_buffer(buffer: pa.Buffer) -> pa.Table: + stream = pa.BufferReader(buffer) + opened_stream = pa.ipc.open_stream(stream) + table = opened_stream.read_all() + return table + + +def _memory_mapped_record_batch_reader_from_file(filename: str) -> pa.RecordBatchStreamReader: + memory_mapped_stream = pa.memory_map(filename) + return pa.ipc.open_stream(memory_mapped_stream) + + +def read_schema_from_file(filename: str) -> pa.Schema: + """ + Infer arrow table schema from file without loading whole file into memory. + Useful especially while having very big files. + """ + with pa.memory_map(filename) as memory_mapped_stream: + schema = pa.ipc.open_stream(memory_mapped_stream).schema + return schema + + +def _batch_arrow_table(table: pa.Table) -> pa.Table: + batched_columns = [] + for column_name in table.column_names: + column = table[column_name].combine_chunks() + offsets = pa.array([0, len(column)], type=pa.int32()) + batched_columns.append(pa.ListArray.from_arrays(offsets, column)) + return pa.Table.from_arrays(batched_columns, names=table.column_names) + + +def _batch_accumulate_arrow_table_by_columns( + table: pa.Table, indices: list[int], columns: tuple[str], tables_accumulator: list[pa.Table], length: Optional[int] +) -> pa.Table: + accumulate_last_batch = length is None or indices[-1] + 1 < length + # keep accumulating if key is the same, otherwise include the accumulated tables + if tables_accumulator and accumulate_last_batch: + for column in columns: + if any(pc.not_equal(table[column], tables_accumulator[0][column][0]).to_pylist()): + break + else: + tables_accumulator.append(table) + empty_batched_table = pa.Table.from_arrays( + [ + pa.ListArray.from_arrays(pa.array([0], type=pa.int32()), table[column].chunk(0)) + for column in table.column_names + ], + names=table.column_names, + ) + return empty_batched_table + table = pa.concat_tables(tables_accumulator + [table]) + tables_accumulator[:] = [] + if len(table) == 0: + return table + # cut the table per key, i.e. when the columns change value + if len(table) > 1: + cut_array = pc.not_equal(table[columns[0]][1:], table[columns[0]][:-1]) + for column in columns[1:]: + cut_array = pc.or_(cut_array, pc.not_equal(table[column][1:], table[column][:-1])) + else: + cut_array = pa.array([], type=pa.uint64()) + offsets = pc.indices_nonzero(cut_array) + # make the batched table + offsets = pc.add(1, offsets) + offsets = pa.concat_arrays([pa.array([0], type=pa.int32()), offsets.cast(pa.int32())]) + if not accumulate_last_batch: + offsets = pa.concat_arrays([offsets, pa.array([len(table)], type=pa.int32())]) + batched_columns = [] + for column_name in table.column_names: + column = table[column_name].combine_chunks() + batched_columns.append(pa.ListArray.from_arrays(offsets, column)) + batched_table = pa.Table.from_arrays(batched_columns, names=table.column_names) + # add the last batch to the accumulator since it might not be full yet + if accumulate_last_batch: + last_offset = offsets[-1].as_py() + tables_accumulator.append(table.slice(last_offset, len(table) - last_offset)) + return batched_table + + +def _memory_mapped_arrow_table_from_file(filename: str) -> pa.Table: + opened_stream = _memory_mapped_record_batch_reader_from_file(filename) + pa_table = opened_stream.read_all() + return pa_table + + +def _deepcopy(x, memo: dict): + """deepcopy a regular class instance""" + cls = x.__class__ + result = cls.__new__(cls) + memo[id(x)] = result + for k, v in x.__dict__.items(): + setattr(result, k, copy.deepcopy(v, memo)) + return result + + +def _interpolation_search(arr: list[int], x: int) -> int: + """ + Return the position i of a sorted array so that arr[i] <= x < arr[i+1] + + Args: + arr (`List[int]`): non-empty sorted list of integers + x (`int`): query + + Returns: + `int`: the position i so that arr[i] <= x < arr[i+1] + + Raises: + `IndexError`: if the array is empty or if the query is outside the array values + """ + i, j = 0, len(arr) - 1 + while i < j and arr[i] <= x < arr[j]: + k = i + ((j - i) * (x - arr[i]) // (arr[j] - arr[i])) + if arr[k] <= x < arr[k + 1]: + return k + elif arr[k] < x: + i, j = k + 1, j + else: + i, j = i, k + raise IndexError(f"Invalid query '{x}' for size {arr[-1] if len(arr) else 'none'}.") + + +class IndexedTableMixin: + def __init__(self, table: pa.Table): + self._schema: pa.Schema = table.schema + self._batches: list[pa.RecordBatch] = [ + recordbatch for recordbatch in table.to_batches() if len(recordbatch) > 0 + ] + self._offsets: np.ndarray = np.cumsum([0] + [len(b) for b in self._batches], dtype=np.int64) + + def fast_gather(self, indices: Union[list[int], np.ndarray]) -> pa.Table: + """ + Create a pa.Table by gathering the records at the records at the specified indices. Should be faster + than pa.concat_tables(table.fast_slice(int(i) % table.num_rows, 1) for i in indices) since NumPy can compute + the binary searches in parallel, highly optimized C + """ + if not len(indices): + raise ValueError("Indices must be non-empty") + batch_indices = np.searchsorted(self._offsets, indices, side="right") - 1 + return pa.Table.from_batches( + [ + self._batches[batch_idx].slice(i - self._offsets[batch_idx], 1) + for batch_idx, i in zip(batch_indices, indices) + ], + schema=self._schema, + ) + + def fast_slice(self, offset=0, length=None) -> pa.Table: + """ + Slice the Table using interpolation search. + The behavior is the same as `pyarrow.Table.slice` but it's significantly faster. + + Interpolation search is used to find the start and end indexes of the batches we want to keep. + The batches to keep are then concatenated to form the sliced Table. + """ + if offset < 0: + raise IndexError("Offset must be non-negative") + elif offset >= self._offsets[-1] or (length is not None and length <= 0): + return pa.Table.from_batches([], schema=self._schema) + i = _interpolation_search(self._offsets, offset) + if length is None or length + offset >= self._offsets[-1]: + batches = self._batches[i:] + batches[0] = batches[0].slice(offset - self._offsets[i]) + else: + j = _interpolation_search(self._offsets, offset + length - 1) + batches = self._batches[i : j + 1] + batches[-1] = batches[-1].slice(0, offset + length - self._offsets[j]) + batches[0] = batches[0].slice(offset - self._offsets[i]) + return pa.Table.from_batches(batches, schema=self._schema) + + +class Table(IndexedTableMixin): + """ + Wraps a pyarrow Table by using composition. + This is the base class for `InMemoryTable`, `MemoryMappedTable` and `ConcatenationTable`. + + It implements all the basic attributes/methods of the pyarrow Table class except + the Table transforms: `slice, filter, flatten, combine_chunks, cast, add_column, + append_column, remove_column, set_column, rename_columns` and `drop`. + + The implementation of these methods differs for the subclasses. + """ + + def __init__(self, table: pa.Table): + super().__init__(table) + self.table = table + + def __deepcopy__(self, memo: dict): + # arrow tables are immutable, so there's no need to copy self.table + # moreover calling deepcopy on a pyarrow table seems to make pa.total_allocated_bytes() decrease for some reason + # by adding it to the memo, self.table won't be copied + memo[id(self.table)] = self.table + # same for the recordbatches used by the index + memo[id(self._batches)] = list(self._batches) + return _deepcopy(self, memo) + + def validate(self, *args, **kwargs): + """ + Perform validation checks. An exception is raised if validation fails. + + By default only cheap validation checks are run. Pass `full=True` + for thorough validation checks (potentially `O(n)`). + + Args: + full (`bool`, defaults to `False`): + If `True`, run expensive checks, otherwise cheap checks only. + + Raises: + `pa.lib.ArrowInvalid`: if validation fails + """ + return self.table.validate(*args, **kwargs) + + def equals(self, *args, **kwargs): + """ + Check if contents of two tables are equal. + + Args: + other ([`~datasets.table.Table`]): + Table to compare against. + check_metadata `bool`, defaults to `False`): + Whether schema metadata equality should be checked as well. + + Returns: + `bool` + """ + args = tuple(arg.table if isinstance(arg, Table) else arg for arg in args) + kwargs = {k: v.table if isinstance(v, Table) else v for k, v in kwargs} + return self.table.equals(*args, **kwargs) + + def to_batches(self, *args, **kwargs): + """ + Convert Table to list of (contiguous) `RecordBatch` objects. + + Args: + max_chunksize (`int`, defaults to `None`): + Maximum size for `RecordBatch` chunks. Individual chunks may be + smaller depending on the chunk layout of individual columns. + + Returns: + `List[pyarrow.RecordBatch]` + """ + return self.table.to_batches(*args, **kwargs) + + def to_pydict(self, *args, **kwargs): + """ + Convert the Table to a `dict` or `OrderedDict`. + + Returns: + `dict` + """ + return self.table.to_pydict(*args, **kwargs) + + def to_pylist(self, *args, **kwargs): + """ + Convert the Table to a list + + Returns: + `list` + """ + return self.table.to_pylist(*args, **kwargs) + + def to_pandas(self, *args, **kwargs): + """ + Convert to a pandas-compatible NumPy array or DataFrame, as appropriate. + + Args: + memory_pool (`MemoryPool`, defaults to `None`): + Arrow MemoryPool to use for allocations. Uses the default memory + pool is not passed. + strings_to_categorical (`bool`, defaults to `False`): + Encode string (UTF8) and binary types to `pandas.Categorical`. + categories (`list`, defaults to `empty`): + List of fields that should be returned as `pandas.Categorical`. Only + applies to table-like data structures. + zero_copy_only (`bool`, defaults to `False`): + Raise an `ArrowException` if this function call would require copying + the underlying data. + integer_object_nulls (`bool`, defaults to `False`): + Cast integers with nulls to objects. + date_as_object (`bool`, defaults to `True`): + Cast dates to objects. If `False`, convert to `datetime64[ns]` dtype. + timestamp_as_object (`bool`, defaults to `False`): + Cast non-nanosecond timestamps (`np.datetime64`) to objects. This is + useful if you have timestamps that don't fit in the normal date + range of nanosecond timestamps (1678 CE-2262 CE). + If `False`, all timestamps are converted to `datetime64[ns]` dtype. + use_threads (`bool`, defaults to `True`): + Whether to parallelize the conversion using multiple threads. + deduplicate_objects (`bool`, defaults to `False`): + Do not create multiple copies Python objects when created, to save + on memory use. Conversion will be slower. + ignore_metadata (`bool`, defaults to `False`): + If `True`, do not use the 'pandas' metadata to reconstruct the + DataFrame index, if present. + safe (`bool`, defaults to `True`): + For certain data types, a cast is needed in order to store the + data in a pandas DataFrame or Series (e.g. timestamps are always + stored as nanoseconds in pandas). This option controls whether it + is a safe cast or not. + split_blocks (`bool`, defaults to `False`): + If `True`, generate one internal "block" for each column when + creating a pandas.DataFrame from a `RecordBatch` or `Table`. While this + can temporarily reduce memory note that various pandas operations + can trigger "consolidation" which may balloon memory use. + self_destruct (`bool`, defaults to `False`): + EXPERIMENTAL: If `True`, attempt to deallocate the originating Arrow + memory while converting the Arrow object to pandas. If you use the + object after calling `to_pandas` with this option it will crash your + program. + types_mapper (`function`, defaults to `None`): + A function mapping a pyarrow DataType to a pandas `ExtensionDtype`. + This can be used to override the default pandas type for conversion + of built-in pyarrow types or in absence of `pandas_metadata` in the + Table schema. The function receives a pyarrow DataType and is + expected to return a pandas `ExtensionDtype` or `None` if the + default conversion should be used for that type. If you have + a dictionary mapping, you can pass `dict.get` as function. + + Returns: + `pandas.Series` or `pandas.DataFrame`: `pandas.Series` or `pandas.DataFrame` depending on type of object + """ + return self.table.to_pandas(*args, **kwargs) + + def to_string(self, *args, **kwargs): + return self.table.to_string(*args, **kwargs) + + def to_reader(self, max_chunksize: Optional[int] = None): + """ + Convert the Table to a RecordBatchReader. + + Note that this method is zero-copy, it merely exposes the same data under a different API. + + Args: + max_chunksize (`int`, defaults to `None`) + Maximum size for RecordBatch chunks. Individual chunks may be smaller depending + on the chunk layout of individual columns. + + Returns: + `pyarrow.RecordBatchReader` + """ + return self.table.to_reader(max_chunksize=max_chunksize) + + def field(self, *args, **kwargs): + """ + Select a schema field by its column name or numeric index. + + Args: + i (`Union[int, str]`): + The index or name of the field to retrieve. + + Returns: + `pyarrow.Field` + """ + return self.table.field(*args, **kwargs) + + def column(self, *args, **kwargs): + """ + Select a column by its column name, or numeric index. + + Args: + i (`Union[int, str]`): + The index or name of the column to retrieve. + + Returns: + `pyarrow.ChunkedArray` + """ + return self.table.column(*args, **kwargs) + + def itercolumns(self, *args, **kwargs): + """ + Iterator over all columns in their numerical order. + + Yields: + `pyarrow.ChunkedArray` + """ + return self.table.itercolumns(*args, **kwargs) + + @property + def schema(self): + """ + Schema of the table and its columns. + + Returns: + `pyarrow.Schema` + """ + return self.table.schema + + @property + def columns(self): + """ + List of all columns in numerical order. + + Returns: + `List[pa.ChunkedArray]` + """ + return self.table.columns + + @property + def num_columns(self): + """ + Number of columns in this table. + + Returns: + int + """ + return self.table.num_columns + + @property + def num_rows(self): + """ + Number of rows in this table. + + Due to the definition of a table, all columns have the same number of + rows. + + Returns: + int + """ + return self.table.num_rows + + @property + def shape(self): + """ + Dimensions of the table: (#rows, #columns). + + Returns: + `(int, int)`: Number of rows and number of columns. + """ + return self.table.shape + + @property + def nbytes(self): + """ + Total number of bytes consumed by the elements of the table. + """ + return self.table.nbytes + + @property + def column_names(self): + """ + Names of the table's columns. + """ + return self.table.column_names + + def __eq__(self, other): + return self.equals(other) + + def __getitem__(self, i): + return self.table[i] + + def __len__(self): + return len(self.table) + + def __repr__(self): + return self.table.__repr__().replace("pyarrow.Table", self.__class__.__name__) + + def __str__(self): + return self.table.__str__().replace("pyarrow.Table", self.__class__.__name__) + + def slice(self, *args, **kwargs): + """ + Compute zero-copy slice of this Table. + + Args: + offset (`int`, defaults to `0`): + Offset from start of table to slice. + length (`int`, defaults to `None`): + Length of slice (default is until end of table starting from + offset). + + Returns: + `datasets.table.Table` + """ + raise NotImplementedError() + + def filter(self, *args, **kwargs): + """ + Select records from a Table. See `pyarrow.compute.filter` for full usage. + """ + raise NotImplementedError() + + def flatten(self, *args, **kwargs): + """ + Flatten this Table. Each column with a struct type is flattened + into one column per struct field. Other columns are left unchanged. + + Args: + memory_pool (`MemoryPool`, defaults to `None`): + For memory allocations, if required, otherwise use default pool. + + Returns: + `datasets.table.Table` + """ + raise NotImplementedError() + + def combine_chunks(self, *args, **kwargs): + """ + Make a new table by combining the chunks this table has. + + All the underlying chunks in the `ChunkedArray` of each column are + concatenated into zero or one chunk. + + Args: + memory_pool (`MemoryPool`, defaults to `None`): + For memory allocations, if required, otherwise use default pool. + + Returns: + `datasets.table.Table` + """ + raise NotImplementedError() + + def cast(self, *args, **kwargs): + """ + Cast table values to another schema. + + Args: + target_schema (`Schema`): + Schema to cast to, the names and order of fields must match. + safe (`bool`, defaults to `True`): + Check for overflows or other unsafe conversions. + + Returns: + `datasets.table.Table` + """ + raise NotImplementedError() + + def replace_schema_metadata(self, *args, **kwargs): + """ + EXPERIMENTAL: Create shallow copy of table by replacing schema + key-value metadata with the indicated new metadata (which may be None, + which deletes any existing metadata + + Args: + metadata (`dict`, defaults to `None`): + + Returns: + `datasets.table.Table`: shallow_copy + """ + raise NotImplementedError() + + def add_column(self, *args, **kwargs): + """ + Add column to Table at position. + + A new table is returned with the column added, the original table + object is left unchanged. + + Args: + i (`int`): + Index to place the column at. + field_ (`Union[str, pyarrow.Field]`): + If a string is passed then the type is deduced from the column + data. + column (`Union[pyarrow.Array, List[pyarrow.Array]]`): + Column data. + + Returns: + `datasets.table.Table`: New table with the passed column added. + """ + raise NotImplementedError() + + def append_column(self, *args, **kwargs): + """ + Append column at end of columns. + + Args: + field_ (`Union[str, pyarrow.Field]`): + If a string is passed then the type is deduced from the column + data. + column (`Union[pyarrow.Array, List[pyarrow.Array]]`): + Column data. + + Returns: + `datasets.table.Table`: New table with the passed column added. + """ + raise NotImplementedError() + + def remove_column(self, *args, **kwargs): + """ + Create new Table with the indicated column removed. + + Args: + i (`int`): + Index of column to remove. + + Returns: + `datasets.table.Table`: New table without the column. + """ + raise NotImplementedError() + + def set_column(self, *args, **kwargs): + """ + Replace column in Table at position. + + Args: + i (`int`): + Index to place the column at. + field_ (`Union[str, pyarrow.Field]`): + If a string is passed then the type is deduced from the column + data. + column (`Union[pyarrow.Array, List[pyarrow.Array]]`): + Column data. + + Returns: + `datasets.table.Table`: New table with the passed column set. + """ + raise NotImplementedError() + + def rename_columns(self, *args, **kwargs): + """ + Create new table with columns renamed to provided names. + """ + raise NotImplementedError() + + def drop(self, *args, **kwargs): + """ + Drop one or more columns and return a new table. + + Args: + columns (`List[str]`): + List of field names referencing existing columns. + + Raises: + `KeyError` : if any of the passed columns name are not existing. + + Returns: + `datasets.table.Table`: New table without the columns. + """ + raise NotImplementedError() + + def select(self, *args, **kwargs): + """ + Select columns of the table. + + Returns a new table with the specified columns, and metadata preserved. + + Args: + columns (:obj:`Union[List[str], List[int]]`): + The column names or integer indices to select. + + Returns: + `datasets.table.Table`: table with only a subset of the columns + """ + raise NotImplementedError() + + +class TableBlock(Table): + """ + `TableBlock` is the allowed class inside a `ConcanetationTable`. + Only `MemoryMappedTable` and `InMemoryTable` are `TableBlock`. + This is because we don't want a `ConcanetationTable` made out of other `ConcanetationTables`. + """ + + pass + + +class InMemoryTable(TableBlock): + """ + The table is said in-memory when it is loaded into the user's RAM. + + Pickling it does copy all the data using memory. + Its implementation is simple and uses the underlying pyarrow Table methods directly. + + This is different from the `MemoryMapped` table, for which pickling doesn't copy all the + data in memory. For a `MemoryMapped`, unpickling instead reloads the table from the disk. + + `InMemoryTable` must be used when data fit in memory, while `MemoryMapped` are reserved for + data bigger than memory or when you want the memory footprint of your application to + stay low. + """ + + @classmethod + def from_file(cls, filename: str): + table = _in_memory_arrow_table_from_file(filename) + return cls(table) + + @classmethod + def from_buffer(cls, buffer: pa.Buffer): + table = _in_memory_arrow_table_from_buffer(buffer) + return cls(table) + + @classmethod + def from_pandas(cls, *args, **kwargs): + """ + Convert pandas.DataFrame to an Arrow Table. + + The column types in the resulting Arrow Table are inferred from the + dtypes of the pandas.Series in the DataFrame. In the case of non-object + Series, the NumPy dtype is translated to its Arrow equivalent. In the + case of `object`, we need to guess the datatype by looking at the + Python objects in this Series. + + Be aware that Series of the `object` dtype don't carry enough + information to always lead to a meaningful Arrow type. In the case that + we cannot infer a type, e.g. because the DataFrame is of length 0 or + the Series only contains `None/nan` objects, the type is set to + null. This behavior can be avoided by constructing an explicit schema + and passing it to this function. + + Args: + df (`pandas.DataFrame`): + schema (`pyarrow.Schema`, *optional*): + The expected schema of the Arrow Table. This can be used to + indicate the type of columns if we cannot infer it automatically. + If passed, the output will have exactly this schema. Columns + specified in the schema that are not found in the DataFrame columns + or its index will raise an error. Additional columns or index + levels in the DataFrame which are not specified in the schema will + be ignored. + preserve_index (`bool`, *optional*): + Whether to store the index as an additional column in the resulting + `Table`. The default of None will store the index as a column, + except for RangeIndex which is stored as metadata only. Use + `preserve_index=True` to force it to be stored as a column. + nthreads (`int`, defaults to `None` (may use up to system CPU count threads)) + If greater than 1, convert columns to Arrow in parallel using + indicated number of threads. + columns (`List[str]`, *optional*): + List of column to be converted. If `None`, use all columns. + safe (`bool`, defaults to `True`): + Check for overflows or other unsafe conversions, + + Returns: + `datasets.table.Table`: + + Examples: + ```python + >>> import pandas as pd + >>> import pyarrow as pa + >>> df = pd.DataFrame({ + ... 'int': [1, 2], + ... 'str': ['a', 'b'] + ... }) + >>> pa.Table.from_pandas(df) + + ``` + """ + return cls(pa.Table.from_pandas(*args, **kwargs)) + + @classmethod + def from_arrays(cls, *args, **kwargs): + """ + Construct a Table from Arrow arrays. + + Args: + arrays (`List[Union[pyarrow.Array, pyarrow.ChunkedArray]]`): + Equal-length arrays that should form the table. + names (`List[str]`, *optional*): + Names for the table columns. If not passed, schema must be passed. + schema (`Schema`, defaults to `None`): + Schema for the created table. If not passed, names must be passed. + metadata (`Union[dict, Mapping]`, defaults to `None`): + Optional metadata for the schema (if inferred). + + Returns: + `datasets.table.Table` + """ + return cls(pa.Table.from_arrays(*args, **kwargs)) + + @classmethod + def from_pydict(cls, *args, **kwargs): + """ + Construct a Table from Arrow arrays or columns. + + Args: + mapping (`Union[dict, Mapping]`): + A mapping of strings to Arrays or Python lists. + schema (`Schema`, defaults to `None`): + If not passed, will be inferred from the Mapping values + metadata (`Union[dict, Mapping]`, defaults to `None`): + Optional metadata for the schema (if inferred). + + Returns: + `datasets.table.Table` + """ + return cls(pa.Table.from_pydict(*args, **kwargs)) + + @classmethod + def from_pylist(cls, mapping, *args, **kwargs): + """ + Construct a Table from list of rows / dictionaries. + + Args: + mapping (`List[dict]`): + A mapping of strings to row values. + schema (`Schema`, defaults to `None`): + If not passed, will be inferred from the Mapping values + metadata (`Union[dict, Mapping]`, defaults to `None`): + Optional metadata for the schema (if inferred). + + Returns: + `datasets.table.Table` + """ + return cls(pa.Table.from_pylist(mapping, *args, **kwargs)) + + @classmethod + def from_batches(cls, *args, **kwargs): + """ + Construct a Table from a sequence or iterator of Arrow `RecordBatches`. + + Args: + batches (`Union[Sequence[pyarrow.RecordBatch], Iterator[pyarrow.RecordBatch]]`): + Sequence of `RecordBatch` to be converted, all schemas must be equal. + schema (`Schema`, defaults to `None`): + If not passed, will be inferred from the first `RecordBatch`. + + Returns: + `datasets.table.Table`: + """ + return cls(pa.Table.from_batches(*args, **kwargs)) + + def slice(self, offset=0, length=None): + """ + Compute zero-copy slice of this Table. + + Args: + offset (`int`, defaults to `0`): + Offset from start of table to slice. + length (`int`, defaults to `None`): + Length of slice (default is until end of table starting from + offset). + + Returns: + `datasets.table.Table` + """ + # Use fast slicing here + return InMemoryTable(self.fast_slice(offset=offset, length=length)) + + def filter(self, *args, **kwargs): + """ + Select records from a Table. See `pyarrow.compute.filter` for full usage. + """ + return InMemoryTable(self.table.filter(*args, **kwargs)) + + def flatten(self, *args, **kwargs): + """ + Flatten this Table. Each column with a struct type is flattened + into one column per struct field. Other columns are left unchanged. + + Args: + memory_pool (`MemoryPool`, defaults to `None`): + For memory allocations, if required, otherwise use default pool. + + Returns: + `datasets.table.Table` + """ + return InMemoryTable(table_flatten(self.table, *args, **kwargs)) + + def combine_chunks(self, *args, **kwargs): + """ + Make a new table by combining the chunks this table has. + + All the underlying chunks in the `ChunkedArray` of each column are + concatenated into zero or one chunk. + + Args: + memory_pool (`MemoryPool`, defaults to `None`): + For memory allocations, if required, otherwise use default pool. + + Returns: + `datasets.table.Table` + """ + return InMemoryTable(self.table.combine_chunks(*args, **kwargs)) + + def cast(self, *args, **kwargs): + """ + Cast table values to another schema. + + Args: + target_schema (`Schema`): + Schema to cast to, the names and order of fields must match. + safe (`bool`, defaults to `True`): + Check for overflows or other unsafe conversions. + + Returns: + `datasets.table.Table` + """ + return InMemoryTable(table_cast(self.table, *args, **kwargs)) + + def replace_schema_metadata(self, *args, **kwargs): + """ + EXPERIMENTAL: Create shallow copy of table by replacing schema + key-value metadata with the indicated new metadata (which may be `None`, + which deletes any existing metadata). + + Args: + metadata (`dict`, defaults to `None`): + + Returns: + `datasets.table.Table`: shallow_copy + """ + return InMemoryTable(self.table.replace_schema_metadata(*args, **kwargs)) + + def add_column(self, *args, **kwargs): + """ + Add column to Table at position. + + A new table is returned with the column added, the original table + object is left unchanged. + + Args: + i (`int`): + Index to place the column at. + field_ (`Union[str, pyarrow.Field]`): + If a string is passed then the type is deduced from the column + data. + column (`Union[pyarrow.Array, List[pyarrow.Array]]`): + Column data. + + Returns: + `datasets.table.Table`: New table with the passed column added. + """ + return InMemoryTable(self.table.add_column(*args, **kwargs)) + + def append_column(self, *args, **kwargs): + """ + Append column at end of columns. + + Args: + field_ (`Union[str, pyarrow.Field]`): + If a string is passed then the type is deduced from the column + data. + column (`Union[pyarrow.Array, List[pyarrow.Array]]`): + Column data. + + Returns: + `datasets.table.Table`: + New table with the passed column added. + """ + return InMemoryTable(self.table.append_column(*args, **kwargs)) + + def remove_column(self, *args, **kwargs): + """ + Create new Table with the indicated column removed. + + Args: + i (`int`): + Index of column to remove. + + Returns: + `datasets.table.Table`: + New table without the column. + """ + return InMemoryTable(self.table.remove_column(*args, **kwargs)) + + def set_column(self, *args, **kwargs): + """ + Replace column in Table at position. + + Args: + i (`int`): + Index to place the column at. + field_ (`Union[str, pyarrow.Field]`): + If a string is passed then the type is deduced from the column + data. + column (`Union[pyarrow.Array, List[pyarrow.Array]]`): + Column data. + + Returns: + `datasets.table.Table`: + New table with the passed column set. + """ + return InMemoryTable(self.table.set_column(*args, **kwargs)) + + def rename_columns(self, *args, **kwargs): + """ + Create new table with columns renamed to provided names. + """ + return InMemoryTable(self.table.rename_columns(*args, **kwargs)) + + def drop(self, *args, **kwargs): + """ + Drop one or more columns and return a new table. + + Args: + columns (`List[str]`): + List of field names referencing existing columns. + + Raises: + `KeyError` : if any of the passed columns name are not existing. + + Returns: + `datasets.table.Table`: + New table without the columns. + """ + return InMemoryTable(self.table.drop(*args, **kwargs)) + + def select(self, *args, **kwargs): + """ + Select columns of the table. + + Returns a new table with the specified columns, and metadata preserved. + + Args: + columns (:obj:`Union[List[str], List[int]]`): + The column names or integer indices to select. + + Returns: + :class:`datasets.table.Table`: New table with the specified columns, and metadata preserved. + """ + return InMemoryTable(self.table.select(*args, **kwargs)) + + +# The MemoryMappedTable needs replays to properly reload tables from the disk +Replay = tuple[str, tuple, dict] + + +class MemoryMappedTable(TableBlock): + """ + The table is said memory mapped when it doesn't use the user's RAM but loads the data + from the disk instead. + + Pickling it doesn't copy the data into memory. + Instead, only the path to the memory mapped arrow file is pickled, as well as the list + of transforms to "replay" when reloading the table from the disk. + + Its implementation requires to store an history of all the transforms that were applied + to the underlying pyarrow Table, so that they can be "replayed" when reloading the Table + from the disk. + + This is different from the `InMemoryTable` table, for which pickling does copy all the + data in memory. + + `InMemoryTable` must be used when data fit in memory, while `MemoryMapped` are reserved for + data bigger than memory or when you want the memory footprint of your application to + stay low. + """ + + def __init__(self, table: pa.Table, path: str, replays: Optional[list[Replay]] = None): + super().__init__(table) + self.path = os.path.abspath(path) + self.replays: list[Replay] = replays if replays is not None else [] + + @classmethod + def from_file(cls, filename: str, replays=None): + table = _memory_mapped_arrow_table_from_file(filename) + table = cls._apply_replays(table, replays) + return cls(table, filename, replays) + + def __getstate__(self): + return {"path": self.path, "replays": self.replays} + + def __setstate__(self, state): + path = state["path"] + replays = state["replays"] + table = _memory_mapped_arrow_table_from_file(path) + table = self._apply_replays(table, replays) + MemoryMappedTable.__init__(self, table, path=path, replays=replays) + + @staticmethod + def _apply_replays(table: pa.Table, replays: Optional[list[Replay]] = None) -> pa.Table: + if replays is not None: + for name, args, kwargs in replays: + if name == "cast": + table = table_cast(table, *args, **kwargs) + elif name == "flatten": + table = table_flatten(table, *args, **kwargs) + else: + table = getattr(table, name)(*args, **kwargs) + return table + + def _append_replay(self, replay: Replay) -> list[Replay]: + replays = copy.deepcopy(self.replays) + replays.append(replay) + return replays + + def slice(self, offset=0, length=None): + """ + Compute zero-copy slice of this Table. + + Args: + offset (`int`, defaults to `0`): + Offset from start of table to slice. + length (`int`, defaults to `None`): + Length of slice (default is until end of table starting from + offset). + + Returns: + `datasets.table.Table` + """ + replay = ("slice", (offset, length), {}) + replays = self._append_replay(replay) + # Use fast slicing here + return MemoryMappedTable(self.fast_slice(offset=offset, length=length), self.path, replays) + + def filter(self, *args, **kwargs): + """ + Select records from a Table. See `pyarrow.compute.filter` for full usage. + """ + replay = ("filter", copy.deepcopy(args), copy.deepcopy(kwargs)) + replays = self._append_replay(replay) + return MemoryMappedTable(self.table.filter(*args, **kwargs), self.path, replays) + + def flatten(self, *args, **kwargs): + """ + Flatten this Table. Each column with a struct type is flattened + into one column per struct field. Other columns are left unchanged. + + Args: + memory_pool (`MemoryPool`, defaults to `None`): + For memory allocations, if required, otherwise use default pool. + + Returns: + `datasets.table.Table` + """ + replay = ("flatten", copy.deepcopy(args), copy.deepcopy(kwargs)) + replays = self._append_replay(replay) + return MemoryMappedTable(table_flatten(self.table, *args, **kwargs), self.path, replays) + + def combine_chunks(self, *args, **kwargs): + """ + Make a new table by combining the chunks this table has. + + All the underlying chunks in the ChunkedArray of each column are + concatenated into zero or one chunk. + + Args: + memory_pool (`MemoryPool`, defaults to `None`): + For memory allocations, if required, otherwise use default pool. + + Returns: + `datasets.table.Table` + """ + replay = ("combine_chunks", copy.deepcopy(args), copy.deepcopy(kwargs)) + replays = self._append_replay(replay) + return MemoryMappedTable(self.table.combine_chunks(*args, **kwargs), self.path, replays) + + def cast(self, *args, **kwargs): + """ + Cast table values to another schema + + Args: + target_schema (`Schema`): + Schema to cast to, the names and order of fields must match. + safe (`bool`, defaults to `True`): + Check for overflows or other unsafe conversions. + + Returns: + `datasets.table.Table` + """ + replay = ("cast", copy.deepcopy(args), copy.deepcopy(kwargs)) + replays = self._append_replay(replay) + return MemoryMappedTable(table_cast(self.table, *args, **kwargs), self.path, replays) + + def replace_schema_metadata(self, *args, **kwargs): + """ + EXPERIMENTAL: Create shallow copy of table by replacing schema + key-value metadata with the indicated new metadata (which may be None, + which deletes any existing metadata. + + Args: + metadata (`dict`, defaults to `None`): + + Returns: + `datasets.table.Table`: shallow_copy + """ + replay = ("replace_schema_metadata", copy.deepcopy(args), copy.deepcopy(kwargs)) + replays = self._append_replay(replay) + return MemoryMappedTable(self.table.replace_schema_metadata(*args, **kwargs), self.path, replays) + + def add_column(self, *args, **kwargs): + """ + Add column to Table at position. + + A new table is returned with the column added, the original table + object is left unchanged. + + Args: + i (`int`): + Index to place the column at. + field_ (`Union[str, pyarrow.Field]`): + If a string is passed then the type is deduced from the column + data. + column (`Union[pyarrow.Array, List[pyarrow.Array]]`): + Column data. + + Returns: + `datasets.table.Table`: New table with the passed column added. + """ + replay = ("add_column", copy.deepcopy(args), copy.deepcopy(kwargs)) + replays = self._append_replay(replay) + return MemoryMappedTable(self.table.add_column(*args, **kwargs), self.path, replays) + + def append_column(self, *args, **kwargs): + """ + Append column at end of columns. + + Args: + field_ (`Union[str, pyarrow.Field]`): + If a string is passed then the type is deduced from the column + data. + column (`Union[pyarrow.Array, List[pyarrow.Array]]`): + Column data. + + Returns: + `datasets.table.Table`: + New table with the passed column added. + """ + replay = ("append_column", copy.deepcopy(args), copy.deepcopy(kwargs)) + replays = self._append_replay(replay) + return MemoryMappedTable(self.table.append_column(*args, **kwargs), self.path, replays) + + def remove_column(self, *args, **kwargs): + """ + Create new Table with the indicated column removed. + + Args: + i (`int`): + Index of column to remove. + + Returns: + `datasets.table.Table`: + New table without the column. + """ + replay = ("remove_column", copy.deepcopy(args), copy.deepcopy(kwargs)) + replays = self._append_replay(replay) + return MemoryMappedTable(self.table.remove_column(*args, **kwargs), self.path, replays) + + def set_column(self, *args, **kwargs): + """ + Replace column in Table at position. + + Args: + i (`int`): + Index to place the column at. + field_ (`Union[str, pyarrow.Field]`): + If a string is passed then the type is deduced from the column + data. + column (`Union[pyarrow.Array, List[pyarrow.Array]]`): + Column data. + + Returns: + `datasets.table.Table`: + New table with the passed column set. + """ + replay = ("set_column", copy.deepcopy(args), copy.deepcopy(kwargs)) + replays = self._append_replay(replay) + return MemoryMappedTable(self.table.set_column(*args, **kwargs), self.path, replays) + + def rename_columns(self, *args, **kwargs): + """ + Create new table with columns renamed to provided names. + """ + replay = ("rename_columns", copy.deepcopy(args), copy.deepcopy(kwargs)) + replays = self._append_replay(replay) + return MemoryMappedTable(self.table.rename_columns(*args, **kwargs), self.path, replays) + + def drop(self, *args, **kwargs): + """ + Drop one or more columns and return a new table. + + Args: + columns (`List[str]`): + List of field names referencing existing columns. + + Raises: + `KeyError` : if any of the passed columns name are not existing. + + Returns: + `datasets.table.Table`: + New table without the columns. + """ + replay = ("drop", copy.deepcopy(args), copy.deepcopy(kwargs)) + replays = self._append_replay(replay) + return MemoryMappedTable(self.table.drop(*args, **kwargs), self.path, replays) + + def select(self, *args, **kwargs): + """ + Select columns of the table. + + Returns a new table with the specified columns, and metadata preserved. + + Args: + columns (:obj:`Union[List[str], List[int]]`): + The column names or integer indices to select. + + Returns: + :class:`datasets.table.Table`: New table with the specified columns, and metadata preserved. + """ + replay = ("select", copy.deepcopy(args), copy.deepcopy(kwargs)) + replays = self._append_replay(replay) + return MemoryMappedTable(self.table.select(*args, **kwargs), self.path, replays) + + +# A ConcatenationTable is the concatenation of several tables. +# The ``blocks`` attributes stores a list of list of blocks. +# The first axis concatenates the tables along the axis 0 (it appends rows), +# while the second axis concatenates tables along the axis 1 (it appends columns). +TableBlockContainer = TypeVar("TableBlockContainer", TableBlock, list[TableBlock], list[list[TableBlock]]) + + +class ConcatenationTable(Table): + """ + The table comes from the concatenation of several tables called blocks. + It enables concatenation on both axis 0 (append rows) and axis 1 (append columns). + + The underlying tables are called "blocks" and can be either `InMemoryTable` + or `MemoryMappedTable` objects. + This allows to combine tables that come from memory or that are memory mapped. + When a `ConcatenationTable` is pickled, then each block is pickled: + - the `InMemoryTable` objects are pickled by copying all the data in memory. + - the MemoryMappedTable objects are pickled without copying the data into memory. + Instead, only the path to the memory mapped arrow file is pickled, as well as the list + of transforms to "replays" when reloading the table from the disk. + + Its implementation requires to store each block separately. + The `blocks` attributes stores a list of list of blocks. + The first axis concatenates the tables along the axis 0 (it appends rows), + while the second axis concatenates tables along the axis 1 (it appends columns). + + If some columns are missing when concatenating on axis 0, they are filled with null values. + This is done using `pyarrow.concat_tables(tables, promote=True)`. + + You can access the fully combined table by accessing the `ConcatenationTable.table` attribute, + and the blocks by accessing the `ConcatenationTable.blocks` attribute. + """ + + def __init__(self, table: pa.Table, blocks: list[list[TableBlock]]): + super().__init__(table) + self.blocks = blocks + # Check that all the blocks have the right type. + # Only InMemoryTable and MemoryMappedTable are allowed. + for subtables in blocks: + for subtable in subtables: + if not isinstance(subtable, TableBlock): + raise TypeError( + "The blocks of a ConcatenationTable must be InMemoryTable or MemoryMappedTable objects" + f", but got {_short_str(subtable)}." + ) + + def __getstate__(self): + return {"blocks": self.blocks, "schema": self.table.schema} + + def __setstate__(self, state): + blocks = state["blocks"] + schema = state["schema"] + table = self._concat_blocks_horizontally_and_vertically(blocks) + if schema is not None and table.schema != schema: + # We fix the columns by concatenating with an empty table with the right columns + empty_table = pa.Table.from_batches([], schema=schema) + # We set promote_options="default" to fill missing columns with null values + table = pa.concat_tables([table, empty_table], promote_options="default") + ConcatenationTable.__init__(self, table, blocks=blocks) + + @staticmethod + def _concat_blocks(blocks: list[Union[TableBlock, pa.Table]], axis: int = 0) -> pa.Table: + pa_tables = [table.table if hasattr(table, "table") else table for table in blocks] + if axis == 0: + # We set promote_options="default" to fill missing columns with null values + return pa.concat_tables(pa_tables, promote_options="default") + elif axis == 1: + for i, table in enumerate(pa_tables): + if i == 0: + pa_table = table + else: + for name, col in zip(table.column_names, table.columns): + pa_table = pa_table.append_column(name, col) + return pa_table + else: + raise ValueError("'axis' must be either 0 or 1") + + @classmethod + def _concat_blocks_horizontally_and_vertically(cls, blocks: list[list[TableBlock]]) -> pa.Table: + pa_tables_to_concat_vertically = [] + for i, tables in enumerate(blocks): + if not tables: + continue + pa_table_horizontally_concatenated = cls._concat_blocks(tables, axis=1) + pa_tables_to_concat_vertically.append(pa_table_horizontally_concatenated) + return cls._concat_blocks(pa_tables_to_concat_vertically, axis=0) + + @classmethod + def _merge_blocks(cls, blocks: TableBlockContainer, axis: Optional[int] = None) -> TableBlockContainer: + if axis is not None: + merged_blocks = [] + for is_in_memory, block_group in groupby(blocks, key=lambda x: isinstance(x, InMemoryTable)): + if is_in_memory: + block_group = [InMemoryTable(cls._concat_blocks(list(block_group), axis=axis))] + merged_blocks += list(block_group) + else: # both + merged_blocks = [cls._merge_blocks(row_block, axis=1) for row_block in blocks] + if all(len(row_block) == 1 for row_block in merged_blocks): + merged_blocks = cls._merge_blocks( + [block for row_block in merged_blocks for block in row_block], axis=0 + ) + return merged_blocks + + @classmethod + def _consolidate_blocks(cls, blocks: TableBlockContainer) -> TableBlockContainer: + if isinstance(blocks, TableBlock): + return blocks + elif isinstance(blocks[0], TableBlock): + return cls._merge_blocks(blocks, axis=0) + else: + return cls._merge_blocks(blocks) + + @classmethod + def from_blocks(cls, blocks: TableBlockContainer) -> "ConcatenationTable": + blocks = cls._consolidate_blocks(blocks) + if isinstance(blocks, TableBlock): + table = blocks + return cls(table.table, [[table]]) + elif isinstance(blocks[0], TableBlock): + table = cls._concat_blocks(blocks, axis=0) + blocks = [[t] for t in blocks] + return cls(table, blocks) + else: + table = cls._concat_blocks_horizontally_and_vertically(blocks) + return cls(table, blocks) + + @classmethod + def from_tables(cls, tables: list[Union[pa.Table, Table]], axis: int = 0) -> "ConcatenationTable": + """Create `ConcatenationTable` from list of tables. + + Args: + tables (list of `Table` or list of `pyarrow.Table`): + List of tables. + axis (`{0, 1}`, defaults to `0`, meaning over rows): + Axis to concatenate over, where `0` means over rows (vertically) and `1` means over columns + (horizontally). + + + """ + + def to_blocks(table: Union[pa.Table, Table]) -> list[list[TableBlock]]: + if isinstance(table, pa.Table): + return [[InMemoryTable(table)]] + elif isinstance(table, ConcatenationTable): + return copy.deepcopy(table.blocks) + else: + return [[table]] + + def _slice_row_block(row_block: list[TableBlock], length: int) -> tuple[list[TableBlock], list[TableBlock]]: + sliced = [table.slice(0, length) for table in row_block] + remainder = [table.slice(length, len(row_block[0]) - length) for table in row_block] + return sliced, remainder + + def _split_both_like( + result: list[list[TableBlock]], blocks: list[list[TableBlock]] + ) -> tuple[list[list[TableBlock]], list[list[TableBlock]]]: + """ + Make sure each row_block contain the same num_rows to be able to concatenate them on axis=1. + + To do so, we modify both blocks sets to have the same row_blocks boundaries. + For example, if `result` has 2 row_blocks of 3 rows and `blocks` has 3 row_blocks of 2 rows, + we modify both to have 4 row_blocks of size 2, 1, 1 and 2: + + [ x x x | x x x ] + + [ y y | y y | y y ] + ----------------------------- + = [ x x | x | x | x x ] + [ y y | y | y | y y ] + + """ + result, blocks = list(result), list(blocks) + new_result, new_blocks = [], [] + while result and blocks: + # we slice the longest row block to save two row blocks of same length + # and we replace the long row block by its remainder if necessary + if len(result[0][0]) > len(blocks[0][0]): + new_blocks.append(blocks[0]) + sliced, result[0] = _slice_row_block(result[0], len(blocks.pop(0)[0])) + new_result.append(sliced) + elif len(result[0][0]) < len(blocks[0][0]): + new_result.append(result[0]) + sliced, blocks[0] = _slice_row_block(blocks[0], len(result.pop(0)[0])) + new_blocks.append(sliced) + else: + new_result.append(result.pop(0)) + new_blocks.append(blocks.pop(0)) + if result or blocks: + raise ValueError("Failed to concatenate on axis=1 because tables don't have the same number of rows") + return new_result, new_blocks + + def _extend_blocks( + result: list[list[TableBlock]], blocks: list[list[TableBlock]], axis: int = 0 + ) -> list[list[TableBlock]]: + if axis == 0: + result.extend(blocks) + elif axis == 1: + # We make sure each row_block have the same num_rows + result, blocks = _split_both_like(result, blocks) + for i, row_block in enumerate(blocks): + result[i].extend(row_block) + return result + + blocks = to_blocks(tables[0]) + for table in tables[1:]: + table_blocks = to_blocks(table) + blocks = _extend_blocks(blocks, table_blocks, axis=axis) + return cls.from_blocks(blocks) + + @property + def _slices(self): + offset = 0 + for tables in self.blocks: + length = len(tables[0]) + yield (offset, length) + offset += length + + def slice(self, offset=0, length=None): + """ + Compute zero-copy slice of this Table. + + Args: + offset (`int`, defaults to `0`): + Offset from start of table to slice. + length (`int`, defaults to `None`): + Length of slice (default is until end of table starting from + offset). + + Returns: + `datasets.table.Table` + """ + table = self.table.slice(offset, length=length) + length = length if length is not None else self.num_rows - offset + blocks = [] + for tables in self.blocks: + n_rows = len(tables[0]) + if length == 0: + break + elif n_rows <= offset: + offset = offset - n_rows + elif n_rows <= offset + length: + blocks.append([t.slice(offset) for t in tables]) + length, offset = length + offset - n_rows, 0 + else: + blocks.append([t.slice(offset, length) for t in tables]) + length, offset = 0, 0 + return ConcatenationTable(table, blocks) + + def filter(self, mask, *args, **kwargs): + """ + Select records from a Table. See `pyarrow.compute.filter` for full usage. + """ + table = self.table.filter(mask, *args, **kwargs) + blocks = [] + for (offset, length), tables in zip(self._slices, self.blocks): + submask = mask.slice(offset, length) + blocks.append([t.filter(submask, *args, **kwargs) for t in tables]) + return ConcatenationTable(table, blocks) + + def flatten(self, *args, **kwargs): + """ + Flatten this Table. Each column with a struct type is flattened + into one column per struct field. Other columns are left unchanged. + + Args: + memory_pool (`MemoryPool`, defaults to `None`): + For memory allocations, if required, otherwise use default pool. + + Returns: + `datasets.table.Table` + """ + table = table_flatten(self.table, *args, **kwargs) + blocks = [] + for tables in self.blocks: + blocks.append([t.flatten(*args, **kwargs) for t in tables]) + return ConcatenationTable(table, blocks) + + def combine_chunks(self, *args, **kwargs): + """ + Make a new table by combining the chunks this table has. + + All the underlying chunks in the `ChunkedArray` of each column are + concatenated into zero or one chunk. + + Args: + memory_pool (`MemoryPool`, defaults to `None`): + For memory allocations, if required, otherwise use default pool. + + Returns: + `datasets.table.Table` + """ + table = self.table.combine_chunks(*args, **kwargs) + blocks = [] + for tables in self.blocks: + blocks.append([t.combine_chunks(*args, **kwargs) for t in tables]) + return ConcatenationTable(table, blocks) + + def cast(self, target_schema, *args, **kwargs): + """ + Cast table values to another schema. + + Args: + target_schema (`Schema`): + Schema to cast to, the names and order of fields must match. + safe (`bool`, defaults to `True`): + Check for overflows or other unsafe conversions. + + Returns: + `datasets.table.Table` + """ + from .features import Features + + table = table_cast(self.table, target_schema, *args, **kwargs) + target_features = Features.from_arrow_schema(target_schema) + blocks = [] + for subtables in self.blocks: + new_tables = [] + fields = list(target_schema) + for subtable in subtables: + subfields = [] + for name in subtable.column_names: + subfields.append(fields.pop(next(i for i, field in enumerate(fields) if field.name == name))) + subfeatures = Features({subfield.name: target_features[subfield.name] for subfield in subfields}) + subschema = subfeatures.arrow_schema + new_tables.append(subtable.cast(subschema, *args, **kwargs)) + blocks.append(new_tables) + return ConcatenationTable(table, blocks) + + def replace_schema_metadata(self, *args, **kwargs): + """ + EXPERIMENTAL: Create shallow copy of table by replacing schema + key-value metadata with the indicated new metadata (which may be `None`, + which deletes any existing metadata). + + Args: + metadata (`dict`, defaults to `None`): + + Returns: + `datasets.table.Table`: shallow_copy + """ + table = self.table.replace_schema_metadata(*args, **kwargs) + blocks = [] + for tables in self.blocks: + blocks.append([t.replace_schema_metadata(*args, **kwargs) for t in tables]) + return ConcatenationTable(table, self.blocks) + + def add_column(self, *args, **kwargs): + """ + Add column to Table at position. + + A new table is returned with the column added, the original table + object is left unchanged. + + Args: + i (`int`): + Index to place the column at. + field_ (`Union[str, pyarrow.Field]`): + If a string is passed then the type is deduced from the column + data. + column (`Union[pyarrow.Array, List[pyarrow.Array]]`): + Column data. + + Returns: + `datasets.table.Table`: New table with the passed column added. + """ + raise NotImplementedError() + + def append_column(self, *args, **kwargs): + """ + Append column at end of columns. + + Args: + field_ (`Union[str, pyarrow.Field]`): + If a string is passed then the type is deduced from the column + data. + column (`Union[pyarrow.Array, List[pyarrow.Array]]`): + Column data. + + Returns: + `datasets.table.Table`: + New table with the passed column added. + """ + raise NotImplementedError() + + def remove_column(self, i, *args, **kwargs): + """ + Create new Table with the indicated column removed. + + Args: + i (`int`): + Index of column to remove. + + Returns: + `datasets.table.Table`: + New table without the column. + """ + table = self.table.remove_column(i, *args, **kwargs) + name = self.table.column_names[i] + blocks = [] + for tables in self.blocks: + blocks.append( + [ + t.remove_column(t.column_names.index(name), *args, **kwargs) if name in t.column_names else t + for t in tables + ] + ) + return ConcatenationTable(table, blocks) + + def set_column(self, *args, **kwargs): + """ + Replace column in Table at position. + + Args: + i (`int`): + Index to place the column at. + field_ (`Union[str, pyarrow.Field]`): + If a string is passed then the type is deduced from the column + data. + column (`Union[pyarrow.Array, List[pyarrow.Array]]`): + Column data. + + Returns: + `datasets.table.Table`: + New table with the passed column set. + """ + raise NotImplementedError() + + def rename_columns(self, names, *args, **kwargs): + """ + Create new table with columns renamed to provided names. + """ + table = self.table.rename_columns(names, *args, **kwargs) + names = dict(zip(self.table.column_names, names)) + blocks = [] + for tables in self.blocks: + blocks.append( + [t.rename_columns([names[name] for name in t.column_names], *args, **kwargs) for t in tables] + ) + return ConcatenationTable(table, blocks) + + def drop(self, columns, *args, **kwargs): + """ + Drop one or more columns and return a new table. + + Args: + columns (`List[str]`): + List of field names referencing existing columns. + + Raises: + `KeyError` : if any of the passed columns name are not existing. + + Returns: + `datasets.table.Table`: + New table without the columns. + """ + table = self.table.drop(columns, *args, **kwargs) + blocks = [] + for tables in self.blocks: + blocks.append([t.drop([c for c in columns if c in t.column_names], *args, **kwargs) for t in tables]) + return ConcatenationTable(table, blocks) + + def select(self, columns, *args, **kwargs): + """ + Select columns of the table. + + Returns a new table with the specified columns, and metadata preserved. + + Args: + columns (:obj:`Union[List[str], List[int]]`): + The column names or integer indices to select. + + Returns: + :class:`datasets.table.Table`: New table with the specified columns, and metadata preserved. + """ + table = self.table.select(columns, *args, **kwargs) + blocks = [] + for tables in self.blocks: + blocks.append([t.select([c for c in columns if c in t.column_names], *args, **kwargs) for t in tables]) + return ConcatenationTable(table, blocks) + + +def concat_tables(tables: list[Table], axis: int = 0) -> Table: + """ + Concatenate tables. + + Args: + tables (list of `Table`): + List of tables to be concatenated. + axis (`{0, 1}`, defaults to `0`, meaning over rows): + Axis to concatenate over, where `0` means over rows (vertically) and `1` means over columns + (horizontally). + + + Returns: + `datasets.table.Table`: + If the number of input tables is > 1, then the returned table is a `datasets.table.ConcatenationTable`. + Otherwise if there's only one table, it is returned as is. + """ + tables = list(tables) + if len(tables) == 1: + return tables[0] + return ConcatenationTable.from_tables(tables, axis=axis) + + +def list_table_cache_files(table: Table) -> list[str]: + """ + Get the cache files that are loaded by the table. + Cache file are used when parts of the table come from the disk via memory mapping. + + Returns: + `List[str]`: + A list of paths to the cache files loaded by the table. + """ + if isinstance(table, ConcatenationTable): + cache_files = [] + for subtables in table.blocks: + for subtable in subtables: + cache_files += list_table_cache_files(subtable) + return cache_files + elif isinstance(table, MemoryMappedTable): + return [table.path] + else: + return [] + + +def _wrap_for_chunked_arrays(func): + """Apply the function on each chunk of a `pyarrow.ChunkedArray`, or on the array directly""" + + def wrapper(array, *args, **kwargs): + if isinstance(array, pa.ChunkedArray): + return pa.chunked_array([func(chunk, *args, **kwargs) for chunk in array.chunks]) + else: + return func(array, *args, **kwargs) + + return wrapper + + +def _are_list_values_of_length(array: pa.ListArray, length: int) -> bool: + """Check if all the sub-lists of a `pa.ListArray` have the specified length.""" + return pc.all(pc.equal(array.value_lengths(), length)).as_py() or array.null_count == len(array) + + +def _combine_list_array_offsets_with_mask(array: pa.ListArray) -> pa.Array: + """Add the null bitmap to the offsets of a `pa.ListArray`.""" + offsets = array.offsets + if array.null_count > 0: + offsets = pa.concat_arrays( + [ + pc.replace_with_mask(offsets[:-1], array.is_null(), pa.nulls(len(array), pa.int32())), + offsets[-1:], + ] + ) + return offsets + + +def _storage_type(type: pa.DataType) -> pa.DataType: + """Convert a (possibly nested) `pa.ExtensionType` to its storage type.""" + if isinstance(type, pa.ExtensionType): + return _storage_type(type.storage_type) + elif isinstance(type, pa.StructType): + return pa.struct([pa.field(field.name, _storage_type(field.type)) for field in type]) + elif isinstance(type, pa.ListType): + return pa.list_(_storage_type(type.value_type)) + elif isinstance(type, pa.FixedSizeListType): + return pa.list_(_storage_type(type.value_type), type.list_size) + return type + + +def _short_str(value: Any) -> str: + out = str(value) + if len(out) > 3000: + out = out[:1500] + "\n...\n" + out[-1500:] + return out + + +@_wrap_for_chunked_arrays +def array_cast( + array: pa.Array, pa_type: pa.DataType, allow_primitive_to_str: bool = True, allow_decimal_to_str: bool = True +) -> Union[pa.Array, pa.FixedSizeListArray, pa.ListArray, pa.StructArray, pa.ExtensionArray]: + """Improved version of `pa.Array.cast` + + It supports casting `pa.StructArray` objects to re-order the fields. + It also let you control certain aspects of the casting, e.g. whether + to disable casting primitives (`booleans`, `floats` or `ints`) or + disable casting decimals to strings. + + Args: + array (`pa.Array`): + PyArrow array to cast + pa_type (`pa.DataType`): + Target PyArrow type + allow_primitive_to_str (`bool`, defaults to `True`): + Whether to allow casting primitives to strings. + Defaults to `True`. + allow_decimal_to_str (`bool`, defaults to `True`): + Whether to allow casting decimals to strings. + Defaults to `True`. + + Raises: + `pa.ArrowInvalidError`: if the arrow data casting fails + `TypeError`: if the target type is not supported according, e.g. + + - if a field is missing + - if casting from primitives to strings and `allow_primitive_to_str` is `False` + - if casting from decimals to strings and `allow_decimal_to_str` is `False` + + Returns: + `List[pyarrow.Array]`: the casted array + """ + _c = partial(array_cast, allow_primitive_to_str=allow_primitive_to_str, allow_decimal_to_str=allow_decimal_to_str) + if isinstance(array, pa.ExtensionArray): + array = array.storage + if isinstance(pa_type, pa.ExtensionType): + return pa_type.wrap_array(_c(array, pa_type.storage_type)) + elif array.type == pa_type: + return array + elif pa.types.is_struct(array.type): + if pa.types.is_struct(pa_type) and ({field.name for field in pa_type} == {field.name for field in array.type}): + if array.type.num_fields == 0: + return array + arrays = [_c(array.field(field.name), field.type) for field in pa_type] + return pa.StructArray.from_arrays(arrays, fields=list(pa_type), mask=array.is_null()) + elif pa.types.is_list(array.type) or pa.types.is_large_list(array.type): + if pa.types.is_fixed_size_list(pa_type): + if _are_list_values_of_length(array, pa_type.list_size): + if array.null_count > 0: + # Ensure each null value in the array translates to [null] * pa_type.list_size in the array's values array + array_type = array.type + storage_type = _storage_type(array_type) + if array_type != storage_type: + # Temporarily convert to the storage type to support extension types in the slice operation + array = _c(array, storage_type) + array = pc.list_slice(array, 0, pa_type.list_size, return_fixed_size_list=True) + array = _c(array, array_type) + else: + array = pc.list_slice(array, 0, pa_type.list_size, return_fixed_size_list=True) + array_values = array.values + return pa.FixedSizeListArray.from_arrays( + _c(array_values, pa_type.value_type), pa_type.list_size, mask=array.is_null() + ) + else: + array_values = array.values[ + array.offset * pa_type.list_size : (array.offset + len(array)) * pa_type.list_size + ] + return pa.FixedSizeListArray.from_arrays(_c(array_values, pa_type.value_type), pa_type.list_size) + elif pa.types.is_list(pa_type): + # Merge offsets with the null bitmap to avoid the "Null bitmap with offsets slice not supported" ArrowNotImplementedError + array_offsets = _combine_list_array_offsets_with_mask(array) + return pa.ListArray.from_arrays(array_offsets, _c(array.values, pa_type.value_type)) + elif pa.types.is_large_list(pa_type): + # Merge offsets with the null bitmap to avoid the "Null bitmap with offsets slice not supported" ArrowNotImplementedError + array_offsets = _combine_list_array_offsets_with_mask(array) + return pa.LargeListArray.from_arrays(array_offsets, _c(array.values, pa_type.value_type)) + elif pa.types.is_fixed_size_list(array.type): + if pa.types.is_fixed_size_list(pa_type): + if pa_type.list_size == array.type.list_size: + array_values = array.values[ + array.offset * array.type.list_size : (array.offset + len(array)) * array.type.list_size + ] + return pa.FixedSizeListArray.from_arrays( + _c(array_values, pa_type.value_type), pa_type.list_size, mask=array.is_null() + ) + elif pa.types.is_list(pa_type): + array_offsets = (np.arange(len(array) + 1) + array.offset) * array.type.list_size + return pa.ListArray.from_arrays(array_offsets, _c(array.values, pa_type.value_type), mask=array.is_null()) + elif pa.types.is_large_list(pa_type): + array_offsets = (np.arange(len(array) + 1) + array.offset) * array.type.list_size + return pa.LargeListArray.from_arrays( + array_offsets, _c(array.values, pa_type.value_type), mask=array.is_null() + ) + else: + if pa.types.is_string(pa_type): + if not allow_primitive_to_str and pa.types.is_primitive(array.type): + raise TypeError( + f"Couldn't cast array of type {_short_str(array.type)} to {_short_str(pa_type)} " + f"since allow_primitive_to_str is set to {allow_primitive_to_str} " + ) + if not allow_decimal_to_str and pa.types.is_decimal(array.type): + raise TypeError( + f"Couldn't cast array of type {_short_str(array.type)} to {_short_str(pa_type)} " + f"and allow_decimal_to_str is set to {allow_decimal_to_str}" + ) + if pa.types.is_null(pa_type) and not pa.types.is_null(array.type): + raise TypeError(f"Couldn't cast array of type {_short_str(array.type)} to {_short_str(pa_type)}") + return array.cast(pa_type) + raise TypeError(f"Couldn't cast array of type {_short_str(array.type)} to {_short_str(pa_type)}") + + +@_wrap_for_chunked_arrays +def cast_array_to_feature( + array: pa.Array, feature: "FeatureType", allow_primitive_to_str: bool = True, allow_decimal_to_str: bool = True +) -> pa.Array: + """Cast an array to the arrow type that corresponds to the requested feature type. + For custom features like [`Audio`] or [`Image`], it takes into account the "cast_storage" methods + they defined to enable casting from other arrow types. + + Args: + array (`pa.Array`): + The PyArrow array to cast. + feature (`datasets.features.FeatureType`): + The target feature type. + allow_primitive_to_str (`bool`, defaults to `True`): + Whether to allow casting primitives to strings. + Defaults to `True`. + allow_decimal_to_str (`bool`, defaults to `True`): + Whether to allow casting decimals to strings. + Defaults to `True`. + + Raises: + `pa.ArrowInvalidError`: if the arrow data casting fails + `TypeError`: if the target type is not supported according, e.g. + + - if a field is missing + - if casting from primitives and `allow_primitive_to_str` is `False` + - if casting from decimals and `allow_decimal_to_str` is `False` + + Returns: + array (`pyarrow.Array`): the casted array + """ + from .features.features import LargeList, List, get_nested_type + + _c = partial( + cast_array_to_feature, + allow_primitive_to_str=allow_primitive_to_str, + allow_decimal_to_str=allow_decimal_to_str, + ) + + if isinstance(array, pa.ExtensionArray): + array = array.storage + if hasattr(feature, "cast_storage"): + return feature.cast_storage(array) + + if pa.types.is_struct(array.type): + # feature must be a dict + if isinstance(feature, dict) and (array_fields := {field.name for field in array.type}) <= set(feature): + null_array = pa.array([None] * len(array)) + arrays = [ + _c(array.field(name) if name in array_fields else null_array, subfeature) + for name, subfeature in feature.items() + ] + return pa.StructArray.from_arrays(arrays, names=list(feature), mask=array.is_null()) + elif pa.types.is_list(array.type) or pa.types.is_large_list(array.type): + # feature must be either List(subfeature) or LargeList(subfeature) + if isinstance(feature, LargeList): + casted_array_values = _c(array.values, feature.feature) + if pa.types.is_large_list(array.type) and casted_array_values.type == array.values.type: + # Both array and feature have equal large_list type and values (within the list) type + return array + else: + # Merge offsets with the null bitmap to avoid the "Null bitmap with offsets slice not supported" ArrowNotImplementedError + array_offsets = _combine_list_array_offsets_with_mask(array) + return pa.LargeListArray.from_arrays(array_offsets, casted_array_values) + elif isinstance(feature, List): + if feature.length > -1: + if _are_list_values_of_length(array, feature.length): + if array.null_count > 0: + # Ensure each null value in the array translates to [null] * pa_type.list_size in the array's values array + array_type = array.type + storage_type = _storage_type(array_type) + if array_type != storage_type: + # Temporarily convert to the storage type to support extension types in the slice operation + array = array_cast( + array, + storage_type, + allow_primitive_to_str=allow_primitive_to_str, + allow_decimal_to_str=allow_decimal_to_str, + ) + array = pc.list_slice(array, 0, feature.length, return_fixed_size_list=True) + array = array_cast( + array, + array_type, + allow_primitive_to_str=allow_primitive_to_str, + allow_decimal_to_str=allow_decimal_to_str, + ) + else: + array = pc.list_slice(array, 0, feature.length, return_fixed_size_list=True) + array_values = array.values + casted_array_values = _c(array_values, feature.feature) + return pa.FixedSizeListArray.from_arrays( + casted_array_values, feature.length, mask=array.is_null() + ) + else: + array_values = array.values[ + array.offset * feature.length : (array.offset + len(array)) * feature.length + ] + return pa.FixedSizeListArray.from_arrays(_c(array_values, feature.feature), feature.length) + else: + casted_array_values = _c(array.values, feature.feature) + if pa.types.is_list(array.type) and casted_array_values.type == array.values.type: + # Both array and feature have equal list type and values (within the list) type + return array + else: + # Merge offsets with the null bitmap to avoid the "Null bitmap with offsets slice not supported" ArrowNotImplementedError + array_offsets = _combine_list_array_offsets_with_mask(array) + return pa.ListArray.from_arrays(array_offsets, casted_array_values) + elif pa.types.is_fixed_size_list(array.type): + # feature must be List(subfeature) + if isinstance(feature, LargeList): + array_offsets = (np.arange(len(array) + 1) + array.offset) * array.type.list_size + return pa.LargeListArray.from_arrays( + array_offsets, _c(array.values, feature.feature), mask=array.is_null() + ) + elif isinstance(feature, List): + if feature.length > -1: + if feature.length == array.type.list_size: + array_values = array.values[ + array.offset * array.type.list_size : (array.offset + len(array)) * array.type.list_size + ] + casted_array_values = _c(array_values, feature.feature) + return pa.FixedSizeListArray.from_arrays(casted_array_values, feature.length, mask=array.is_null()) + else: + array_offsets = (np.arange(len(array) + 1) + array.offset) * array.type.list_size + return pa.ListArray.from_arrays(array_offsets, _c(array.values, feature.feature), mask=array.is_null()) + if pa.types.is_null(array.type): + return array_cast( + array, + get_nested_type(feature), + allow_primitive_to_str=allow_primitive_to_str, + allow_decimal_to_str=allow_decimal_to_str, + ) + elif not isinstance(feature, (List, LargeList, dict)): + return array_cast( + array, + feature(), + allow_primitive_to_str=allow_primitive_to_str, + allow_decimal_to_str=allow_decimal_to_str, + ) + raise TypeError(f"Couldn't cast array of type\n{_short_str(array.type)}\nto\n{_short_str(feature)}") + + +@_wrap_for_chunked_arrays +def embed_array_storage( + array: pa.Array, + feature: "FeatureType", + token_per_repo_id=None, + local_files: bool = True, + remote_files: bool = True, +): + """Embed data into an arrays's storage. + For custom features like Audio or Image, it takes into account the "embed_storage" methods + they define to embed external data (e.g. an image file) into an array. + + + + Args: + array (`pa.Array`): + The PyArrow array in which to embed data. + feature (`datasets.features.FeatureType`): + Array features. + local_files (`bool`, defaults to `True`) + Whether to embed local files data in the array + + + remote_files (`bool`, defaults to `True`) + Whether to embed remote files data in the array. + E.g. files with paths that start with hf:// or https:// + + + + Raises: + `TypeError`: if the target type is not supported according, e.g. + + - if a field is missing + + Returns: + array (`pyarrow.Array`): the casted array + """ + if not local_files and not remote_files: + return array + + from .features import LargeList, List + + _e = partial( + embed_array_storage, token_per_repo_id=token_per_repo_id, local_files=local_files, remote_files=remote_files + ) + + if isinstance(array, pa.ExtensionArray): + array = array.storage + if hasattr(feature, "embed_storage"): + return feature.embed_storage( + array, token_per_repo_id=token_per_repo_id, local_files=local_files, remote_files=remote_files + ) + elif pa.types.is_struct(array.type): + # feature must be a dict + if isinstance(feature, dict): + arrays = [_e(array.field(name), subfeature) for name, subfeature in feature.items()] + return pa.StructArray.from_arrays(arrays, names=list(feature), mask=array.is_null()) + elif pa.types.is_list(array.type): + # feature must be either List(subfeature) + # Merge offsets with the null bitmap to avoid the "Null bitmap with offsets slice not supported" ArrowNotImplementedError + array_offsets = _combine_list_array_offsets_with_mask(array) + if isinstance(feature, List) and feature.length == -1: + return pa.ListArray.from_arrays(array_offsets, _e(array.values, feature.feature)) + elif pa.types.is_large_list(array.type): + # feature must be LargeList(subfeature) + # Merge offsets with the null bitmap to avoid the "Null bitmap with offsets slice not supported" ArrowNotImplementedError + array_offsets = _combine_list_array_offsets_with_mask(array) + return pa.LargeListArray.from_arrays(array_offsets, _e(array.values, feature.feature)) + elif pa.types.is_fixed_size_list(array.type): + # feature must be List(subfeature) + if isinstance(feature, List) and feature.length > -1: + array_values = array.values[ + array.offset * array.type.list_size : (array.offset + len(array)) * array.type.list_size + ] + embedded_array_values = _e(array_values, feature.feature) + return pa.FixedSizeListArray.from_arrays(embedded_array_values, feature.length, mask=array.is_null()) + if not isinstance(feature, (List, LargeList, dict)): + return array + raise TypeError(f"Couldn't embed array of type\n{_short_str(array.type)}\nwith\n{_short_str(feature)}") + + +class CastError(ValueError): + """When it's not possible to cast an Arrow table to a specific schema or set of features""" + + def __init__(self, *args, table_column_names: list[str], requested_column_names: list[str]) -> None: + super().__init__(*args) + self.table_column_names = table_column_names + self.requested_column_names = requested_column_names + + def __reduce__(self): + # Fix unpickling: TypeError: __init__() missing 2 required keyword-only arguments: 'table_column_names' and 'requested_column_names' + return partial( + CastError, table_column_names=self.table_column_names, requested_column_names=self.requested_column_names + ), () + + def details(self): + new_columns = set(self.table_column_names) - set(self.requested_column_names) + missing_columns = set(self.requested_column_names) - set(self.table_column_names) + if new_columns and missing_columns: + return f"there are {len(new_columns)} new columns ({_short_str(new_columns)}) and {len(missing_columns)} missing columns ({_short_str(missing_columns)})." + elif new_columns: + return f"there are {len(new_columns)} new columns ({_short_str(new_columns)})" + else: + return f"there are {len(missing_columns)} missing columns ({_short_str(missing_columns)})" + + +def cast_table_to_features(table: pa.Table, features: "Features"): + """Cast a table to the arrow schema that corresponds to the requested features. + + Args: + table (`pyarrow.Table`): + PyArrow table to cast. + features ([`Features`]): + Target features. + + Returns: + table (`pyarrow.Table`): the casted table + """ + if sorted(table.column_names) != sorted(features): + raise CastError( + f"Couldn't cast\n{_short_str(table.schema)}\nto\n{_short_str(features)}\nbecause column names don't match", + table_column_names=table.column_names, + requested_column_names=list(features), + ) + arrays = [cast_array_to_feature(table[name], feature) for name, feature in features.items()] + return pa.Table.from_arrays(arrays, schema=features.arrow_schema) + + +def cast_table_to_schema(table: pa.Table, schema: pa.Schema): + """Cast a table to the arrow schema. Different from `cast_table_to_features`, this method can preserve nullability. + + Args: + table (`pa.Table`): + PyArrow table to cast. + features ([`Features`]): + Target features. + + Returns: + `pa.Table`: the casted table + """ + from .features import Features + + features = Features.from_arrow_schema(schema) + table_column_names = set(table.column_names) + if not table_column_names <= set(schema.names): + raise CastError( + f"Couldn't cast\n{_short_str(table.schema)}\nto\n{_short_str(features)}\nbecause column names don't match", + table_column_names=table.column_names, + requested_column_names=list(features), + ) + arrays = [ + cast_array_to_feature( + table[name] if name in table_column_names else pa.array([None] * len(table), type=schema.field(name).type), + feature, + ) + for name, feature in features.items() + ] + return pa.Table.from_arrays(arrays, schema=schema) + + +def embed_table_storage(table: pa.Table, token_per_repo_id=None, local_files: bool = True, remote_files: bool = True): + """Embed external data into a table's storage. + + + + Args: + table (`pyarrow.Table`): + PyArrow table in which to embed data. + local_files (`bool`, defaults to `True`) + Whether to embed local files data in the table + + + remote_files (`bool`, defaults to `True`) + Whether to embed remote files data in the table. + E.g. files with paths that start with hf:// or https:// + + + + Returns: + table (`pyarrow.Table`): the table with embedded data + """ + if not local_files and not remote_files: + return table + + from .features.features import Features, require_storage_embed + + features = Features.from_arrow_schema(table.schema) + arrays = [ + embed_array_storage( + table[name], + feature, + token_per_repo_id=token_per_repo_id, + local_files=local_files, + remote_files=remote_files, + ) + if require_storage_embed(feature) + else table[name] + for name, feature in features.items() + ] + return pa.Table.from_arrays(arrays, schema=features.arrow_schema) + + +def table_cast(table: pa.Table, schema: pa.Schema): + """Improved version of `pa.Table.cast`. + + It supports casting to feature types stored in the schema metadata. + + Args: + table (`pyarrow.Table`): + PyArrow table to cast. + schema (`pyarrow.Schema`): + Target PyArrow schema. + + Returns: + table (`pyarrow.Table`): the casted table + """ + if table.schema != schema: + return cast_table_to_schema(table, schema) + elif table.schema.metadata != schema.metadata: + return table.replace_schema_metadata(schema.metadata) + else: + return table + + +def table_flatten(table: pa.Table): + """Improved version of `pa.Table.flatten`. + + It behaves as `pa.Table.flatten` in a sense it does 1-step flatten of the columns with a struct type into one column per struct field, + but updates the metadata and skips decodable features unless the `decode` attribute of these features is set to False. + + Args: + table (`pa.Table`): + PyArrow table to flatten. + + Returns: + `Table`: the flattened table + """ + from .features import Features + + features = Features.from_arrow_schema(table.schema) + if any(hasattr(subfeature, "flatten") and subfeature.flatten() == subfeature for subfeature in features.values()): + flat_arrays = [] + flat_column_names = [] + for field in table.schema: + array = table.column(field.name) + subfeature = features[field.name] + if pa.types.is_struct(field.type) and ( + not hasattr(subfeature, "flatten") or subfeature.flatten() != subfeature + ): + flat_arrays.extend(array.flatten()) + flat_column_names.extend([f"{field.name}.{subfield.name}" for subfield in field.type]) + else: + flat_arrays.append(array) + flat_column_names.append(field.name) + flat_table = pa.Table.from_arrays( + flat_arrays, + names=flat_column_names, + ) + else: + flat_table = table.flatten() + # Preserve complex types in the metadata + flat_features = features.flatten(max_depth=2) + flat_features = Features({column_name: flat_features[column_name] for column_name in flat_table.column_names}) + return flat_table.replace_schema_metadata(flat_features.arrow_schema.metadata) + + +def table_visitor(table: pa.Table, function: Callable[[pa.Array], None]): + """Visit all arrays in a table and apply a function to them. + + Args: + table (`pyarrow.Table`): + PyArrow table to visit. + function (`Callable[[pa.Array], None]`): + Function to apply to each array. + """ + from .features import Features, LargeList, List + + features = Features.from_arrow_schema(table.schema) + + def _visit(array, feature): + if isinstance(array, pa.ChunkedArray): + for chunk in array.chunks: + _visit(chunk, feature) + else: + if isinstance(array, pa.ExtensionArray): + array = array.storage + function(array, feature) + if pa.types.is_struct(array.type) and not hasattr(feature, "cast_storage"): + for name, subfeature in feature.items(): + _visit(array.field(name), subfeature) + elif pa.types.is_list(array.type): + if isinstance(feature, (LargeList, List)): + _visit(array.values, feature.feature) + + for name, feature in features.items(): + _visit(table[name], feature) + + +def table_iter(table: Table, batch_size: int, drop_last_batch=False) -> Iterator[pa.Table]: + """Iterate over sub-tables of size `batch_size`. + + Args: + table (`pyarrow.Table`): + PyArrow table to iterate over. + batch_size (`int`): + Size of each sub-table to yield. + drop_last_batch (`bool`, defaults to `False`): + Drop the last batch if it is smaller than `batch_size`. + """ + chunks_buffer = [] + chunks_buffer_size = 0 + for chunk in table.to_reader(max_chunksize=batch_size): + if len(chunk) == 0: + continue + elif chunks_buffer_size + len(chunk) < batch_size: + chunks_buffer.append(chunk) + chunks_buffer_size += len(chunk) + continue + elif chunks_buffer_size + len(chunk) == batch_size: + chunks_buffer.append(chunk) + yield pa.Table.from_batches(chunks_buffer) + chunks_buffer = [] + chunks_buffer_size = 0 + else: + cropped_chunk_length = batch_size - chunks_buffer_size + chunks_buffer.append(chunk.slice(0, cropped_chunk_length)) + yield pa.Table.from_batches(chunks_buffer) + chunks_buffer = [chunk.slice(cropped_chunk_length, len(chunk) - cropped_chunk_length)] + chunks_buffer_size = len(chunk) - cropped_chunk_length + if not drop_last_batch and chunks_buffer: + yield pa.Table.from_batches(chunks_buffer) diff --git a/src/datasets/utils/__init__.py b/src/datasets/utils/__init__.py new file mode 100644 index 0000000..a1c3d29 --- /dev/null +++ b/src/datasets/utils/__init__.py @@ -0,0 +1,25 @@ +# Copyright 2020 The HuggingFace Datasets Authors and the TensorFlow Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import tqdm as _tqdm # _tqdm is the module +from .experimental import experimental +from .info_utils import VerificationMode +from .logging import disable_progress_bar, enable_progress_bar, is_progress_bar_enabled +from .tqdm import ( + are_progress_bars_disabled, + disable_progress_bars, + enable_progress_bars, + tqdm, +) +from .version import Version diff --git a/src/datasets/utils/_dataset_viewer.py b/src/datasets/utils/_dataset_viewer.py new file mode 100644 index 0000000..0f4c298 --- /dev/null +++ b/src/datasets/utils/_dataset_viewer.py @@ -0,0 +1,95 @@ +from typing import Any, Optional, Union + +from huggingface_hub.utils import get_session + +from .. import config +from ..exceptions import DatasetsError +from .file_utils import ( + get_authentication_headers_for_url, +) +from .logging import get_logger + + +logger = get_logger(__name__) + + +class DatasetViewerError(DatasetsError): + """Dataset viewer error. + + Raised when trying to use the dataset viewer HTTP API and when trying to access: + - a missing dataset, or + - a private/gated dataset and the user is not authenticated. + - unavailable /parquet or /info responses + """ + + +def get_exported_parquet_files( + dataset: str, commit_hash: str, token: Optional[Union[str, bool]] +) -> list[dict[str, Any]]: + """ + Get the dataset exported parquet files + Docs: https://huggingface.co/docs/datasets-server/parquet + """ + dataset_viewer_parquet_url = config.HF_ENDPOINT.replace("://", "://datasets-server.") + "/parquet?dataset=" + try: + parquet_data_files_response = get_session().get( + url=dataset_viewer_parquet_url + dataset, + headers=get_authentication_headers_for_url(config.HF_ENDPOINT + f"datasets/{dataset}", token=token), + timeout=100.0, + ) + parquet_data_files_response.raise_for_status() + if "X-Revision" in parquet_data_files_response.headers: + if parquet_data_files_response.headers["X-Revision"] == commit_hash or commit_hash is None: + parquet_data_files_response_json = parquet_data_files_response.json() + if ( + parquet_data_files_response_json.get("partial") is False + and not parquet_data_files_response_json.get("pending", True) + and not parquet_data_files_response_json.get("failed", True) + and "parquet_files" in parquet_data_files_response_json + ): + return parquet_data_files_response_json["parquet_files"] + else: + logger.debug(f"Parquet export for {dataset} is not completely ready yet.") + else: + logger.debug( + f"Parquet export for {dataset} is available but outdated (commit_hash='{parquet_data_files_response.headers['X-Revision']}')" + ) + except Exception as e: # noqa catch any exception of the dataset viewer API and consider the parquet export doesn't exist + logger.debug(f"No parquet export for {dataset} available ({type(e).__name__}: {e})") + raise DatasetViewerError("No exported Parquet files available.") + + +def get_exported_dataset_infos( + dataset: str, commit_hash: str, token: Optional[Union[str, bool]] +) -> dict[str, dict[str, Any]]: + """ + Get the dataset information, can be useful to get e.g. the dataset features. + Docs: https://huggingface.co/docs/datasets-server/info + """ + dataset_viewer_info_url = config.HF_ENDPOINT.replace("://", "://datasets-server.") + "/info?dataset=" + try: + info_response = get_session().get( + url=dataset_viewer_info_url + dataset, + headers=get_authentication_headers_for_url(config.HF_ENDPOINT + f"datasets/{dataset}", token=token), + timeout=100.0, + ) + info_response.raise_for_status() + if "X-Revision" in info_response.headers: + if info_response.headers["X-Revision"] == commit_hash or commit_hash is None: + info_response = info_response.json() + if ( + info_response.get("partial") is False + and not info_response.get("pending", True) + and not info_response.get("failed", True) + and "dataset_info" in info_response + ): + return info_response["dataset_info"] + else: + logger.debug(f"Dataset info for {dataset} is not completely ready yet.") + else: + logger.debug( + f"Dataset info for {dataset} is available but outdated (commit_hash='{info_response.headers['X-Revision']}')" + ) + except Exception as e: # noqa catch any exception of the dataset viewer API and consider the dataset info doesn't exist + logger.debug(f"No dataset info for {dataset} available ({type(e).__name__}: {e})") + raise DatasetViewerError("No exported dataset infos available.") diff --git a/src/datasets/utils/_dill.py b/src/datasets/utils/_dill.py new file mode 100644 index 0000000..1830096 --- /dev/null +++ b/src/datasets/utils/_dill.py @@ -0,0 +1,505 @@ +# Copyright 2023 The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Extends `dill` to support pickling more types and produce more consistent dumps.""" + +import os +import sys +from io import BytesIO +from types import CodeType, FunctionType + +import dill +from packaging import version + +from .. import config + + +class Pickler(dill.Pickler): + dispatch = dill._dill.MetaCatchingDict(dill.Pickler.dispatch.copy()) + _legacy_no_dict_keys_sorting = False + + def save(self, obj, save_persistent_id=True): + obj_type = type(obj) + if obj_type not in self.dispatch: + if "regex" in sys.modules: + import regex # type: ignore + + if obj_type is regex.Pattern: + pklregister(obj_type)(_save_regexPattern) + if "spacy" in sys.modules: + import spacy # type: ignore + + if issubclass(obj_type, spacy.Language): + pklregister(obj_type)(_save_spacyLanguage) + if "tiktoken" in sys.modules: + import tiktoken # type: ignore + + if obj_type is tiktoken.Encoding: + pklregister(obj_type)(_save_tiktokenEncoding) + if "torch" in sys.modules: + import torch # type: ignore + + if issubclass(obj_type, torch.Tensor): + pklregister(obj_type)(_save_torchTensor) + + if obj_type is torch.Generator: + pklregister(obj_type)(_save_torchGenerator) + + # Unwrap `torch.compile`-ed modules + if issubclass(obj_type, torch.nn.Module): + obj = getattr(obj, "_orig_mod", obj) + if "transformers" in sys.modules: + import transformers # type: ignore + + if issubclass(obj_type, transformers.PreTrainedTokenizerBase): + pklregister(obj_type)(_save_transformersPreTrainedTokenizerBase) + + # Unwrap `torch.compile`-ed functions + if obj_type is FunctionType: + obj = getattr(obj, "_torchdynamo_orig_callable", obj) + dill.Pickler.save(self, obj, save_persistent_id=save_persistent_id) + + def _batch_setitems(self, items, *args, **kwargs): + # Ignore the order of keys in a dict + try: + # Faster, but fails for unorderable elements + items = sorted(items) + except Exception: # TypeError, decimal.InvalidOperation, etc. + from datasets.fingerprint import Hasher + + items = sorted(items, key=lambda x: Hasher.hash(x[0])) + return super()._batch_setitems(items, *args, **kwargs) + + def memoize(self, obj): + # Don't memoize strings since two identical strings can have different Python ids + if type(obj) is not str: # noqa: E721 + dill.Pickler.memoize(self, obj) + + +def pklregister(t): + """Register a custom reducer for the type.""" + + def proxy(func): + Pickler.dispatch[t] = func + return func + + return proxy + + +def _is_supported_dill_version(): + """Check if the current dill version is in the supported range.""" + return config.DILL_VERSION.release[:3] in [ + version.parse("0.3.6").release, + version.parse("0.3.7").release, + version.parse("0.3.8").release, + version.parse("0.3.9").release, + version.parse("0.4.0").release, + version.parse("0.4.1").release, + ] + + +def dump(obj, file): + """Pickle an object to a file.""" + Pickler(file, recurse=True).dump(obj) + + +def dumps(obj): + """Pickle an object to a string.""" + file = BytesIO() + dump(obj, file) + return file.getvalue() + + +if config.DILL_VERSION < version.parse("0.3.6"): + + def log(pickler, msg): + dill._dill.log.info(msg) + +elif _is_supported_dill_version(): + + def log(pickler, msg): + dill._dill.logger.trace(pickler, msg) + + +@pklregister(set) +def _save_set(pickler, obj): + log(pickler, f"Se: {obj}") + try: + # Faster, but fails for unorderable elements + args = (sorted(obj),) + except Exception: # TypeError, decimal.InvalidOperation, etc. + from datasets.fingerprint import Hasher + + args = (sorted(obj, key=Hasher.hash),) + + pickler.save_reduce(set, args, obj=obj) + log(pickler, "# Se") + + +def _save_regexPattern(pickler, obj): + import regex # type: ignore + + log(pickler, f"Re: {obj}") + args = (obj.pattern, obj.flags) + pickler.save_reduce(regex.compile, args, obj=obj) + log(pickler, "# Re") + + +def _save_tiktokenEncoding(pickler, obj): + import tiktoken # type: ignore + + log(pickler, f"Enc: {obj}") + args = (obj.name, obj._pat_str, obj._mergeable_ranks, obj._special_tokens) + pickler.save_reduce(tiktoken.Encoding, args, obj=obj) + log(pickler, "# Enc") + + +def _save_torchTensor(pickler, obj): + import torch # type: ignore + + # `torch.from_numpy` is not picklable in `torch>=1.11.0` + def create_torchTensor(np_array, dtype=None): + tensor = torch.from_numpy(np_array) + if dtype: + tensor = tensor.type(dtype) + return tensor + + log(pickler, f"To: {obj}") + if obj.dtype == torch.bfloat16: + args = (obj.detach().to(torch.float).cpu().numpy(), torch.bfloat16) + else: + args = (obj.detach().cpu().numpy(),) + pickler.save_reduce(create_torchTensor, args, obj=obj) + log(pickler, "# To") + + +def _save_torchGenerator(pickler, obj): + import torch # type: ignore + + def create_torchGenerator(state): + generator = torch.Generator() + generator.set_state(state) + return generator + + log(pickler, f"Ge: {obj}") + args = (obj.get_state(),) + pickler.save_reduce(create_torchGenerator, args, obj=obj) + log(pickler, "# Ge") + + +def _save_spacyLanguage(pickler, obj): + import spacy # type: ignore + + def create_spacyLanguage(config, bytes): + lang_cls = spacy.util.get_lang_class(config["nlp"]["lang"]) + lang_inst = lang_cls.from_config(config) + return lang_inst.from_bytes(bytes) + + log(pickler, f"Sp: {obj}") + args = (obj.config, obj.to_bytes()) + pickler.save_reduce(create_spacyLanguage, args, obj=obj) + log(pickler, "# Sp") + + +def _save_transformersPreTrainedTokenizerBase(pickler, obj): + log(pickler, f"Tok: {obj}") + # Ignore the `cache` attribute and make hashing stable. + # + # Some tokenizers backed by the `tokenizers` library mutate their internal `_tokenizer` state when called + # (e.g. by enabling truncation/padding). This can change the serialized bytes across runs and make dataset + # fingerprints unstable, which prevents `.map(load_from_cache_file=True)` from reusing cache files. + # + # For hashing/fingerprinting, we temporarily disable backend truncation/padding to avoid these runtime settings + # affecting the fingerprint, then restore the original settings. + state = obj.__dict__.copy() + if "cache" in state and isinstance(state["cache"], dict): + state["cache"] = {} + if "deprecation_warnings" in state and isinstance(state["deprecation_warnings"], dict): + state["deprecation_warnings"] = {} + + backend_tokenizer = obj.__dict__.get("_tokenizer") + truncation = padding = None + if ( + backend_tokenizer is not None + and hasattr(backend_tokenizer, "truncation") + and hasattr(backend_tokenizer, "padding") + ): + truncation = backend_tokenizer.truncation + padding = backend_tokenizer.padding + try: + if truncation is not None and hasattr(backend_tokenizer, "no_truncation"): + backend_tokenizer.no_truncation() + if padding is not None and hasattr(backend_tokenizer, "no_padding"): + backend_tokenizer.no_padding() + except Exception: + truncation = padding = None + + try: + pickler.save_reduce(type(obj), (), state=state, obj=obj) + finally: + try: + if backend_tokenizer is not None: + if truncation is not None and hasattr(backend_tokenizer, "enable_truncation"): + backend_tokenizer.enable_truncation(**truncation) + if padding is not None and hasattr(backend_tokenizer, "enable_padding"): + backend_tokenizer.enable_padding(**padding) + except Exception: + pass + log(pickler, "# Tok") + + +if config.DILL_VERSION < version.parse("0.3.6"): + + @pklregister(CodeType) + def _save_code(pickler, obj): + """ + From dill._dill.save_code + This is a modified version that removes the origin (filename + line no.) + of functions created in notebooks or shells for example. + """ + dill._dill.log.info(f"Co: {obj}") + # The filename of a function is the .py file where it is defined. + # Filenames of functions created in notebooks or shells start with '<' + # ex: for ipython, and for shell + # Filenames of functions created in ipykernel the filename + # look like f"{tempdir}/ipykernel_{id1}/{id2}.py" + # Moreover lambda functions have a special name: '' + # ex: (lambda x: x).__code__.co_name == "" # True + # + # For the hashing mechanism we ignore where the function has been defined + # More specifically: + # - we ignore the filename of special functions (filename starts with '<') + # - we always ignore the line number + # - we only use the base name of the file instead of the whole path, + # to be robust in case a script is moved for example. + # + # Only those two lines are different from the original implementation: + co_filename = ( + "" + if obj.co_filename.startswith("<") + or ( + len(obj.co_filename.split(os.path.sep)) > 1 + and obj.co_filename.split(os.path.sep)[-2].startswith("ipykernel_") + ) + or obj.co_name == "" + else os.path.basename(obj.co_filename) + ) + co_firstlineno = 1 + # The rest is the same as in the original dill implementation (with also a version check for 3.10) + if dill._dill.PY3: + if hasattr(obj, "co_posonlyargcount"): # python 3.8 (16 args) + args = ( + obj.co_argcount, + obj.co_posonlyargcount, + obj.co_kwonlyargcount, + obj.co_nlocals, + obj.co_stacksize, + obj.co_flags, + obj.co_code, + obj.co_consts, + obj.co_names, + obj.co_varnames, + co_filename, + obj.co_name, + co_firstlineno, + obj.co_linetable if sys.version_info >= (3, 10) else obj.co_lnotab, + obj.co_freevars, + obj.co_cellvars, + ) + else: # python 3.7 (15 args) + args = ( + obj.co_argcount, + obj.co_kwonlyargcount, + obj.co_nlocals, + obj.co_stacksize, + obj.co_flags, + obj.co_code, + obj.co_consts, + obj.co_names, + obj.co_varnames, + co_filename, + obj.co_name, + co_firstlineno, + obj.co_lnotab, + obj.co_freevars, + obj.co_cellvars, + ) + else: + args = ( + obj.co_argcount, + obj.co_nlocals, + obj.co_stacksize, + obj.co_flags, + obj.co_code, + obj.co_consts, + obj.co_names, + obj.co_varnames, + co_filename, + obj.co_name, + co_firstlineno, + obj.co_lnotab, + obj.co_freevars, + obj.co_cellvars, + ) + pickler.save_reduce(CodeType, args, obj=obj) + dill._dill.log.info("# Co") + return + +elif _is_supported_dill_version(): + # From: https://github.com/uqfoundation/dill/blob/dill-0.3.6/dill/_dill.py#L1104 + @pklregister(CodeType) + def save_code(pickler, obj): + dill._dill.logger.trace(pickler, "Co: %s", obj) + + ############################################################################################################ + # Modification here for huggingface/datasets + # The filename of a function is the .py file where it is defined. + # Filenames of functions created in notebooks or shells start with '<' + # ex: for ipython, and for shell + # Filenames of functions created in ipykernel the filename + # look like f"{tempdir}/ipykernel_{id1}/{id2}.py" + # Moreover lambda functions have a special name: '' + # ex: (lambda x: x).__code__.co_name == "" # True + # + # For the hashing mechanism we ignore where the function has been defined + # More specifically: + # - we ignore the filename of special functions (filename starts with '<') + # - we always ignore the line number + # - we only use the base name of the file instead of the whole path, + # to be robust in case a script is moved for example. + # + # Only those two lines are different from the original implementation: + co_filename = ( + "" + if obj.co_filename.startswith("<") + or ( + len(obj.co_filename.split(os.path.sep)) > 1 + and obj.co_filename.split(os.path.sep)[-2].startswith("ipykernel_") + ) + or obj.co_name == "" + else os.path.basename(obj.co_filename) + ) + co_firstlineno = 1 + # The rest is the same as in the original dill implementation, except for the replacements: + # - obj.co_filename => co_filename + # - obj.co_firstlineno => co_firstlineno + # - obj.co_lnotab => obj.co_linetable for >= 3.10 since co_lnotab was deprecated + ############################################################################################################ + + if hasattr(obj, "co_endlinetable"): # python 3.11a (20 args) + args = ( + obj.co_linetable, # Modification for huggingface/datasets ############################################ + obj.co_argcount, + obj.co_posonlyargcount, + obj.co_kwonlyargcount, + obj.co_nlocals, + obj.co_stacksize, + obj.co_flags, + obj.co_code, + obj.co_consts, + obj.co_names, + obj.co_varnames, + co_filename, # Modification for huggingface/datasets ############################################ + obj.co_name, + obj.co_qualname, + co_firstlineno, # Modification for huggingface/datasets ######################################### + obj.co_linetable, + obj.co_endlinetable, + obj.co_columntable, + obj.co_exceptiontable, + obj.co_freevars, + obj.co_cellvars, + ) + elif hasattr(obj, "co_exceptiontable"): # python 3.11 (18 args) + args = ( + obj.co_linetable, # Modification for huggingface/datasets ####################################### + obj.co_argcount, + obj.co_posonlyargcount, + obj.co_kwonlyargcount, + obj.co_nlocals, + obj.co_stacksize, + obj.co_flags, + obj.co_code, + obj.co_consts, + obj.co_names, + obj.co_varnames, + co_filename, # Modification for huggingface/datasets ############################################ + obj.co_name, + obj.co_qualname, + co_firstlineno, # Modification for huggingface/datasets ######################################### + obj.co_linetable, + obj.co_exceptiontable, + obj.co_freevars, + obj.co_cellvars, + ) + elif hasattr(obj, "co_linetable"): # python 3.10 (16 args) + args = ( + obj.co_linetable, # Modification for huggingface/datasets ####################################### + obj.co_argcount, + obj.co_posonlyargcount, + obj.co_kwonlyargcount, + obj.co_nlocals, + obj.co_stacksize, + obj.co_flags, + obj.co_code, + obj.co_consts, + obj.co_names, + obj.co_varnames, + co_filename, # Modification for huggingface/datasets ############################################ + obj.co_name, + co_firstlineno, # Modification for huggingface/datasets ######################################### + obj.co_linetable, + obj.co_freevars, + obj.co_cellvars, + ) + elif hasattr(obj, "co_posonlyargcount"): # python 3.8 (16 args) + args = ( + obj.co_argcount, + obj.co_posonlyargcount, + obj.co_kwonlyargcount, + obj.co_nlocals, + obj.co_stacksize, + obj.co_flags, + obj.co_code, + obj.co_consts, + obj.co_names, + obj.co_varnames, + co_filename, # Modification for huggingface/datasets ############################################ + obj.co_name, + co_firstlineno, # Modification for huggingface/datasets ######################################### + obj.co_lnotab, + obj.co_freevars, + obj.co_cellvars, + ) + else: # python 3.7 (15 args) + args = ( + obj.co_argcount, + obj.co_kwonlyargcount, + obj.co_nlocals, + obj.co_stacksize, + obj.co_flags, + obj.co_code, + obj.co_consts, + obj.co_names, + obj.co_varnames, + co_filename, # Modification for huggingface/datasets ############################################ + obj.co_name, + co_firstlineno, # Modification for huggingface/datasets ######################################### + obj.co_lnotab, + obj.co_freevars, + obj.co_cellvars, + ) + + pickler.save_reduce(dill._dill._create_code, args, obj=obj) + dill._dill.logger.trace(pickler, "# Co") + return diff --git a/src/datasets/utils/_filelock.py b/src/datasets/utils/_filelock.py new file mode 100644 index 0000000..803ce77 --- /dev/null +++ b/src/datasets/utils/_filelock.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python +# Copyright 2023 The HuggingFace Inc. team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License +"""Utilities to handle file locking in `datasets`.""" + +import os + +from filelock import FileLock as FileLock_ +from filelock import UnixFileLock +from filelock import __version__ as _filelock_version +from packaging import version + + +class FileLock(FileLock_): + """ + A `filelock.FileLock` initializer that handles long paths. + It also uses the current umask for lock files. + """ + + MAX_FILENAME_LENGTH = 255 + + def __init__(self, lock_file, *args, **kwargs): + # The "mode" argument is required if we want to use the current umask in filelock >= 3.10 + # In previous previous it was already using the current umask. + if "mode" not in kwargs and version.parse(_filelock_version) >= version.parse("3.10.0"): + umask = os.umask(0o666) + os.umask(umask) + kwargs["mode"] = 0o666 & ~umask + lock_file = self.hash_filename_if_too_long(lock_file) + super().__init__(lock_file, *args, **kwargs) + + @classmethod + def hash_filename_if_too_long(cls, path: str) -> str: + path = os.path.abspath(os.path.expanduser(path)) + filename = os.path.basename(path) + max_filename_length = cls.MAX_FILENAME_LENGTH + if issubclass(cls, UnixFileLock): + max_filename_length = min(max_filename_length, os.statvfs(os.path.dirname(path)).f_namemax) + if len(filename) > max_filename_length: + dirname = os.path.dirname(path) + hashed_filename = str(hash(filename)) + new_filename = ( + filename[: max_filename_length - len(hashed_filename) - 8] + "..." + hashed_filename + ".lock" + ) + return os.path.join(dirname, new_filename) + else: + return path diff --git a/src/datasets/utils/deprecation_utils.py b/src/datasets/utils/deprecation_utils.py new file mode 100644 index 0000000..f05ecbe --- /dev/null +++ b/src/datasets/utils/deprecation_utils.py @@ -0,0 +1,105 @@ +import enum +import inspect +import warnings +from functools import wraps +from typing import Callable, Optional + +from .logging import get_logger + + +_emitted_deprecation_warnings = set() +logger = get_logger(__name__) + + +def deprecated(help_message: Optional[str] = None): + """Decorator to mark a class or a function as deprecated. + + Args: + help_message (:obj:`str`, optional): An optional message to guide the user on how to + switch to non-deprecated usage of the library. + """ + + def decorator(deprecated_class_or_function: Callable): + global _emitted_deprecation_warnings + + if inspect.isclass(deprecated_class_or_function): + deprecated_function = deprecated_class_or_function.__init__ + name = deprecated_class_or_function.__name__ + else: + deprecated_function = deprecated_class_or_function + name = deprecated_function.__name__ + # Support deprecating __init__ class method: class name instead + name = name if name != "__init__" else deprecated_function.__qualname__.split(".")[-2] + + warning_msg = ( + f"{name} is deprecated and will be removed in the next major version of datasets." + f" {help_message}" + if help_message + else "" + ) + + @wraps(deprecated_function) + def wrapper(*args, **kwargs): + func_hash = hash(deprecated_function) + if func_hash not in _emitted_deprecation_warnings: + warnings.warn(warning_msg, category=FutureWarning, stacklevel=2) + _emitted_deprecation_warnings.add(func_hash) + return deprecated_function(*args, **kwargs) + + wrapper._decorator_name_ = "deprecated" + + if inspect.isclass(deprecated_class_or_function): + deprecated_class_or_function.__init__ = wrapper + return deprecated_class_or_function + else: + return wrapper + + return decorator + + +class OnAccess(enum.EnumMeta): + """ + Enum metaclass that calls a user-specified function whenever a member is accessed. + """ + + def __getattribute__(cls, name): + obj = super().__getattribute__(name) + if isinstance(obj, enum.Enum) and obj._on_access: + obj._on_access() + return obj + + def __getitem__(cls, name): + member = super().__getitem__(name) + if member._on_access: + member._on_access() + return member + + def __call__(cls, value, names=None, *, module=None, qualname=None, type=None, start=1): + obj = super().__call__(value, names, module=module, qualname=qualname, type=type, start=start) + if isinstance(obj, enum.Enum) and obj._on_access: + obj._on_access() + return obj + + +class DeprecatedEnum(enum.Enum, metaclass=OnAccess): + """ + Enum class that calls `deprecate` method whenever a member is accessed. + """ + + def __new__(cls, value): + member = object.__new__(cls) + member._value_ = value + member._on_access = member.deprecate + return member + + @property + def help_message(self): + return "" + + def deprecate(self): + help_message = f" {self.help_message}" if self.help_message else "" + warnings.warn( + f"'{self.__objclass__.__name__}' is deprecated and will be removed in the next major version of datasets." + + help_message, + FutureWarning, + stacklevel=3, + ) diff --git a/src/datasets/utils/doc_utils.py b/src/datasets/utils/doc_utils.py new file mode 100644 index 0000000..6ef8bcb --- /dev/null +++ b/src/datasets/utils/doc_utils.py @@ -0,0 +1,15 @@ +from typing import Callable + + +def is_documented_by(function_with_docstring: Callable): + """Decorator to share docstrings across common functions. + + Args: + function_with_docstring (`Callable`): Name of the function with the docstring. + """ + + def wrapper(target_function): + target_function.__doc__ = function_with_docstring.__doc__ + return target_function + + return wrapper diff --git a/src/datasets/utils/experimental.py b/src/datasets/utils/experimental.py new file mode 100644 index 0000000..cc40615 --- /dev/null +++ b/src/datasets/utils/experimental.py @@ -0,0 +1,43 @@ +"""Contains utilities to flag a feature as "experimental" in datasets.""" + +import warnings +from functools import wraps +from typing import Callable + + +def experimental(fn: Callable) -> Callable: + """Decorator to flag a feature as experimental. + + An experimental feature trigger a warning when used as it might be subject to breaking changes in the future. + + Args: + fn (`Callable`): + The function to flag as experimental. + + Returns: + `Callable`: The decorated function. + + Example: + + ```python + >>> from datasets.utils import experimental + + >>> @experimental + ... def my_function(): + ... print("Hello world!") + + >>> my_function() + UserWarning: 'my_function' is experimental and might be subject to breaking changes in the future. + Hello world! + ``` + """ + + @wraps(fn) + def _inner_fn(*args, **kwargs): + warnings.warn( + (f"'{fn.__name__}' is experimental and might be subject to breaking changes in the future."), + UserWarning, + ) + return fn(*args, **kwargs) + + return _inner_fn diff --git a/src/datasets/utils/extract.py b/src/datasets/utils/extract.py new file mode 100644 index 0000000..fc3a6ab --- /dev/null +++ b/src/datasets/utils/extract.py @@ -0,0 +1,446 @@ +import bz2 +import gzip +import lzma +import os +import shutil +import struct +import tarfile +import warnings +import zipfile +from abc import ABC, abstractmethod +from pathlib import Path +from typing import TYPE_CHECKING, Optional, Union + +from .. import config +from ._filelock import FileLock +from .logging import get_logger + + +if TYPE_CHECKING: + import py7zr + import rarfile + + +logger = get_logger(__name__) + + +class ExtractManager: + def __init__(self, cache_dir: Optional[str] = None): + self.extract_dir = ( + os.path.join(cache_dir, config.EXTRACTED_DATASETS_DIR) if cache_dir else config.EXTRACTED_DATASETS_PATH + ) + self.extractor = Extractor + + def _get_output_path(self, path: str) -> str: + from .file_utils import hash_url_to_filename + + # Path where we extract compressed archives + # We extract in the cache dir, and get the extracted path name by hashing the original path" + abs_path = os.path.abspath(path) + return os.path.join(self.extract_dir, hash_url_to_filename(abs_path)) + + def _do_extract(self, output_path: str, force_extract: bool) -> bool: + return force_extract or ( + not os.path.isfile(output_path) and not (os.path.isdir(output_path) and os.listdir(output_path)) + ) + + def extract(self, input_path: str, force_extract: bool = False) -> str: + extractor_format = self.extractor.infer_extractor_format(input_path) + if not extractor_format: + return input_path + output_path = self._get_output_path(input_path) + if self._do_extract(output_path, force_extract): + self.extractor.extract(input_path, output_path, extractor_format) + return output_path + + +class BaseExtractor(ABC): + @classmethod + @abstractmethod + def is_extractable(cls, path: Union[Path, str], **kwargs) -> bool: ... + + @staticmethod + @abstractmethod + def extract(input_path: Union[Path, str], output_path: Union[Path, str]) -> None: ... + + +class MagicNumberBaseExtractor(BaseExtractor, ABC): + magic_numbers: list[bytes] = [] + + @staticmethod + def read_magic_number(path: Union[Path, str], magic_number_length: int): + with open(path, "rb") as f: + return f.read(magic_number_length) + + @classmethod + def is_extractable(cls, path: Union[Path, str], magic_number: bytes = b"") -> bool: + if not magic_number: + magic_number_length = max(len(cls_magic_number) for cls_magic_number in cls.magic_numbers) + try: + magic_number = cls.read_magic_number(path, magic_number_length) + except OSError: + return False + return any(magic_number.startswith(cls_magic_number) for cls_magic_number in cls.magic_numbers) + + +class TarExtractor(BaseExtractor): + @classmethod + def is_extractable(cls, path: Union[Path, str], **kwargs) -> bool: + return tarfile.is_tarfile(path) + + @staticmethod + def safemembers(members: tarfile.TarFile, output_path: Union[Path, str]): + """ + Fix for CVE-2007-4559 + Desc: + Directory traversal vulnerability in the (1) extract and (2) extractall functions in the tarfile + module in Python allows user-assisted remote attackers to overwrite arbitrary files via a .. (dot dot) + sequence in filenames in a TAR archive, a related issue to CVE-2001-1267. + See: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-4559 + From: https://stackoverflow.com/a/10077309 + """ + + def resolved(path: Union[Path, str]) -> str: + return os.path.realpath(os.path.abspath(path)) + + def badpath(path: str, base: str) -> bool: + # joinpath will ignore base if path is absolute + return not resolved(os.path.join(base, path)).startswith(base) + + def badlink(info: tarfile.TarInfo, base: str) -> bool: + # Links are interpreted relative to the directory containing the link + tip = resolved(os.path.join(base, os.path.dirname(info.name))) + return badpath(info.linkname, base=tip) + + base = resolved(output_path) + + for finfo in members: + if badpath(finfo.name, base): + logger.error(f"Extraction of {finfo.name} is blocked (illegal path)") + elif finfo.issym() and badlink(finfo, base): + logger.error(f"Extraction of {finfo.name} is blocked: Symlink to {finfo.linkname}") + elif finfo.islnk() and badlink(finfo, base): + logger.error(f"Extraction of {finfo.name} is blocked: Hard link to {finfo.linkname}") + else: + yield finfo + + @staticmethod + def extract(input_path: Union[Path, str], output_path: Union[Path, str]) -> None: + os.makedirs(output_path, exist_ok=True) + tar_file = tarfile.open(input_path) + tar_file.extractall(output_path, members=TarExtractor.safemembers(tar_file, output_path)) + tar_file.close() + + +class GzipExtractor(MagicNumberBaseExtractor): + magic_numbers = [b"\x1f\x8b"] + + @staticmethod + def extract(input_path: Union[Path, str], output_path: Union[Path, str]) -> None: + with gzip.open(input_path, "rb") as gzip_file: + with open(output_path, "wb") as extracted_file: + shutil.copyfileobj(gzip_file, extracted_file) + + +class ZipExtractor(MagicNumberBaseExtractor): + magic_numbers = [ + b"PK\x03\x04", + b"PK\x05\x06", # empty archive + b"PK\x07\x08", # spanned archive + ] + + @classmethod + def is_extractable(cls, path: Union[Path, str], magic_number: bytes = b"") -> bool: + if super().is_extractable(path, magic_number=magic_number): + return True + try: + # Alternative version of zipfile.is_zipfile that has less false positives, but misses executable zip archives. + # From: https://github.com/python/cpython/pull/5053 + from zipfile import ( + _CD_SIGNATURE, + _ECD_DISK_NUMBER, + _ECD_DISK_START, + _ECD_ENTRIES_TOTAL, + _ECD_OFFSET, + _ECD_SIZE, + _EndRecData, + sizeCentralDir, + stringCentralDir, + structCentralDir, + ) + + with open(path, "rb") as fp: + endrec = _EndRecData(fp) + if endrec: + if endrec[_ECD_ENTRIES_TOTAL] == 0 and endrec[_ECD_SIZE] == 0 and endrec[_ECD_OFFSET] == 0: + return True # Empty zipfiles are still zipfiles + elif endrec[_ECD_DISK_NUMBER] == endrec[_ECD_DISK_START]: + fp.seek(endrec[_ECD_OFFSET]) # Central directory is on the same disk + if fp.tell() == endrec[_ECD_OFFSET] and endrec[_ECD_SIZE] >= sizeCentralDir: + data = fp.read(sizeCentralDir) # CD is where we expect it to be + if len(data) == sizeCentralDir: + centdir = struct.unpack(structCentralDir, data) # CD is the right size + if centdir[_CD_SIGNATURE] == stringCentralDir: + return True # First central directory entry has correct magic number + return False + except Exception: # catch all errors in case future python versions change the zipfile internals + return False + + @staticmethod + def safemembers(members: list[zipfile.ZipInfo], output_path: Union[Path, str]): + """ + Fix for CVE-2007-4559 + Desc: + Directory traversal vulnerability in the (1) extract and (2) extractall functions in the tarfile + module in Python allows user-assisted remote attackers to overwrite arbitrary files via a .. (dot dot) + sequence in filenames in a TAR archive, a related issue to CVE-2001-1267. + See: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-4559 + From: https://stackoverflow.com/a/10077309 + + This additional mitigation is applied for zipfile as well. + """ + + def resolved(path: Union[Path, str]) -> str: + return os.path.realpath(os.path.abspath(path)) + + def badpath(path: str, base: str) -> bool: + # joinpath will ignore base if path is absolute + return not resolved(os.path.join(base, path)).startswith(base) + + base = resolved(output_path) + + for finfo in members: + if badpath(finfo.filename, base): + logger.error(f"Extraction of {finfo.filename} is blocked (illegal path)") + # zipfile doesn't support symlinks + # elif finfo.is_symlink and badlink(finfo, base): + # logger.error(f"Extraction of {finfo.name} is blocked: Symlink to {finfo.linkname}") + else: + yield finfo + + @staticmethod + def extract(input_path: Union[Path, str], output_path: Union[Path, str]) -> None: + os.makedirs(output_path, exist_ok=True) + with zipfile.ZipFile(input_path, "r") as zip_file: + zip_file.extractall(output_path, members=ZipExtractor.safemembers(zip_file.filelist, output_path)) + zip_file.close() + + +class XzExtractor(MagicNumberBaseExtractor): + magic_numbers = [b"\xfd\x37\x7a\x58\x5a\x00"] + + @staticmethod + def extract(input_path: Union[Path, str], output_path: Union[Path, str]) -> None: + with lzma.open(input_path) as compressed_file: + with open(output_path, "wb") as extracted_file: + shutil.copyfileobj(compressed_file, extracted_file) + + +class RarExtractor(MagicNumberBaseExtractor): + magic_numbers = [b"Rar!\x1a\x07\x00", b"Rar!\x1a\x07\x01\x00"] # RAR_ID # RAR5_ID + + @staticmethod + def safemembers(members: list["rarfile.RarInfo"], output_path: Union[Path, str]): + """ + Fix for CVE-2007-4559 + Desc: + Directory traversal vulnerability in the (1) extract and (2) extractall functions in the tarfile + module in Python allows user-assisted remote attackers to overwrite arbitrary files via a .. (dot dot) + sequence in filenames in a TAR archive, a related issue to CVE-2001-1267. + See: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-4559 + From: https://stackoverflow.com/a/10077309 + + This additional mitigation is applied for rarfile as well. + """ + + def resolved(path: Union[Path, str]) -> str: + return os.path.realpath(os.path.abspath(path)) + + def badpath(path: str, base: str) -> bool: + # joinpath will ignore base if path is absolute + return not resolved(os.path.join(base, path)).startswith(base) + + def badlink(info: "rarfile.RarInfo", base: str) -> bool: + # Links are interpreted relative to the directory containing the link + tip = resolved(os.path.join(base, os.path.dirname(info.filename))) + redir_type, redir_flags, link_name = info.file_redir + return badpath(link_name, base=tip) + + base = resolved(output_path) + + for finfo in members: + if badpath(finfo.filename, base): + logger.error(f"Extraction of {finfo.filename} is blocked (illegal path)") + elif finfo.is_symlink() and badlink(finfo, base): + logger.error(f"Extraction of {finfo.filename} is blocked: Symlink to {finfo.file_redir}") + else: + yield finfo + + @staticmethod + def extract(input_path: Union[Path, str], output_path: Union[Path, str]) -> None: + if not config.RARFILE_AVAILABLE: + raise ImportError("Please pip install rarfile") + import rarfile + + os.makedirs(output_path, exist_ok=True) + rf = rarfile.RarFile(input_path) + rf.extractall(output_path, members=RarExtractor.safemembers(rf.infolist(), output_path)) + rf.close() + + +class ZstdExtractor(MagicNumberBaseExtractor): + magic_numbers = [b"\x28\xb5\x2f\xfd"] + + @staticmethod + def extract(input_path: Union[Path, str], output_path: Union[Path, str]) -> None: + if not config.ZSTANDARD_AVAILABLE: + raise ImportError("Please pip install zstandard") + import zstandard as zstd + + dctx = zstd.ZstdDecompressor() + with open(input_path, "rb") as ifh, open(output_path, "wb") as ofh: + dctx.copy_stream(ifh, ofh) + + +class Bzip2Extractor(MagicNumberBaseExtractor): + magic_numbers = [b"\x42\x5a\x68"] + + @staticmethod + def extract(input_path: Union[Path, str], output_path: Union[Path, str]) -> None: + with bz2.open(input_path, "rb") as compressed_file: + with open(output_path, "wb") as extracted_file: + shutil.copyfileobj(compressed_file, extracted_file) + + +class SevenZipExtractor(MagicNumberBaseExtractor): + magic_numbers = [b"\x37\x7a\xbc\xaf\x27\x1c"] + + @staticmethod + def safemembers(members: list["py7zr.FileInfo"], output_path: Union[Path, str]): + """ + Fix for CVE-2007-4559 + Desc: + Directory traversal vulnerability in the (1) extract and (2) extractall functions in the tarfile + module in Python allows user-assisted remote attackers to overwrite arbitrary files via a .. (dot dot) + sequence in filenames in a TAR archive, a related issue to CVE-2001-1267. + See: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-4559 + From: https://stackoverflow.com/a/10077309 + + This additional mitigation is applied for py7zr as well. + """ + + def resolved(path: Union[Path, str]) -> str: + return os.path.realpath(os.path.abspath(path)) + + def badpath(path: str, base: str) -> bool: + # joinpath will ignore base if path is absolute + return not resolved(os.path.join(base, path)).startswith(base) + + def badlink(info: "py7zr.FileInfo", base: str) -> bool: + # Links are interpreted relative to the directory containing the link + tip = resolved(os.path.join(base, os.path.dirname(info.filename))) + return badpath(os.path.basename(info.filename), base=tip) + + base = resolved(output_path) + + for finfo in members: + if badpath(finfo.filename, base): + logger.error(f"Extraction of {finfo.filename} is blocked (illegal path)") + # py7zr already checks symlinks validity + # elif finfo.is_symlink and badlink(finfo, base): + # logger.error(f"Extraction of {finfo.name} is blocked: Symlink to {finfo.linkname}") + else: + yield finfo + + @staticmethod + def extract(input_path: Union[Path, str], output_path: Union[Path, str]) -> None: + if not config.PY7ZR_AVAILABLE: + raise ImportError("Please pip install py7zr") + import py7zr + + os.makedirs(output_path, exist_ok=True) + with py7zr.SevenZipFile(input_path, "r") as archive: + targets = [finfo.filename for finfo in SevenZipExtractor.safemembers(archive.list(), output_path)] + archive.extract(output_path, targets=targets) + + +class Lz4Extractor(MagicNumberBaseExtractor): + magic_numbers = [b"\x04\x22\x4d\x18"] + + @staticmethod + def extract(input_path: Union[Path, str], output_path: Union[Path, str]) -> None: + if not config.LZ4_AVAILABLE: + raise ImportError("Please pip install lz4") + import lz4.frame + + with lz4.frame.open(input_path, "rb") as compressed_file: + with open(output_path, "wb") as extracted_file: + shutil.copyfileobj(compressed_file, extracted_file) + + +class Extractor: + # Put zip file to the last, b/c it is possible wrongly detected as zip (I guess it means: as tar or gzip) + extractors: dict[str, type[BaseExtractor]] = { + "tar": TarExtractor, + "gzip": GzipExtractor, + "zip": ZipExtractor, + "xz": XzExtractor, + "rar": RarExtractor, + "zstd": ZstdExtractor, + "bz2": Bzip2Extractor, + "7z": SevenZipExtractor, # + "lz4": Lz4Extractor, # + } + + @classmethod + def _get_magic_number_max_length(cls): + return max( + len(extractor_magic_number) + for extractor in cls.extractors.values() + if issubclass(extractor, MagicNumberBaseExtractor) + for extractor_magic_number in extractor.magic_numbers + ) + + @staticmethod + def _read_magic_number(path: Union[Path, str], magic_number_length: int): + try: + return MagicNumberBaseExtractor.read_magic_number(path, magic_number_length=magic_number_length) + except OSError: + return b"" + + @classmethod + def is_extractable(cls, path: Union[Path, str], return_extractor: bool = False) -> bool: + warnings.warn( + "Method 'is_extractable' was deprecated in version 2.4.0 and will be removed in 3.0.0. " + "Use 'infer_extractor_format' instead.", + category=FutureWarning, + ) + extractor_format = cls.infer_extractor_format(path) + if extractor_format: + return True if not return_extractor else (True, cls.extractors[extractor_format]) + return False if not return_extractor else (False, None) + + @classmethod + def infer_extractor_format(cls, path: Union[Path, str]) -> Optional[str]: # + magic_number_max_length = cls._get_magic_number_max_length() + magic_number = cls._read_magic_number(path, magic_number_max_length) + for extractor_format, extractor in cls.extractors.items(): + if extractor.is_extractable(path, magic_number=magic_number): + return extractor_format + + @classmethod + def extract( + cls, + input_path: Union[Path, str], + output_path: Union[Path, str], + extractor_format: str, + ) -> None: + os.makedirs(os.path.dirname(output_path), exist_ok=True) + # Prevent parallel extractions + lock_path = str(Path(output_path).with_suffix(".lock")) + with FileLock(lock_path): + if os.path.islink(output_path): + os.unlink(output_path) + shutil.rmtree(output_path, ignore_errors=True) + extractor = cls.extractors[extractor_format] + return extractor.extract(input_path, output_path) diff --git a/src/datasets/utils/file_utils.py b/src/datasets/utils/file_utils.py new file mode 100644 index 0000000..3d37c34 --- /dev/null +++ b/src/datasets/utils/file_utils.py @@ -0,0 +1,1449 @@ +""" +Utilities for working with the local dataset cache. +This file is adapted from the AllenNLP library at https://github.com/allenai/allennlp +Copyright by the AllenNLP authors. +""" + +import asyncio +import glob +import io +import json +import multiprocessing +import os +import posixpath +import re +import shutil +import tarfile +import time +import xml.dom.minidom +import zipfile +from collections.abc import Generator +from io import BytesIO +from itertools import chain +from pathlib import Path, PurePosixPath +from typing import Any, Optional, TypeVar, Union +from unittest.mock import patch +from urllib.parse import urlparse +from xml.etree import ElementTree as ET + +import fsspec +import httpx +import huggingface_hub +import huggingface_hub.errors +import requests +from fsspec.core import strip_protocol, url_to_fs +from fsspec.utils import can_be_local +from huggingface_hub.utils import get_session, insecure_hashlib +from packaging import version + +from .. import __version__, config +from ..download.download_config import DownloadConfig +from ..filesystems import COMPRESSION_FILESYSTEMS +from . import _tqdm, logging +from ._filelock import FileLock +from .extract import ExtractManager +from .track import TrackedIterableFromGenerator + + +try: + from aiohttp.client_exceptions import ClientError as _AiohttpClientError +except ImportError: + # aiohttp is not available; synthesize an exception type + # that will never be raised by any actual code for use in the `except` + # clause only. + class _AiohttpClientError(Exception): + pass + + +logger = logging.get_logger(__name__) # pylint: disable=invalid-name + +INCOMPLETE_SUFFIX = ".incomplete" + +T = TypeVar("T", str, Path) + +CONNECTION_ERRORS_TO_RETRY = ( + _AiohttpClientError, + asyncio.TimeoutError, + requests.exceptions.ConnectionError, + requests.exceptions.Timeout, + httpx.RequestError, +) +SERVER_UNAVAILABLE_CODE = 504 +RATE_LIMIT_CODE = 429 + + +def is_remote_url(url_or_filename: str) -> bool: + return urlparse(url_or_filename).scheme != "" and not os.path.ismount(urlparse(url_or_filename).scheme + ":/") + + +def is_local_path(url_or_filename: str) -> bool: + # On unix the scheme of a local path is empty (for both absolute and relative), + # while on windows the scheme is the drive name (ex: "c") for absolute paths. + # for details on the windows behavior, see https://bugs.python.org/issue42215 + return urlparse(url_or_filename).scheme == "" or os.path.ismount(urlparse(url_or_filename).scheme + ":/") + + +def is_relative_path(url_or_filename: str) -> bool: + return urlparse(url_or_filename).scheme == "" and not os.path.isabs(url_or_filename) + + +def relative_to_absolute_path(path: T) -> T: + """Convert relative path to absolute path.""" + abs_path_str = os.path.abspath(os.path.expanduser(os.path.expandvars(str(path)))) + return Path(abs_path_str) if isinstance(path, Path) else abs_path_str + + +def url_or_path_join(base_name: str, *pathnames: str) -> str: + if is_remote_url(base_name): + return posixpath.join(base_name, *(str(pathname).replace(os.sep, "/").lstrip("/") for pathname in pathnames)) + else: + return Path(base_name, *pathnames).as_posix() + + +def url_or_path_parent(url_or_path: str) -> str: + if is_remote_url(url_or_path): + return url_or_path[: url_or_path.rindex("/")] + else: + return os.path.dirname(url_or_path) + + +def hash_url_to_filename(url, etag=None): + """ + Convert `url` into a hashed filename in a repeatable way. + If `etag` is specified, append its hash to the url's, delimited + by a period. + If the url ends with .h5 (Keras HDF5 weights) adds '.h5' to the name + so that TF 2.0 can identify it as a HDF5 file + (see https://github.com/tensorflow/tensorflow/blob/00fad90125b18b80fe054de1055770cfb8fe4ba3/tensorflow/python/keras/engine/network.py#L1380) + """ + url_bytes = url.encode("utf-8") + url_hash = insecure_hashlib.sha256(url_bytes) + filename = url_hash.hexdigest() + + if etag: + etag_bytes = etag.encode("utf-8") + etag_hash = insecure_hashlib.sha256(etag_bytes) + filename += "." + etag_hash.hexdigest() + + if url.endswith(".py"): + filename += ".py" + + return filename + + +def cached_path( + url_or_filename, + download_config=None, + **download_kwargs, +) -> str: + """ + Given something that might be a URL (or might be a local path), + determine which. If it's a URL, download the file and cache it, and + return the path to the cached file. If it's already a local path, + make sure the file exists and then return the path. + + Return: + Local path (string) + + Raises: + FileNotFoundError: in case of non-recoverable file + (non-existent or no cache on disk) + ConnectionError: in case of unreachable url + and no cache on disk + ValueError: if it couldn't parse the url or filename correctly + httpx.NetworkError or requests.exceptions.ConnectionError: in case of internet connection issue + """ + if download_config is None: + download_config = DownloadConfig(**download_kwargs) + + cache_dir = download_config.cache_dir or config.DOWNLOADED_DATASETS_PATH + if isinstance(cache_dir, Path): + cache_dir = str(cache_dir) + if isinstance(url_or_filename, Path): + url_or_filename = str(url_or_filename) + + # Convert fsspec URL in the format "file://local/path" to "local/path" + if can_be_local(url_or_filename): + url_or_filename = strip_protocol(url_or_filename) + + if is_remote_url(url_or_filename): + # URL, so get it from the cache (downloading if necessary) + url_or_filename, storage_options = _prepare_path_and_storage_options( + url_or_filename, download_config=download_config + ) + # Download files from Hugging Face. + # Note: no need to check for https://huggingface.co file URLs since _prepare_path_and_storage_options + # prepares Hugging Face HTTP URLs as hf:// paths already + if url_or_filename.startswith("hf://") and not url_or_filename.startswith("hf://buckets/"): + resolved_path = huggingface_hub.HfFileSystem( + endpoint=config.HF_ENDPOINT, token=download_config.token + ).resolve_path(url_or_filename) + try: + output_path = huggingface_hub.HfApi( + endpoint=config.HF_ENDPOINT, + token=download_config.token, + library_name="datasets", + library_version=__version__, + user_agent=get_datasets_user_agent(download_config.user_agent), + ).hf_hub_download( + repo_id=resolved_path.repo_id, + repo_type=resolved_path.repo_type, + revision=resolved_path.revision, + filename=resolved_path.path_in_repo, + force_download=download_config.force_download, + proxies=download_config.proxies, + ) + except ( + huggingface_hub.utils.RepositoryNotFoundError, + huggingface_hub.utils.EntryNotFoundError, + huggingface_hub.utils.RevisionNotFoundError, + huggingface_hub.utils.GatedRepoError, + ) as e: + raise FileNotFoundError(str(e)) from e + # Download external files + else: + output_path = get_from_cache( + url_or_filename, + cache_dir=cache_dir, + force_download=download_config.force_download, + user_agent=download_config.user_agent, + use_etag=download_config.use_etag, + token=download_config.token, + storage_options=storage_options, + download_desc=download_config.download_desc, + disable_tqdm=download_config.disable_tqdm, + ) + elif os.path.exists(url_or_filename): + # File, and it exists. + output_path = url_or_filename + elif is_local_path(url_or_filename): + # File, but it doesn't exist. + raise FileNotFoundError(f"Local file {url_or_filename} doesn't exist") + else: + # Something unknown + raise ValueError(f"unable to parse {url_or_filename} as a URL or as a local path") + + if output_path is None: + return output_path + + if download_config.extract_compressed_file: + if download_config.extract_on_the_fly: + # Add a compression prefix to the compressed file so that it can be extracted + # as it's being read using xopen. + protocol = _get_extraction_protocol(output_path, download_config=download_config) + extension = _get_path_extension(url_or_filename.split("::")[0]) + if ( + protocol + and extension not in ["tgz", "tar"] + and not url_or_filename.split("::")[0].endswith((".tar.gz", ".tar.bz2", ".tar.xz")) + ): + output_path = relative_to_absolute_path(output_path) + if protocol in SINGLE_FILE_COMPRESSION_PROTOCOLS: + # there is one single file which is the uncompressed file + inner_file = os.path.basename(output_path) + inner_file = inner_file[: inner_file.rindex(".")] if "." in inner_file else inner_file + output_path = f"{protocol}://{inner_file}::{output_path}" + else: + output_path = f"{protocol}://::{output_path}" + return output_path + + # Eager extraction + output_path = ExtractManager(cache_dir=download_config.cache_dir).extract( + output_path, force_extract=download_config.force_extract + ) + return relative_to_absolute_path(output_path) + + +def get_datasets_user_agent(user_agent: Optional[Union[str, dict]] = None) -> str: + ua = f"datasets/{__version__}" + ua += f"; python/{config.PY_VERSION}" + ua += f"; hf_hub/{huggingface_hub.__version__}" + ua += f"; pyarrow/{config.PYARROW_VERSION}" + if config.TORCH_AVAILABLE: + ua += f"; torch/{config.TORCH_VERSION}" + if config.TF_AVAILABLE: + ua += f"; tensorflow/{config.TF_VERSION}" + if config.JAX_AVAILABLE: + ua += f"; jax/{config.JAX_VERSION}" + if isinstance(user_agent, dict): + ua += f"; {'; '.join(f'{k}/{v}' for k, v in user_agent.items())}" + elif isinstance(user_agent, str): + ua += "; " + user_agent + return ua + + +def get_authentication_headers_for_url(url: str, token: Optional[Union[str, bool]] = None) -> dict: + """Handle the HF authentication""" + if url.startswith(config.HF_ENDPOINT): + return huggingface_hub.utils.build_hf_headers( + token=token, library_name="datasets", library_version=__version__ + ) + else: + return {} + + +def _raise_if_offline_mode_is_enabled(msg: Optional[str] = None): + """Raise an OfflineModeIsEnabled error (subclass of ConnectionError) if HF_HUB_OFFLINE is True.""" + if config.HF_HUB_OFFLINE: + raise huggingface_hub.errors.OfflineModeIsEnabled( + "Offline mode is enabled." if msg is None else "Offline mode is enabled. " + str(msg) + ) + + +def fsspec_head(url, storage_options=None): + _raise_if_offline_mode_is_enabled(f"Tried to reach {url}") + fs, path = url_to_fs(url, **(storage_options or {})) + return fs.info(path) + + +def stack_multiprocessing_download_progress_bars(): + # Stack downloads progress bars automatically using HF_DATASETS_STACK_MULTIPROCESSING_DOWNLOAD_PROGRESS_BARS=1 + # We use environment variables since the download may happen in a subprocess + return patch.dict(os.environ, {"HF_DATASETS_STACK_MULTIPROCESSING_DOWNLOAD_PROGRESS_BARS": "1"}) + + +class TqdmCallback(fsspec.callbacks.TqdmCallback): + def __init__(self, tqdm_kwargs=None, *args, **kwargs): + if config.FSSPEC_VERSION < version.parse("2024.2.0"): + super().__init__(tqdm_kwargs, *args, **kwargs) + self._tqdm = _tqdm # replace tqdm module by datasets.utils.tqdm module + else: + kwargs["tqdm_cls"] = _tqdm.tqdm + super().__init__(tqdm_kwargs, *args, **kwargs) + + +def fsspec_get(url, temp_file, storage_options=None, desc=None, disable_tqdm=False): + _raise_if_offline_mode_is_enabled(f"Tried to reach {url}") + fs, path = url_to_fs(url, **(storage_options or {})) + callback = TqdmCallback( + tqdm_kwargs={ + "desc": desc or "Downloading", + "unit": "B", + "unit_scale": True, + "position": multiprocessing.current_process()._identity[-1] # contains the ranks of subprocesses + if os.environ.get("HF_DATASETS_STACK_MULTIPROCESSING_DOWNLOAD_PROGRESS_BARS") == "1" + and multiprocessing.current_process()._identity + else None, + "disable": disable_tqdm, + } + ) + fs.get_file(path, temp_file.name, callback=callback) + + +def get_from_cache( + url, + cache_dir=None, + force_download=False, + user_agent=None, + use_etag=True, + token=None, + storage_options=None, + download_desc=None, + disable_tqdm=False, +) -> str: + """ + Given a URL, look for the corresponding file in the local cache. + If it's not there, download it. Then return the path to the cached file. + + Return: + Local path (string) + + Raises: + FileNotFoundError: in case of non-recoverable file + (non-existent or no cache on disk) + ConnectionError: in case of unreachable url + and no cache on disk + """ + if storage_options is None: + storage_options = {} + if cache_dir is None: + cache_dir = config.HF_DATASETS_CACHE + if isinstance(cache_dir, Path): + cache_dir = str(cache_dir) + + os.makedirs(cache_dir, exist_ok=True) + + response = None + etag = None + + # Try a first time to file the file on the local file system without eTag (None) + # if we don't ask for 'force_download' then we spare a request + filename = hash_url_to_filename(url, etag=None) + cache_path = os.path.join(cache_dir, filename) + + if os.path.exists(cache_path) and not force_download and not use_etag: + return cache_path + + # Prepare headers for authentication + headers = get_authentication_headers_for_url(url, token=token) + if user_agent is not None: + headers["user-agent"] = user_agent + + response = fsspec_head(url, storage_options=storage_options) + etag = (response.get("ETag", None) or response.get("etag", None)) if use_etag else None + + # Try a second time + filename = hash_url_to_filename(url, etag) + cache_path = os.path.join(cache_dir, filename) + + if os.path.exists(cache_path) and not force_download: + return cache_path + + # Prevent parallel downloads of the same file with a lock. + lock_path = cache_path + ".lock" + with FileLock(lock_path): + # Retry in case previously locked processes just enter after the precedent process releases the lock + if os.path.exists(cache_path) and not force_download: + return cache_path + + incomplete_path = cache_path + ".incomplete" + + # Download to temporary file, then copy to cache path once finished. + # Otherwise, you get corrupt cache entries if the download gets interrupted. + with open(incomplete_path, "w+b") as temp_file: + logger.info(f"{url} not found in cache or force_download set to True, downloading to {temp_file.name}") + # GET file object + fsspec_get(url, temp_file, storage_options=storage_options, desc=download_desc, disable_tqdm=disable_tqdm) + + logger.info(f"storing {url} in cache at {cache_path}") + shutil.move(temp_file.name, cache_path) + + logger.info(f"creating metadata file for {cache_path}") + meta = {"url": url, "etag": etag} + meta_path = cache_path + ".json" + with open(meta_path, "w", encoding="utf-8") as meta_file: + json.dump(meta, meta_file) + + return cache_path + + +def add_start_docstrings(*docstr): + def docstring_decorator(fn): + fn.__doc__ = "".join(docstr) + "\n\n" + (fn.__doc__ if fn.__doc__ is not None else "") + return fn + + return docstring_decorator + + +def add_end_docstrings(*docstr): + def docstring_decorator(fn): + fn.__doc__ = (fn.__doc__ if fn.__doc__ is not None else "") + "\n\n" + "".join(docstr) + return fn + + return docstring_decorator + + +def estimate_dataset_size(paths): + return sum(path.stat().st_size for path in paths) + + +def readline(f: io.RawIOBase): + # From: https://github.com/python/cpython/blob/d27e2f4d118e7a9909b6a3e5da06c5ff95806a85/Lib/_pyio.py#L525 + res = bytearray() + while True: + b = f.read(1) + if not b: + break + res += b + if res.endswith(b"\n"): + break + return bytes(res) + + +####################### +# Streaming utilities # +####################### + +BASE_KNOWN_EXTENSIONS = [ + "txt", + "csv", + "json", + "jsonl", + "tsv", + "conll", + "conllu", + "orig", + "parquet", + "pkl", + "pickle", + "rel", + "xml", + "arrow", +] +COMPRESSION_EXTENSION_TO_PROTOCOL = { + # single file compression + **{ + extension.lstrip("."): fs_class.protocol + for fs_class in COMPRESSION_FILESYSTEMS + for extension in fs_class.extensions + }, + # archive compression + "zip": "zip", + "eval": "zip", +} +SINGLE_FILE_COMPRESSION_EXTENSION_TO_PROTOCOL = { + extension.lstrip("."): fs_class.protocol + for fs_class in COMPRESSION_FILESYSTEMS + for extension in fs_class.extensions +} +SINGLE_FILE_COMPRESSION_PROTOCOLS = {fs_class.protocol for fs_class in COMPRESSION_FILESYSTEMS} +SINGLE_SLASH_AFTER_PROTOCOL_PATTERN = re.compile(r"(? str: + # Get extension: https://foo.bar/train.json.gz -> gz + extension = path.split(".")[-1] + # Remove query params ("dl=1", "raw=true"): gz?dl=1 -> gz + # Remove shards infos (".txt_1", ".txt-00000-of-00100"): txt_1 -> txt + for symb in "?-_": + extension = extension.split(symb)[0] + return extension + + +def _get_extraction_protocol_with_magic_number(f) -> Optional[str]: + """read the magic number from a file-like object and return the compression protocol""" + # Check if the file object is seekable even before reading the magic number (to avoid https://bugs.python.org/issue26440) + try: + f.seek(0) + except (AttributeError, io.UnsupportedOperation): + return None + magic_number = f.read(MAGIC_NUMBER_MAX_LENGTH) + f.seek(0) + for i in range(MAGIC_NUMBER_MAX_LENGTH): + compression = MAGIC_NUMBER_TO_COMPRESSION_PROTOCOL.get(magic_number[: MAGIC_NUMBER_MAX_LENGTH - i]) + if compression is not None: + return compression + compression = MAGIC_NUMBER_TO_UNSUPPORTED_COMPRESSION_PROTOCOL.get(magic_number[: MAGIC_NUMBER_MAX_LENGTH - i]) + if compression is not None: + raise NotImplementedError(f"Compression protocol '{compression}' not implemented.") + + +def _get_extraction_protocol(urlpath: str, download_config: Optional[DownloadConfig] = None) -> Optional[str]: + # get inner file: zip://train-00000.json.gz::https://foo.bar/data.zip -> zip://train-00000.json.gz + urlpath = str(urlpath) + path = urlpath.split("::")[0] + extension = _get_path_extension(path) + if ( + extension in BASE_KNOWN_EXTENSIONS + or extension in ["tgz", "tar"] + or path.endswith((".tar.gz", ".tar.bz2", ".tar.xz")) + ): + return None + elif extension in COMPRESSION_EXTENSION_TO_PROTOCOL: + return COMPRESSION_EXTENSION_TO_PROTOCOL[extension] + urlpath, storage_options = _prepare_path_and_storage_options(urlpath, download_config=download_config) + try: + with fsspec.open(urlpath, **(storage_options or {})) as f: + return _get_extraction_protocol_with_magic_number(f) + except FileNotFoundError: + if urlpath.startswith(config.HF_ENDPOINT): + raise FileNotFoundError( + urlpath + "\nIf the repo is private or gated, make sure to log in with `huggingface-cli login`." + ) from None + else: + raise + + +def xjoin(a, *p): + """ + This function extends os.path.join to support the "::" hop separator. It supports both paths and urls. + + A shorthand, particularly useful where you have multiple hops, is to “chain” the URLs with the special separator "::". + This is used to access files inside a zip file over http for example. + + Let's say you have a zip file at https://host.com/archive.zip, and you want to access the file inside the zip file at /folder1/file.txt. + Then you can just chain the url this way: + + zip://folder1/file.txt::https://host.com/archive.zip + + The xjoin function allows you to apply the join on the first path of the chain. + + Example:: + + >>> xjoin("zip://folder1::https://host.com/archive.zip", "file.txt") + zip://folder1/file.txt::https://host.com/archive.zip + """ + a, *b = str(a).split("::") + if is_local_path(a): + return os.path.join(a, *p) + else: + a = posixpath.join(a, *p) + return "::".join([a] + b) + + +def xdirname(a): + """ + This function extends os.path.dirname to support the "::" hop separator. It supports both paths and urls. + + A shorthand, particularly useful where you have multiple hops, is to “chain” the URLs with the special separator "::". + This is used to access files inside a zip file over http for example. + + Let's say you have a zip file at https://host.com/archive.zip, and you want to access the file inside the zip file at /folder1/file.txt. + Then you can just chain the url this way: + + zip://folder1/file.txt::https://host.com/archive.zip + + The xdirname function allows you to apply the dirname on the first path of the chain. + + Example:: + + >>> xdirname("zip://folder1/file.txt::https://host.com/archive.zip") + zip://folder1::https://host.com/archive.zip + """ + a, *b = str(a).split("::") + if is_local_path(a): + a = os.path.dirname(Path(a).as_posix()) + else: + a = posixpath.dirname(a) + # if we end up at the root of the protocol, we get for example a = 'http:' + # so we have to fix it by adding the '//' that was removed: + if a.endswith(":"): + a += "//" + return "::".join([a] + b) + + +def xexists(urlpath: str, download_config: Optional[DownloadConfig] = None): + """Extend `os.path.exists` function to support both local and remote files. + + Args: + urlpath (`str`): URL path. + download_config : mainly use token or storage_options to support different platforms and auth types. + + Returns: + `bool` + """ + + main_hop, *rest_hops = _as_str(urlpath).split("::") + if is_local_path(main_hop): + return os.path.exists(main_hop) + else: + urlpath, storage_options = _prepare_path_and_storage_options(urlpath, download_config=download_config) + main_hop, *rest_hops = urlpath.split("::") + fs, *_ = url_to_fs(urlpath, **storage_options) + return fs.exists(main_hop) + + +def xbasename(a): + """ + This function extends os.path.basename to support the "::" hop separator. It supports both paths and urls. + + A shorthand, particularly useful where you have multiple hops, is to “chain” the URLs with the special separator "::". + This is used to access files inside a zip file over http for example. + + Let's say you have a zip file at https://host.com/archive.zip, and you want to access the file inside the zip file at /folder1/file.txt. + Then you can just chain the url this way: + + zip://folder1/file.txt::https://host.com/archive.zip + + The xbasename function allows you to apply the basename on the first path of the chain. + + Example:: + + >>> xbasename("zip://folder1/file.txt::https://host.com/archive.zip") + file.txt + """ + a, *b = str(a).split("::") + if is_local_path(a): + return os.path.basename(Path(a).as_posix()) + else: + return posixpath.basename(a) + + +def xsplit(a): + """ + This function extends os.path.split to support the "::" hop separator. It supports both paths and urls. + + A shorthand, particularly useful where you have multiple hops, is to “chain” the URLs with the special separator "::". + This is used to access files inside a zip file over http for example. + + Let's say you have a zip file at https://host.com/archive.zip, and you want to access the file inside the zip file at /folder1/file.txt. + Then you can just chain the url this way: + + zip://folder1/file.txt::https://host.com/archive.zip + + The xsplit function allows you to apply the xsplit on the first path of the chain. + + Example:: + + >>> xsplit("zip://folder1/file.txt::https://host.com/archive.zip") + ('zip://folder1::https://host.com/archive.zip', 'file.txt') + """ + a, *b = str(a).split("::") + if is_local_path(a): + return os.path.split(Path(a).as_posix()) + else: + a, tail = posixpath.split(a) + return "::".join([a + "//" if a.endswith(":") else a] + b), tail + + +def xsplitext(a): + """ + This function extends os.path.splitext to support the "::" hop separator. It supports both paths and urls. + + A shorthand, particularly useful where you have multiple hops, is to “chain” the URLs with the special separator "::". + This is used to access files inside a zip file over http for example. + + Let's say you have a zip file at https://host.com/archive.zip, and you want to access the file inside the zip file at /folder1/file.txt. + Then you can just chain the url this way: + + zip://folder1/file.txt::https://host.com/archive.zip + + The xsplitext function allows you to apply the splitext on the first path of the chain. + + Example:: + + >>> xsplitext("zip://folder1/file.txt::https://host.com/archive.zip") + ('zip://folder1/file::https://host.com/archive.zip', '.txt') + """ + a, *b = str(a).split("::") + if is_local_path(a): + return os.path.splitext(Path(a).as_posix()) + else: + a, ext = posixpath.splitext(a) + return "::".join([a] + b), ext + + +def xisfile(path, download_config: Optional[DownloadConfig] = None) -> bool: + """Extend `os.path.isfile` function to support remote files. + + Args: + path (`str`): URL path. + download_config : mainly use token or storage_options to support different platforms and auth types. + + Returns: + `bool` + """ + main_hop, *rest_hops = str(path).split("::") + if is_local_path(main_hop): + return os.path.isfile(path) + else: + path, storage_options = _prepare_path_and_storage_options(path, download_config=download_config) + main_hop, *rest_hops = path.split("::") + fs, *_ = url_to_fs(path, **storage_options) + return fs.isfile(main_hop) + + +def xgetsize(path, download_config: Optional[DownloadConfig] = None) -> int: + """Extend `os.path.getsize` function to support remote files. + + Args: + path (`str`): URL path. + download_config : mainly use token or storage_options to support different platforms and auth types. + + Returns: + `int`: optional + """ + main_hop, *rest_hops = str(path).split("::") + if is_local_path(main_hop): + return os.path.getsize(path) + else: + path, storage_options = _prepare_path_and_storage_options(path, download_config=download_config) + main_hop, *rest_hops = path.split("::") + fs, *_ = fs, *_ = url_to_fs(path, **storage_options) + try: + size = fs.size(main_hop) + except huggingface_hub.utils.EntryNotFoundError: + raise FileNotFoundError(f"No such file: {path}") + if size is None: + # use xopen instead of fs.open to make data fetching more robust + with xopen(path, download_config=download_config) as f: + size = len(f.read()) + return size + + +def xisdir(path, download_config: Optional[DownloadConfig] = None) -> bool: + """Extend `os.path.isdir` function to support remote files. + + Args: + path (`str`): URL path. + download_config : mainly use token or storage_options to support different platforms and auth types. + + Returns: + `bool` + """ + main_hop, *rest_hops = str(path).split("::") + if is_local_path(main_hop): + return os.path.isdir(path) + else: + path, storage_options = _prepare_path_and_storage_options(path, download_config=download_config) + main_hop, *rest_hops = path.split("::") + fs, *_ = fs, *_ = url_to_fs(path, **storage_options) + inner_path = main_hop.split("://")[-1] + if not inner_path.strip("/"): + return True + return fs.isdir(inner_path) + + +def xrelpath(path, start=None): + """Extend `os.path.relpath` function to support remote files. + + Args: + path (`str`): URL path. + start (`str`): Start URL directory path. + + Returns: + `str` + """ + main_hop, *rest_hops = str(path).split("::") + if is_local_path(main_hop): + return os.path.relpath(main_hop, start=start) if start else os.path.relpath(main_hop) + else: + return posixpath.relpath(main_hop, start=str(start).split("::")[0]) if start else os.path.relpath(main_hop) + + +class _OverridableIOWrapper(io.RawIOBase): + def __init__(self, f): + self._overrides = {} + self.f = f + + def __getattribute__(self, attr): + if attr == "_overrides": + return object.__getattribute__(self, attr) + elif attr in self._overrides: + return self._overrides[attr] + return getattr(self.f, attr) + + def __setattr__(self, attr, value): + if attr == "_overrides": + object.__setattr__(self, attr, value) + else: + self._overrides[attr] = value + + +def _add_retries_to_file_obj_read_method(file_obj): + read = file_obj.read + max_retries = config.STREAMING_READ_MAX_RETRIES + + def read_with_retries(*args, **kwargs): + disconnect_err = None + for retry in range(1, max_retries + 1): + try: + out = read(*args, **kwargs) + break + except CONNECTION_ERRORS_TO_RETRY as err: + disconnect_err = err + logger.warning( + f"Got disconnected from remote data host. Retrying in {config.STREAMING_READ_RETRY_INTERVAL}sec [{retry}/{max_retries}]" + ) + time.sleep(config.STREAMING_READ_RETRY_INTERVAL) + except huggingface_hub.errors.HfHubHTTPError as err: + if err.response is not None and err.response.status_code == SERVER_UNAVAILABLE_CODE: + disconnect_err = err + logger.warning( + f"Got disconnected from remote data host. Retrying in {config.STREAMING_READ_SERVER_UNAVAILABLE_RETRY_INTERVAL}sec [{retry}/{max_retries}]" + ) + time.sleep(config.STREAMING_READ_SERVER_UNAVAILABLE_RETRY_INTERVAL) + elif err.response is not None and err.response.status_code == RATE_LIMIT_CODE: + disconnect_err = err + logger.warning(str(err)) + logger.warning( + f"Got disconnected from remote data host. Retrying in {config.STREAMING_READ_RATE_LIMIT_RETRY_INTERVAL}sec [{retry}/{max_retries}]" + ) + time.sleep(config.STREAMING_READ_RATE_LIMIT_RETRY_INTERVAL) + else: + raise + else: + raise ConnectionError("Server Disconnected") from disconnect_err + return out + + try: + file_obj.read = read_with_retries + except AttributeError: # read-only attribute + file_obj = _OverridableIOWrapper(file_obj) + file_obj.read = read_with_retries + return file_obj + + +def _prepare_path_and_storage_options( + urlpath: str, download_config: Optional[DownloadConfig] = None +) -> tuple[str, dict[str, dict[str, Any]]]: + prepared_urlpath = [] + prepared_storage_options = {} + for hop in urlpath.split("::"): + hop, storage_options = _prepare_single_hop_path_and_storage_options(hop, download_config=download_config) + prepared_urlpath.append(hop) + prepared_storage_options.update(storage_options) + return "::".join(prepared_urlpath), storage_options + + +def _prepare_single_hop_path_and_storage_options( + urlpath: str, download_config: Optional[DownloadConfig] = None +) -> tuple[str, dict[str, dict[str, Any]]]: + """ + Prepare the URL and the kwargs that must be passed to the HttpFileSystem or HfFileSystem + + In particular it resolves google drive URLs + It also adds the authentication headers for the Hugging Face Hub, for both https:// and hf:// paths. + + Storage options are formatted in the form {protocol: storage_options_for_protocol} + """ + token = None if download_config is None else download_config.token + if urlpath.startswith(config.HF_ENDPOINT) and "/resolve/" in urlpath: + urlpath = "hf://" + urlpath[len(config.HF_ENDPOINT) + 1 :].replace("/resolve/", "@", 1) + protocol = urlpath.split("://")[0] if "://" in urlpath else "file" + if download_config is not None and protocol in download_config.storage_options: + storage_options = download_config.storage_options[protocol].copy() + elif download_config is not None and protocol not in download_config.storage_options: + storage_options = { + option_name: option_value + for option_name, option_value in download_config.storage_options.items() + if option_name not in fsspec.available_protocols() + } + else: + storage_options = {} + if protocol in {"http", "https"}: + client_kwargs = storage_options.pop("client_kwargs", {}) + storage_options["client_kwargs"] = {"trust_env": True, **client_kwargs} # Enable reading proxy env variables + if "drive.google.com" in urlpath: + response = get_session().head(urlpath, timeout=10) + for k, v in response.cookies.items(): + if k.startswith("download_warning"): + urlpath += "&confirm=" + v + cookies = response.cookies + storage_options = {"cookies": cookies, **storage_options} + # Fix Google Drive URL to avoid Virus scan warning + if "confirm=" not in urlpath: + urlpath += "&confirm=t" + if urlpath.startswith("https://raw.githubusercontent.com/"): + # Workaround for served data with gzip content-encoding: https://github.com/fsspec/filesystem_spec/issues/389 + headers = storage_options.pop("headers", {}) + storage_options["headers"] = {"Accept-Encoding": "identity", **headers} + elif protocol == "hf": + storage_options = { + "endpoint": config.HF_ENDPOINT, + "token": token, + **storage_options, + } + if storage_options: + storage_options = {protocol: storage_options} + return urlpath, storage_options + + +def xopen(file: str, mode="r", *args, download_config: Optional[DownloadConfig] = None, **kwargs): + """Extend `open` function to support remote files using `fsspec`. + + It also has a retry mechanism in case connection fails. + The `args` and `kwargs` are passed to `fsspec.open`, except `token` which is used for queries to private repos on huggingface.co + + Args: + file (`str`): Path name of the file to be opened. + mode (`str`, *optional*, default "r"): Mode in which the file is opened. + *args: Arguments to be passed to `fsspec.open`. + download_config : mainly use token or storage_options to support different platforms and auth types. + **kwargs: Keyword arguments to be passed to `fsspec.open`. + + Returns: + file object + """ + # This works as well for `xopen(str(Path(...)))` + file_str = _as_str(file) + main_hop, *rest_hops = file_str.split("::") + if is_local_path(main_hop): + # ignore fsspec-specific kwargs + kwargs.pop("block_size", None) + return open(main_hop, mode, *args, **kwargs) + # add headers and cookies for authentication on the HF Hub and for Google Drive + file, storage_options = _prepare_path_and_storage_options(file_str, download_config=download_config) + kwargs = {**kwargs, **(storage_options or {})} + + max_retries = config.STREAMING_OPEN_MAX_RETRIES + + disconnect_err = None + for retry in range(1, max_retries + 1): + try: + fs, fs_token, paths = fsspec.get_fs_token_paths( + file, + mode, + storage_options=kwargs, + ) + file_obj = fs.open(paths[0], mode) + if hasattr(fs, "of") and hasattr(fs.of, "__exit__"): + file_obj._fs = fs # keep a reference or the fs might close the file on gc + break + except CONNECTION_ERRORS_TO_RETRY as err: + disconnect_err = err + logger.warning( + f"Failed to connect to remote data host. Retrying in {config.STREAMING_OPEN_RETRY_INTERVAL}sec [{retry}/{max_retries}]" + ) + time.sleep(config.STREAMING_OPEN_RETRY_INTERVAL) + except ValueError as e: + if str(e) == "Cannot seek streaming HTTP file": + raise NonStreamableDatasetError( + "Streaming is not possible for this dataset because data host server doesn't support HTTP range " + "requests. You can still load this dataset in non-streaming mode by passing `streaming=False` (default)" + ) from e + else: + raise + except FileNotFoundError: + if file.startswith(config.HF_ENDPOINT): + raise FileNotFoundError( + file + "\nIf the repo is private or gated, make sure to log in with `huggingface-cli login`." + ) from None + else: + raise + else: + raise ConnectionError("Server Disconnected") from disconnect_err + file_obj = _add_retries_to_file_obj_read_method(file_obj) + return file_obj + + +def xlistdir(path: str, download_config: Optional[DownloadConfig] = None) -> list[str]: + """Extend `os.listdir` function to support remote files. + + Args: + path (`str`): URL path. + download_config : mainly use token or storage_options to support different platforms and auth types. + + Returns: + `list` of `str` + """ + main_hop, *rest_hops = _as_str(path).split("::") + if is_local_path(main_hop): + return os.listdir(path) + else: + # globbing inside a zip in a private repo requires authentication + path, storage_options = _prepare_path_and_storage_options(path, download_config=download_config) + main_hop, *rest_hops = path.split("::") + fs, *_ = url_to_fs(path, **storage_options) + inner_path = main_hop.split("://")[-1] + if inner_path.strip("/") and not fs.isdir(inner_path): + raise FileNotFoundError(f"Directory doesn't exist: {path}") + paths = fs.listdir(inner_path, detail=False) + return [os.path.basename(path.rstrip("/")) for path in paths] + + +def xglob(urlpath, *, recursive=False, download_config: Optional[DownloadConfig] = None): + """Extend `glob.glob` function to support remote files. + + Args: + urlpath (`str`): URL path with shell-style wildcard patterns. + recursive (`bool`, default `False`): Whether to match the "**" pattern recursively to zero or more + directories or subdirectories. + download_config : mainly use token or storage_options to support different platforms and auth types. + + Returns: + `list` of `str` + """ + main_hop, *rest_hops = _as_str(urlpath).split("::") + if is_local_path(main_hop): + return glob.glob(main_hop, recursive=recursive) + else: + # globbing inside a zip in a private repo requires authentication + urlpath, storage_options = _prepare_path_and_storage_options(urlpath, download_config=download_config) + main_hop, *rest_hops = urlpath.split("::") + fs, *_ = url_to_fs(urlpath, **storage_options) + inner_path = main_hop.split("://")[1] + globbed_paths = fs.glob(inner_path) + protocol = fs.protocol if isinstance(fs.protocol, str) else fs.protocol[-1] + return ["::".join([f"{protocol}://{globbed_path}"] + rest_hops) for globbed_path in globbed_paths] + + +def xwalk(urlpath, download_config: Optional[DownloadConfig] = None, **kwargs): + """Extend `os.walk` function to support remote files. + + Args: + urlpath (`str`): URL root path. + download_config : mainly use token or storage_options to support different platforms and auth types. + **kwargs: Additional keyword arguments forwarded to the underlying filesystem. + + + Yields: + `tuple`: 3-tuple (dirpath, dirnames, filenames). + """ + main_hop, *rest_hops = _as_str(urlpath).split("::") + if is_local_path(main_hop): + yield from os.walk(main_hop, **kwargs) + else: + # walking inside a zip in a private repo requires authentication + urlpath, storage_options = _prepare_path_and_storage_options(urlpath, download_config=download_config) + main_hop, *rest_hops = urlpath.split("::") + fs, *_ = url_to_fs(urlpath, **storage_options) + inner_path = main_hop.split("://")[-1] + if inner_path.strip("/") and not fs.isdir(inner_path): + return [] + protocol = fs.protocol if isinstance(fs.protocol, str) else fs.protocol[-1] + for dirpath, dirnames, filenames in fs.walk(inner_path, **kwargs): + yield "::".join([f"{protocol}://{dirpath}"] + rest_hops), dirnames, filenames + + +class xPath(type(Path())): + """Extension of `pathlib.Path` to support both local paths and remote URLs.""" + + def __str__(self): + path_str = super().__str__() + main_hop, *rest_hops = path_str.split("::") + if is_local_path(main_hop): + return main_hop + path_as_posix = path_str.replace("\\", "/") + path_as_posix = SINGLE_SLASH_AFTER_PROTOCOL_PATTERN.sub("://", path_as_posix) + path_as_posix += "//" if path_as_posix.endswith(":") else "" # Add slashes to root of the protocol + return path_as_posix + + def exists(self, download_config: Optional[DownloadConfig] = None): + """Extend `pathlib.Path.exists` method to support both local and remote files. + + Args: + download_config : mainly use token or storage_options to support different platforms and auth types. + + Returns: + `bool` + """ + return xexists(str(self), download_config=download_config) + + def is_file(self, download_config: Optional[DownloadConfig] = None): + """Extend `pathlib.Path.is_file` method to support both local and remote files. + + Args: + download_config : mainly use token or storage_options to support different platforms and auth types. + + Returns: + `bool` + """ + return xisfile(str(self), download_config=download_config) + + def is_dir(self, download_config: Optional[DownloadConfig] = None): + """Extend `pathlib.Path.is_dir` method to support both local and remote files. + + Args: + download_config : mainly use token or storage_options to support different platforms and auth types. + + Returns: + `bool` + """ + return xisdir(str(self), download_config=download_config) + + def glob(self, pattern, download_config: Optional[DownloadConfig] = None): + """Glob function for argument of type :obj:`~pathlib.Path` that supports both local paths end remote URLs. + + Args: + pattern (`str`): Pattern that resulting paths must match. + download_config : mainly use token or storage_options to support different platforms and auth types. + + Yields: + [`xPath`] + """ + posix_path = self.as_posix() + main_hop, *rest_hops = posix_path.split("::") + if is_local_path(main_hop): + yield from Path(main_hop).glob(pattern) + else: + # globbing inside a zip in a private repo requires authentication + if rest_hops: + urlpath = rest_hops[0] + urlpath, storage_options = _prepare_path_and_storage_options(urlpath, download_config=download_config) + storage_options = {urlpath.split("://")[0]: storage_options} + posix_path = "::".join([main_hop, urlpath, *rest_hops[1:]]) + else: + storage_options = None + fs, *_ = url_to_fs(xjoin(posix_path, pattern), **(storage_options or {})) + globbed_paths = fs.glob(xjoin(main_hop, pattern)) + for globbed_path in globbed_paths: + yield type(self)("::".join([f"{fs.protocol}://{globbed_path}"] + rest_hops)) + + def rglob(self, pattern, **kwargs): + """Rglob function for argument of type :obj:`~pathlib.Path` that supports both local paths end remote URLs. + + Args: + pattern (`str`): Pattern that resulting paths must match. + + Yields: + [`xPath`] + """ + return self.glob("**/" + pattern, **kwargs) + + @property + def parent(self) -> "xPath": + """Name function for argument of type :obj:`~pathlib.Path` that supports both local paths end remote URLs. + + Returns: + [`xPath`] + """ + return type(self)(xdirname(self.as_posix())) + + @property + def name(self) -> str: + """Name function for argument of type :obj:`~pathlib.Path` that supports both local paths end remote URLs. + + Returns: + `str` + """ + return PurePosixPath(self.as_posix().split("::")[0]).name + + @property + def stem(self) -> str: + """Stem function for argument of type :obj:`~pathlib.Path` that supports both local paths end remote URLs. + + Returns: + `str` + """ + return PurePosixPath(self.as_posix().split("::")[0]).stem + + @property + def suffix(self) -> str: + """Suffix function for argument of type :obj:`~pathlib.Path` that supports both local paths end remote URLs. + + Returns: + `str` + """ + return PurePosixPath(self.as_posix().split("::")[0]).suffix + + def open(self, *args, **kwargs): + """Extend :func:`xopen` to support argument of type :obj:`~pathlib.Path`. + + Args: + **args: Arguments passed to :func:`fsspec.open`. + **kwargs: Keyword arguments passed to :func:`fsspec.open`. + + Returns: + `io.FileIO`: File-like object. + """ + return xopen(str(self), *args, **kwargs) + + def joinpath(self, *p: tuple[str, ...]) -> "xPath": + """Extend :func:`xjoin` to support argument of type :obj:`~pathlib.Path`. + + Args: + *p (`tuple` of `str`): Other path components. + + Returns: + [`xPath`] + """ + return type(self)(xjoin(self.as_posix(), *p)) + + def __truediv__(self, p: str) -> "xPath": + return self.joinpath(p) + + def with_suffix(self, suffix): + main_hop, *rest_hops = str(self).split("::") + if is_local_path(main_hop): + return type(self)(str(super().with_suffix(suffix))) + return type(self)("::".join([type(self)(PurePosixPath(main_hop).with_suffix(suffix)).as_posix()] + rest_hops)) + + +def _as_str(path: Union[str, Path, xPath]): + return str(path) if isinstance(path, xPath) else str(xPath(str(path))) + + +def xgzip_open(filepath_or_buffer, *args, download_config: Optional[DownloadConfig] = None, **kwargs): + import gzip + + if hasattr(filepath_or_buffer, "read"): + return gzip.open(filepath_or_buffer, *args, **kwargs) + else: + filepath_or_buffer = str(filepath_or_buffer) + return gzip.open(xopen(filepath_or_buffer, "rb", download_config=download_config), *args, **kwargs) + + +def xnumpy_load(filepath_or_buffer, *args, download_config: Optional[DownloadConfig] = None, **kwargs): + import numpy as np + + if hasattr(filepath_or_buffer, "read"): + return np.load(filepath_or_buffer, *args, **kwargs) + else: + filepath_or_buffer = str(filepath_or_buffer) + return np.load(xopen(filepath_or_buffer, "rb", download_config=download_config), *args, **kwargs) + + +def xpandas_read_csv(filepath_or_buffer, download_config: Optional[DownloadConfig] = None, **kwargs): + import pandas as pd + + if hasattr(filepath_or_buffer, "read"): + return pd.read_csv(filepath_or_buffer, **kwargs) + else: + filepath_or_buffer = str(filepath_or_buffer) + if kwargs.get("compression", "infer") == "infer": + kwargs["compression"] = _get_extraction_protocol(filepath_or_buffer, download_config=download_config) + return pd.read_csv(xopen(filepath_or_buffer, "rb", download_config=download_config), **kwargs) + + +def xpandas_read_excel(filepath_or_buffer, download_config: Optional[DownloadConfig] = None, **kwargs): + import pandas as pd + + if hasattr(filepath_or_buffer, "read"): + try: + return pd.read_excel(filepath_or_buffer, **kwargs) + except ValueError: # Cannot seek streaming HTTP file + return pd.read_excel(BytesIO(filepath_or_buffer.read()), **kwargs) + else: + filepath_or_buffer = str(filepath_or_buffer) + try: + return pd.read_excel(xopen(filepath_or_buffer, "rb", download_config=download_config), **kwargs) + except ValueError: # Cannot seek streaming HTTP file + return pd.read_excel( + BytesIO(xopen(filepath_or_buffer, "rb", download_config=download_config).read()), **kwargs + ) + + +def xpyarrow_parquet_read_table(filepath_or_buffer, download_config: Optional[DownloadConfig] = None, **kwargs): + import pyarrow.parquet as pq + + if hasattr(filepath_or_buffer, "read"): + return pq.read_table(filepath_or_buffer, **kwargs) + else: + filepath_or_buffer = str(filepath_or_buffer) + return pq.read_table(xopen(filepath_or_buffer, mode="rb", download_config=download_config), **kwargs) + + +def xsio_loadmat(filepath_or_buffer, download_config: Optional[DownloadConfig] = None, **kwargs): + import scipy.io as sio + + if hasattr(filepath_or_buffer, "read"): + return sio.loadmat(filepath_or_buffer, **kwargs) + else: + return sio.loadmat(xopen(filepath_or_buffer, "rb", download_config=download_config), **kwargs) + + +def xet_parse(source, parser=None, download_config: Optional[DownloadConfig] = None): + """Extend `xml.etree.ElementTree.parse` function to support remote files. + + Args: + source: File path or file object. + parser (`XMLParser`, *optional*, default `XMLParser`): Parser instance. + download_config : mainly use token or storage_options to support different platforms and auth types. + + Returns: + `xml.etree.ElementTree.Element`: Root element of the given source document. + """ + if hasattr(source, "read"): + return ET.parse(source, parser=parser) + else: + with xopen(source, "rb", download_config=download_config) as f: + return ET.parse(f, parser=parser) + + +def xxml_dom_minidom_parse(filename_or_file, download_config: Optional[DownloadConfig] = None, **kwargs): + """Extend `xml.dom.minidom.parse` function to support remote files. + + Args: + filename_or_file (`str` or file): File path or file object. + download_config : mainly use token or storage_options to support different platforms and auth types. + **kwargs (optional): Additional keyword arguments passed to `xml.dom.minidom.parse`. + + Returns: + :obj:`xml.dom.minidom.Document`: Parsed document. + """ + if hasattr(filename_or_file, "read"): + return xml.dom.minidom.parse(filename_or_file, **kwargs) + else: + with xopen(filename_or_file, "rb", download_config=download_config) as f: + return xml.dom.minidom.parse(f, **kwargs) + + +class ArchiveIterable(TrackedIterableFromGenerator): + """An iterable of (path, fileobj) from a TAR archive, used by `iter_archive`""" + + @staticmethod + def _iter_tar(f): + stream = tarfile.open(fileobj=f, mode="r|*") + for tarinfo in stream: + file_path = tarinfo.name + if not tarinfo.isreg(): + continue + if file_path is None: + continue + if os.path.basename(file_path).startswith((".", "__")): + # skipping hidden files + continue + file_obj = stream.extractfile(tarinfo) + yield file_path, file_obj + stream.members = [] + del stream + + @staticmethod + def _iter_zip(f): + zipf = zipfile.ZipFile(f) + for member in zipf.infolist(): + file_path = member.filename + if member.is_dir(): + continue + if file_path is None: + continue + if os.path.basename(file_path).startswith((".", "__")): + # skipping hidden files + continue + file_obj = zipf.open(member) + yield file_path, file_obj + + @classmethod + def _iter_from_fileobj(cls, f) -> Generator[tuple, None, None]: + compression = _get_extraction_protocol_with_magic_number(f) + if compression == "zip": + yield from cls._iter_zip(f) + else: + yield from cls._iter_tar(f) + + @classmethod + def _iter_from_urlpath( + cls, urlpath: str, download_config: Optional[DownloadConfig] = None + ) -> Generator[tuple, None, None]: + compression = _get_extraction_protocol(urlpath, download_config=download_config) + # Set block_size=0 to get faster streaming + # (e.g. for hf:// and https:// it uses streaming Requests file-like instances) + with xopen(urlpath, "rb", download_config=download_config, block_size=0) as f: + if compression == "zip": + yield from cls._iter_zip(f) + else: + yield from cls._iter_tar(f) + + @classmethod + def from_buf(cls, fileobj) -> "ArchiveIterable": + return cls(cls._iter_from_fileobj, fileobj) + + @classmethod + def from_urlpath(cls, urlpath_or_buf, download_config: Optional[DownloadConfig] = None) -> "ArchiveIterable": + return cls(cls._iter_from_urlpath, urlpath_or_buf, download_config) + + +class FilesIterable(TrackedIterableFromGenerator): + """An iterable of paths from a list of directories or files""" + + @classmethod + def _iter_from_urlpaths( + cls, urlpaths: Union[str, list[str]], download_config: Optional[DownloadConfig] = None + ) -> Generator[str, None, None]: + if not isinstance(urlpaths, list): + urlpaths = [urlpaths] + for urlpath in urlpaths: + if xisfile(urlpath, download_config=download_config): + yield urlpath + elif xisdir(urlpath, download_config=download_config): + for dirpath, dirnames, filenames in xwalk(urlpath, download_config=download_config): + # in-place modification to prune the search + dirnames[:] = sorted([dirname for dirname in dirnames if not dirname.startswith((".", "__"))]) + if xbasename(dirpath).startswith((".", "__")): + # skipping hidden directories + continue + for filename in sorted(filenames): + if filename.startswith((".", "__")): + # skipping hidden files + continue + yield xjoin(dirpath, filename) + else: + raise FileNotFoundError(urlpath) + + @classmethod + def from_urlpaths(cls, urlpaths, download_config: Optional[DownloadConfig] = None) -> "FilesIterable": + return cls(cls._iter_from_urlpaths, urlpaths, download_config) diff --git a/src/datasets/utils/filelock.py b/src/datasets/utils/filelock.py new file mode 100644 index 0000000..df0728e --- /dev/null +++ b/src/datasets/utils/filelock.py @@ -0,0 +1,11 @@ +# deprecated, please use the `filelock` package instead + +from filelock import ( # noqa: F401 # imported for backward compatibility TODO: remove in 3.0.0 + BaseFileLock, + SoftFileLock, + Timeout, + UnixFileLock, + WindowsFileLock, +) + +from ._filelock import FileLock # noqa: F401 # imported for backward compatibility. TODO: remove in 3.0.0 diff --git a/src/datasets/utils/hub.py b/src/datasets/utils/hub.py new file mode 100644 index 0000000..6d78433 --- /dev/null +++ b/src/datasets/utils/hub.py @@ -0,0 +1,6 @@ +from functools import partial + +from huggingface_hub import hf_hub_url + + +hf_dataset_url = partial(hf_hub_url, repo_type="dataset") diff --git a/src/datasets/utils/info_utils.py b/src/datasets/utils/info_utils.py new file mode 100644 index 0000000..c3e246f --- /dev/null +++ b/src/datasets/utils/info_utils.py @@ -0,0 +1,105 @@ +import enum +import os +from typing import Optional + +from huggingface_hub.utils import insecure_hashlib + +from .. import config +from ..exceptions import ( + ExpectedMoreDownloadedFilesError, + ExpectedMoreSplitsError, + NonMatchingChecksumError, + NonMatchingSplitsSizesError, + UnexpectedDownloadedFileError, + UnexpectedSplitsError, +) +from .logging import get_logger + + +logger = get_logger(__name__) + + +class VerificationMode(enum.Enum): + """`Enum` that specifies which verification checks to run. + + The default mode is `BASIC_CHECKS`, which will perform only rudimentary checks to avoid slowdowns + when generating/downloading a dataset for the first time. + + The verification modes: + + | | Verification checks | + |---------------------------|------------------------------------------------------------------------------ | + | `ALL_CHECKS` | Split checks and validity (number of files, checksums) of downloaded files | + | `BASIC_CHECKS` (default) | Same as `ALL_CHECKS` but without checking downloaded files | + | `NO_CHECKS` | None | + + """ + + ALL_CHECKS = "all_checks" + BASIC_CHECKS = "basic_checks" + NO_CHECKS = "no_checks" + + +def verify_checksums(expected_checksums: Optional[dict], recorded_checksums: dict, verification_name=None): + if expected_checksums is None: + logger.info("Unable to verify checksums.") + return + if len(set(expected_checksums) - set(recorded_checksums)) > 0: + raise ExpectedMoreDownloadedFilesError(str(set(expected_checksums) - set(recorded_checksums))) + if len(set(recorded_checksums) - set(expected_checksums)) > 0: + raise UnexpectedDownloadedFileError(str(set(recorded_checksums) - set(expected_checksums))) + bad_urls = [url for url in expected_checksums if expected_checksums[url] != recorded_checksums[url]] + for_verification_name = " for " + verification_name if verification_name is not None else "" + if len(bad_urls) > 0: + raise NonMatchingChecksumError( + f"Checksums didn't match{for_verification_name}:\n" + f"{bad_urls}\n" + "Set `verification_mode='no_checks'` to skip checksums verification and ignore this error" + ) + logger.info("All the checksums matched successfully" + for_verification_name) + + +def verify_splits(expected_splits: Optional[dict], recorded_splits: dict): + if expected_splits is None: + logger.info("Unable to verify splits sizes.") + return + if len(set(expected_splits) - set(recorded_splits)) > 0: + raise ExpectedMoreSplitsError(str(set(expected_splits) - set(recorded_splits))) + if len(set(recorded_splits) - set(expected_splits)) > 0: + raise UnexpectedSplitsError(str(set(recorded_splits) - set(expected_splits))) + bad_splits = [ + {"expected": expected_splits[name], "recorded": recorded_splits[name]} + for name in expected_splits + if expected_splits[name].num_examples != recorded_splits[name].num_examples + ] + if len(bad_splits) > 0: + raise NonMatchingSplitsSizesError(str(bad_splits)) + logger.info("All the splits matched successfully.") + + +def get_size_checksum_dict(path: str, record_checksum: bool = False) -> dict: + """Compute the file size and the sha256 checksum of a file""" + if record_checksum: + m = insecure_hashlib.sha256() + with open(path, "rb") as f: + for chunk in iter(lambda: f.read(1 << 20), b""): + m.update(chunk) + checksum = m.hexdigest() + else: + checksum = None + return {"num_bytes": os.path.getsize(path), "checksum": checksum} + + +def is_small_dataset(dataset_size): + """Check if `dataset_size` is smaller than `config.IN_MEMORY_MAX_SIZE`. + + Args: + dataset_size (int): Dataset size in bytes. + + Returns: + bool: Whether `dataset_size` is smaller than `config.IN_MEMORY_MAX_SIZE`. + """ + if dataset_size and config.IN_MEMORY_MAX_SIZE: + return dataset_size < config.IN_MEMORY_MAX_SIZE + else: + return False diff --git a/src/datasets/utils/json.py b/src/datasets/utils/json.py new file mode 100644 index 0000000..c1fb4e3 --- /dev/null +++ b/src/datasets/utils/json.py @@ -0,0 +1,139 @@ +from typing import TYPE_CHECKING, Any + +import pandas as pd + + +if TYPE_CHECKING: + from ..features.features import FeatureType + + +def ujson_dumps(*args, **kwargs): + try: + return pd.io.json.ujson_dumps(*args, **kwargs) + except AttributeError: + # Before pandas-2.2.0, ujson_dumps was renamed to dumps: import ujson_dumps as dumps + return pd.io.json.dumps(*args, **kwargs) + + +def ujson_loads(*args, **kwargs): + try: + return pd.io.json.ujson_loads(*args, **kwargs) + except AttributeError: + # Before pandas-2.2.0, ujson_loads was renamed to loads: import ujson_loads as loads + return pd.io.json.loads(*args, **kwargs) + + +def json_encode_field(example: Any, json_field_path: list[str]) -> Any: + if json_field_path: + field, *json_field_path = json_field_path + if example is None: + return None + elif field == 0: + return [json_encode_field(x, json_field_path) for x in example] + else: + return {**example, field: json_encode_field(example.get(field), json_field_path)} + elif example is None: + # keep missing values as real nulls instead of the JSON string "null" + return None + else: + try: + ujson_loads(example) + except Exception: + return ujson_dumps(example) + else: + return example + + +def json_decode_field(example: Any, json_field_path: str) -> Any: + if json_field_path: + field, *json_field_path = json_field_path + if example is None: + return None + elif field == 0: + return [json_decode_field(x, json_field_path) for x in example] + else: + return {**example, field: json_decode_field(example.get(field), json_field_path)} + elif example is None: + return None + else: + try: + return ujson_loads(example) + except Exception: + return example + + +def find_mixed_struct_types_field_paths(examples: list, allow_root=False) -> list[list[str]]: + mixed_struct_types_field_paths = [] + examples = [example for example in examples if example is not None] + if not examples: + return [] + paths_and_content_to_check = [([], examples)] + while paths_and_content_to_check: + path, content = paths_and_content_to_check.pop(0) + if all(isinstance(x, dict) for x in content): + if (allow_root or path) and (any(set(x) != set(content[0]) for x in content) or not content[0]): + mixed_struct_types_field_paths.append(path) + else: + for subfield in {field for x in content for field in x}: + examples = [x[subfield] for x in content if subfield in x and x[subfield] is not None] + if not examples: + continue + paths_and_content_to_check.append((path + [subfield], examples)) + elif all(isinstance(x, list) for x in content): + examples = [x for sublist in content for x in sublist if x is not None] + if not examples: + continue + paths_and_content_to_check.append((path + [0], examples)) + elif any(isinstance(x, (dict, list)) for x in content): + mixed_struct_types_field_paths.append(path) + return mixed_struct_types_field_paths + + +def get_json_field_path_from_pyarrow_json_error(err_str: str) -> list[str]: + # e.g. json_field_path_str = "col/subfield_containing_a_list/[]/subsubfield_in_item_in_the_list" + json_field_path_str = err_str.split("Column(", 1)[1].rsplit(") changed from", 1)[0].strip("/") + # e.g. json_field_path = ["col", "subfield_containing_a_list", 0, "subsubfield_in_item_in_the_list"] + json_field_path = [0 if seg == "[]" else seg for seg in json_field_path_str.split("/")] + return json_field_path + + +def insert_json_field_path(json_field_paths: list[list[str]], json_field_path: list[str]) -> None: + # Add to list of json_field_paths and check if other share a common path + for i in range(len(json_field_paths)): + if json_field_paths[i][: len(json_field_path)] == json_field_path: + json_field_paths[i] = json_field_path + break + else: + json_field_paths.append(json_field_path) + + +def json_encode_fields_in_json_lines(original_batch: bytes, json_field_paths: list[list[str]]) -> bytes: + examples = [ujson_loads(line) for line in original_batch.splitlines()] + for json_field_path in json_field_paths: + examples = [json_encode_field(example, json_field_path) for example in examples] + batch = "\n".join([ujson_dumps(example) for example in examples]).encode() + return batch + + +def get_json_field_paths_from_feature(feature: "FeatureType") -> list[list[str]]: + from datasets.features.features import Json, _visit_with_path + + json_field_paths = [] + + def get_json_type_path(_feature, feature_path): + if isinstance(_feature, Json): + json_field_paths.append(feature_path) + return _feature + + _visit_with_path(feature, get_json_type_path) + return json_field_paths + + +def set_json_types_in_feature(feature: "FeatureType", json_field_paths: list[list[str]]) -> None: + from datasets.features.features import Json, _visit_with_path + + def set_json_type(feature, feature_path): + return Json() if feature_path in json_field_paths else feature + + feature = _visit_with_path(feature, set_json_type) + return feature diff --git a/src/datasets/utils/logging.py b/src/datasets/utils/logging.py new file mode 100644 index 0000000..851c1a2 --- /dev/null +++ b/src/datasets/utils/logging.py @@ -0,0 +1,175 @@ +# Copyright 2020 Optuna, Hugging Face +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Logging utilities.""" + +import logging +import os +from logging import ( + CRITICAL, # NOQA + DEBUG, # NOQA + ERROR, # NOQA + FATAL, # NOQA + INFO, # NOQA + NOTSET, # NOQA + WARN, # NOQA + WARNING, # NOQA +) +from typing import Optional + +from .tqdm import ( # noqa: F401 # imported for backward compatibility + disable_progress_bar, + enable_progress_bar, + is_progress_bar_enabled, + tqdm, +) + + +log_levels = { + "debug": logging.DEBUG, + "info": logging.INFO, + "warning": logging.WARNING, + "error": logging.ERROR, + "critical": logging.CRITICAL, +} + +_default_log_level = logging.WARNING + + +def _get_default_logging_level(): + """ + If DATASETS_VERBOSITY env var is set to one of the valid choices return that as the new default level. + If it is not - fall back to ``_default_log_level`` + """ + env_level_str = os.getenv("DATASETS_VERBOSITY", None) + if env_level_str: + if env_level_str in log_levels: + return log_levels[env_level_str] + else: + logging.getLogger().warning( + f"Unknown option DATASETS_VERBOSITY={env_level_str}, has to be one of: {', '.join(log_levels.keys())}" + ) + return _default_log_level + + +def _get_library_name() -> str: + return __name__.split(".")[0] + + +def _get_library_root_logger() -> logging.Logger: + return logging.getLogger(_get_library_name()) + + +def _configure_library_root_logger() -> None: + # Apply our default configuration to the library root logger. + library_root_logger = _get_library_root_logger() + library_root_logger.addHandler(logging.StreamHandler()) + library_root_logger.setLevel(_get_default_logging_level()) + + +def _reset_library_root_logger() -> None: + library_root_logger = _get_library_root_logger() + library_root_logger.setLevel(logging.NOTSET) + + +def get_logger(name: Optional[str] = None) -> logging.Logger: + """Return a logger with the specified name. + This function can be used in dataset builders. + """ + if name is None: + name = _get_library_name() + return logging.getLogger(name) + + +def get_verbosity() -> int: + """Return the current level for the HuggingFace datasets library's root logger. + Returns: + Logging level, e.g., `datasets.logging.DEBUG` and `datasets.logging.INFO`. + + > [!TIP] + > HuggingFace datasets library has following logging levels: + > - `datasets.logging.CRITICAL`, `datasets.logging.FATAL` + > - `datasets.logging.ERROR` + > - `datasets.logging.WARNING`, `datasets.logging.WARN` + > - `datasets.logging.INFO` + > - `datasets.logging.DEBUG` + """ + return _get_library_root_logger().getEffectiveLevel() + + +def set_verbosity(verbosity: int) -> None: + """Set the level for the Hugging Face Datasets library's root logger. + Args: + verbosity: + Logging level, e.g., `datasets.logging.DEBUG` and `datasets.logging.INFO`. + """ + _get_library_root_logger().setLevel(verbosity) + + +def set_verbosity_info(): + """Set the level for the Hugging Face datasets library's root logger to `INFO`. + + This will display most of the logging information and tqdm bars. + + Shortcut to `datasets.logging.set_verbosity(datasets.logging.INFO)`. + """ + return set_verbosity(INFO) + + +def set_verbosity_warning(): + """Set the level for the Hugging Face datasets library's root logger to `WARNING`. + + This will display only the warning and errors logging information and tqdm bars. + + Shortcut to `datasets.logging.set_verbosity(datasets.logging.WARNING)`. + """ + return set_verbosity(WARNING) + + +def set_verbosity_debug(): + """Set the level for the Hugging Face datasets library's root logger to `DEBUG`. + + This will display all the logging information and tqdm bars. + + Shortcut to `datasets.logging.set_verbosity(datasets.logging.DEBUG)`. + """ + return set_verbosity(DEBUG) + + +def set_verbosity_error(): + """Set the level for the Hugging Face datasets library's root logger to `ERROR`. + + This will display only the errors logging information and tqdm bars. + + Shortcut to `datasets.logging.set_verbosity(datasets.logging.ERROR)`. + """ + return set_verbosity(ERROR) + + +def disable_propagation() -> None: + """Disable propagation of the library log outputs. + Note that log propagation is disabled by default. + """ + _get_library_root_logger().propagate = False + + +def enable_propagation() -> None: + """Enable propagation of the library log outputs. + Please disable the Hugging Face datasets library's default handler to prevent double logging if the root logger has + been configured. + """ + _get_library_root_logger().propagate = True + + +# Configure the library root logger at the module level (singleton-like) +_configure_library_root_logger() diff --git a/src/datasets/utils/metadata.py b/src/datasets/utils/metadata.py new file mode 100644 index 0000000..cceecf3 --- /dev/null +++ b/src/datasets/utils/metadata.py @@ -0,0 +1,233 @@ +import re +import textwrap +from collections import Counter +from itertools import groupby +from operator import itemgetter +from typing import Any, ClassVar, Optional + +import yaml +from huggingface_hub import DatasetCardData + +from ..config import METADATA_CONFIGS_FIELD +from ..features import Features +from ..info import DatasetInfo, DatasetInfosDict +from ..naming import _split_re +from ..utils.logging import get_logger + + +logger = get_logger(__name__) + + +class _NoDuplicateSafeLoader(yaml.SafeLoader): + def _check_no_duplicates_on_constructed_node(self, node): + keys = [self.constructed_objects[key_node] for key_node, _ in node.value] + keys = [tuple(key) if isinstance(key, list) else key for key in keys] + counter = Counter(keys) + duplicate_keys = [key for key in counter if counter[key] > 1] + if duplicate_keys: + raise TypeError(f"Got duplicate yaml keys: {duplicate_keys}") + + def construct_mapping(self, node, deep=False): + mapping = super().construct_mapping(node, deep=deep) + self._check_no_duplicates_on_constructed_node(node) + return mapping + + +def _split_yaml_from_readme(readme_content: str) -> tuple[Optional[str], str]: + full_content = list(readme_content.splitlines()) + if full_content and full_content[0] == "---" and "---" in full_content[1:]: + sep_idx = full_content[1:].index("---") + 1 + yamlblock = "\n".join(full_content[1:sep_idx]) + return yamlblock, "\n".join(full_content[sep_idx + 1 :]) + + return None, "\n".join(full_content) + + +class MetadataConfigs(dict[str, dict[str, Any]]): + """Should be in format {config_name: {**config_params}}.""" + + FIELD_NAME: ClassVar[str] = METADATA_CONFIGS_FIELD + + @staticmethod + def _raise_if_data_files_field_not_valid(metadata_config: dict): + yaml_data_files = metadata_config.get("data_files") + if yaml_data_files is not None: + yaml_error_message = textwrap.dedent( + f""" + Expected data_files in YAML to be either a string or a list of strings + or a list of dicts with two keys: 'split' and 'path', but got {yaml_data_files} + Examples of data_files in YAML: + + data_files: data.csv + + data_files: data/*.png + + data_files: + - part0/* + - part1/* + + data_files: + - split: train + path: train/* + - split: test + path: test/* + + data_files: + - split: train + path: + - train/part1/* + - train/part2/* + - split: test + path: test/* + + PS: some symbols like dashes '-' are not allowed in split names + """ + ) + if not isinstance(yaml_data_files, (list, str)): + raise ValueError(yaml_error_message) + if isinstance(yaml_data_files, list): + for yaml_data_files_item in yaml_data_files: + if ( + not isinstance(yaml_data_files_item, (str, dict)) + or isinstance(yaml_data_files_item, dict) + and not ( + len(yaml_data_files_item) == 2 + and "split" in yaml_data_files_item + and re.match(_split_re, yaml_data_files_item["split"]) + and isinstance(yaml_data_files_item.get("path"), (str, list)) + ) + ): + raise ValueError(yaml_error_message) + + @classmethod + def _from_exported_parquet_files_and_dataset_infos( + cls, + parquet_commit_hash: str, + exported_parquet_files: list[dict[str, Any]], + dataset_infos: DatasetInfosDict, + ) -> "MetadataConfigs": + metadata_configs = { + config_name: { + "data_files": [ + { + "split": split_name, + "path": [ + parquet_file["url"].replace("refs%2Fconvert%2Fparquet", parquet_commit_hash) + for parquet_file in parquet_files_for_split + ], + } + for split_name, parquet_files_for_split in groupby(parquet_files_for_config, itemgetter("split")) + ], + "version": str(dataset_infos.get(config_name, DatasetInfo()).version or "0.0.0"), + } + for config_name, parquet_files_for_config in groupby(exported_parquet_files, itemgetter("config")) + } + if dataset_infos: + # Preserve order of configs and splits + metadata_configs = { + config_name: { + "data_files": [ + data_file + for split_name in dataset_info.splits + for data_file in metadata_configs[config_name]["data_files"] + if data_file["split"] == split_name + ], + "version": metadata_configs[config_name]["version"], + } + for config_name, dataset_info in dataset_infos.items() + } + return cls(metadata_configs) + + @classmethod + def from_dataset_card_data(cls, dataset_card_data: DatasetCardData) -> "MetadataConfigs": + if dataset_card_data.get(cls.FIELD_NAME): + metadata_configs = dataset_card_data[cls.FIELD_NAME] + if not isinstance(metadata_configs, list): + raise ValueError(f"Expected {cls.FIELD_NAME} to be a list, but got '{metadata_configs}'") + for metadata_config in metadata_configs: + if "config_name" not in metadata_config: + raise ValueError( + f"Each config must include `config_name` field with a string name of a config, " + f"but got {metadata_config}. " + ) + cls._raise_if_data_files_field_not_valid(metadata_config) + return cls( + { + config.pop("config_name"): { + param: value if param != "features" else Features._from_yaml_list(value) + for param, value in config.items() + } + for metadata_config in metadata_configs + if (config := metadata_config.copy()) + } + ) + return cls() + + def to_dataset_card_data(self, dataset_card_data: DatasetCardData) -> None: + if self: + for metadata_config in self.values(): + self._raise_if_data_files_field_not_valid(metadata_config) + current_metadata_configs = self.from_dataset_card_data(dataset_card_data) + total_metadata_configs = dict(sorted({**current_metadata_configs, **self}.items())) + for config_name, config_metadata in total_metadata_configs.items(): + config_metadata.pop("config_name", None) + dataset_card_data[self.FIELD_NAME] = [ + {"config_name": config_name, **config_metadata} + for config_name, config_metadata in total_metadata_configs.items() + ] + + def get_default_config_name(self) -> Optional[str]: + default_config_name = None + for config_name, metadata_config in self.items(): + if len(self) == 1 or config_name == "default" or metadata_config.get("default"): + if default_config_name is None: + default_config_name = config_name + else: + raise ValueError( + f"Dataset has several default configs: '{default_config_name}' and '{config_name}'." + ) + return default_config_name + + +# DEPRECATED - just here to support old versions of evaluate like 0.2.2 +# To support new tasks on the Hugging Face Hub, please open a PR for this file: +# https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/src/pipelines.ts +known_task_ids = { + "image-classification": [], + "translation": [], + "image-segmentation": [], + "fill-mask": [], + "automatic-speech-recognition": [], + "token-classification": [], + "sentence-similarity": [], + "audio-classification": [], + "question-answering": [], + "summarization": [], + "zero-shot-classification": [], + "table-to-text": [], + "feature-extraction": [], + "other": [], + "multiple-choice": [], + "text-classification": [], + "text-to-image": [], + "text2text-generation": [], + "zero-shot-image-classification": [], + "tabular-classification": [], + "tabular-regression": [], + "image-to-image": [], + "tabular-to-text": [], + "unconditional-image-generation": [], + "text-retrieval": [], + "text-to-speech": [], + "object-detection": [], + "audio-to-audio": [], + "text-generation": [], + "conversational": [], + "table-question-answering": [], + "visual-question-answering": [], + "image-to-text": [], + "reinforcement-learning": [], + "voice-activity-detection": [], + "time-series-forecasting": [], + "document-question-answering": [], +} diff --git a/src/datasets/utils/patching.py b/src/datasets/utils/patching.py new file mode 100644 index 0000000..69563f5 --- /dev/null +++ b/src/datasets/utils/patching.py @@ -0,0 +1,119 @@ +from importlib import import_module + +from .logging import get_logger + + +logger = get_logger(__name__) + + +class _PatchedModuleObj: + """Set all the modules components as attributes of the _PatchedModuleObj object.""" + + def __init__(self, module, attrs=None): + attrs = attrs or [] + if module is not None: + for key in module.__dict__: + if key in attrs or not key.startswith("__"): + setattr(self, key, getattr(module, key)) + self._original_module = module._original_module if isinstance(module, _PatchedModuleObj) else module + + +class patch_submodule: + """ + Patch a submodule attribute of an object, by keeping all other submodules intact at all levels. + + Example:: + + >>> import importlib + >>> from datasets.load import dataset_module_factory + >>> from datasets.streaming import patch_submodule, xjoin + >>> + >>> dataset_module = dataset_module_factory("stanfordnlp/snli") + >>> snli_module = importlib.import_module(dataset_module.module_path) + >>> patcher = patch_submodule(snli_module, "os.path.join", xjoin) + >>> patcher.start() + >>> assert snli_module.os.path.join is xjoin + """ + + _active_patches = [] + + def __init__(self, obj, target: str, new, attrs=None): + self.obj = obj + self.target = target + self.new = new + self.key = target.split(".")[0] + self.original = {} + self.attrs = attrs or [] + + def __enter__(self): + *submodules, target_attr = self.target.split(".") + + # Patch modules: + # it's used to patch attributes of submodules like "os.path.join"; + # in this case we need to patch "os" and "os.path" + + for i in range(len(submodules)): + try: + submodule = import_module(".".join(submodules[: i + 1])) + except ModuleNotFoundError: + continue + # We iterate over all the globals in self.obj in case we find "os" or "os.path" + for attr in self.obj.__dir__(): + obj_attr = getattr(self.obj, attr) + # We don't check for the name of the global, but rather if its value *is* "os" or "os.path". + # This allows to patch renamed modules like "from os import path as ospath". + if obj_attr is submodule or ( + isinstance(obj_attr, _PatchedModuleObj) and obj_attr._original_module is submodule + ): + self.original[attr] = obj_attr + # patch at top level + setattr(self.obj, attr, _PatchedModuleObj(obj_attr, attrs=self.attrs)) + patched = getattr(self.obj, attr) + # construct lower levels patches + for key in submodules[i + 1 :]: + setattr(patched, key, _PatchedModuleObj(getattr(patched, key, None), attrs=self.attrs)) + patched = getattr(patched, key) + # finally set the target attribute + setattr(patched, target_attr, self.new) + + # Patch attribute itself: + # it's used for builtins like "open", + # and also to patch "os.path.join" we may also need to patch "join" + # itself if it was imported as "from os.path import join". + + if submodules: # if it's an attribute of a submodule like "os.path.join" + try: + attr_value = getattr(import_module(".".join(submodules)), target_attr) + except (AttributeError, ModuleNotFoundError): + return + # We iterate over all the globals in self.obj in case we find "os.path.join" + for attr in self.obj.__dir__(): + # We don't check for the name of the global, but rather if its value *is* "os.path.join". + # This allows to patch renamed attributes like "from os.path import join as pjoin". + if getattr(self.obj, attr) is attr_value: + self.original[attr] = getattr(self.obj, attr) + setattr(self.obj, attr, self.new) + elif target_attr in globals()["__builtins__"]: # if it'a s builtin like "open" + self.original[target_attr] = globals()["__builtins__"][target_attr] + setattr(self.obj, target_attr, self.new) + else: + raise RuntimeError(f"Tried to patch attribute {target_attr} instead of a submodule.") + + def __exit__(self, *exc_info): + for attr in list(self.original): + setattr(self.obj, attr, self.original.pop(attr)) + + def start(self): + """Activate a patch.""" + self.__enter__() + self._active_patches.append(self) + + def stop(self): + """Stop an active patch.""" + try: + self._active_patches.remove(self) + except ValueError: + # If the patch hasn't been started this will fail + return None + + return self.__exit__() diff --git a/src/datasets/utils/py_utils.py b/src/datasets/utils/py_utils.py new file mode 100644 index 0000000..df6d7b9 --- /dev/null +++ b/src/datasets/utils/py_utils.py @@ -0,0 +1,640 @@ +# Copyright 2020 The HuggingFace Datasets Authors and the TensorFlow Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""Some python utils function and classes.""" + +import copy +import functools +import itertools +import multiprocessing.pool +import os +import queue +import re +import types +import warnings +from collections.abc import Iterable +from contextlib import contextmanager +from dataclasses import fields, is_dataclass +from queue import Empty +from shutil import disk_usage +from typing import Any, Callable, Optional, TypeVar, Union + +import multiprocess +import multiprocess.pool +import numpy as np +from tqdm.auto import tqdm + +from .. import config +from ..parallel import parallel_map +from . import logging +from . import tqdm as hf_tqdm +from ._dill import ( # noqa: F401 # imported for backward compatibility. TODO: remove in 3.0.0 + Pickler, + dump, + dumps, + pklregister, +) + + +try: # pragma: no branch + from typing import Final + + import typing_extensions as _typing_extensions + from typing_extensions import Literal +except ImportError: + _typing_extensions = Literal = Final = None + + +logger = logging.get_logger(__name__) + + +# NOTE: When used on an instance method, the cache is shared across all +# instances and IS NOT per-instance. +# See +# https://stackoverflow.com/questions/14946264/python-lru-cache-decorator-per-instance +# For @property methods, use @memoized_property below. +memoize = functools.lru_cache + + +def size_str(size_in_bytes): + """Returns a human readable size string. + + If size_in_bytes is None, then returns "Unknown size". + + For example `size_str(1.5 * datasets.units.GiB) == "1.50 GiB"`. + + Args: + size_in_bytes: `int` or `None`, the size, in bytes, that we want to + format as a human-readable size string. + """ + if not size_in_bytes: + return "Unknown size" + + _NAME_LIST = [("PiB", 2**50), ("TiB", 2**40), ("GiB", 2**30), ("MiB", 2**20), ("KiB", 2**10)] + + size_in_bytes = float(size_in_bytes) + for name, size_bytes in _NAME_LIST: + value = size_in_bytes / size_bytes + if value >= 1.0: + return f"{value:.2f} {name}" + return f"{int(size_in_bytes)} bytes" + + +def convert_file_size_to_int(size: Union[int, str]) -> int: + """ + Converts a size expressed as a string with digits an unit (like `"50MB"`) to an integer (in bytes). + + Args: + size (`int` or `str`): The size to convert. Will be directly returned if an `int`. + + Example: + + ```py + >>> convert_file_size_to_int("1MiB") + 1048576 + ``` + """ + if isinstance(size, int): + return size + if size.upper().endswith("PIB"): + return int(size[:-3]) * (2**50) + if size.upper().endswith("TIB"): + return int(size[:-3]) * (2**40) + if size.upper().endswith("GIB"): + return int(size[:-3]) * (2**30) + if size.upper().endswith("MIB"): + return int(size[:-3]) * (2**20) + if size.upper().endswith("KIB"): + return int(size[:-3]) * (2**10) + if size.upper().endswith("PB"): + int_size = int(size[:-2]) * (10**15) + return int_size // 8 if size.endswith("b") else int_size + if size.upper().endswith("TB"): + int_size = int(size[:-2]) * (10**12) + return int_size // 8 if size.endswith("b") else int_size + if size.upper().endswith("GB"): + int_size = int(size[:-2]) * (10**9) + return int_size // 8 if size.endswith("b") else int_size + if size.upper().endswith("MB"): + int_size = int(size[:-2]) * (10**6) + return int_size // 8 if size.endswith("b") else int_size + if size.upper().endswith("KB"): + int_size = int(size[:-2]) * (10**3) + return int_size // 8 if size.endswith("b") else int_size + raise ValueError(f"`size={size}` is not in a valid format. Use an integer followed by the unit, e.g., '5GB'.") + + +def glob_pattern_to_regex(pattern): + # partially taken from fsspec: + # https://github.com/fsspec/filesystem_spec/blob/697d0f8133d8a5fbc3926e4761d7ecd51337ce50/fsspec/asyn.py#L735 + return ( + pattern.replace("\\", r"\\") + .replace(".", r"\.") + .replace("*", ".*") + .replace("+", r"\+") + .replace("//", "/") + .replace("(", r"\(") + .replace(")", r"\)") + .replace("|", r"\|") + .replace("^", r"\^") + .replace("$", r"\$") + .rstrip("/") + .replace("?", ".") + ) + + +def string_to_dict(string: str, pattern: str) -> Optional[dict[str, str]]: + """Un-format a string using a python f-string pattern. + From https://stackoverflow.com/a/36838374 + + Example:: + + >>> p = 'hello, my name is {name} and I am a {age} year old {what}' + >>> s = p.format(name='cody', age=18, what='quarterback') + >>> s + 'hello, my name is cody and I am a 18 year old quarterback' + >>> string_to_dict(s, p) + {'age': '18', 'name': 'cody', 'what': 'quarterback'} + + Args: + string (str): input string + pattern (str): pattern formatted like a python f-string + This can be a regex - so in case of un-formatting paths you should use posix paths. + Otherwise backslashes for windows paths can cause issues. + + Returns: + Optional[dict[str, str]]: dictionary of variable -> value, retrieved from the input using the pattern, or + `None` if the string does not match the pattern. + """ + pattern = re.sub(r"{([^:}]+)(?::[^}]+)?}", r"{\1}", pattern) # remove format specifiers, e.g. {rank:05d} -> {rank} + regex = re.sub(r"{(.+?)}", r"(?P<_\1>.+)", pattern) + result = re.search(regex, string) + if result is None: + return None + values = list(result.groups()) + keys = re.findall(r"{(.+?)}", pattern) + _dict = dict(zip(keys, values)) + return _dict + + +def asdict(obj): + """Convert an object to its dictionary representation recursively. + + + """ + + # Implementation based on https://docs.python.org/3/library/dataclasses.html#dataclasses.asdict + + def _is_dataclass_instance(obj): + # https://docs.python.org/3/library/dataclasses.html#dataclasses.is_dataclass + return is_dataclass(obj) and not isinstance(obj, type) + + def _asdict_inner(obj): + if _is_dataclass_instance(obj): + result = {} + for f in fields(obj): + value = _asdict_inner(getattr(obj, f.name)) + if not f.init or value != f.default or f.metadata.get("include_in_asdict_even_if_is_default", False): + result[f.name] = value + return result + elif isinstance(obj, tuple) and hasattr(obj, "_fields"): + # obj is a namedtuple + return type(obj)(*[_asdict_inner(v) for v in obj]) + elif isinstance(obj, (list, tuple)): + # Assume we can create an object of this type by passing in a + # generator (which is not true for namedtuples, handled + # above). + return type(obj)(_asdict_inner(v) for v in obj) + elif isinstance(obj, dict): + return {_asdict_inner(k): _asdict_inner(v) for k, v in obj.items()} + else: + return copy.deepcopy(obj) + + if not isinstance(obj, dict) and not _is_dataclass_instance(obj): + raise TypeError(f"{obj} is not a dict or a dataclass") + + return _asdict_inner(obj) + + +@contextmanager +def temporary_assignment(obj, attr, value): + """Temporarily assign obj.attr to value.""" + original = getattr(obj, attr, None) + setattr(obj, attr, value) + try: + yield + finally: + setattr(obj, attr, original) + + +@contextmanager +def temp_seed(seed: int, set_pytorch=False, set_tensorflow=False): + """Temporarily set the random seed. This works for python numpy, pytorch and tensorflow.""" + np_state = np.random.get_state() + np.random.seed(seed) + + if set_pytorch and config.TORCH_AVAILABLE: + import torch + + torch_state = torch.random.get_rng_state() + torch.random.manual_seed(seed) + + if torch.cuda.is_available(): + torch_cuda_states = torch.cuda.get_rng_state_all() + torch.cuda.manual_seed_all(seed) + + if set_tensorflow and config.TF_AVAILABLE: + import tensorflow as tf + from tensorflow.python.eager import context as tfpycontext + + tf_state = tf.random.get_global_generator() + temp_gen = tf.random.Generator.from_seed(seed) + tf.random.set_global_generator(temp_gen) + + if not tf.executing_eagerly(): + raise ValueError("Setting random seed for TensorFlow is only available in eager mode") + + tf_context = tfpycontext.context() # eager mode context + tf_seed = tf_context._seed + tf_rng_initialized = hasattr(tf_context, "_rng") + if tf_rng_initialized: + tf_rng = tf_context._rng + tf_context._set_global_seed(seed) + + try: + yield + finally: + np.random.set_state(np_state) + + if set_pytorch and config.TORCH_AVAILABLE: + torch.random.set_rng_state(torch_state) + if torch.cuda.is_available(): + torch.cuda.set_rng_state_all(torch_cuda_states) + + if set_tensorflow and config.TF_AVAILABLE: + tf.random.set_global_generator(tf_state) + + tf_context._seed = tf_seed + if tf_rng_initialized: + tf_context._rng = tf_rng + else: + delattr(tf_context, "_rng") + + +def unique_values(values): + """Iterate over iterable and return only unique values in order.""" + seen = set() + for value in values: + if value not in seen: + seen.add(value) + yield value + + +def no_op_if_value_is_null(func): + """If the value is None, return None, else call `func`.""" + + def wrapper(value): + return func(value) if value is not None else None + + return wrapper + + +def first_non_null_value(iterable): + """Return the index and the value of the first non-null value in the iterable. If all values are None, return -1 as index.""" + for i, value in enumerate(iterable): + if value is not None: + return i, value + return -1, None + + +def first_non_null_non_empty_value(iterable): + """Return the index and the value of the first non-null non-empty value in the iterable. If all values are None or empty, return -1 as index.""" + for i, value in enumerate(iterable): + if value is not None and not (isinstance(value, (dict, list)) and len(value) == 0): + return i, value + return -1, None + + +def zip_dict(*dicts): + """Iterate over items of dictionaries grouped by their keys.""" + for key in unique_values(itertools.chain(*dicts)): # set merge all keys + # Will raise KeyError if the dict don't have the same keys + yield key, tuple(d[key] for d in dicts) + + +class NonMutableDict(dict): + """Dict where keys can only be added but not modified. + + Will raise an error if the user try to overwrite one key. The error message + can be customized during construction. It will be formatted using {key} for + the overwritten key. + """ + + def __init__(self, *args, **kwargs): + self._error_msg = kwargs.pop( + "error_msg", + "Try to overwrite existing key: {key}", + ) + if kwargs: + raise ValueError("NonMutableDict cannot be initialized with kwargs.") + super().__init__(*args, **kwargs) + + def __setitem__(self, key, value): + if key in self: + raise ValueError(self._error_msg.format(key=key)) + return super().__setitem__(key, value) + + def update(self, other): + if any(k in self for k in other): + raise ValueError(self._error_msg.format(key=set(self) & set(other))) + return super().update(other) + + +class classproperty(property): # pylint: disable=invalid-name + """Descriptor to be used as decorator for @classmethods.""" + + def __get__(self, obj, objtype=None): + return self.fget.__get__(None, objtype)() + + +def _single_map_nested(args): + """Apply a function recursively to each element of a nested data struct.""" + function, data_struct, batched, batch_size, types, rank, disable_tqdm, desc = args + + # Singleton first to spare some computation + if not isinstance(data_struct, dict) and not isinstance(data_struct, types): + if batched: + return function([data_struct])[0] + else: + return function(data_struct) + if ( + batched + and not isinstance(data_struct, dict) + and isinstance(data_struct, types) + and all(not isinstance(v, (dict, types)) for v in data_struct) + ): + return [mapped_item for batch in iter_batched(data_struct, batch_size) for mapped_item in function(batch)] + + # Reduce logging to keep things readable in multiprocessing with tqdm + if rank is not None and logging.get_verbosity() < logging.WARNING: + logging.set_verbosity_warning() + # Print at least one thing to fix tqdm in notebooks in multiprocessing + # see https://github.com/tqdm/tqdm/issues/485#issuecomment-473338308 + if rank is not None and not disable_tqdm and any("notebook" in tqdm_cls.__name__ for tqdm_cls in tqdm.__mro__): + print(" ", end="", flush=True) + + # Loop over single examples or batches and write to buffer/file if examples are to be updated + pbar_iterable = data_struct.items() if isinstance(data_struct, dict) else data_struct + pbar_desc = (desc + " " if desc is not None else "") + "#" + str(rank) if rank is not None else desc + with hf_tqdm(pbar_iterable, disable=disable_tqdm, position=rank, unit="obj", desc=pbar_desc) as pbar: + if isinstance(data_struct, dict): + return { + k: _single_map_nested((function, v, batched, batch_size, types, None, True, None)) for k, v in pbar + } + else: + mapped = [_single_map_nested((function, v, batched, batch_size, types, None, True, None)) for v in pbar] + if isinstance(data_struct, list): + return mapped + elif isinstance(data_struct, tuple): + return tuple(mapped) + else: + return np.array(mapped) + + +def map_nested( + function: Callable[[Any], Any], + data_struct: Any, + dict_only: bool = False, + map_list: bool = True, + map_tuple: bool = False, + map_numpy: bool = False, + num_proc: Optional[int] = None, + parallel_min_length: int = 2, + batched: bool = False, + batch_size: Optional[int] = 1000, + types: Optional[tuple] = None, + disable_tqdm: bool = True, + desc: Optional[str] = None, +) -> Any: + """Apply a function recursively to each element of a nested data struct. + + Use multiprocessing if num_proc > 1 and the length of data_struct is greater than or equal to + `parallel_min_length`. + + + + Before version 2.5.0, multiprocessing was not used if `num_proc` was greater than or equal to ``len(iterable)``. + + Now, if `num_proc` is greater than or equal to ``len(iterable)``, `num_proc` is set to ``len(iterable)`` and + multiprocessing is used. + + + + Args: + function (`Callable`): Function to be applied to `data_struct`. + data_struct (`Any`): Data structure to apply `function` to. + dict_only (`bool`, default `False`): Whether only apply `function` recursively to `dict` values in + `data_struct`. + map_list (`bool`, default `True`): Whether also apply `function` recursively to `list` elements (besides `dict` + values). + map_tuple (`bool`, default `False`): Whether also apply `function` recursively to `tuple` elements (besides + `dict` values). + map_numpy (`bool, default `False`): Whether also apply `function` recursively to `numpy.array` elements (besides + `dict` values). + num_proc (`int`, *optional*): Number of processes. + The level in the data struct used for multiprocessing is the first level that has smaller sub-structs, + starting from the root. + parallel_min_length (`int`, default `2`): Minimum length of `data_struct` required for parallel + processing. + + batched (`bool`, defaults to `False`): + Provide batch of items to `function`. + + batch_size (`int`, *optional*, defaults to `1000`): + Number of items per batch provided to `function` if `batched=True`. + If `batch_size <= 0` or `batch_size == None`, provide the full iterable as a single batch to `function`. + + types (`tuple`, *optional*): Additional types (besides `dict` values) to apply `function` recursively to their + elements. + disable_tqdm (`bool`, default `True`): Whether to disable the tqdm progressbar. + desc (`str`, *optional*): Prefix for the tqdm progressbar. + + Returns: + `Any` + """ + if types is None: + types = [] + if not dict_only: + if map_list: + types.append(list) + if map_tuple: + types.append(tuple) + if map_numpy: + types.append(np.ndarray) + types = tuple(types) + + # Singleton + if not isinstance(data_struct, dict) and not isinstance(data_struct, types): + if batched: + data_struct = [data_struct] + mapped = function(data_struct) + if batched: + mapped = mapped[0] + return mapped + + iterable = list(data_struct.values()) if isinstance(data_struct, dict) else data_struct + + if num_proc is None: + num_proc = 1 + if any(isinstance(v, types) and len(v) > len(iterable) for v in iterable): + mapped = [ + map_nested( + function=function, + data_struct=obj, + num_proc=num_proc, + parallel_min_length=parallel_min_length, + batched=batched, + batch_size=batch_size, + types=types, + ) + for obj in iterable + ] + elif num_proc != -1 and num_proc <= 1 or len(iterable) < parallel_min_length: + if batched: + if batch_size is None or batch_size <= 0: + batch_size = max(len(iterable) // num_proc + int(len(iterable) % num_proc > 0), 1) + iterable = list(iter_batched(iterable, batch_size)) + mapped = [ + _single_map_nested((function, obj, batched, batch_size, types, None, True, None)) + for obj in hf_tqdm(iterable, disable=disable_tqdm, desc=desc) + ] + if batched: + mapped = [mapped_item for mapped_batch in mapped for mapped_item in mapped_batch] + else: + with warnings.catch_warnings(): + warnings.filterwarnings( + "ignore", + message=".* is experimental and might be subject to breaking changes in the future\\.$", + category=UserWarning, + ) + if batched: + if batch_size is None or batch_size <= 0: + batch_size = len(iterable) // num_proc + int(len(iterable) % num_proc > 0) + iterable = list(iter_batched(iterable, batch_size)) + mapped = parallel_map( + function, iterable, num_proc, batched, batch_size, types, disable_tqdm, desc, _single_map_nested + ) + if batched: + mapped = [mapped_item for mapped_batch in mapped for mapped_item in mapped_batch] + + if isinstance(data_struct, dict): + return dict(zip(data_struct.keys(), mapped)) + else: + if isinstance(data_struct, list): + return mapped + elif isinstance(data_struct, tuple): + return tuple(mapped) + else: + return np.array(mapped) + + +class NestedDataStructure: + def __init__(self, data=None): + self.data = data if data is not None else [] + + def flatten(self, data=None): + data = data if data is not None else self.data + if isinstance(data, dict): + return self.flatten(list(data.values())) + elif isinstance(data, (list, tuple)): + return [flattened for item in data for flattened in self.flatten(item)] + else: + return [data] + + +def has_sufficient_disk_space(needed_bytes, directory="."): + try: + free_bytes = disk_usage(os.path.abspath(directory)).free + except OSError: + return True + return needed_bytes < free_bytes + + +def copyfunc(func): + result = types.FunctionType(func.__code__, func.__globals__, func.__name__, func.__defaults__, func.__closure__) + result.__kwdefaults__ = func.__kwdefaults__ + return result + + +Y = TypeVar("Y") + + +def _write_generator_to_queue(queue: queue.Queue, func: Callable[..., Iterable[Y]], kwargs: dict) -> int: + for i, result in enumerate(func(**kwargs)): + queue.put(result) + return i + + +def _get_pool_pid(pool: Union[multiprocessing.pool.Pool, multiprocess.pool.Pool]) -> set[int]: + return {f.pid for f in pool._pool} + + +def iflatmap_unordered( + pool: Union[multiprocessing.pool.Pool, multiprocess.pool.Pool], + func: Callable[..., Iterable[Y]], + *, + kwargs_iterable: Iterable[dict], +) -> Iterable[Y]: + initial_pool_pid = _get_pool_pid(pool) + pool_changed = False + with pool._ctx.Manager() as manager: + queue = manager.Queue() + async_results = [ + pool.apply_async(_write_generator_to_queue, (queue, func, kwargs)) for kwargs in kwargs_iterable + ] + try: + while True: + try: + yield queue.get(timeout=0.05) + except Empty: + if all(async_result.ready() for async_result in async_results) and queue.empty(): + break + if _get_pool_pid(pool) != initial_pool_pid: + pool_changed = True + # One of the subprocesses has died. We should not wait forever. + raise RuntimeError( + "One of the subprocesses has abruptly died during map operation." + "To debug the error, disable multiprocessing." + ) + finally: + if not pool_changed: + # we get the result in case there's an error to raise + [async_result.get(timeout=0.05) for async_result in async_results] + + +T = TypeVar("T") + + +def iter_batched(iterable: Iterable[T], n: int) -> Iterable[list[T]]: + if n < 1: + raise ValueError(f"Invalid batch size {n}") + batch = [] + for item in iterable: + batch.append(item) + if len(batch) == n: + yield batch + batch = [] + if batch: + yield batch diff --git a/src/datasets/utils/resources/__init__.py b/src/datasets/utils/resources/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/datasets/utils/resources/creators.json b/src/datasets/utils/resources/creators.json new file mode 100644 index 0000000..d9e15f0 --- /dev/null +++ b/src/datasets/utils/resources/creators.json @@ -0,0 +1,17 @@ +{ + "language": [ + "found", + "crowdsourced", + "expert-generated", + "machine-generated", + "other" + ], + "annotations": [ + "found", + "crowdsourced", + "expert-generated", + "machine-generated", + "no-annotation", + "other" + ] +} diff --git a/src/datasets/utils/resources/languages.json b/src/datasets/utils/resources/languages.json new file mode 100644 index 0000000..ea7686f --- /dev/null +++ b/src/datasets/utils/resources/languages.json @@ -0,0 +1,8026 @@ +{ + "code": "Programming language (C++, Java, Javascript, Python, etc.)", + "aa": "Afar", + "aaa": "Ghotuo", + "aab": "Alumu-Tesu", + "aac": "Ari", + "aad": "Amal", + "aae": "Arbëreshë Albanian", + "aaf": "Aranadan", + "aag": "Ambrak", + "aah": "Abu' Arapesh", + "aai": "Arifama-Miniafia", + "aak": "Ankave", + "aal": "Afade", + "aan": "Anambé", + "aao": "Algerian Saharan Arabic", + "aap": "Pará Arára", + "aaq": "Eastern Abnaki", + "aas": "Aasáx", + "aat": "Arvanitika Albanian", + "aau": "Abau", + "aav": "Austro-Asiatic languages", + "aaw": "Solong", + "aax": "Mandobo Atas", + "aaz": "Amarasi", + "ab": "Abkhazian", + "aba": "Abé", + "abb": "Bankon", + "abc": "Ambala Ayta", + "abd": "Manide", + "abe": "Western Abnaki", + "abf": "Abai Sungai", + "abg": "Abaga", + "abh": "Tajiki Arabic", + "abi": "Abidji", + "abj": "Aka-Bea", + "abl": "Lampung Nyo", + "abm": "Abanyom", + "abn": "Abua", + "abo": "Abon", + "abp": "Abellen Ayta", + "abq": "Abaza", + "abr": "Abron", + "abs": "Ambonese Malay", + "abt": "Ambulas", + "abu": "Abure", + "abv": "Baharna Arabic", + "abw": "Pal", + "abx": "Inabaknon", + "aby": "Aneme Wake", + "abz": "Abui", + "aca": "Achagua", + "acb": "Áncá", + "acd": "Gikyode", + "ace": "Achinese", + "acf": "Saint Lucian Creole French", + "ach": "Acoli", + "aci": "Aka-Cari", + "ack": "Aka-Kora", + "acl": "Akar-Bale", + "acm": "Mesopotamian Arabic", + "acn": "Achang", + "acp": "Eastern Acipa", + "acq": "Ta'izzi-Adeni Arabic", + "acr": "Achi", + "acs": "Acroá", + "act": "Achterhoeks", + "acu": "Achuar-Shiwiar", + "acv": "Achumawi", + "acw": "Hijazi Arabic", + "acx": "Omani Arabic", + "acy": "Cypriot Arabic", + "acz": "Acheron", + "ada": "Adangme", + "adb": "Atauran", + "add": "Lidzonka; Dzodinka", + "ade": "Adele", + "adf": "Dhofari Arabic", + "adg": "Andegerebinha", + "adh": "Adhola", + "adi": "Adi", + "adj": "Adioukrou", + "adl": "Galo", + "adn": "Adang", + "ado": "Abu", + "adq": "Adangbe", + "adr": "Adonara", + "ads": "Adamorobe Sign Language", + "adt": "Adnyamathanha", + "adu": "Aduge", + "adw": "Amundava", + "adx": "Amdo Tibetan", + "ady": "Adyghe; Adygei", + "adz": "Adzera", + "ae": "Avestan", + "aea": "Areba", + "aeb": "Tunisian Arabic", + "aec": "Saidi Arabic", + "aed": "Argentine Sign Language", + "aee": "Northeast Pashai; Northeast Pashayi", + "aek": "Haeke", + "ael": "Ambele", + "aem": "Arem", + "aen": "Armenian Sign Language", + "aeq": "Aer", + "aer": "Eastern Arrernte", + "aes": "Alsea", + "aeu": "Akeu", + "aew": "Ambakich", + "aey": "Amele", + "aez": "Aeka", + "af": "Afrikaans", + "afa": "Afro-Asiatic languages", + "afb": "Gulf Arabic", + "afd": "Andai", + "afe": "Putukwam", + "afg": "Afghan Sign Language", + "afh": "Afrihili", + "afi": "Akrukay; Chini", + "afk": "Nanubae", + "afn": "Defaka", + "afo": "Eloyi", + "afp": "Tapei", + "afs": "Afro-Seminole Creole", + "aft": "Afitti", + "afu": "Awutu", + "afz": "Obokuitai", + "aga": "Aguano", + "agb": "Legbo", + "agc": "Agatu", + "agd": "Agarabi", + "age": "Angal", + "agf": "Arguni", + "agg": "Angor", + "agh": "Ngelima", + "agi": "Agariya", + "agj": "Argobba", + "agk": "Isarog Agta", + "agl": "Fembe", + "agm": "Angaataha", + "agn": "Agutaynen", + "ago": "Tainae", + "agq": "Aghem", + "agr": "Aguaruna", + "ags": "Esimbi", + "agt": "Central Cagayan Agta", + "agu": "Aguacateco", + "agv": "Remontado Dumagat", + "agw": "Kahua", + "agx": "Aghul", + "agy": "Southern Alta", + "agz": "Mt. Iriga Agta", + "aha": "Ahanta", + "ahb": "Axamb", + "ahg": "Qimant", + "ahh": "Aghu", + "ahi": "Tiagbamrin Aizi", + "ahk": "Akha", + "ahl": "Igo", + "ahm": "Mobumrin Aizi", + "ahn": "Àhàn", + "aho": "Ahom", + "ahp": "Aproumu Aizi", + "ahr": "Ahirani", + "ahs": "Ashe", + "aht": "Ahtena", + "aia": "Arosi", + "aib": "Ainu (China)", + "aic": "Ainbai", + "aid": "Alngith", + "aie": "Amara", + "aif": "Agi", + "aig": "Antigua and Barbuda Creole English", + "aih": "Ai-Cham", + "aii": "Assyrian Neo-Aramaic", + "aij": "Lishanid Noshan", + "aik": "Ake", + "ail": "Aimele", + "aim": "Aimol", + "ain": "Ainu (Japan)", + "aio": "Aiton", + "aip": "Burumakok", + "aiq": "Aimaq", + "air": "Airoran", + "ait": "Arikem", + "aiw": "Aari", + "aix": "Aighon", + "aiy": "Ali", + "aja": "Aja (South Sudan)", + "ajg": "Aja (Benin)", + "aji": "Ajië", + "ajn": "Andajin", + "ajp": "South Levantine Arabic", + "ajs": "Algerian Jewish Sign Language", + "aju": "Judeo-Moroccan Arabic", + "ajw": "Ajawa", + "ajz": "Amri Karbi", + "ak": "Akan", + "akb": "Batak Angkola", + "akc": "Mpur", + "akd": "Ukpet-Ehom", + "ake": "Akawaio", + "akf": "Akpa", + "akg": "Anakalangu", + "akh": "Angal Heneng", + "aki": "Aiome", + "akj": "Aka-Jeru", + "akk": "Akkadian", + "akl": "Aklanon", + "akm": "Aka-Bo", + "ako": "Akurio", + "akp": "Siwu", + "akq": "Ak", + "akr": "Araki", + "aks": "Akaselem", + "akt": "Akolet", + "aku": "Akum", + "akv": "Akhvakh", + "akw": "Akwa", + "akx": "Aka-Kede", + "aky": "Aka-Kol", + "akz": "Alabama", + "ala": "Alago", + "alc": "Qawasqar", + "ald": "Alladian", + "ale": "Aleut", + "alf": "Alege", + "alg": "Algonquian languages", + "alh": "Alawa", + "ali": "Amaimon", + "alj": "Alangan", + "alk": "Alak", + "all": "Allar", + "alm": "Amblong", + "aln": "Gheg Albanian", + "alo": "Larike-Wakasihu", + "alp": "Alune", + "alq": "Algonquin", + "alr": "Alutor", + "als": "Tosk Albanian", + "alt": "Southern Altai", + "alu": "'Are'are", + "alv": "Atlantic-Congo languages", + "alw": "Alaba-K’abeena; Wanbasana", + "alx": "Amol", + "aly": "Alyawarr", + "alz": "Alur", + "am": "Amharic", + "ama": "Amanayé", + "amb": "Ambo", + "amc": "Amahuaca", + "ame": "Yanesha'", + "amf": "Hamer-Banna", + "amg": "Amurdak", + "ami": "Amis", + "amj": "Amdang", + "amk": "Ambai", + "aml": "War-Jaintia", + "amm": "Ama (Papua New Guinea)", + "amn": "Amanab", + "amo": "Amo", + "amp": "Alamblak", + "amq": "Amahai", + "amr": "Amarakaeri", + "ams": "Southern Amami-Oshima", + "amt": "Amto", + "amu": "Guerrero Amuzgo", + "amv": "Ambelau", + "amw": "Western Neo-Aramaic", + "amx": "Anmatyerre", + "amy": "Ami", + "amz": "Atampaya", + "an": "Aragonese", + "ana": "Andaqui", + "anb": "Andoa", + "anc": "Ngas", + "and": "Ansus", + "ane": "Xârâcùù", + "anf": "Animere", + "ang": "Old English (ca. 450-1100)", + "anh": "Nend", + "ani": "Andi", + "anj": "Anor", + "ank": "Goemai", + "anl": "Anu-Hkongso Chin", + "anm": "Anal", + "ann": "Obolo", + "ano": "Andoque", + "anp": "Angika", + "anq": "Jarawa (India)", + "anr": "Andh", + "ans": "Anserma", + "ant": "Antakarinya; Antikarinya", + "anu": "Anuak", + "anv": "Denya", + "anw": "Anaang", + "anx": "Andra-Hus", + "any": "Anyin", + "anz": "Anem", + "aoa": "Angolar", + "aob": "Abom", + "aoc": "Pemon", + "aod": "Andarum", + "aoe": "Angal Enen", + "aof": "Bragat", + "aog": "Angoram", + "aoi": "Anindilyakwa", + "aoj": "Mufian", + "aok": "Arhö", + "aol": "Alor", + "aom": "Ömie", + "aon": "Bumbita Arapesh", + "aor": "Aore", + "aos": "Taikat", + "aot": "Atong (India); A'tong", + "aou": "A'ou", + "aox": "Atorada", + "aoz": "Uab Meto", + "apa": "Apache languages", + "apb": "Sa'a", + "apc": "North Levantine Arabic", + "apd": "Sudanese Arabic", + "ape": "Bukiyip", + "apf": "Pahanan Agta", + "apg": "Ampanang", + "aph": "Athpariya", + "api": "Apiaká", + "apj": "Jicarilla Apache", + "apk": "Kiowa Apache", + "apl": "Lipan Apache", + "apm": "Mescalero-Chiricahua Apache", + "apn": "Apinayé", + "apo": "Ambul", + "app": "Apma", + "apq": "A-Pucikwar", + "apr": "Arop-Lokep", + "aps": "Arop-Sissano", + "apt": "Apatani", + "apu": "Apurinã", + "apv": "Alapmunte", + "apw": "Western Apache", + "apx": "Aputai", + "apy": "Apalaí", + "apz": "Safeyoka", + "aqa": "Alacalufan languages", + "aqc": "Archi", + "aqd": "Ampari Dogon", + "aqg": "Arigidi", + "aqk": "Aninka", + "aql": "Algic languages", + "aqm": "Atohwaim", + "aqn": "Northern Alta", + "aqp": "Atakapa", + "aqr": "Arhâ", + "aqt": "Angaité", + "aqz": "Akuntsu", + "ar": "Arabic", + "arb": "Standard Arabic", + "arc": "Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE)", + "ard": "Arabana", + "are": "Western Arrarnta", + "arh": "Arhuaco", + "ari": "Arikara", + "arj": "Arapaso", + "ark": "Arikapú", + "arl": "Arabela", + "arn": "Mapudungun; Mapuche", + "aro": "Araona", + "arp": "Arapaho", + "arq": "Algerian Arabic", + "arr": "Karo (Brazil)", + "ars": "Najdi Arabic", + "art": "Artificial languages", + "aru": "Aruá (Amazonas State); Arawá", + "arv": "Arbore", + "arw": "Arawak", + "arx": "Aruá (Rodonia State)", + "ary": "Moroccan Arabic", + "arz": "Egyptian Arabic", + "as": "Assamese", + "asa": "Asu (Tanzania)", + "asb": "Assiniboine", + "asc": "Casuarina Coast Asmat", + "ase": "American Sign Language", + "asf": "Auslan; Australian Sign Language", + "asg": "Cishingini", + "ash": "Abishira", + "asi": "Buruwai", + "asj": "Sari", + "ask": "Ashkun", + "asl": "Asilulu", + "asn": "Xingú Asuriní", + "aso": "Dano", + "asp": "Algerian Sign Language", + "asq": "Austrian Sign Language", + "asr": "Asuri", + "ass": "Ipulo", + "ast": "Asturian; Asturleonese; Bable; Leonese", + "asu": "Tocantins Asurini", + "asv": "Asoa", + "asw": "Australian Aborigines Sign Language", + "asx": "Muratayak", + "asy": "Yaosakor Asmat", + "asz": "As", + "ata": "Pele-Ata", + "atb": "Zaiwa", + "atc": "Atsahuaca", + "atd": "Ata Manobo", + "ate": "Atemble", + "atg": "Ivbie North-Okpela-Arhe", + "ath": "Athapascan languages", + "ati": "Attié", + "atj": "Atikamekw", + "atk": "Ati", + "atl": "Mt. Iraya Agta", + "atm": "Ata", + "atn": "Ashtiani", + "ato": "Atong (Cameroon)", + "atp": "Pudtol Atta", + "atq": "Aralle-Tabulahan", + "atr": "Waimiri-Atroari", + "ats": "Gros Ventre", + "att": "Pamplona Atta", + "atu": "Reel", + "atv": "Northern Altai", + "atw": "Atsugewi", + "atx": "Arutani", + "aty": "Aneityum", + "atz": "Arta", + "aua": "Asumboa", + "aub": "Alugu", + "auc": "Waorani", + "aud": "Anuta", + "auf": "Arauan languages", + "aug": "Aguna", + "auh": "Aushi", + "aui": "Anuki", + "auj": "Awjilah", + "auk": "Heyo", + "aul": "Aulua", + "aum": "Asu (Nigeria)", + "aun": "Molmo One", + "auo": "Auyokawa", + "aup": "Makayam", + "auq": "Anus; Korur", + "aur": "Aruek", + "aus": "Australian languages", + "aut": "Austral", + "auu": "Auye", + "auw": "Awyi", + "aux": "Aurá", + "auy": "Awiyaana", + "auz": "Uzbeki Arabic", + "av": "Avaric", + "avb": "Avau", + "avd": "Alviri-Vidari", + "avi": "Avikam", + "avk": "Kotava", + "avl": "Eastern Egyptian Bedawi Arabic", + "avm": "Angkamuthi", + "avn": "Avatime", + "avo": "Agavotaguerra", + "avs": "Aushiri", + "avt": "Au", + "avu": "Avokaya", + "avv": "Avá-Canoeiro", + "awa": "Awadhi", + "awb": "Awa (Papua New Guinea)", + "awc": "Cicipu", + "awd": "Arawakan languages", + "awe": "Awetí", + "awg": "Anguthimri", + "awh": "Awbono", + "awi": "Aekyom", + "awk": "Awabakal", + "awm": "Arawum", + "awn": "Awngi", + "awo": "Awak", + "awr": "Awera", + "aws": "South Awyu", + "awt": "Araweté", + "awu": "Central Awyu", + "awv": "Jair Awyu", + "aww": "Awun", + "awx": "Awara", + "awy": "Edera Awyu", + "axb": "Abipon", + "axe": "Ayerrerenge", + "axg": "Mato Grosso Arára", + "axk": "Yaka (Central African Republic)", + "axl": "Lower Southern Aranda", + "axm": "Middle Armenian", + "axx": "Xârâgurè", + "ay": "Aymara", + "aya": "Awar", + "ayb": "Ayizo Gbe", + "ayc": "Southern Aymara", + "ayd": "Ayabadhu", + "aye": "Ayere", + "ayg": "Ginyanga", + "ayh": "Hadrami Arabic", + "ayi": "Leyigha", + "ayk": "Akuku", + "ayl": "Libyan Arabic", + "ayn": "Sanaani Arabic", + "ayo": "Ayoreo", + "ayp": "North Mesopotamian Arabic", + "ayq": "Ayi (Papua New Guinea)", + "ayr": "Central Aymara", + "ays": "Sorsogon Ayta", + "ayt": "Magbukun Ayta", + "ayu": "Ayu", + "ayz": "Mai Brat", + "az": "Azerbaijani", + "aza": "Azha", + "azb": "South Azerbaijani", + "azc": "Uto-Aztecan languages", + "azd": "Eastern Durango Nahuatl", + "azg": "San Pedro Amuzgos Amuzgo", + "azj": "North Azerbaijani", + "azm": "Ipalapa Amuzgo", + "azn": "Western Durango Nahuatl", + "azo": "Awing", + "azt": "Faire Atta", + "azz": "Highland Puebla Nahuatl", + "ba": "Bashkir", + "baa": "Babatana", + "bab": "Bainouk-Gunyuño", + "bac": "Badui", + "bad": "Banda languages", + "bae": "Baré", + "baf": "Nubaca", + "bag": "Tuki", + "bah": "Bahamas Creole English", + "bai": "Bamileke languages", + "baj": "Barakai", + "bal": "Baluchi", + "ban": "Balinese", + "bao": "Waimaha", + "bap": "Bantawa", + "bar": "Bavarian", + "bas": "Basa (Cameroon)", + "bat": "Baltic languages", + "bau": "Bada (Nigeria)", + "bav": "Vengo", + "baw": "Bambili-Bambui", + "bax": "Bamun", + "bay": "Batuley", + "bba": "Baatonum", + "bbb": "Barai", + "bbc": "Batak Toba", + "bbd": "Bau", + "bbe": "Bangba", + "bbf": "Baibai", + "bbg": "Barama", + "bbh": "Bugan", + "bbi": "Barombi", + "bbj": "Ghomálá'", + "bbk": "Babanki", + "bbl": "Bats", + "bbm": "Babango", + "bbn": "Uneapa", + "bbo": "Northern Bobo Madaré; Konabéré", + "bbp": "West Central Banda", + "bbq": "Bamali", + "bbr": "Girawa", + "bbs": "Bakpinka", + "bbt": "Mburku", + "bbu": "Kulung (Nigeria)", + "bbv": "Karnai", + "bbw": "Baba", + "bbx": "Bubia", + "bby": "Befang", + "bca": "Central Bai", + "bcb": "Bainouk-Samik", + "bcc": "Southern Balochi", + "bcd": "North Babar", + "bce": "Bamenyam", + "bcf": "Bamu", + "bcg": "Baga Pokur", + "bch": "Bariai", + "bci": "Baoulé", + "bcj": "Bardi", + "bck": "Bunuba", + "bcl": "Central Bikol", + "bcm": "Bannoni", + "bcn": "Bali (Nigeria)", + "bco": "Kaluli", + "bcp": "Bali (Democratic Republic of Congo)", + "bcq": "Bench", + "bcr": "Babine", + "bcs": "Kohumono", + "bct": "Bendi", + "bcu": "Awad Bing", + "bcv": "Shoo-Minda-Nye", + "bcw": "Bana", + "bcy": "Bacama", + "bcz": "Bainouk-Gunyaamolo", + "bda": "Bayot", + "bdb": "Basap", + "bdc": "Emberá-Baudó", + "bdd": "Bunama", + "bde": "Bade", + "bdf": "Biage", + "bdg": "Bonggi", + "bdh": "Baka (South Sudan)", + "bdi": "Burun", + "bdj": "Bai (South Sudan); Bai", + "bdk": "Budukh", + "bdl": "Indonesian Bajau", + "bdm": "Buduma", + "bdn": "Baldemu", + "bdo": "Morom", + "bdp": "Bende", + "bdq": "Bahnar", + "bdr": "West Coast Bajau", + "bds": "Burunge", + "bdt": "Bokoto", + "bdu": "Oroko", + "bdv": "Bodo Parja", + "bdw": "Baham", + "bdx": "Budong-Budong", + "bdy": "Bandjalang", + "bdz": "Badeshi", + "be": "Belarusian", + "bea": "Beaver", + "beb": "Bebele", + "bec": "Iceve-Maci", + "bed": "Bedoanas", + "bee": "Byangsi", + "bef": "Benabena", + "beg": "Belait", + "beh": "Biali", + "bei": "Bekati'", + "bej": "Beja; Bedawiyet", + "bek": "Bebeli", + "bem": "Bemba (Zambia)", + "beo": "Beami", + "bep": "Besoa", + "beq": "Beembe", + "ber": "Berber languages", + "bes": "Besme", + "bet": "Guiberoua Béte", + "beu": "Blagar", + "bev": "Daloa Bété", + "bew": "Betawi", + "bex": "Jur Modo", + "bey": "Beli (Papua New Guinea)", + "bez": "Bena (Tanzania)", + "bfa": "Bari", + "bfb": "Pauri Bareli", + "bfc": "Panyi Bai; Northern Bai", + "bfd": "Bafut", + "bfe": "Betaf; Tena", + "bff": "Bofi", + "bfg": "Busang Kayan", + "bfh": "Blafe", + "bfi": "British Sign Language", + "bfj": "Bafanji", + "bfk": "Ban Khor Sign Language", + "bfl": "Banda-Ndélé", + "bfm": "Mmen", + "bfn": "Bunak", + "bfo": "Malba Birifor", + "bfp": "Beba", + "bfq": "Badaga", + "bfr": "Bazigar", + "bfs": "Southern Bai", + "bft": "Balti", + "bfu": "Gahri", + "bfw": "Bondo", + "bfx": "Bantayanon", + "bfy": "Bagheli", + "bfz": "Mahasu Pahari", + "bg": "Bulgarian", + "bga": "Gwamhi-Wuri", + "bgb": "Bobongko", + "bgc": "Haryanvi", + "bgd": "Rathwi Bareli", + "bge": "Bauria", + "bgf": "Bangandu", + "bgg": "Bugun", + "bgi": "Giangan", + "bgj": "Bangolan", + "bgk": "Bit; Buxinhua", + "bgl": "Bo (Laos)", + "bgn": "Western Balochi", + "bgo": "Baga Koga", + "bgp": "Eastern Balochi", + "bgq": "Bagri", + "bgr": "Bawm Chin", + "bgs": "Tagabawa", + "bgt": "Bughotu", + "bgu": "Mbongno", + "bgv": "Warkay-Bipim", + "bgw": "Bhatri", + "bgx": "Balkan Gagauz Turkish", + "bgy": "Benggoi", + "bgz": "Banggai", + "bh": "Bihari languages", + "bha": "Bharia", + "bhb": "Bhili", + "bhc": "Biga", + "bhd": "Bhadrawahi", + "bhe": "Bhaya", + "bhf": "Odiai", + "bhg": "Binandere", + "bhh": "Bukharic", + "bhi": "Bhilali", + "bhj": "Bahing", + "bhl": "Bimin", + "bhm": "Bathari", + "bhn": "Bohtan Neo-Aramaic", + "bho": "Bhojpuri", + "bhp": "Bima", + "bhq": "Tukang Besi South", + "bhr": "Bara Malagasy", + "bhs": "Buwal", + "bht": "Bhattiyali", + "bhu": "Bhunjia", + "bhv": "Bahau", + "bhw": "Biak", + "bhx": "Bhalay", + "bhy": "Bhele", + "bhz": "Bada (Indonesia)", + "bi": "Bislama", + "bia": "Badimaya", + "bib": "Bissa; Bisa", + "bid": "Bidiyo", + "bie": "Bepour", + "bif": "Biafada", + "big": "Biangai", + "bik": "Bikol", + "bil": "Bile", + "bim": "Bimoba", + "bin": "Bini; Edo", + "bio": "Nai", + "bip": "Bila", + "biq": "Bipi", + "bir": "Bisorio", + "bit": "Berinomo", + "biu": "Biete", + "biv": "Southern Birifor", + "biw": "Kol (Cameroon)", + "bix": "Bijori", + "biy": "Birhor", + "biz": "Baloi", + "bja": "Budza", + "bjb": "Banggarla", + "bjc": "Bariji", + "bje": "Biao-Jiao Mien", + "bjf": "Barzani Jewish Neo-Aramaic", + "bjg": "Bidyogo", + "bjh": "Bahinemo", + "bji": "Burji", + "bjj": "Kanauji", + "bjk": "Barok", + "bjl": "Bulu (Papua New Guinea)", + "bjm": "Bajelani", + "bjn": "Banjar", + "bjo": "Mid-Southern Banda", + "bjp": "Fanamaket", + "bjr": "Binumarien", + "bjs": "Bajan", + "bjt": "Balanta-Ganja", + "bju": "Busuu", + "bjv": "Bedjond", + "bjw": "Bakwé", + "bjx": "Banao Itneg", + "bjy": "Bayali", + "bjz": "Baruga", + "bka": "Kyak", + "bkc": "Baka (Cameroon)", + "bkd": "Binukid; Talaandig", + "bkf": "Beeke", + "bkg": "Buraka", + "bkh": "Bakoko", + "bki": "Baki", + "bkj": "Pande", + "bkk": "Brokskat", + "bkl": "Berik", + "bkm": "Kom (Cameroon)", + "bkn": "Bukitan", + "bko": "Kwa'", + "bkp": "Boko (Democratic Republic of Congo)", + "bkq": "Bakairí", + "bkr": "Bakumpai", + "bks": "Northern Sorsoganon", + "bkt": "Boloki", + "bku": "Buhid", + "bkv": "Bekwarra", + "bkw": "Bekwel", + "bkx": "Baikeno", + "bky": "Bokyi", + "bkz": "Bungku", + "bla": "Siksika", + "blb": "Bilua", + "blc": "Bella Coola", + "bld": "Bolango", + "ble": "Balanta-Kentohe", + "blf": "Buol", + "blh": "Kuwaa", + "bli": "Bolia", + "blj": "Bolongan", + "blk": "Pa'o Karen; Pa'O", + "bll": "Biloxi", + "blm": "Beli (South Sudan)", + "bln": "Southern Catanduanes Bikol", + "blo": "Anii", + "blp": "Blablanga", + "blq": "Baluan-Pam", + "blr": "Blang", + "bls": "Balaesang", + "blt": "Tai Dam", + "blv": "Kibala; Bolo", + "blw": "Balangao", + "blx": "Mag-Indi Ayta", + "bly": "Notre", + "blz": "Balantak", + "bm": "Bambara", + "bma": "Lame", + "bmb": "Bembe", + "bmc": "Biem", + "bmd": "Baga Manduri", + "bme": "Limassa", + "bmf": "Bom-Kim", + "bmg": "Bamwe", + "bmh": "Kein", + "bmi": "Bagirmi", + "bmj": "Bote-Majhi", + "bmk": "Ghayavi", + "bml": "Bomboli", + "bmm": "Northern Betsimisaraka Malagasy", + "bmn": "Bina (Papua New Guinea)", + "bmo": "Bambalang", + "bmp": "Bulgebi", + "bmq": "Bomu", + "bmr": "Muinane", + "bms": "Bilma Kanuri", + "bmt": "Biao Mon", + "bmu": "Somba-Siawari", + "bmv": "Bum", + "bmw": "Bomwali", + "bmx": "Baimak", + "bmz": "Baramu", + "bn": "Bengali; Bangla", + "bna": "Bonerate", + "bnb": "Bookan", + "bnc": "Bontok", + "bnd": "Banda (Indonesia)", + "bne": "Bintauna", + "bnf": "Masiwang", + "bng": "Benga", + "bni": "Bangi", + "bnj": "Eastern Tawbuid", + "bnk": "Bierebo", + "bnl": "Boon", + "bnm": "Batanga", + "bnn": "Bunun", + "bno": "Bantoanon", + "bnp": "Bola", + "bnq": "Bantik", + "bnr": "Butmas-Tur", + "bns": "Bundeli", + "bnt": "Bantu languages", + "bnu": "Bentong", + "bnv": "Bonerif; Beneraf; Edwas", + "bnw": "Bisis", + "bnx": "Bangubangu", + "bny": "Bintulu", + "bnz": "Beezen", + "bo": "Tibetan", + "boa": "Bora", + "bob": "Aweer", + "boe": "Mundabli", + "bof": "Bolon", + "bog": "Bamako Sign Language", + "boh": "Boma", + "boi": "Barbareño", + "boj": "Anjam", + "bok": "Bonjo", + "bol": "Bole", + "bom": "Berom", + "bon": "Bine", + "boo": "Tiemacèwè Bozo", + "bop": "Bonkiman", + "boq": "Bogaya", + "bor": "Borôro", + "bot": "Bongo", + "bou": "Bondei", + "bov": "Tuwuli", + "bow": "Rema", + "box": "Buamu", + "boy": "Bodo (Central African Republic)", + "boz": "Tiéyaxo Bozo", + "bpa": "Daakaka", + "bpc": "Mbuk", + "bpd": "Banda-Banda", + "bpe": "Bauni", + "bpg": "Bonggo", + "bph": "Botlikh", + "bpi": "Bagupi", + "bpj": "Binji", + "bpk": "Orowe; 'Ôrôê", + "bpl": "Broome Pearling Lugger Pidgin", + "bpm": "Biyom", + "bpn": "Dzao Min", + "bpo": "Anasi", + "bpp": "Kaure", + "bpq": "Banda Malay", + "bpr": "Koronadal Blaan", + "bps": "Sarangani Blaan", + "bpt": "Barrow Point", + "bpu": "Bongu", + "bpv": "Bian Marind", + "bpw": "Bo (Papua New Guinea)", + "bpx": "Palya Bareli", + "bpy": "Bishnupriya", + "bpz": "Bilba", + "bqa": "Tchumbuli", + "bqb": "Bagusa", + "bqc": "Boko (Benin); Boo", + "bqd": "Bung", + "bqf": "Baga Kaloum", + "bqg": "Bago-Kusuntu", + "bqh": "Baima", + "bqi": "Bakhtiari", + "bqj": "Bandial", + "bqk": "Banda-Mbrès", + "bql": "Bilakura", + "bqm": "Wumboko", + "bqn": "Bulgarian Sign Language", + "bqo": "Balo", + "bqp": "Busa", + "bqq": "Biritai", + "bqr": "Burusu", + "bqs": "Bosngun", + "bqt": "Bamukumbit", + "bqu": "Boguru", + "bqv": "Koro Wachi; Begbere-Ejar", + "bqw": "Buru (Nigeria)", + "bqx": "Baangi", + "bqy": "Bengkala Sign Language", + "bqz": "Bakaka", + "br": "Breton", + "bra": "Braj", + "brb": "Brao; Lave", + "brc": "Berbice Creole Dutch", + "brd": "Baraamu", + "brf": "Bira", + "brg": "Baure", + "brh": "Brahui", + "bri": "Mokpwe", + "brj": "Bieria", + "brk": "Birked", + "brl": "Birwa", + "brm": "Barambu", + "brn": "Boruca", + "bro": "Brokkat", + "brp": "Barapasi", + "brq": "Breri", + "brr": "Birao", + "brs": "Baras", + "brt": "Bitare", + "bru": "Eastern Bru", + "brv": "Western Bru", + "brw": "Bellari", + "brx": "Bodo (India)", + "bry": "Burui", + "brz": "Bilbil", + "bs": "Bosnian", + "bsa": "Abinomn", + "bsb": "Brunei Bisaya", + "bsc": "Bassari; Oniyan", + "bse": "Wushi", + "bsf": "Bauchi", + "bsg": "Bashkardi", + "bsh": "Kati", + "bsi": "Bassossi", + "bsj": "Bangwinji", + "bsk": "Burushaski", + "bsl": "Basa-Gumna", + "bsm": "Busami", + "bsn": "Barasana-Eduria", + "bso": "Buso", + "bsp": "Baga Sitemu", + "bsq": "Bassa", + "bsr": "Bassa-Kontagora", + "bss": "Akoose", + "bst": "Basketo", + "bsu": "Bahonsuai", + "bsv": "Baga Sobané", + "bsw": "Baiso", + "bsx": "Yangkam", + "bsy": "Sabah Bisaya", + "bta": "Bata", + "btc": "Bati (Cameroon)", + "btd": "Batak Dairi", + "bte": "Gamo-Ningi", + "btf": "Birgit", + "btg": "Gagnoa Bété", + "bth": "Biatah Bidayuh", + "bti": "Burate", + "btj": "Bacanese Malay", + "btk": "Batak languages", + "btm": "Batak Mandailing", + "btn": "Ratagnon", + "bto": "Rinconada Bikol", + "btp": "Budibud", + "btq": "Batek", + "btr": "Baetora", + "bts": "Batak Simalungun", + "btt": "Bete-Bendi", + "btu": "Batu", + "btv": "Bateri", + "btw": "Butuanon", + "btx": "Batak Karo", + "bty": "Bobot", + "btz": "Batak Alas-Kluet", + "bua": "Buriat", + "bub": "Bua", + "buc": "Bushi", + "bud": "Ntcham", + "bue": "Beothuk", + "buf": "Bushoong", + "bug": "Buginese", + "buh": "Younuo Bunu", + "bui": "Bongili", + "buj": "Basa-Gurmana", + "buk": "Bugawac", + "bum": "Bulu (Cameroon)", + "bun": "Sherbro", + "buo": "Terei", + "bup": "Busoa", + "buq": "Brem", + "bus": "Bokobaru", + "but": "Bungain", + "buu": "Budu", + "buv": "Bun", + "buw": "Bubi", + "bux": "Boghom", + "buy": "Bullom So", + "buz": "Bukwen", + "bva": "Barein", + "bvb": "Bube", + "bvc": "Baelelea", + "bvd": "Baeggu", + "bve": "Berau Malay", + "bvf": "Boor", + "bvg": "Bonkeng", + "bvh": "Bure", + "bvi": "Belanda Viri", + "bvj": "Baan", + "bvk": "Bukat", + "bvl": "Bolivian Sign Language", + "bvm": "Bamunka", + "bvn": "Buna", + "bvo": "Bolgo", + "bvp": "Bumang", + "bvq": "Birri", + "bvr": "Burarra", + "bvt": "Bati (Indonesia)", + "bvu": "Bukit Malay", + "bvv": "Baniva", + "bvw": "Boga", + "bvx": "Dibole", + "bvy": "Baybayanon", + "bvz": "Bauzi", + "bwa": "Bwatoo", + "bwb": "Namosi-Naitasiri-Serua", + "bwc": "Bwile", + "bwd": "Bwaidoka", + "bwe": "Bwe Karen", + "bwf": "Boselewa", + "bwg": "Barwe", + "bwh": "Bishuo", + "bwi": "Baniwa", + "bwj": "Láá Láá Bwamu", + "bwk": "Bauwaki", + "bwl": "Bwela", + "bwm": "Biwat", + "bwn": "Wunai Bunu", + "bwo": "Boro (Ethiopia); Borna (Ethiopia)", + "bwp": "Mandobo Bawah", + "bwq": "Southern Bobo Madaré", + "bwr": "Bura-Pabir", + "bws": "Bomboma", + "bwt": "Bafaw-Balong", + "bwu": "Buli (Ghana)", + "bww": "Bwa", + "bwx": "Bu-Nao Bunu", + "bwy": "Cwi Bwamu", + "bwz": "Bwisi", + "bxa": "Tairaha", + "bxb": "Belanda Bor", + "bxc": "Molengue", + "bxd": "Pela", + "bxe": "Birale", + "bxf": "Bilur; Minigir", + "bxg": "Bangala", + "bxh": "Buhutu", + "bxi": "Pirlatapa", + "bxj": "Bayungu", + "bxk": "Bukusu; Lubukusu", + "bxl": "Jalkunan", + "bxm": "Mongolia Buriat", + "bxn": "Burduna", + "bxo": "Barikanchi", + "bxp": "Bebil", + "bxq": "Beele", + "bxr": "Russia Buriat", + "bxs": "Busam", + "bxu": "China Buriat", + "bxv": "Berakou", + "bxw": "Bankagooma", + "bxz": "Binahari", + "bya": "Batak", + "byb": "Bikya", + "byc": "Ubaghara", + "byd": "Benyadu'", + "bye": "Pouye", + "byf": "Bete", + "byg": "Baygo", + "byh": "Bhujel", + "byi": "Buyu", + "byj": "Bina (Nigeria)", + "byk": "Biao", + "byl": "Bayono", + "bym": "Bidjara", + "byn": "Bilin; Blin", + "byo": "Biyo", + "byp": "Bumaji", + "byq": "Basay", + "byr": "Baruya; Yipma", + "bys": "Burak", + "byt": "Berti", + "byv": "Medumba", + "byw": "Belhariya", + "byx": "Qaqet", + "byz": "Banaro", + "bza": "Bandi", + "bzb": "Andio", + "bzc": "Southern Betsimisaraka Malagasy", + "bzd": "Bribri", + "bze": "Jenaama Bozo", + "bzf": "Boikin", + "bzg": "Babuza", + "bzh": "Mapos Buang", + "bzi": "Bisu", + "bzj": "Belize Kriol English", + "bzk": "Nicaragua Creole English", + "bzl": "Boano (Sulawesi)", + "bzm": "Bolondo", + "bzn": "Boano (Maluku)", + "bzo": "Bozaba", + "bzp": "Kemberano", + "bzq": "Buli (Indonesia)", + "bzr": "Biri", + "bzs": "Brazilian Sign Language", + "bzt": "Brithenig", + "bzu": "Burmeso", + "bzv": "Naami", + "bzw": "Basa (Nigeria)", + "bzx": "Kɛlɛngaxo Bozo", + "bzy": "Obanliku", + "bzz": "Evant", + "ca": "Catalan; Valencian", + "caa": "Chortí", + "cab": "Garifuna", + "cac": "Chuj", + "cad": "Caddo", + "cae": "Lehar; Laalaa", + "caf": "Southern Carrier", + "cag": "Nivaclé", + "cah": "Cahuarano", + "cai": "Central American Indian languages", + "caj": "Chané", + "cak": "Kaqchikel; Cakchiquel", + "cal": "Carolinian", + "cam": "Cemuhî", + "can": "Chambri", + "cao": "Chácobo", + "cap": "Chipaya", + "caq": "Car Nicobarese", + "car": "Galibi Carib", + "cas": "Tsimané", + "cau": "Caucasian languages", + "cav": "Cavineña", + "caw": "Callawalla", + "cax": "Chiquitano", + "cay": "Cayuga", + "caz": "Canichana", + "cba": "Chibchan languages", + "cbb": "Cabiyarí", + "cbc": "Carapana", + "cbd": "Carijona", + "cbg": "Chimila", + "cbi": "Chachi", + "cbj": "Ede Cabe", + "cbk": "Chavacano", + "cbl": "Bualkhaw Chin", + "cbn": "Nyahkur", + "cbo": "Izora", + "cbq": "Tsucuba; Cuba", + "cbr": "Cashibo-Cacataibo", + "cbs": "Cashinahua", + "cbt": "Chayahuita", + "cbu": "Candoshi-Shapra", + "cbv": "Cacua", + "cbw": "Kinabalian", + "cby": "Carabayo", + "ccc": "Chamicuro", + "ccd": "Cafundo Creole", + "cce": "Chopi", + "ccg": "Samba Daka", + "cch": "Atsam", + "ccj": "Kasanga", + "ccl": "Cutchi-Swahili", + "ccm": "Malaccan Creole Malay", + "ccn": "North Caucasian languages", + "cco": "Comaltepec Chinantec", + "ccp": "Chakma", + "ccr": "Cacaopera", + "ccs": "South Caucasian languages", + "cda": "Choni", + "cdc": "Chadic languages", + "cdd": "Caddoan languages", + "cde": "Chenchu", + "cdf": "Chiru", + "cdh": "Chambeali", + "cdi": "Chodri", + "cdj": "Churahi", + "cdm": "Chepang", + "cdn": "Chaudangsi", + "cdo": "Min Dong Chinese", + "cdr": "Cinda-Regi-Tiyal", + "cds": "Chadian Sign Language", + "cdy": "Chadong", + "cdz": "Koda", + "ce": "Chechen", + "cea": "Lower Chehalis", + "ceb": "Cebuano", + "ceg": "Chamacoco", + "cek": "Eastern Khumi Chin", + "cel": "Celtic languages", + "cen": "Cen", + "cet": "Centúúm", + "cey": "Ekai Chin", + "cfa": "Dijim-Bwilim", + "cfd": "Cara", + "cfg": "Como Karim", + "cfm": "Falam Chin", + "cga": "Changriwa", + "cgc": "Kagayanen", + "cgg": "Chiga", + "cgk": "Chocangacakha", + "ch": "Chamorro", + "chb": "Chibcha", + "chc": "Catawba", + "chd": "Highland Oaxaca Chontal", + "chf": "Tabasco Chontal", + "chg": "Chagatai", + "chh": "Chinook", + "chj": "Ojitlán Chinantec", + "chk": "Chuukese", + "chl": "Cahuilla", + "chm": "Mari (Russia)", + "chn": "Chinook jargon", + "cho": "Choctaw", + "chp": "Chipewyan; Dene Suline", + "chq": "Quiotepec Chinantec", + "chr": "Cherokee", + "cht": "Cholón", + "chw": "Chuwabu", + "chx": "Chantyal", + "chy": "Cheyenne", + "chz": "Ozumacín Chinantec", + "cia": "Cia-Cia", + "cib": "Ci Gbe", + "cic": "Chickasaw", + "cid": "Chimariko", + "cie": "Cineni", + "cih": "Chinali", + "cik": "Chitkuli Kinnauri", + "cim": "Cimbrian", + "cin": "Cinta Larga", + "cip": "Chiapanec", + "cir": "Tiri; Haméa; Méa", + "ciw": "Chippewa", + "ciy": "Chaima", + "cja": "Western Cham", + "cje": "Chru", + "cjh": "Upper Chehalis", + "cji": "Chamalal", + "cjk": "Chokwe", + "cjm": "Eastern Cham", + "cjn": "Chenapian", + "cjo": "Ashéninka Pajonal", + "cjp": "Cabécar", + "cjs": "Shor", + "cjv": "Chuave", + "cjy": "Jinyu Chinese", + "ckb": "Central Kurdish", + "ckh": "Chak", + "ckl": "Cibak", + "ckm": "Chakavian", + "ckn": "Kaang Chin", + "cko": "Anufo", + "ckq": "Kajakse", + "ckr": "Kairak", + "cks": "Tayo", + "ckt": "Chukot", + "cku": "Koasati", + "ckv": "Kavalan", + "ckx": "Caka", + "cky": "Cakfem-Mushere", + "ckz": "Cakchiquel-Quiché Mixed Language", + "cla": "Ron", + "clc": "Chilcotin", + "cld": "Chaldean Neo-Aramaic", + "cle": "Lealao Chinantec", + "clh": "Chilisso", + "cli": "Chakali", + "clj": "Laitu Chin", + "clk": "Idu-Mishmi", + "cll": "Chala", + "clm": "Clallam", + "clo": "Lowland Oaxaca Chontal", + "clt": "Lautu Chin", + "clu": "Caluyanun", + "clw": "Chulym", + "cly": "Eastern Highland Chatino", + "cma": "Maa", + "cmc": "Chamic languages", + "cme": "Cerma", + "cmg": "Classical Mongolian", + "cmi": "Emberá-Chamí", + "cml": "Campalagian", + "cmm": "Michigamea", + "cmn": "Mandarin Chinese", + "cmo": "Central Mnong", + "cmr": "Mro-Khimi Chin", + "cms": "Messapic", + "cmt": "Camtho", + "cna": "Changthang", + "cnb": "Chinbon Chin", + "cnc": "Côông", + "cng": "Northern Qiang", + "cnh": "Hakha Chin; Haka Chin", + "cni": "Asháninka", + "cnk": "Khumi Chin", + "cnl": "Lalana Chinantec", + "cno": "Con", + "cnp": "Northern Ping Chinese; Northern Pinghua", + "cnq": "Chung", + "cnr": "Montenegrin", + "cns": "Central Asmat", + "cnt": "Tepetotutla Chinantec", + "cnu": "Chenoua", + "cnw": "Ngawn Chin", + "cnx": "Middle Cornish", + "co": "Corsican", + "coa": "Cocos Islands Malay", + "cob": "Chicomuceltec", + "coc": "Cocopa", + "cod": "Cocama-Cocamilla", + "coe": "Koreguaje", + "cof": "Colorado", + "cog": "Chong", + "coh": "Chonyi-Dzihana-Kauma; Chichonyi-Chidzihana-Chikauma", + "coj": "Cochimi", + "cok": "Santa Teresa Cora", + "col": "Columbia-Wenatchi", + "com": "Comanche", + "con": "Cofán", + "coo": "Comox", + "cop": "Coptic", + "coq": "Coquille", + "cot": "Caquinte", + "cou": "Wamey", + "cov": "Cao Miao", + "cow": "Cowlitz", + "cox": "Nanti", + "coz": "Chochotec", + "cpa": "Palantla Chinantec", + "cpb": "Ucayali-Yurúa Ashéninka", + "cpc": "Ajyíninka Apurucayali", + "cpe": "English-based creoles and pidgins", + "cpf": "French-based creoles and pidgins", + "cpg": "Cappadocian Greek", + "cpi": "Chinese Pidgin English", + "cpn": "Cherepon", + "cpo": "Kpeego", + "cpp": "Portuguese-based creoles and pidgins", + "cps": "Capiznon", + "cpu": "Pichis Ashéninka", + "cpx": "Pu-Xian Chinese", + "cpy": "South Ucayali Ashéninka", + "cqd": "Chuanqiandian Cluster Miao", + "cr": "Cree", + "cra": "Chara", + "crb": "Island Carib", + "crc": "Lonwolwol", + "crd": "Coeur d'Alene", + "crf": "Caramanta", + "crg": "Michif", + "crh": "Crimean Tatar; Crimean Turkish", + "cri": "Sãotomense", + "crj": "Southern East Cree", + "crk": "Plains Cree", + "crl": "Northern East Cree", + "crm": "Moose Cree", + "crn": "El Nayar Cora", + "cro": "Crow", + "crp": "Creoles and pidgins", + "crq": "Iyo'wujwa Chorote", + "crr": "Carolina Algonquian", + "crs": "Seselwa Creole French", + "crt": "Iyojwa'ja Chorote", + "crv": "Chaura", + "crw": "Chrau", + "crx": "Carrier", + "cry": "Cori", + "crz": "Cruzeño", + "cs": "Czech", + "csa": "Chiltepec Chinantec", + "csb": "Kashubian", + "csc": "Catalan Sign Language; Lengua de señas catalana; Llengua de Signes Catalana", + "csd": "Chiangmai Sign Language", + "cse": "Czech Sign Language", + "csf": "Cuba Sign Language", + "csg": "Chilean Sign Language", + "csh": "Asho Chin", + "csi": "Coast Miwok", + "csj": "Songlai Chin", + "csk": "Jola-Kasa", + "csl": "Chinese Sign Language", + "csm": "Central Sierra Miwok", + "csn": "Colombian Sign Language", + "cso": "Sochiapam Chinantec; Sochiapan Chinantec", + "csp": "Southern Ping Chinese; Southern Pinghua", + "csq": "Croatia Sign Language", + "csr": "Costa Rican Sign Language", + "css": "Southern Ohlone", + "cst": "Northern Ohlone", + "csu": "Central Sudanic languages", + "csv": "Sumtu Chin", + "csw": "Swampy Cree", + "csx": "Cambodian Sign Language", + "csy": "Siyin Chin", + "csz": "Coos", + "cta": "Tataltepec Chatino", + "ctc": "Chetco", + "ctd": "Tedim Chin", + "cte": "Tepinapa Chinantec", + "ctg": "Chittagonian", + "cth": "Thaiphum Chin", + "ctl": "Tlacoatzintepec Chinantec", + "ctm": "Chitimacha", + "ctn": "Chhintange", + "cto": "Emberá-Catío", + "ctp": "Western Highland Chatino", + "cts": "Northern Catanduanes Bikol", + "ctt": "Wayanad Chetti", + "ctu": "Chol", + "cty": "Moundadan Chetty", + "ctz": "Zacatepec Chatino", + "cu": "Church Slavic; Church Slavonic; Old Bulgarian; Old Church Slavonic; Old Slavonic", + "cua": "Cua", + "cub": "Cubeo", + "cuc": "Usila Chinantec", + "cuh": "Chuka; Gichuka", + "cui": "Cuiba", + "cuj": "Mashco Piro", + "cuk": "San Blas Kuna", + "cul": "Culina; Kulina", + "cuo": "Cumanagoto", + "cup": "Cupeño", + "cuq": "Cun", + "cur": "Chhulung", + "cus": "Cushitic languages", + "cut": "Teutila Cuicatec", + "cuu": "Tai Ya", + "cuv": "Cuvok", + "cuw": "Chukwa", + "cux": "Tepeuxila Cuicatec", + "cuy": "Cuitlatec", + "cv": "Chuvash", + "cvg": "Chug", + "cvn": "Valle Nacional Chinantec", + "cwa": "Kabwa", + "cwb": "Maindo", + "cwd": "Woods Cree", + "cwe": "Kwere", + "cwg": "Chewong; Cheq Wong", + "cwt": "Kuwaataay", + "cy": "Welsh", + "cya": "Nopala Chatino", + "cyb": "Cayubaba", + "cyo": "Cuyonon", + "czh": "Huizhou Chinese", + "czk": "Knaanic", + "czn": "Zenzontepec Chatino", + "czo": "Min Zhong Chinese", + "czt": "Zotung Chin", + "da": "Danish", + "daa": "Dangaléat", + "dac": "Dambi", + "dad": "Marik", + "dae": "Duupa", + "dag": "Dagbani", + "dah": "Gwahatike", + "dai": "Day", + "daj": "Dar Fur Daju", + "dak": "Dakota", + "dal": "Dahalo", + "dam": "Damakawa", + "dao": "Daai Chin", + "daq": "Dandami Maria", + "dar": "Dargwa", + "das": "Daho-Doo", + "dau": "Dar Sila Daju", + "dav": "Taita; Dawida", + "daw": "Davawenyo", + "dax": "Dayi", + "day": "Land Dayak languages", + "daz": "Dao", + "dba": "Bangime", + "dbb": "Deno", + "dbd": "Dadiya", + "dbe": "Dabe", + "dbf": "Edopi", + "dbg": "Dogul Dom Dogon", + "dbi": "Doka", + "dbj": "Ida'an", + "dbl": "Dyirbal", + "dbm": "Duguri", + "dbn": "Duriankere", + "dbo": "Dulbu", + "dbp": "Duwai", + "dbq": "Daba", + "dbr": "Dabarre", + "dbt": "Ben Tey Dogon", + "dbu": "Bondum Dom Dogon", + "dbv": "Dungu", + "dbw": "Bankan Tey Dogon", + "dby": "Dibiyaso", + "dcc": "Deccan", + "dcr": "Negerhollands", + "dda": "Dadi Dadi", + "ddd": "Dongotono", + "dde": "Doondo", + "ddg": "Fataluku", + "ddi": "West Goodenough", + "ddj": "Jaru", + "ddn": "Dendi (Benin)", + "ddo": "Dido", + "ddr": "Dhudhuroa", + "dds": "Donno So Dogon", + "ddw": "Dawera-Daweloor", + "de": "German", + "dec": "Dagik", + "ded": "Dedua", + "dee": "Dewoin", + "def": "Dezfuli", + "deg": "Degema", + "deh": "Dehwari", + "dei": "Demisa", + "dek": "Dek", + "del": "Delaware", + "dem": "Dem", + "den": "Slave (Athapascan)", + "dep": "Pidgin Delaware", + "deq": "Dendi (Central African Republic)", + "der": "Deori", + "des": "Desano", + "dev": "Domung", + "dez": "Dengese", + "dga": "Southern Dagaare", + "dgb": "Bunoge Dogon", + "dgc": "Casiguran Dumagat Agta", + "dgd": "Dagaari Dioula", + "dge": "Degenan", + "dgg": "Doga", + "dgh": "Dghwede", + "dgi": "Northern Dagara", + "dgk": "Dagba", + "dgl": "Andaandi; Dongolawi", + "dgn": "Dagoman", + "dgo": "Dogri (individual language)", + "dgr": "Dogrib; Tłı̨chǫ", + "dgs": "Dogoso", + "dgt": "Ndra'ngith", + "dgw": "Daungwurrung", + "dgx": "Doghoro", + "dgz": "Daga", + "dhd": "Dhundari", + "dhg": "Dhangu-Djangu; Dhangu; Djangu", + "dhi": "Dhimal", + "dhl": "Dhalandji", + "dhm": "Zemba", + "dhn": "Dhanki", + "dho": "Dhodia", + "dhr": "Dhargari", + "dhs": "Dhaiso", + "dhu": "Dhurga", + "dhv": "Dehu; Drehu", + "dhw": "Dhanwar (Nepal)", + "dhx": "Dhungaloo", + "dia": "Dia", + "dib": "South Central Dinka", + "dic": "Lakota Dida", + "did": "Didinga", + "dif": "Dieri; Diyari", + "dig": "Digo; Chidigo", + "dih": "Kumiai", + "dii": "Dimbong", + "dij": "Dai", + "dik": "Southwestern Dinka", + "dil": "Dilling", + "dim": "Dime", + "din": "Dinka", + "dio": "Dibo", + "dip": "Northeastern Dinka", + "diq": "Dimli (individual language)", + "dir": "Dirim", + "dis": "Dimasa", + "diu": "Diriku", + "diw": "Northwestern Dinka", + "dix": "Dixon Reef", + "diy": "Diuwe", + "diz": "Ding", + "dja": "Djadjawurrung", + "djb": "Djinba", + "djc": "Dar Daju Daju", + "djd": "Djamindjung; Ngaliwurru", + "dje": "Zarma", + "djf": "Djangun", + "dji": "Djinang", + "djj": "Djeebbana", + "djk": "Eastern Maroon Creole; Businenge Tongo; Nenge", + "djm": "Jamsay Dogon", + "djn": "Jawoyn; Djauan", + "djo": "Jangkang", + "djr": "Djambarrpuyngu", + "dju": "Kapriman", + "djw": "Djawi", + "dka": "Dakpakha", + "dkg": "Kadung", + "dkk": "Dakka", + "dkr": "Kuijau", + "dks": "Southeastern Dinka", + "dkx": "Mazagway", + "dlg": "Dolgan", + "dlk": "Dahalik", + "dlm": "Dalmatian", + "dln": "Darlong", + "dma": "Duma", + "dmb": "Mombo Dogon", + "dmc": "Gavak", + "dmd": "Madhi Madhi", + "dme": "Dugwor", + "dmf": "Medefaidrin", + "dmg": "Upper Kinabatangan", + "dmk": "Domaaki", + "dml": "Dameli", + "dmm": "Dama", + "dmn": "Mande languages", + "dmo": "Kemedzung", + "dmr": "East Damar", + "dms": "Dampelas", + "dmu": "Dubu; Tebi", + "dmv": "Dumpas", + "dmw": "Mudburra", + "dmx": "Dema", + "dmy": "Demta; Sowari", + "dna": "Upper Grand Valley Dani", + "dnd": "Daonda", + "dne": "Ndendeule", + "dng": "Dungan", + "dni": "Lower Grand Valley Dani", + "dnj": "Dan", + "dnk": "Dengka", + "dnn": "Dzùùngoo", + "dno": "Ndrulo; Northern Lendu", + "dnr": "Danaru", + "dnt": "Mid Grand Valley Dani", + "dnu": "Danau", + "dnv": "Danu", + "dnw": "Western Dani", + "dny": "Dení", + "doa": "Dom", + "dob": "Dobu", + "doc": "Northern Dong", + "doe": "Doe", + "dof": "Domu", + "doh": "Dong", + "doi": "Dogri (macrolanguage)", + "dok": "Dondo", + "dol": "Doso", + "don": "Toura (Papua New Guinea)", + "doo": "Dongo", + "dop": "Lukpa", + "doq": "Dominican Sign Language", + "dor": "Dori'o", + "dos": "Dogosé", + "dot": "Dass", + "dov": "Dombe", + "dow": "Doyayo", + "dox": "Bussa", + "doy": "Dompo", + "doz": "Dorze", + "dpp": "Papar", + "dra": "Dravidian languages", + "drb": "Dair", + "drc": "Minderico", + "drd": "Darmiya", + "dre": "Dolpo", + "drg": "Rungus", + "dri": "C'Lela", + "drl": "Paakantyi", + "drn": "West Damar", + "dro": "Daro-Matu Melanau", + "drq": "Dura", + "drs": "Gedeo", + "drt": "Drents", + "dru": "Rukai", + "dry": "Darai", + "dsb": "Lower Sorbian", + "dse": "Dutch Sign Language", + "dsh": "Daasanach", + "dsi": "Disa", + "dsl": "Danish Sign Language", + "dsn": "Dusner", + "dso": "Desiya", + "dsq": "Tadaksahak", + "dsz": "Mardin Sign Language", + "dta": "Daur", + "dtb": "Labuk-Kinabatangan Kadazan", + "dtd": "Ditidaht", + "dth": "Adithinngithigh", + "dti": "Ana Tinga Dogon", + "dtk": "Tene Kan Dogon", + "dtm": "Tomo Kan Dogon", + "dtn": "Daatsʼíin", + "dto": "Tommo So Dogon", + "dtp": "Kadazan Dusun; Central Dusun", + "dtr": "Lotud", + "dts": "Toro So Dogon", + "dtt": "Toro Tegu Dogon", + "dtu": "Tebul Ure Dogon", + "dty": "Dotyali", + "dua": "Duala", + "dub": "Dubli", + "duc": "Duna", + "due": "Umiray Dumaget Agta", + "duf": "Dumbea; Drubea", + "dug": "Duruma; Chiduruma", + "duh": "Dungra Bhil", + "dui": "Dumun", + "duk": "Uyajitaya", + "dul": "Alabat Island Agta", + "dum": "Middle Dutch (ca. 1050-1350)", + "dun": "Dusun Deyah", + "duo": "Dupaninan Agta", + "dup": "Duano", + "duq": "Dusun Malang", + "dur": "Dii", + "dus": "Dumi", + "duu": "Drung", + "duv": "Duvle", + "duw": "Dusun Witu", + "dux": "Duungooma", + "duy": "Dicamay Agta", + "duz": "Duli-Gey", + "dv": "Dhivehi; Divehi; Maldivian", + "dva": "Duau", + "dwa": "Diri", + "dwk": "Dawik Kui", + "dwr": "Dawro", + "dws": "Dutton World Speedwords", + "dwu": "Dhuwal", + "dww": "Dawawa", + "dwy": "Dhuwaya", + "dwz": "Dewas Rai", + "dya": "Dyan", + "dyb": "Dyaberdyaber", + "dyd": "Dyugun", + "dyg": "Villa Viciosa Agta", + "dyi": "Djimini Senoufo", + "dym": "Yanda Dom Dogon", + "dyn": "Dyangadi; Dhanggatti", + "dyo": "Jola-Fonyi", + "dyu": "Dyula", + "dyy": "Djabugay; Dyaabugay", + "dz": "Dzongkha", + "dza": "Tunzu", + "dze": "Djiwarli", + "dzg": "Dazaga", + "dzl": "Dzalakha", + "dzn": "Dzando", + "eaa": "Karenggapa", + "ebc": "Beginci", + "ebg": "Ebughu", + "ebk": "Eastern Bontok", + "ebo": "Teke-Ebo", + "ebr": "Ebrié", + "ebu": "Embu; Kiembu", + "ecr": "Eteocretan", + "ecs": "Ecuadorian Sign Language", + "ecy": "Eteocypriot", + "ee": "Ewe", + "eee": "E", + "efa": "Efai", + "efe": "Efe", + "efi": "Efik", + "ega": "Ega", + "egl": "Emilian", + "egm": "Benamanga", + "ego": "Eggon", + "egx": "Egyptian languages", + "egy": "Egyptian (Ancient)", + "ehs": "Miyakubo Sign Language", + "ehu": "Ehueun", + "eip": "Eipomek", + "eit": "Eitiep", + "eiv": "Askopan", + "eja": "Ejamat", + "eka": "Ekajuk", + "eke": "Ekit", + "ekg": "Ekari", + "eki": "Eki", + "ekk": "Standard Estonian", + "ekl": "Kol (Bangladesh); Kol", + "ekm": "Elip", + "eko": "Koti", + "ekp": "Ekpeye", + "ekr": "Yace", + "eky": "Eastern Kayah", + "el": "Modern Greek (1453-)", + "ele": "Elepi", + "elh": "El Hugeirat", + "eli": "Nding", + "elk": "Elkei", + "elm": "Eleme", + "elo": "El Molo", + "elu": "Elu", + "elx": "Elamite", + "ema": "Emai-Iuleha-Ora", + "emb": "Embaloh", + "eme": "Emerillon", + "emg": "Eastern Meohang", + "emi": "Mussau-Emira", + "emk": "Eastern Maninkakan", + "emm": "Mamulique", + "emn": "Eman", + "emp": "Northern Emberá", + "emq": "Eastern Minyag", + "ems": "Pacific Gulf Yupik", + "emu": "Eastern Muria", + "emw": "Emplawas", + "emx": "Erromintxela", + "emy": "Epigraphic Mayan", + "emz": "Mbessa", + "en": "English", + "ena": "Apali", + "enb": "Markweeta", + "enc": "En", + "end": "Ende", + "enf": "Forest Enets", + "enh": "Tundra Enets", + "enl": "Enlhet", + "enm": "Middle English (1100-1500)", + "enn": "Engenni", + "eno": "Enggano", + "enq": "Enga", + "enr": "Emumu; Emem", + "enu": "Enu", + "env": "Enwan (Edo State)", + "enw": "Enwan (Akwa Ibom State)", + "enx": "Enxet", + "eo": "Esperanto", + "eot": "Beti (Côte d'Ivoire)", + "epi": "Epie", + "era": "Eravallan", + "erg": "Sie", + "erh": "Eruwa", + "eri": "Ogea", + "erk": "South Efate", + "ero": "Horpa", + "err": "Erre", + "ers": "Ersu", + "ert": "Eritai", + "erw": "Erokwanas", + "es": "Spanish; Castilian", + "ese": "Ese Ejja", + "esg": "Aheri Gondi", + "esh": "Eshtehardi", + "esi": "North Alaskan Inupiatun", + "esk": "Northwest Alaska Inupiatun", + "esl": "Egypt Sign Language", + "esm": "Esuma", + "esn": "Salvadoran Sign Language", + "eso": "Estonian Sign Language", + "esq": "Esselen", + "ess": "Central Siberian Yupik", + "esu": "Central Yupik", + "esx": "Eskimo-Aleut languages", + "esy": "Eskayan", + "et": "Estonian", + "etb": "Etebi", + "etc": "Etchemin", + "eth": "Ethiopian Sign Language", + "etn": "Eton (Vanuatu)", + "eto": "Eton (Cameroon)", + "etr": "Edolo", + "ets": "Yekhee", + "ett": "Etruscan", + "etu": "Ejagham", + "etx": "Eten", + "etz": "Semimi", + "eu": "Basque", + "euq": "Basque (family)", + "eve": "Even", + "evh": "Uvbie", + "evn": "Evenki", + "ewo": "Ewondo", + "ext": "Extremaduran", + "eya": "Eyak", + "eyo": "Keiyo", + "eza": "Ezaa", + "eze": "Uzekwe", + "fa": "Persian", + "faa": "Fasu", + "fab": "Fa d'Ambu", + "fad": "Wagi", + "faf": "Fagani", + "fag": "Finongan", + "fah": "Baissa Fali", + "fai": "Faiwol", + "faj": "Faita", + "fak": "Fang (Cameroon)", + "fal": "South Fali", + "fam": "Fam", + "fan": "Fang (Equatorial Guinea)", + "fap": "Paloor", + "far": "Fataleka", + "fat": "Fanti", + "fau": "Fayu", + "fax": "Fala", + "fay": "Southwestern Fars", + "faz": "Northwestern Fars", + "fbl": "West Albay Bikol", + "fcs": "Quebec Sign Language", + "fer": "Feroge", + "ff": "Fulah", + "ffi": "Foia Foia", + "ffm": "Maasina Fulfulde", + "fgr": "Fongoro", + "fi": "Finnish", + "fia": "Nobiin", + "fie": "Fyer", + "fif": "Faifi", + "fil": "Filipino; Pilipino", + "fip": "Fipa", + "fir": "Firan", + "fit": "Tornedalen Finnish; Meänkieli", + "fiu": "Finno-Ugrian languages", + "fiw": "Fiwaga", + "fj": "Fijian", + "fkk": "Kirya-Konzəl", + "fkv": "Kven Finnish", + "fla": "Kalispel-Pend d'Oreille", + "flh": "Foau", + "fli": "Fali", + "fll": "North Fali", + "fln": "Flinders Island", + "flr": "Fuliiru", + "fly": "Flaaitaal; Tsotsitaal", + "fmp": "Fe'fe'", + "fmu": "Far Western Muria", + "fnb": "Fanbak", + "fng": "Fanagalo", + "fni": "Fania", + "fo": "Faroese", + "fod": "Foodo", + "foi": "Foi", + "fom": "Foma", + "fon": "Fon", + "for": "Fore", + "fos": "Siraya", + "fox": "Formosan languages", + "fpe": "Fernando Po Creole English", + "fqs": "Fas", + "fr": "French", + "frc": "Cajun French", + "frd": "Fordata", + "frk": "Frankish", + "frm": "Middle French (ca. 1400-1600)", + "fro": "Old French (842-ca. 1400)", + "frp": "Arpitan; Francoprovençal", + "frq": "Forak", + "frr": "Northern Frisian", + "frs": "Eastern Frisian", + "frt": "Fortsenal", + "fse": "Finnish Sign Language", + "fsl": "French Sign Language", + "fss": "Finland-Swedish Sign Language; finlandssvenskt teckenspråk; suomenruotsalainen viittomakieli", + "fub": "Adamawa Fulfulde", + "fuc": "Pulaar", + "fud": "East Futuna", + "fue": "Borgu Fulfulde", + "fuf": "Pular", + "fuh": "Western Niger Fulfulde", + "fui": "Bagirmi Fulfulde", + "fuj": "Ko", + "fum": "Fum", + "fun": "Fulniô", + "fuq": "Central-Eastern Niger Fulfulde", + "fur": "Friulian", + "fut": "Futuna-Aniwa", + "fuu": "Furu", + "fuv": "Nigerian Fulfulde", + "fuy": "Fuyug", + "fvr": "Fur", + "fwa": "Fwâi", + "fwe": "Fwe", + "fy": "Western Frisian", + "ga": "Irish", + "gaa": "Ga", + "gab": "Gabri", + "gac": "Mixed Great Andamanese", + "gad": "Gaddang", + "gae": "Guarequena", + "gaf": "Gende", + "gag": "Gagauz", + "gah": "Alekano", + "gai": "Borei", + "gaj": "Gadsup", + "gak": "Gamkonora", + "gal": "Galolen", + "gam": "Kandawo", + "gan": "Gan Chinese", + "gao": "Gants", + "gap": "Gal", + "gaq": "Gata'", + "gar": "Galeya", + "gas": "Adiwasi Garasia", + "gat": "Kenati", + "gau": "Mudhili Gadaba", + "gaw": "Nobonob", + "gax": "Borana-Arsi-Guji Oromo", + "gay": "Gayo", + "gaz": "West Central Oromo", + "gba": "Gbaya (Central African Republic)", + "gbb": "Kaytetye", + "gbd": "Karajarri", + "gbe": "Niksek", + "gbf": "Gaikundi", + "gbg": "Gbanziri", + "gbh": "Defi Gbe", + "gbi": "Galela", + "gbj": "Bodo Gadaba", + "gbk": "Gaddi", + "gbl": "Gamit", + "gbm": "Garhwali", + "gbn": "Mo'da", + "gbo": "Northern Grebo", + "gbp": "Gbaya-Bossangoa", + "gbq": "Gbaya-Bozoum", + "gbr": "Gbagyi", + "gbs": "Gbesi Gbe", + "gbu": "Gagadu", + "gbv": "Gbanu", + "gbw": "Gabi-Gabi", + "gbx": "Eastern Xwla Gbe", + "gby": "Gbari", + "gbz": "Zoroastrian Dari", + "gcc": "Mali", + "gcd": "Ganggalida", + "gce": "Galice", + "gcf": "Guadeloupean Creole French", + "gcl": "Grenadian Creole English", + "gcn": "Gaina", + "gcr": "Guianese Creole French", + "gct": "Colonia Tovar German", + "gd": "Scottish Gaelic; Gaelic", + "gda": "Gade Lohar", + "gdb": "Pottangi Ollar Gadaba", + "gdc": "Gugu Badhun", + "gdd": "Gedaged", + "gde": "Gude", + "gdf": "Guduf-Gava", + "gdg": "Ga'dang", + "gdh": "Gadjerawang; Gajirrabeng", + "gdi": "Gundi", + "gdj": "Gurdjar", + "gdk": "Gadang", + "gdl": "Dirasha", + "gdm": "Laal", + "gdn": "Umanakaina", + "gdo": "Ghodoberi", + "gdq": "Mehri", + "gdr": "Wipi", + "gds": "Ghandruk Sign Language", + "gdt": "Kungardutyi", + "gdu": "Gudu", + "gdx": "Godwari", + "gea": "Geruma", + "geb": "Kire", + "gec": "Gboloo Grebo", + "ged": "Gade", + "gef": "Gerai", + "geg": "Gengle", + "geh": "Hutterite German; Hutterisch", + "gei": "Gebe", + "gej": "Gen", + "gek": "Ywom", + "gel": "ut-Ma'in", + "gem": "Germanic languages", + "geq": "Geme", + "ges": "Geser-Gorom", + "gev": "Eviya", + "gew": "Gera", + "gex": "Garre", + "gey": "Enya", + "gez": "Geez", + "gfk": "Patpatar", + "gft": "Gafat", + "gga": "Gao", + "ggb": "Gbii", + "ggd": "Gugadj", + "gge": "Gurr-goni", + "ggg": "Gurgula", + "ggk": "Kungarakany", + "ggl": "Ganglau", + "ggt": "Gitua", + "ggu": "Gagu; Gban", + "ggw": "Gogodala", + "gha": "Ghadamès", + "ghc": "Hiberno-Scottish Gaelic", + "ghe": "Southern Ghale", + "ghh": "Northern Ghale", + "ghk": "Geko Karen", + "ghl": "Ghulfan", + "ghn": "Ghanongga", + "gho": "Ghomara", + "ghr": "Ghera", + "ghs": "Guhu-Samane", + "ght": "Kuke; Kutang Ghale", + "gia": "Kija", + "gib": "Gibanawa", + "gic": "Gail", + "gid": "Gidar", + "gie": "Gaɓogbo; Guébie", + "gig": "Goaria", + "gih": "Githabul", + "gii": "Girirra", + "gil": "Gilbertese", + "gim": "Gimi (Eastern Highlands)", + "gin": "Hinukh", + "gip": "Gimi (West New Britain)", + "giq": "Green Gelao", + "gir": "Red Gelao", + "gis": "North Giziga", + "git": "Gitxsan", + "giu": "Mulao", + "giw": "White Gelao", + "gix": "Gilima", + "giy": "Giyug", + "giz": "South Giziga", + "gjk": "Kachi Koli", + "gjm": "Gunditjmara", + "gjn": "Gonja", + "gjr": "Gurindji Kriol", + "gju": "Gujari", + "gka": "Guya", + "gkd": "Magɨ (Madang Province)", + "gke": "Ndai", + "gkn": "Gokana", + "gko": "Kok-Nar", + "gkp": "Guinea Kpelle", + "gku": "ǂUngkue", + "gl": "Galician", + "glb": "Belning", + "glc": "Bon Gula", + "gld": "Nanai", + "glh": "Northwest Pashai; Northwest Pashayi", + "glj": "Gula Iro", + "glk": "Gilaki", + "gll": "Garlali", + "glo": "Galambu", + "glr": "Glaro-Twabo", + "glu": "Gula (Chad)", + "glw": "Glavda", + "gly": "Gule", + "gma": "Gambera", + "gmb": "Gula'alaa", + "gmd": "Mághdì", + "gme": "East Germanic languages", + "gmg": "Magɨyi", + "gmh": "Middle High German (ca. 1050-1500)", + "gml": "Middle Low German", + "gmm": "Gbaya-Mbodomo", + "gmn": "Gimnime", + "gmq": "North Germanic languages", + "gmr": "Mirning; Mirniny", + "gmu": "Gumalu", + "gmv": "Gamo", + "gmw": "West Germanic languages", + "gmx": "Magoma", + "gmy": "Mycenaean Greek", + "gmz": "Mgbolizhia", + "gn": "Guarani", + "gna": "Kaansa", + "gnb": "Gangte", + "gnc": "Guanche", + "gnd": "Zulgo-Gemzek", + "gne": "Ganang", + "gng": "Ngangam", + "gnh": "Lere", + "gni": "Gooniyandi", + "gnj": "Ngen", + "gnk": "ǁGana", + "gnl": "Gangulu", + "gnm": "Ginuman", + "gnn": "Gumatj", + "gno": "Northern Gondi", + "gnq": "Gana", + "gnr": "Gureng Gureng", + "gnt": "Guntai", + "gnu": "Gnau", + "gnw": "Western Bolivian Guaraní", + "gnz": "Ganzi", + "goa": "Guro", + "gob": "Playero", + "goc": "Gorakor", + "god": "Godié", + "goe": "Gongduk", + "gof": "Gofa", + "gog": "Gogo", + "goh": "Old High German (ca. 750-1050)", + "goi": "Gobasi", + "goj": "Gowlan", + "gok": "Gowli", + "gol": "Gola", + "gom": "Goan Konkani", + "gon": "Gondi", + "goo": "Gone Dau", + "gop": "Yeretuar", + "goq": "Gorap", + "gor": "Gorontalo", + "gos": "Gronings", + "got": "Gothic", + "gou": "Gavar", + "gov": "Goo", + "gow": "Gorowa", + "gox": "Gobu", + "goy": "Goundo", + "goz": "Gozarkhani", + "gpa": "Gupa-Abawa", + "gpe": "Ghanaian Pidgin English", + "gpn": "Taiap", + "gqa": "Ga'anda", + "gqi": "Guiqiong", + "gqn": "Guana (Brazil)", + "gqr": "Gor", + "gqu": "Qau", + "gra": "Rajput Garasia", + "grb": "Grebo", + "grc": "Ancient Greek (to 1453)", + "grd": "Guruntum-Mbaaru", + "grg": "Madi", + "grh": "Gbiri-Niragu", + "gri": "Ghari", + "grj": "Southern Grebo", + "grk": "Greek languages", + "grm": "Kota Marudu Talantang", + "gro": "Groma", + "grq": "Gorovu", + "grr": "Taznatit", + "grs": "Gresi", + "grt": "Garo", + "gru": "Kistane", + "grv": "Central Grebo", + "grw": "Gweda", + "grx": "Guriaso", + "gry": "Barclayville Grebo", + "grz": "Guramalum", + "gse": "Ghanaian Sign Language", + "gsg": "German Sign Language", + "gsl": "Gusilay", + "gsm": "Guatemalan Sign Language", + "gsn": "Nema; Gusan", + "gso": "Southwest Gbaya", + "gsp": "Wasembo", + "gss": "Greek Sign Language", + "gsw": "Swiss German; Alemannic; Alsatian", + "gta": "Guató", + "gtu": "Aghu-Tharnggala", + "gu": "Gujarati", + "gua": "Shiki", + "gub": "Guajajára", + "guc": "Wayuu", + "gud": "Yocoboué Dida", + "gue": "Gurindji", + "guf": "Gupapuyngu", + "gug": "Paraguayan Guaraní", + "guh": "Guahibo", + "gui": "Eastern Bolivian Guaraní", + "guk": "Gumuz", + "gul": "Sea Island Creole English", + "gum": "Guambiano", + "gun": "Mbyá Guaraní", + "guo": "Guayabero", + "gup": "Gunwinggu", + "guq": "Aché", + "gur": "Farefare", + "gus": "Guinean Sign Language", + "gut": "Maléku Jaíka", + "guu": "Yanomamö", + "guw": "Gun", + "gux": "Gourmanchéma", + "guz": "Gusii; Ekegusii", + "gv": "Manx", + "gva": "Guana (Paraguay)", + "gvc": "Guanano", + "gve": "Duwet", + "gvf": "Golin", + "gvj": "Guajá", + "gvl": "Gulay", + "gvm": "Gurmana", + "gvn": "Kuku-Yalanji", + "gvo": "Gavião Do Jiparaná", + "gvp": "Pará Gavião", + "gvr": "Gurung", + "gvs": "Gumawana", + "gvy": "Guyani", + "gwa": "Mbato", + "gwb": "Gwa", + "gwc": "Gawri; Kalami", + "gwd": "Gawwada", + "gwe": "Gweno", + "gwf": "Gowro", + "gwg": "Moo", + "gwi": "Gwichʼin", + "gwj": "ǀGwi", + "gwm": "Awngthim", + "gwn": "Gwandara", + "gwr": "Gwere", + "gwt": "Gawar-Bati", + "gwu": "Guwamu", + "gww": "Kwini", + "gwx": "Gua", + "gxx": "Wè Southern", + "gya": "Northwest Gbaya", + "gyb": "Garus", + "gyd": "Kayardild", + "gye": "Gyem", + "gyf": "Gungabula", + "gyg": "Gbayi", + "gyi": "Gyele", + "gyl": "Gayil", + "gym": "Ngäbere", + "gyn": "Guyanese Creole English", + "gyo": "Gyalsumdo", + "gyr": "Guarayu", + "gyy": "Gunya", + "gyz": "Geji; Gyaazi", + "gza": "Ganza", + "gzi": "Gazi", + "gzn": "Gane", + "ha": "Hausa", + "haa": "Han", + "hab": "Hanoi Sign Language", + "hac": "Gurani", + "had": "Hatam", + "hae": "Eastern Oromo", + "haf": "Haiphong Sign Language", + "hag": "Hanga", + "hah": "Hahon", + "hai": "Haida", + "haj": "Hajong", + "hak": "Hakka Chinese", + "hal": "Halang", + "ham": "Hewa", + "han": "Hangaza", + "hao": "Hakö", + "hap": "Hupla", + "haq": "Ha", + "har": "Harari", + "has": "Haisla", + "hav": "Havu", + "haw": "Hawaiian", + "hax": "Southern Haida", + "hay": "Haya", + "haz": "Hazaragi", + "hba": "Hamba", + "hbb": "Huba", + "hbn": "Heiban", + "hbo": "Ancient Hebrew", + "hbu": "Habu", + "hca": "Andaman Creole Hindi", + "hch": "Huichol", + "hdn": "Northern Haida", + "hds": "Honduras Sign Language", + "hdy": "Hadiyya", + "he": "Hebrew", + "hea": "Northern Qiandong Miao", + "hed": "Herdé", + "heg": "Helong", + "heh": "Hehe", + "hei": "Heiltsuk", + "hem": "Hemba", + "hgm": "Haiǁom", + "hgw": "Haigwai", + "hhi": "Hoia Hoia", + "hhr": "Kerak", + "hhy": "Hoyahoya", + "hi": "Hindi", + "hia": "Lamang", + "hib": "Hibito", + "hid": "Hidatsa", + "hif": "Fiji Hindi", + "hig": "Kamwe", + "hih": "Pamosu", + "hii": "Hinduri", + "hij": "Hijuk", + "hik": "Seit-Kaitetu", + "hil": "Hiligaynon", + "him": "Himachali languages; Western Pahari languages", + "hio": "Tsoa", + "hir": "Himarimã", + "hit": "Hittite", + "hiw": "Hiw", + "hix": "Hixkaryána", + "hji": "Haji", + "hka": "Kahe", + "hke": "Hunde", + "hkh": "Khah; Poguli", + "hkk": "Hunjara-Kaina Ke", + "hkn": "Mel-Khaonh", + "hks": "Hong Kong Sign Language; Heung Kong Sau Yue", + "hla": "Halia", + "hlb": "Halbi", + "hld": "Halang Doan", + "hle": "Hlersu", + "hlt": "Matu Chin", + "hlu": "Hieroglyphic Luwian", + "hma": "Southern Mashan Hmong; Southern Mashan Miao", + "hmb": "Humburi Senni Songhay", + "hmc": "Central Huishui Hmong; Central Huishui Miao", + "hmd": "Large Flowery Miao; A-hmaos; Da-Hua Miao", + "hme": "Eastern Huishui Hmong; Eastern Huishui Miao", + "hmf": "Hmong Don", + "hmg": "Southwestern Guiyang Hmong", + "hmh": "Southwestern Huishui Hmong; Southwestern Huishui Miao", + "hmi": "Northern Huishui Hmong; Northern Huishui Miao", + "hmj": "Ge; Gejia", + "hmk": "Maek", + "hml": "Luopohe Hmong; Luopohe Miao", + "hmm": "Central Mashan Hmong; Central Mashan Miao", + "hmn": "Hmong; Mong", + "hmp": "Northern Mashan Hmong; Northern Mashan Miao", + "hmq": "Eastern Qiandong Miao", + "hmr": "Hmar", + "hms": "Southern Qiandong Miao", + "hmt": "Hamtai", + "hmu": "Hamap", + "hmv": "Hmong Dô", + "hmw": "Western Mashan Hmong; Western Mashan Miao", + "hmx": "Hmong-Mien languages", + "hmy": "Southern Guiyang Hmong; Southern Guiyang Miao", + "hmz": "Hmong Shua; Sinicized Miao", + "hna": "Mina (Cameroon)", + "hnd": "Southern Hindko", + "hne": "Chhattisgarhi", + "hng": "Hungu", + "hnh": "ǁAni", + "hni": "Hani", + "hnj": "Hmong Njua; Mong Leng; Mong Njua", + "hnn": "Hanunoo", + "hno": "Northern Hindko", + "hns": "Caribbean Hindustani", + "hnu": "Hung", + "ho": "Hiri Motu", + "hoa": "Hoava", + "hob": "Mari (Madang Province)", + "hoc": "Ho", + "hod": "Holma", + "hoe": "Horom", + "hoh": "Hobyót", + "hoi": "Holikachuk", + "hoj": "Hadothi; Haroti", + "hok": "Hokan languages", + "hol": "Holu", + "hom": "Homa", + "hoo": "Holoholo", + "hop": "Hopi", + "hor": "Horo", + "hos": "Ho Chi Minh City Sign Language", + "hot": "Hote; Malê", + "hov": "Hovongan", + "how": "Honi", + "hoy": "Holiya", + "hoz": "Hozo", + "hpo": "Hpon", + "hps": "Hawai'i Sign Language (HSL); Hawai'i Pidgin Sign Language", + "hr": "Croatian", + "hra": "Hrangkhol", + "hrc": "Niwer Mil", + "hre": "Hre", + "hrk": "Haruku", + "hrm": "Horned Miao", + "hro": "Haroi", + "hrp": "Nhirrpi", + "hrt": "Hértevin", + "hru": "Hruso", + "hrw": "Warwar Feni", + "hrx": "Hunsrik", + "hrz": "Harzani", + "hsb": "Upper Sorbian", + "hsh": "Hungarian Sign Language", + "hsl": "Hausa Sign Language", + "hsn": "Xiang Chinese", + "hss": "Harsusi", + "ht": "Haitian; Haitian Creole", + "hti": "Hoti", + "hto": "Minica Huitoto", + "hts": "Hadza", + "htu": "Hitu", + "htx": "Middle Hittite", + "hu": "Hungarian", + "hub": "Huambisa", + "huc": "ǂHua; ǂʼAmkhoe", + "hud": "Huaulu", + "hue": "San Francisco Del Mar Huave", + "huf": "Humene", + "hug": "Huachipaeri", + "huh": "Huilliche", + "hui": "Huli", + "huj": "Northern Guiyang Hmong; Northern Guiyang Miao", + "huk": "Hulung", + "hul": "Hula", + "hum": "Hungana", + "huo": "Hu", + "hup": "Hupa", + "huq": "Tsat", + "hur": "Halkomelem", + "hus": "Huastec", + "hut": "Humla", + "huu": "Murui Huitoto", + "huv": "San Mateo Del Mar Huave", + "huw": "Hukumina", + "hux": "Nüpode Huitoto", + "huy": "Hulaulá", + "huz": "Hunzib", + "hvc": "Haitian Vodoun Culture Language", + "hve": "San Dionisio Del Mar Huave", + "hvk": "Haveke", + "hvn": "Sabu", + "hvv": "Santa María Del Mar Huave", + "hwa": "Wané", + "hwc": "Hawai'i Creole English; Hawai'i Pidgin", + "hwo": "Hwana", + "hy": "Armenian", + "hya": "Hya", + "hyw": "Western Armenian", + "hyx": "Armenian (family)", + "hz": "Herero", + "ia": "Interlingua (International Auxiliary Language Association)", + "iai": "Iaai", + "ian": "Iatmul", + "iar": "Purari", + "iba": "Iban", + "ibb": "Ibibio", + "ibd": "Iwaidja", + "ibe": "Akpes", + "ibg": "Ibanag", + "ibh": "Bih", + "ibl": "Ibaloi", + "ibm": "Agoi", + "ibn": "Ibino", + "ibr": "Ibuoro", + "ibu": "Ibu", + "iby": "Ibani", + "ica": "Ede Ica", + "ich": "Etkywan", + "icl": "Icelandic Sign Language", + "icr": "Islander Creole English", + "id": "Indonesian", + "ida": "Idakho-Isukha-Tiriki; Luidakho-Luisukha-Lutirichi", + "idb": "Indo-Portuguese", + "idc": "Idon; Ajiya", + "idd": "Ede Idaca", + "ide": "Idere", + "idi": "Idi", + "idr": "Indri", + "ids": "Idesa", + "idt": "Idaté", + "idu": "Idoma", + "ie": "Interlingue; Occidental", + "ifa": "Amganad Ifugao", + "ifb": "Batad Ifugao; Ayangan Ifugao", + "ife": "Ifè", + "iff": "Ifo", + "ifk": "Tuwali Ifugao", + "ifm": "Teke-Fuumu", + "ifu": "Mayoyao Ifugao", + "ify": "Keley-I Kallahan", + "ig": "Igbo", + "igb": "Ebira", + "ige": "Igede", + "igg": "Igana", + "igl": "Igala", + "igm": "Kanggape", + "ign": "Ignaciano", + "igo": "Isebe", + "igs": "Interglossa", + "igw": "Igwe", + "ihb": "Iha Based Pidgin", + "ihi": "Ihievbe", + "ihp": "Iha", + "ihw": "Bidhawal", + "ii": "Sichuan Yi; Nuosu", + "iin": "Thiin", + "iir": "Indo-Iranian languages", + "ijc": "Izon", + "ije": "Biseni", + "ijj": "Ede Ije", + "ijn": "Kalabari", + "ijo": "Ijo languages", + "ijs": "Southeast Ijo", + "ik": "Inupiaq", + "ike": "Eastern Canadian Inuktitut", + "iki": "Iko", + "ikk": "Ika", + "ikl": "Ikulu", + "iko": "Olulumo-Ikom", + "ikp": "Ikpeshi", + "ikr": "Ikaranggal", + "iks": "Inuit Sign Language", + "ikt": "Inuinnaqtun; Western Canadian Inuktitut", + "ikv": "Iku-Gora-Ankwa", + "ikw": "Ikwere", + "ikx": "Ik", + "ikz": "Ikizu", + "ila": "Ile Ape", + "ilb": "Ila", + "ilg": "Garig-Ilgar", + "ili": "Ili Turki", + "ilk": "Ilongot", + "ilm": "Iranun (Malaysia)", + "ilo": "Iloko", + "ilp": "Iranun (Philippines)", + "ils": "International Sign", + "ilu": "Ili'uun", + "ilv": "Ilue", + "ima": "Mala Malasar", + "imi": "Anamgura", + "iml": "Miluk", + "imn": "Imonda", + "imo": "Imbongu", + "imr": "Imroing", + "ims": "Marsian", + "imt": "Imotong", + "imy": "Milyan", + "inb": "Inga", + "inc": "Indic languages", + "ine": "Indo-European languages", + "ing": "Degexit'an", + "inh": "Ingush", + "inj": "Jungle Inga", + "inl": "Indonesian Sign Language", + "inm": "Minaean", + "inn": "Isinai", + "ino": "Inoke-Yate", + "inp": "Iñapari", + "ins": "Indian Sign Language", + "int": "Intha", + "inz": "Ineseño", + "io": "Ido", + "ior": "Inor", + "iou": "Tuma-Irumu", + "iow": "Iowa-Oto", + "ipi": "Ipili", + "ipo": "Ipiko", + "iqu": "Iquito", + "iqw": "Ikwo", + "ira": "Iranian languages", + "ire": "Iresim", + "irh": "Irarutu", + "iri": "Rigwe; Irigwe", + "irk": "Iraqw", + "irn": "Irántxe", + "iro": "Iroquoian languages", + "irr": "Ir", + "iru": "Irula", + "irx": "Kamberau", + "iry": "Iraya", + "is": "Icelandic", + "isa": "Isabi", + "isc": "Isconahua", + "isd": "Isnag", + "ise": "Italian Sign Language", + "isg": "Irish Sign Language", + "ish": "Esan", + "isi": "Nkem-Nkum", + "isk": "Ishkashimi", + "ism": "Masimasi", + "isn": "Isanzu", + "iso": "Isoko", + "isr": "Israeli Sign Language", + "ist": "Istriot", + "isu": "Isu (Menchum Division)", + "it": "Italian", + "itb": "Binongan Itneg", + "itc": "Italic languages", + "itd": "Southern Tidung", + "ite": "Itene", + "iti": "Inlaod Itneg", + "itk": "Judeo-Italian", + "itl": "Itelmen", + "itm": "Itu Mbon Uzo", + "ito": "Itonama", + "itr": "Iteri", + "its": "Isekiri", + "itt": "Maeng Itneg", + "itv": "Itawit", + "itw": "Ito", + "itx": "Itik", + "ity": "Moyadan Itneg", + "itz": "Itzá", + "iu": "Inuktitut", + "ium": "Iu Mien", + "ivb": "Ibatan", + "ivv": "Ivatan", + "iwk": "I-Wak", + "iwm": "Iwam", + "iwo": "Iwur", + "iws": "Sepik Iwam", + "ixc": "Ixcatec", + "ixl": "Ixil", + "iya": "Iyayu", + "iyo": "Mesaka", + "iyx": "Yaka (Congo)", + "izh": "Ingrian", + "izr": "Izere", + "izz": "Izii", + "ja": "Japanese", + "jaa": "Jamamadí", + "jab": "Hyam", + "jac": "Popti'; Jakalteko", + "jad": "Jahanka", + "jae": "Yabem", + "jaf": "Jara", + "jah": "Jah Hut", + "jaj": "Zazao", + "jak": "Jakun", + "jal": "Yalahatan", + "jam": "Jamaican Creole English", + "jan": "Jandai", + "jao": "Yanyuwa", + "jaq": "Yaqay", + "jas": "New Caledonian Javanese", + "jat": "Jakati", + "jau": "Yaur", + "jax": "Jambi Malay", + "jay": "Yan-nhangu; Nhangu", + "jaz": "Jawe", + "jbe": "Judeo-Berber", + "jbi": "Badjiri", + "jbj": "Arandai", + "jbk": "Barikewa", + "jbm": "Bijim", + "jbn": "Nafusi", + "jbo": "Lojban", + "jbr": "Jofotek-Bromnya", + "jbt": "Jabutí", + "jbu": "Jukun Takum", + "jbw": "Yawijibaya", + "jcs": "Jamaican Country Sign Language", + "jct": "Krymchak", + "jda": "Jad", + "jdg": "Jadgali", + "jdt": "Judeo-Tat", + "jeb": "Jebero", + "jee": "Jerung", + "jeh": "Jeh", + "jei": "Yei", + "jek": "Jeri Kuo", + "jel": "Yelmek", + "jen": "Dza", + "jer": "Jere", + "jet": "Manem", + "jeu": "Jonkor Bourmataguil", + "jgb": "Ngbee", + "jge": "Judeo-Georgian", + "jgk": "Gwak", + "jgo": "Ngomba", + "jhi": "Jehai", + "jhs": "Jhankot Sign Language", + "jia": "Jina", + "jib": "Jibu", + "jic": "Tol", + "jid": "Bu (Kaduna State)", + "jie": "Jilbe", + "jig": "Jingulu; Djingili", + "jih": "sTodsde; Shangzhai", + "jii": "Jiiddu", + "jil": "Jilim", + "jim": "Jimi (Cameroon)", + "jio": "Jiamao", + "jiq": "Guanyinqiao; Lavrung", + "jit": "Jita", + "jiu": "Youle Jinuo", + "jiv": "Shuar", + "jiy": "Buyuan Jinuo", + "jje": "Jejueo", + "jjr": "Bankal", + "jka": "Kaera", + "jkm": "Mobwa Karen", + "jko": "Kubo", + "jkp": "Paku Karen", + "jkr": "Koro (India)", + "jks": "Amami Koniya Sign Language", + "jku": "Labir", + "jle": "Ngile", + "jls": "Jamaican Sign Language", + "jma": "Dima", + "jmb": "Zumbun", + "jmc": "Machame", + "jmd": "Yamdena", + "jmi": "Jimi (Nigeria)", + "jml": "Jumli", + "jmn": "Makuri Naga", + "jmr": "Kamara", + "jms": "Mashi (Nigeria)", + "jmw": "Mouwase", + "jmx": "Western Juxtlahuaca Mixtec", + "jna": "Jangshung", + "jnd": "Jandavra", + "jng": "Yangman", + "jni": "Janji", + "jnj": "Yemsa", + "jnl": "Rawat", + "jns": "Jaunsari", + "job": "Joba", + "jod": "Wojenaka", + "jog": "Jogi", + "jor": "Jorá", + "jos": "Jordanian Sign Language", + "jow": "Jowulu", + "jpa": "Jewish Palestinian Aramaic", + "jpr": "Judeo-Persian", + "jpx": "Japanese (family)", + "jqr": "Jaqaru", + "jra": "Jarai", + "jrb": "Judeo-Arabic", + "jrr": "Jiru", + "jrt": "Jakattoe", + "jru": "Japrería", + "jsl": "Japanese Sign Language", + "jua": "Júma", + "jub": "Wannu", + "juc": "Jurchen", + "jud": "Worodougou", + "juh": "Hõne", + "jui": "Ngadjuri", + "juk": "Wapan", + "jul": "Jirel", + "jum": "Jumjum", + "jun": "Juang", + "juo": "Jiba", + "jup": "Hupdë", + "jur": "Jurúna", + "jus": "Jumla Sign Language", + "jut": "Jutish", + "juu": "Ju", + "juw": "Wãpha", + "juy": "Juray", + "jv": "Javanese", + "jvd": "Javindo", + "jvn": "Caribbean Javanese", + "jwi": "Jwira-Pepesa", + "jya": "Jiarong", + "jye": "Judeo-Yemeni Arabic", + "jyy": "Jaya", + "ka": "Georgian", + "kaa": "Kara-Kalpak; Karakalpak", + "kab": "Kabyle", + "kac": "Kachin; Jingpho", + "kad": "Adara", + "kae": "Ketangalan", + "kaf": "Katso", + "kag": "Kajaman", + "kah": "Kara (Central African Republic)", + "kai": "Karekare", + "kaj": "Jju", + "kak": "Kalanguya; Kayapa Kallahan", + "kam": "Kamba (Kenya)", + "kao": "Xaasongaxango", + "kap": "Bezhta", + "kaq": "Capanahua", + "kar": "Karen languages", + "kav": "Katukína", + "kaw": "Kawi", + "kax": "Kao", + "kay": "Kamayurá", + "kba": "Kalarko", + "kbb": "Kaxuiâna", + "kbc": "Kadiwéu", + "kbd": "Kabardian", + "kbe": "Kanju", + "kbg": "Khamba", + "kbh": "Camsá", + "kbi": "Kaptiau", + "kbj": "Kari", + "kbk": "Grass Koiari", + "kbl": "Kanembu", + "kbm": "Iwal", + "kbn": "Kare (Central African Republic)", + "kbo": "Keliko", + "kbp": "Kabiyè", + "kbq": "Kamano", + "kbr": "Kafa", + "kbs": "Kande", + "kbt": "Abadi", + "kbu": "Kabutra", + "kbv": "Dera (Indonesia)", + "kbw": "Kaiep", + "kbx": "Ap Ma", + "kby": "Manga Kanuri", + "kbz": "Duhwa", + "kca": "Khanty", + "kcb": "Kawacha", + "kcc": "Lubila", + "kcd": "Ngkâlmpw Kanum", + "kce": "Kaivi", + "kcf": "Ukaan", + "kcg": "Tyap", + "kch": "Vono", + "kci": "Kamantan", + "kcj": "Kobiana", + "kck": "Kalanga", + "kcl": "Kela (Papua New Guinea); Kala", + "kcm": "Gula (Central African Republic)", + "kcn": "Nubi", + "kco": "Kinalakna", + "kcp": "Kanga", + "kcq": "Kamo", + "kcr": "Katla", + "kcs": "Koenoem", + "kct": "Kaian", + "kcu": "Kami (Tanzania)", + "kcv": "Kete", + "kcw": "Kabwari", + "kcx": "Kachama-Ganjule", + "kcy": "Korandje", + "kcz": "Konongo", + "kda": "Worimi", + "kdc": "Kutu", + "kdd": "Yankunytjatjara", + "kde": "Makonde", + "kdf": "Mamusi", + "kdg": "Seba", + "kdh": "Tem", + "kdi": "Kumam", + "kdj": "Karamojong", + "kdk": "Numèè; Kwényi", + "kdl": "Tsikimba", + "kdm": "Kagoma", + "kdn": "Kunda", + "kdo": "Kordofanian languages", + "kdp": "Kaningdon-Nindem", + "kdq": "Koch", + "kdr": "Karaim", + "kdt": "Kuy", + "kdu": "Kadaru", + "kdw": "Koneraw", + "kdx": "Kam", + "kdy": "Keder; Keijar", + "kdz": "Kwaja", + "kea": "Kabuverdianu", + "keb": "Kélé", + "kec": "Keiga", + "ked": "Kerewe", + "kee": "Eastern Keres", + "kef": "Kpessi", + "keg": "Tese", + "keh": "Keak", + "kei": "Kei", + "kej": "Kadar", + "kek": "Kekchí", + "kel": "Kela (Democratic Republic of Congo)", + "kem": "Kemak", + "ken": "Kenyang", + "keo": "Kakwa", + "kep": "Kaikadi", + "keq": "Kamar", + "ker": "Kera", + "kes": "Kugbo", + "ket": "Ket", + "keu": "Akebu", + "kev": "Kanikkaran", + "kew": "West Kewa", + "kex": "Kukna", + "key": "Kupia", + "kez": "Kukele", + "kfa": "Kodava", + "kfb": "Northwestern Kolami", + "kfc": "Konda-Dora", + "kfd": "Korra Koraga", + "kfe": "Kota (India)", + "kff": "Koya", + "kfg": "Kudiya", + "kfh": "Kurichiya", + "kfi": "Kannada Kurumba", + "kfj": "Kemiehua", + "kfk": "Kinnauri", + "kfl": "Kung", + "kfm": "Khunsari", + "kfn": "Kuk", + "kfo": "Koro (Côte d'Ivoire)", + "kfp": "Korwa", + "kfq": "Korku", + "kfr": "Kachhi; Kutchi", + "kfs": "Bilaspuri", + "kft": "Kanjari", + "kfu": "Katkari", + "kfv": "Kurmukar", + "kfw": "Kharam Naga", + "kfx": "Kullu Pahari", + "kfy": "Kumaoni", + "kfz": "Koromfé", + "kg": "Kongo", + "kga": "Koyaga", + "kgb": "Kawe", + "kge": "Komering", + "kgf": "Kube", + "kgg": "Kusunda", + "kgi": "Selangor Sign Language", + "kgj": "Gamale Kham", + "kgk": "Kaiwá", + "kgl": "Kunggari", + "kgm": "Karipúna", + "kgn": "Karingani", + "kgo": "Krongo", + "kgp": "Kaingang", + "kgq": "Kamoro", + "kgr": "Abun", + "kgs": "Kumbainggar", + "kgt": "Somyev", + "kgu": "Kobol", + "kgv": "Karas", + "kgw": "Karon Dori", + "kgx": "Kamaru", + "kgy": "Kyerung", + "kha": "Khasi", + "khb": "Lü", + "khc": "Tukang Besi North", + "khd": "Bädi Kanum", + "khe": "Korowai", + "khf": "Khuen", + "khg": "Khams Tibetan", + "khh": "Kehu", + "khi": "Khoisan languages", + "khj": "Kuturmi", + "khk": "Halh Mongolian", + "khl": "Lusi", + "khn": "Khandesi", + "kho": "Khotanese; Sakan", + "khp": "Kapori; Kapauri", + "khq": "Koyra Chiini Songhay", + "khr": "Kharia", + "khs": "Kasua", + "kht": "Khamti", + "khu": "Nkhumbi", + "khv": "Khvarshi", + "khw": "Khowar", + "khx": "Kanu", + "khy": "Kele (Democratic Republic of Congo)", + "khz": "Keapara", + "ki": "Kikuyu; Gikuyu", + "kia": "Kim", + "kib": "Koalib", + "kic": "Kickapoo", + "kid": "Koshin", + "kie": "Kibet", + "kif": "Eastern Parbate Kham", + "kig": "Kimaama; Kimaghima", + "kih": "Kilmeri", + "kii": "Kitsai", + "kij": "Kilivila", + "kil": "Kariya", + "kim": "Karagas", + "kio": "Kiowa", + "kip": "Sheshi Kham", + "kiq": "Kosadle; Kosare", + "kis": "Kis", + "kit": "Agob", + "kiu": "Kirmanjki (individual language)", + "kiv": "Kimbu", + "kiw": "Northeast Kiwai", + "kix": "Khiamniungan Naga", + "kiy": "Kirikiri", + "kiz": "Kisi", + "kj": "Kuanyama; Kwanyama", + "kja": "Mlap", + "kjb": "Q'anjob'al; Kanjobal", + "kjc": "Coastal Konjo", + "kjd": "Southern Kiwai", + "kje": "Kisar", + "kjg": "Khmu", + "kjh": "Khakas", + "kji": "Zabana", + "kjj": "Khinalugh", + "kjk": "Highland Konjo", + "kjl": "Western Parbate Kham", + "kjm": "Kháng", + "kjn": "Kunjen", + "kjo": "Harijan Kinnauri", + "kjp": "Pwo Eastern Karen", + "kjq": "Western Keres", + "kjr": "Kurudu", + "kjs": "East Kewa", + "kjt": "Phrae Pwo Karen", + "kju": "Kashaya", + "kjv": "Kaikavian Literary Language", + "kjx": "Ramopa", + "kjy": "Erave", + "kjz": "Bumthangkha", + "kk": "Kazakh", + "kka": "Kakanda", + "kkb": "Kwerisa", + "kkc": "Odoodee", + "kkd": "Kinuku", + "kke": "Kakabe", + "kkf": "Kalaktang Monpa", + "kkg": "Mabaka Valley Kalinga", + "kkh": "Khün", + "kki": "Kagulu", + "kkj": "Kako", + "kkk": "Kokota", + "kkl": "Kosarek Yale", + "kkm": "Kiong", + "kkn": "Kon Keu", + "kko": "Karko", + "kkp": "Gugubera; Koko-Bera", + "kkq": "Kaeku", + "kkr": "Kir-Balar", + "kks": "Giiwo", + "kkt": "Koi", + "kku": "Tumi", + "kkv": "Kangean", + "kkw": "Teke-Kukuya", + "kkx": "Kohin", + "kky": "Guugu Yimidhirr; Guguyimidjir", + "kkz": "Kaska", + "kl": "Kalaallisut; Greenlandic", + "kla": "Klamath-Modoc", + "klb": "Kiliwa", + "klc": "Kolbila", + "kld": "Gamilaraay", + "kle": "Kulung (Nepal)", + "klf": "Kendeje", + "klg": "Tagakaulo", + "klh": "Weliki", + "kli": "Kalumpang", + "klj": "Khalaj", + "klk": "Kono (Nigeria)", + "kll": "Kagan Kalagan", + "klm": "Migum", + "kln": "Kalenjin", + "klo": "Kapya", + "klp": "Kamasa", + "klq": "Rumu", + "klr": "Khaling", + "kls": "Kalasha", + "klt": "Nukna", + "klu": "Klao", + "klv": "Maskelynes", + "klw": "Tado; Lindu", + "klx": "Koluwawa", + "kly": "Kalao", + "klz": "Kabola", + "km": "Khmer; Central Khmer", + "kma": "Konni", + "kmb": "Kimbundu", + "kmc": "Southern Dong", + "kmd": "Majukayang Kalinga", + "kme": "Bakole", + "kmf": "Kare (Papua New Guinea)", + "kmg": "Kâte", + "kmh": "Kalam", + "kmi": "Kami (Nigeria)", + "kmj": "Kumarbhag Paharia", + "kmk": "Limos Kalinga", + "kml": "Tanudan Kalinga", + "kmm": "Kom (India)", + "kmn": "Awtuw", + "kmo": "Kwoma", + "kmp": "Gimme", + "kmq": "Kwama", + "kmr": "Northern Kurdish", + "kms": "Kamasau", + "kmt": "Kemtuik", + "kmu": "Kanite", + "kmv": "Karipúna Creole French", + "kmw": "Komo (Democratic Republic of Congo)", + "kmx": "Waboda", + "kmy": "Koma", + "kmz": "Khorasani Turkish", + "kn": "Kannada", + "kna": "Dera (Nigeria)", + "knb": "Lubuagan Kalinga", + "knc": "Central Kanuri", + "knd": "Konda", + "kne": "Kankanaey", + "knf": "Mankanya", + "kng": "Koongo", + "kni": "Kanufi", + "knj": "Western Kanjobal", + "knk": "Kuranko", + "knl": "Keninjal", + "knm": "Kanamarí", + "knn": "Konkani (individual language)", + "kno": "Kono (Sierra Leone)", + "knp": "Kwanja", + "knq": "Kintaq", + "knr": "Kaningra", + "kns": "Kensiu", + "knt": "Panoan Katukína", + "knu": "Kono (Guinea)", + "knv": "Tabo", + "knw": "Kung-Ekoka", + "knx": "Kendayan; Salako", + "kny": "Kanyok", + "knz": "Kalamsé", + "ko": "Korean", + "koa": "Konomala", + "koc": "Kpati", + "kod": "Kodi", + "koe": "Kacipo-Bale Suri", + "kof": "Kubi", + "kog": "Cogui; Kogi", + "koh": "Koyo", + "koi": "Komi-Permyak", + "kok": "Konkani (macrolanguage)", + "kol": "Kol (Papua New Guinea)", + "koo": "Konzo", + "kop": "Waube", + "koq": "Kota (Gabon)", + "kos": "Kosraean", + "kot": "Lagwan", + "kou": "Koke", + "kov": "Kudu-Camo", + "kow": "Kugama", + "koy": "Koyukon", + "koz": "Korak", + "kpa": "Kutto", + "kpb": "Mullu Kurumba", + "kpc": "Curripaco", + "kpd": "Koba", + "kpe": "Kpelle", + "kpf": "Komba", + "kpg": "Kapingamarangi", + "kph": "Kplang", + "kpi": "Kofei", + "kpj": "Karajá", + "kpk": "Kpan", + "kpl": "Kpala", + "kpm": "Koho", + "kpn": "Kepkiriwát", + "kpo": "Ikposo", + "kpq": "Korupun-Sela", + "kpr": "Korafe-Yegha", + "kps": "Tehit", + "kpt": "Karata", + "kpu": "Kafoa", + "kpv": "Komi-Zyrian", + "kpw": "Kobon", + "kpx": "Mountain Koiali", + "kpy": "Koryak", + "kpz": "Kupsabiny", + "kqa": "Mum", + "kqb": "Kovai", + "kqc": "Doromu-Koki", + "kqd": "Koy Sanjaq Surat", + "kqe": "Kalagan", + "kqf": "Kakabai", + "kqg": "Khe", + "kqh": "Kisankasa", + "kqi": "Koitabu", + "kqj": "Koromira", + "kqk": "Kotafon Gbe", + "kql": "Kyenele", + "kqm": "Khisa", + "kqn": "Kaonde", + "kqo": "Eastern Krahn", + "kqp": "Kimré", + "kqq": "Krenak", + "kqr": "Kimaragang", + "kqs": "Northern Kissi", + "kqt": "Klias River Kadazan", + "kqu": "Seroa", + "kqv": "Okolod", + "kqw": "Kandas", + "kqx": "Mser", + "kqy": "Koorete", + "kqz": "Korana", + "kr": "Kanuri", + "kra": "Kumhali", + "krb": "Karkin", + "krc": "Karachay-Balkar", + "krd": "Kairui-Midiki", + "kre": "Panará", + "krf": "Koro (Vanuatu)", + "krh": "Kurama", + "kri": "Krio", + "krj": "Kinaray-A", + "krk": "Kerek", + "krl": "Karelian", + "krn": "Sapo", + "kro": "Kru languages", + "krp": "Korop", + "krr": "Krung", + "krs": "Gbaya (Sudan)", + "krt": "Tumari Kanuri", + "kru": "Kurukh", + "krv": "Kavet", + "krw": "Western Krahn", + "krx": "Karon", + "kry": "Kryts", + "krz": "Sota Kanum", + "ks": "Kashmiri", + "ksa": "Shuwa-Zamani", + "ksb": "Shambala", + "ksc": "Southern Kalinga", + "ksd": "Kuanua", + "kse": "Kuni", + "ksf": "Bafia", + "ksg": "Kusaghe", + "ksh": "Kölsch", + "ksi": "Krisa; I'saka", + "ksj": "Uare", + "ksk": "Kansa", + "ksl": "Kumalu", + "ksm": "Kumba", + "ksn": "Kasiguranin", + "kso": "Kofa", + "ksp": "Kaba", + "ksq": "Kwaami", + "ksr": "Borong", + "kss": "Southern Kisi", + "kst": "Winyé", + "ksu": "Khamyang", + "ksv": "Kusu", + "ksw": "S'gaw Karen", + "ksx": "Kedang", + "ksy": "Kharia Thar", + "ksz": "Kodaku", + "kta": "Katua", + "ktb": "Kambaata", + "ktc": "Kholok", + "ktd": "Kokata; Kukatha", + "kte": "Nubri", + "ktf": "Kwami", + "ktg": "Kalkutung", + "kth": "Karanga", + "kti": "North Muyu", + "ktj": "Plapo Krumen", + "ktk": "Kaniet", + "ktl": "Koroshi", + "ktm": "Kurti", + "ktn": "Karitiâna", + "kto": "Kuot", + "ktp": "Kaduo", + "ktq": "Katabaga", + "kts": "South Muyu", + "ktt": "Ketum", + "ktu": "Kituba (Democratic Republic of Congo)", + "ktv": "Eastern Katu", + "ktw": "Kato", + "ktx": "Kaxararí", + "kty": "Kango (Bas-Uélé District)", + "ktz": "Juǀʼhoan; Juǀʼhoansi", + "ku": "Kurdish", + "kub": "Kutep", + "kuc": "Kwinsu", + "kud": "'Auhelawa", + "kue": "Kuman (Papua New Guinea)", + "kuf": "Western Katu", + "kug": "Kupa", + "kuh": "Kushi", + "kui": "Kuikúro-Kalapálo; Kalapalo", + "kuj": "Kuria", + "kuk": "Kepo'", + "kul": "Kulere", + "kum": "Kumyk", + "kun": "Kunama", + "kuo": "Kumukio", + "kup": "Kunimaipa", + "kuq": "Karipuna", + "kus": "Kusaal", + "kut": "Kutenai", + "kuu": "Upper Kuskokwim", + "kuv": "Kur", + "kuw": "Kpagua", + "kux": "Kukatja", + "kuy": "Kuuku-Ya'u", + "kuz": "Kunza", + "kv": "Komi", + "kva": "Bagvalal", + "kvb": "Kubu", + "kvc": "Kove", + "kvd": "Kui (Indonesia)", + "kve": "Kalabakan", + "kvf": "Kabalai", + "kvg": "Kuni-Boazi", + "kvh": "Komodo", + "kvi": "Kwang", + "kvj": "Psikye", + "kvk": "Korean Sign Language", + "kvl": "Kayaw", + "kvm": "Kendem", + "kvn": "Border Kuna", + "kvo": "Dobel", + "kvp": "Kompane", + "kvq": "Geba Karen", + "kvr": "Kerinci", + "kvt": "Lahta Karen; Lahta", + "kvu": "Yinbaw Karen", + "kvv": "Kola", + "kvw": "Wersing", + "kvx": "Parkari Koli", + "kvy": "Yintale Karen; Yintale", + "kvz": "Tsakwambo; Tsaukambo", + "kw": "Cornish", + "kwa": "Dâw", + "kwb": "Kwa", + "kwc": "Likwala", + "kwd": "Kwaio", + "kwe": "Kwerba", + "kwf": "Kwara'ae", + "kwg": "Sara Kaba Deme", + "kwh": "Kowiai", + "kwi": "Awa-Cuaiquer", + "kwj": "Kwanga", + "kwk": "Kwakiutl", + "kwl": "Kofyar", + "kwm": "Kwambi", + "kwn": "Kwangali", + "kwo": "Kwomtari", + "kwp": "Kodia", + "kwr": "Kwer", + "kws": "Kwese", + "kwt": "Kwesten", + "kwu": "Kwakum", + "kwv": "Sara Kaba Náà", + "kww": "Kwinti", + "kwx": "Khirwar", + "kwy": "San Salvador Kongo", + "kwz": "Kwadi", + "kxa": "Kairiru", + "kxb": "Krobu", + "kxc": "Konso; Khonso", + "kxd": "Brunei", + "kxf": "Manumanaw Karen; Manumanaw", + "kxh": "Karo (Ethiopia)", + "kxi": "Keningau Murut", + "kxj": "Kulfa", + "kxk": "Zayein Karen", + "kxm": "Northern Khmer", + "kxn": "Kanowit-Tanjong Melanau", + "kxo": "Kanoé", + "kxp": "Wadiyara Koli", + "kxq": "Smärky Kanum", + "kxr": "Koro (Papua New Guinea)", + "kxs": "Kangjia", + "kxt": "Koiwat", + "kxv": "Kuvi", + "kxw": "Konai", + "kxx": "Likuba", + "kxy": "Kayong", + "kxz": "Kerewo", + "ky": "Kirghiz; Kyrgyz", + "kya": "Kwaya", + "kyb": "Butbut Kalinga", + "kyc": "Kyaka", + "kyd": "Karey", + "kye": "Krache", + "kyf": "Kouya", + "kyg": "Keyagana", + "kyh": "Karok", + "kyi": "Kiput", + "kyj": "Karao", + "kyk": "Kamayo", + "kyl": "Kalapuya", + "kym": "Kpatili", + "kyn": "Northern Binukidnon", + "kyo": "Kelon", + "kyp": "Kang", + "kyq": "Kenga", + "kyr": "Kuruáya", + "kys": "Baram Kayan", + "kyt": "Kayagar", + "kyu": "Western Kayah", + "kyv": "Kayort", + "kyw": "Kudmali", + "kyx": "Rapoisi", + "kyy": "Kambaira", + "kyz": "Kayabí", + "kza": "Western Karaboro", + "kzb": "Kaibobo", + "kzc": "Bondoukou Kulango", + "kzd": "Kadai", + "kze": "Kosena", + "kzf": "Da'a Kaili", + "kzg": "Kikai", + "kzi": "Kelabit", + "kzk": "Kazukuru", + "kzl": "Kayeli", + "kzm": "Kais", + "kzn": "Kokola", + "kzo": "Kaningi", + "kzp": "Kaidipang", + "kzq": "Kaike", + "kzr": "Karang", + "kzs": "Sugut Dusun", + "kzu": "Kayupulau", + "kzv": "Komyandaret", + "kzw": "Karirí-Xocó", + "kzx": "Kamarian", + "kzy": "Kango (Tshopo District)", + "kzz": "Kalabra", + "la": "Latin", + "laa": "Southern Subanen", + "lab": "Linear A", + "lac": "Lacandon", + "lad": "Ladino", + "lae": "Pattani", + "laf": "Lafofa", + "lag": "Langi", + "lah": "Lahnda", + "lai": "Lambya", + "laj": "Lango (Uganda)", + "lal": "Lalia", + "lam": "Lamba", + "lan": "Laru", + "lap": "Laka (Chad)", + "laq": "Qabiao", + "lar": "Larteh", + "las": "Lama (Togo)", + "lau": "Laba", + "law": "Lauje", + "lax": "Tiwa", + "lay": "Lama Bai", + "laz": "Aribwatsa", + "lb": "Luxembourgish; Letzeburgesch", + "lbb": "Label", + "lbc": "Lakkia", + "lbe": "Lak", + "lbf": "Tinani", + "lbg": "Laopang", + "lbi": "La'bi", + "lbj": "Ladakhi", + "lbk": "Central Bontok", + "lbl": "Libon Bikol", + "lbm": "Lodhi", + "lbn": "Rmeet", + "lbo": "Laven", + "lbq": "Wampar", + "lbr": "Lohorung", + "lbs": "Libyan Sign Language", + "lbt": "Lachi", + "lbu": "Labu", + "lbv": "Lavatbura-Lamusong", + "lbw": "Tolaki", + "lbx": "Lawangan", + "lby": "Lamalama; Lamu-Lamu", + "lbz": "Lardil", + "lcc": "Legenyem", + "lcd": "Lola", + "lce": "Loncong; Sekak", + "lcf": "Lubu", + "lch": "Luchazi", + "lcl": "Lisela", + "lcm": "Tungag", + "lcp": "Western Lawa", + "lcq": "Luhu", + "lcs": "Lisabata-Nuniali", + "lda": "Kla-Dan", + "ldb": "Dũya", + "ldd": "Luri", + "ldg": "Lenyima", + "ldh": "Lamja-Dengsa-Tola", + "ldi": "Laari", + "ldj": "Lemoro", + "ldk": "Leelau", + "ldl": "Kaan", + "ldm": "Landoma", + "ldn": "Láadan", + "ldo": "Loo", + "ldp": "Tso", + "ldq": "Lufu", + "lea": "Lega-Shabunda", + "leb": "Lala-Bisa", + "lec": "Leco", + "led": "Lendu", + "lee": "Lyélé", + "lef": "Lelemi", + "leh": "Lenje", + "lei": "Lemio", + "lej": "Lengola", + "lek": "Leipon", + "lel": "Lele (Democratic Republic of Congo)", + "lem": "Nomaande", + "len": "Lenca", + "leo": "Leti (Cameroon)", + "lep": "Lepcha", + "leq": "Lembena", + "ler": "Lenkau", + "les": "Lese", + "let": "Lesing-Gelimi; Amio-Gelimi", + "leu": "Kara (Papua New Guinea)", + "lev": "Lamma", + "lew": "Ledo Kaili", + "lex": "Luang", + "ley": "Lemolang", + "lez": "Lezghian", + "lfa": "Lefa", + "lfn": "Lingua Franca Nova", + "lg": "Ganda; Luganda", + "lga": "Lungga", + "lgb": "Laghu", + "lgg": "Lugbara", + "lgh": "Laghuu", + "lgi": "Lengilu", + "lgk": "Lingarak; Neverver", + "lgl": "Wala", + "lgm": "Lega-Mwenga", + "lgn": "T'apo; Opuuo", + "lgo": "Lango (South Sudan)", + "lgq": "Logba", + "lgr": "Lengo", + "lgt": "Pahi", + "lgu": "Longgu", + "lgz": "Ligenza", + "lha": "Laha (Viet Nam)", + "lhh": "Laha (Indonesia)", + "lhi": "Lahu Shi", + "lhl": "Lahul Lohar", + "lhm": "Lhomi", + "lhn": "Lahanan", + "lhp": "Lhokpu", + "lhs": "Mlahsö", + "lht": "Lo-Toga", + "lhu": "Lahu", + "li": "Limburgan; Limburger; Limburgish", + "lia": "West-Central Limba", + "lib": "Likum", + "lic": "Hlai", + "lid": "Nyindrou", + "lie": "Likila", + "lif": "Limbu", + "lig": "Ligbi", + "lih": "Lihir", + "lij": "Ligurian", + "lik": "Lika", + "lil": "Lillooet", + "lio": "Liki", + "lip": "Sekpele", + "liq": "Libido", + "lir": "Liberian English", + "lis": "Lisu", + "liu": "Logorik", + "liv": "Liv", + "liw": "Col", + "lix": "Liabuku", + "liy": "Banda-Bambari", + "liz": "Libinza", + "lja": "Golpa", + "lje": "Rampi", + "lji": "Laiyolo", + "ljl": "Li'o", + "ljp": "Lampung Api", + "ljw": "Yirandali", + "ljx": "Yuru", + "lka": "Lakalei", + "lkb": "Kabras; Lukabaras", + "lkc": "Kucong", + "lkd": "Lakondê", + "lke": "Kenyi", + "lkh": "Lakha", + "lki": "Laki", + "lkj": "Remun", + "lkl": "Laeko-Libuat", + "lkm": "Kalaamaya", + "lkn": "Lakon; Vure", + "lko": "Khayo; Olukhayo", + "lkr": "Päri", + "lks": "Kisa; Olushisa", + "lkt": "Lakota", + "lku": "Kungkari", + "lky": "Lokoya", + "lla": "Lala-Roba", + "llb": "Lolo", + "llc": "Lele (Guinea)", + "lld": "Ladin", + "lle": "Lele (Papua New Guinea)", + "llf": "Hermit", + "llg": "Lole", + "llh": "Lamu", + "lli": "Teke-Laali", + "llj": "Ladji Ladji", + "llk": "Lelak", + "lll": "Lilau", + "llm": "Lasalimu", + "lln": "Lele (Chad)", + "llp": "North Efate", + "llq": "Lolak", + "lls": "Lithuanian Sign Language", + "llu": "Lau", + "llx": "Lauan", + "lma": "East Limba", + "lmb": "Merei", + "lmc": "Limilngan", + "lmd": "Lumun", + "lme": "Pévé", + "lmf": "South Lembata", + "lmg": "Lamogai", + "lmh": "Lambichhong", + "lmi": "Lombi", + "lmj": "West Lembata", + "lmk": "Lamkang", + "lml": "Hano", + "lmn": "Lambadi", + "lmo": "Lombard", + "lmp": "Limbum", + "lmq": "Lamatuka", + "lmr": "Lamalera", + "lmu": "Lamenu", + "lmv": "Lomaiviti", + "lmw": "Lake Miwok", + "lmx": "Laimbue", + "lmy": "Lamboya", + "ln": "Lingala", + "lna": "Langbashe", + "lnb": "Mbalanhu", + "lnd": "Lundayeh; Lun Bawang", + "lng": "Langobardic", + "lnh": "Lanoh", + "lni": "Daantanai'", + "lnj": "Leningitij", + "lnl": "South Central Banda", + "lnm": "Langam", + "lnn": "Lorediakarkar", + "lns": "Lamnso'", + "lnu": "Longuda", + "lnw": "Lanima", + "lnz": "Lonzo", + "lo": "Lao", + "loa": "Loloda", + "lob": "Lobi", + "loc": "Inonhan", + "loe": "Saluan", + "lof": "Logol", + "log": "Logo", + "loh": "Narim", + "loi": "Loma (Côte d'Ivoire)", + "loj": "Lou", + "lok": "Loko", + "lol": "Mongo", + "lom": "Loma (Liberia)", + "lon": "Malawi Lomwe", + "loo": "Lombo", + "lop": "Lopa", + "loq": "Lobala", + "lor": "Téén", + "los": "Loniu", + "lot": "Otuho", + "lou": "Louisiana Creole", + "lov": "Lopi", + "low": "Tampias Lobu", + "lox": "Loun", + "loy": "Loke", + "loz": "Lozi", + "lpa": "Lelepa", + "lpe": "Lepki", + "lpn": "Long Phuri Naga", + "lpo": "Lipo", + "lpx": "Lopit", + "lqr": "Logir", + "lra": "Rara Bakati'", + "lrc": "Northern Luri", + "lre": "Laurentian", + "lrg": "Laragia", + "lri": "Marachi; Olumarachi", + "lrk": "Loarki", + "lrl": "Lari", + "lrm": "Marama; Olumarama", + "lrn": "Lorang", + "lro": "Laro", + "lrr": "Southern Yamphu", + "lrt": "Larantuka Malay", + "lrv": "Larevat", + "lrz": "Lemerig", + "lsa": "Lasgerdi", + "lsb": "Burundian Sign Language; Langue des Signes Burundaise", + "lsc": "Albarradas Sign Language; Lengua de señas Albarradas", + "lsd": "Lishana Deni", + "lse": "Lusengo", + "lsh": "Lish", + "lsi": "Lashi", + "lsl": "Latvian Sign Language", + "lsm": "Saamia; Olusamia", + "lsn": "Tibetan Sign Language", + "lso": "Laos Sign Language", + "lsp": "Panamanian Sign Language; Lengua de Señas Panameñas", + "lsr": "Aruop", + "lss": "Lasi", + "lst": "Trinidad and Tobago Sign Language", + "lsv": "Sivia Sign Language", + "lsw": "Seychelles Sign Language; Lalang Siny Seselwa; Langue des Signes Seychelloise", + "lsy": "Mauritian Sign Language", + "lt": "Lithuanian", + "ltc": "Late Middle Chinese", + "ltg": "Latgalian", + "lth": "Thur", + "lti": "Leti (Indonesia)", + "ltn": "Latundê", + "lto": "Tsotso; Olutsotso", + "lts": "Tachoni; Lutachoni", + "ltu": "Latu", + "lu": "Luba-Katanga", + "lua": "Luba-Lulua", + "luc": "Aringa", + "lud": "Ludian", + "lue": "Luvale", + "luf": "Laua", + "lui": "Luiseno", + "luj": "Luna", + "luk": "Lunanakha", + "lul": "Olu'bo", + "lum": "Luimbi", + "lun": "Lunda", + "luo": "Luo (Kenya and Tanzania); Dholuo", + "lup": "Lumbu", + "luq": "Lucumi", + "lur": "Laura", + "lus": "Lushai", + "lut": "Lushootseed", + "luu": "Lumba-Yakkha", + "luv": "Luwati", + "luw": "Luo (Cameroon)", + "luy": "Luyia; Oluluyia", + "luz": "Southern Luri", + "lv": "Latvian", + "lva": "Maku'a", + "lvi": "Lavi", + "lvk": "Lavukaleve", + "lvs": "Standard Latvian", + "lvu": "Levuka", + "lwa": "Lwalu", + "lwe": "Lewo Eleng", + "lwg": "Wanga; Oluwanga", + "lwh": "White Lachi", + "lwl": "Eastern Lawa", + "lwm": "Laomian", + "lwo": "Luwo", + "lws": "Malawian Sign Language", + "lwt": "Lewotobi", + "lwu": "Lawu", + "lww": "Lewo", + "lxm": "Lakurumau", + "lya": "Layakha", + "lyg": "Lyngngam", + "lyn": "Luyana", + "lzh": "Literary Chinese", + "lzl": "Litzlitz", + "lzn": "Leinong Naga", + "lzz": "Laz", + "maa": "San Jerónimo Tecóatl Mazatec", + "mab": "Yutanduchi Mixtec", + "mad": "Madurese", + "mae": "Bo-Rukul", + "maf": "Mafa", + "mag": "Magahi", + "mai": "Maithili", + "maj": "Jalapa De Díaz Mazatec", + "mak": "Makasar", + "mam": "Mam", + "man": "Mandingo; Manding", + "map": "Austronesian languages", + "maq": "Chiquihuitlán Mazatec", + "mas": "Masai", + "mat": "San Francisco Matlatzinca", + "mau": "Huautla Mazatec", + "mav": "Sateré-Mawé", + "maw": "Mampruli", + "max": "North Moluccan Malay", + "maz": "Central Mazahua", + "mba": "Higaonon", + "mbb": "Western Bukidnon Manobo", + "mbc": "Macushi", + "mbd": "Dibabawon Manobo", + "mbe": "Molale", + "mbf": "Baba Malay", + "mbh": "Mangseng", + "mbi": "Ilianen Manobo", + "mbj": "Nadëb", + "mbk": "Malol", + "mbl": "Maxakalí", + "mbm": "Ombamba", + "mbn": "Macaguán", + "mbo": "Mbo (Cameroon)", + "mbp": "Malayo", + "mbq": "Maisin", + "mbr": "Nukak Makú", + "mbs": "Sarangani Manobo", + "mbt": "Matigsalug Manobo", + "mbu": "Mbula-Bwazza", + "mbv": "Mbulungish", + "mbw": "Maring", + "mbx": "Mari (East Sepik Province)", + "mby": "Memoni", + "mbz": "Amoltepec Mixtec", + "mca": "Maca", + "mcb": "Machiguenga", + "mcc": "Bitur", + "mcd": "Sharanahua", + "mce": "Itundujia Mixtec", + "mcf": "Matsés", + "mcg": "Mapoyo", + "mch": "Maquiritari", + "mci": "Mese", + "mcj": "Mvanip", + "mck": "Mbunda", + "mcl": "Macaguaje", + "mcm": "Malaccan Creole Portuguese", + "mcn": "Masana", + "mco": "Coatlán Mixe", + "mcp": "Makaa", + "mcq": "Ese", + "mcr": "Menya", + "mcs": "Mambai", + "mct": "Mengisa", + "mcu": "Cameroon Mambila", + "mcv": "Minanibai", + "mcw": "Mawa (Chad)", + "mcx": "Mpiemo", + "mcy": "South Watut", + "mcz": "Mawan", + "mda": "Mada (Nigeria)", + "mdb": "Morigi", + "mdc": "Male (Papua New Guinea)", + "mdd": "Mbum", + "mde": "Maba (Chad)", + "mdf": "Moksha", + "mdg": "Massalat", + "mdh": "Maguindanaon", + "mdi": "Mamvu", + "mdj": "Mangbetu", + "mdk": "Mangbutu", + "mdl": "Maltese Sign Language", + "mdm": "Mayogo", + "mdn": "Mbati", + "mdp": "Mbala", + "mdq": "Mbole", + "mdr": "Mandar", + "mds": "Maria (Papua New Guinea)", + "mdt": "Mbere", + "mdu": "Mboko", + "mdv": "Santa Lucía Monteverde Mixtec", + "mdw": "Mbosi", + "mdx": "Dizin", + "mdy": "Male (Ethiopia)", + "mdz": "Suruí Do Pará", + "mea": "Menka", + "meb": "Ikobi", + "mec": "Marra", + "med": "Melpa", + "mee": "Mengen", + "mef": "Megam", + "meh": "Southwestern Tlaxiaco Mixtec", + "mei": "Midob", + "mej": "Meyah", + "mek": "Mekeo", + "mel": "Central Melanau", + "mem": "Mangala", + "men": "Mende (Sierra Leone)", + "meo": "Kedah Malay", + "mep": "Miriwoong", + "meq": "Merey", + "mer": "Meru", + "mes": "Masmaje", + "met": "Mato", + "meu": "Motu", + "mev": "Mano", + "mew": "Maaka", + "mey": "Hassaniyya", + "mez": "Menominee", + "mfa": "Pattani Malay", + "mfb": "Bangka", + "mfc": "Mba", + "mfd": "Mendankwe-Nkwen", + "mfe": "Morisyen", + "mff": "Naki", + "mfg": "Mogofin", + "mfh": "Matal", + "mfi": "Wandala", + "mfj": "Mefele", + "mfk": "North Mofu", + "mfl": "Putai", + "mfm": "Marghi South", + "mfn": "Cross River Mbembe", + "mfo": "Mbe", + "mfp": "Makassar Malay", + "mfq": "Moba", + "mfr": "Marrithiyel", + "mfs": "Mexican Sign Language", + "mft": "Mokerang", + "mfu": "Mbwela", + "mfv": "Mandjak", + "mfw": "Mulaha", + "mfx": "Melo", + "mfy": "Mayo", + "mfz": "Mabaan", + "mg": "Malagasy", + "mga": "Middle Irish (900-1200)", + "mgb": "Mararit", + "mgc": "Morokodo", + "mgd": "Moru", + "mge": "Mango", + "mgf": "Maklew", + "mgg": "Mpumpong", + "mgh": "Makhuwa-Meetto", + "mgi": "Lijili", + "mgj": "Abureni", + "mgk": "Mawes", + "mgl": "Maleu-Kilenge", + "mgm": "Mambae", + "mgn": "Mbangi", + "mgo": "Meta'", + "mgp": "Eastern Magar", + "mgq": "Malila", + "mgr": "Mambwe-Lungu", + "mgs": "Manda (Tanzania)", + "mgt": "Mongol", + "mgu": "Mailu", + "mgv": "Matengo", + "mgw": "Matumbi", + "mgy": "Mbunga", + "mgz": "Mbugwe", + "mh": "Marshallese", + "mha": "Manda (India)", + "mhb": "Mahongwe", + "mhc": "Mocho", + "mhd": "Mbugu", + "mhe": "Besisi; Mah Meri", + "mhf": "Mamaa", + "mhg": "Margu", + "mhi": "Ma'di", + "mhj": "Mogholi", + "mhk": "Mungaka", + "mhl": "Mauwake", + "mhm": "Makhuwa-Moniga", + "mhn": "Mócheno", + "mho": "Mashi (Zambia)", + "mhp": "Balinese Malay", + "mhq": "Mandan", + "mhr": "Eastern Mari", + "mhs": "Buru (Indonesia)", + "mht": "Mandahuaca", + "mhu": "Digaro-Mishmi; Darang Deng", + "mhw": "Mbukushu", + "mhx": "Maru; Lhaovo", + "mhy": "Ma'anyan", + "mhz": "Mor (Mor Islands)", + "mi": "Maori", + "mia": "Miami", + "mib": "Atatláhuca Mixtec", + "mic": "Mi'kmaq; Micmac", + "mid": "Mandaic", + "mie": "Ocotepec Mixtec", + "mif": "Mofu-Gudur", + "mig": "San Miguel El Grande Mixtec", + "mih": "Chayuco Mixtec", + "mii": "Chigmecatitlán Mixtec", + "mij": "Abar; Mungbam", + "mik": "Mikasuki", + "mil": "Peñoles Mixtec", + "mim": "Alacatlatzala Mixtec", + "min": "Minangkabau", + "mio": "Pinotepa Nacional Mixtec", + "mip": "Apasco-Apoala Mixtec", + "miq": "Mískito", + "mir": "Isthmus Mixe", + "mit": "Southern Puebla Mixtec", + "miu": "Cacaloxtepec Mixtec", + "miw": "Akoye", + "mix": "Mixtepec Mixtec", + "miy": "Ayutla Mixtec", + "miz": "Coatzospan Mixtec", + "mjb": "Makalero", + "mjc": "San Juan Colorado Mixtec", + "mjd": "Northwest Maidu", + "mje": "Muskum", + "mjg": "Tu", + "mjh": "Mwera (Nyasa)", + "mji": "Kim Mun", + "mjj": "Mawak", + "mjk": "Matukar", + "mjl": "Mandeali", + "mjm": "Medebur", + "mjn": "Ma (Papua New Guinea)", + "mjo": "Malankuravan", + "mjp": "Malapandaram", + "mjq": "Malaryan", + "mjr": "Malavedan", + "mjs": "Miship", + "mjt": "Sauria Paharia", + "mju": "Manna-Dora", + "mjv": "Mannan", + "mjw": "Karbi", + "mjx": "Mahali", + "mjy": "Mahican", + "mjz": "Majhi", + "mk": "Macedonian", + "mka": "Mbre", + "mkb": "Mal Paharia", + "mkc": "Siliput", + "mke": "Mawchi", + "mkf": "Miya", + "mkg": "Mak (China)", + "mkh": "Mon-Khmer languages", + "mki": "Dhatki", + "mkj": "Mokilese", + "mkk": "Byep", + "mkl": "Mokole", + "mkm": "Moklen", + "mkn": "Kupang Malay", + "mko": "Mingang Doso", + "mkp": "Moikodi", + "mkq": "Bay Miwok", + "mkr": "Malas", + "mks": "Silacayoapan Mixtec", + "mkt": "Vamale", + "mku": "Konyanka Maninka", + "mkv": "Mafea", + "mkw": "Kituba (Congo)", + "mkx": "Kinamiging Manobo", + "mky": "East Makian", + "mkz": "Makasae", + "ml": "Malayalam", + "mla": "Malo", + "mlb": "Mbule", + "mlc": "Cao Lan", + "mle": "Manambu", + "mlf": "Mal", + "mlh": "Mape", + "mli": "Malimpung", + "mlj": "Miltu", + "mlk": "Ilwana; Kiwilwana", + "mll": "Malua Bay", + "mlm": "Mulam", + "mln": "Malango", + "mlo": "Mlomp", + "mlp": "Bargam", + "mlq": "Western Maninkakan", + "mlr": "Vame", + "mls": "Masalit", + "mlu": "To'abaita", + "mlv": "Motlav; Mwotlap", + "mlw": "Moloko", + "mlx": "Malfaxal; Naha'ai", + "mlz": "Malaynon", + "mma": "Mama", + "mmb": "Momina", + "mmc": "Michoacán Mazahua", + "mmd": "Maonan", + "mme": "Mae", + "mmf": "Mundat", + "mmg": "North Ambrym", + "mmh": "Mehináku", + "mmi": "Musar", + "mmj": "Majhwar", + "mmk": "Mukha-Dora", + "mml": "Man Met", + "mmm": "Maii", + "mmn": "Mamanwa", + "mmo": "Mangga Buang", + "mmp": "Siawi", + "mmq": "Musak", + "mmr": "Western Xiangxi Miao", + "mmt": "Malalamai", + "mmu": "Mmaala", + "mmv": "Miriti", + "mmw": "Emae", + "mmx": "Madak", + "mmy": "Migaama", + "mmz": "Mabaale", + "mn": "Mongolian", + "mna": "Mbula", + "mnb": "Muna", + "mnc": "Manchu", + "mnd": "Mondé", + "mne": "Naba", + "mnf": "Mundani", + "mng": "Eastern Mnong", + "mnh": "Mono (Democratic Republic of Congo)", + "mni": "Manipuri", + "mnj": "Munji", + "mnk": "Mandinka", + "mnl": "Tiale", + "mnm": "Mapena", + "mnn": "Southern Mnong", + "mno": "Manobo languages", + "mnp": "Min Bei Chinese", + "mnq": "Minriq", + "mnr": "Mono (USA)", + "mns": "Mansi", + "mnu": "Mer", + "mnv": "Rennell-Bellona", + "mnw": "Mon", + "mnx": "Manikion", + "mny": "Manyawa", + "mnz": "Moni", + "moa": "Mwan", + "moc": "Mocoví", + "mod": "Mobilian", + "moe": "Innu; Montagnais", + "mog": "Mongondow", + "moh": "Mohawk", + "moi": "Mboi", + "moj": "Monzombo", + "mok": "Morori", + "mom": "Mangue", + "moo": "Monom", + "mop": "Mopán Maya", + "moq": "Mor (Bomberai Peninsula)", + "mor": "Moro", + "mos": "Mossi", + "mot": "Barí", + "mou": "Mogum", + "mov": "Mohave", + "mow": "Moi (Congo)", + "mox": "Molima", + "moy": "Shekkacho", + "moz": "Mukulu; Gergiko", + "mpa": "Mpoto", + "mpb": "Malak Malak; Mullukmulluk", + "mpc": "Mangarrayi", + "mpd": "Machinere", + "mpe": "Majang", + "mpg": "Marba", + "mph": "Maung", + "mpi": "Mpade", + "mpj": "Martu Wangka; Wangkajunga", + "mpk": "Mbara (Chad)", + "mpl": "Middle Watut", + "mpm": "Yosondúa Mixtec", + "mpn": "Mindiri", + "mpo": "Miu", + "mpp": "Migabac", + "mpq": "Matís", + "mpr": "Vangunu", + "mps": "Dadibi", + "mpt": "Mian", + "mpu": "Makuráp", + "mpv": "Mungkip", + "mpw": "Mapidian", + "mpx": "Misima-Panaeati", + "mpy": "Mapia", + "mpz": "Mpi", + "mqa": "Maba (Indonesia)", + "mqb": "Mbuko", + "mqc": "Mangole", + "mqe": "Matepi", + "mqf": "Momuna", + "mqg": "Kota Bangun Kutai Malay", + "mqh": "Tlazoyaltepec Mixtec", + "mqi": "Mariri", + "mqj": "Mamasa", + "mqk": "Rajah Kabunsuwan Manobo", + "mql": "Mbelime", + "mqm": "South Marquesan", + "mqn": "Moronene", + "mqo": "Modole", + "mqp": "Manipa", + "mqq": "Minokok", + "mqr": "Mander", + "mqs": "West Makian", + "mqt": "Mok", + "mqu": "Mandari", + "mqv": "Mosimo", + "mqw": "Murupi", + "mqx": "Mamuju", + "mqy": "Manggarai", + "mqz": "Pano", + "mr": "Marathi", + "mra": "Mlabri", + "mrb": "Marino", + "mrc": "Maricopa", + "mrd": "Western Magar", + "mre": "Martha's Vineyard Sign Language", + "mrf": "Elseng", + "mrg": "Mising", + "mrh": "Mara Chin", + "mrj": "Western Mari", + "mrk": "Hmwaveke", + "mrl": "Mortlockese", + "mrm": "Merlav; Mwerlap", + "mrn": "Cheke Holo", + "mro": "Mru", + "mrp": "Morouas", + "mrq": "North Marquesan", + "mrr": "Maria (India)", + "mrs": "Maragus", + "mrt": "Marghi Central", + "mru": "Mono (Cameroon)", + "mrv": "Mangareva", + "mrw": "Maranao", + "mrx": "Maremgi; Dineor", + "mry": "Mandaya", + "mrz": "Marind", + "ms": "Malay (macrolanguage)", + "msb": "Masbatenyo", + "msc": "Sankaran Maninka", + "msd": "Yucatec Maya Sign Language", + "mse": "Musey", + "msf": "Mekwei", + "msg": "Moraid", + "msh": "Masikoro Malagasy", + "msi": "Sabah Malay", + "msj": "Ma (Democratic Republic of Congo)", + "msk": "Mansaka", + "msl": "Molof; Poule", + "msm": "Agusan Manobo", + "msn": "Vurës", + "mso": "Mombum", + "msp": "Maritsauá", + "msq": "Caac", + "msr": "Mongolian Sign Language", + "mss": "West Masela", + "msu": "Musom", + "msv": "Maslam", + "msw": "Mansoanka", + "msx": "Moresada", + "msy": "Aruamu", + "msz": "Momare", + "mt": "Maltese", + "mta": "Cotabato Manobo", + "mtb": "Anyin Morofo", + "mtc": "Munit", + "mtd": "Mualang", + "mte": "Mono (Solomon Islands)", + "mtf": "Murik (Papua New Guinea)", + "mtg": "Una", + "mth": "Munggui", + "mti": "Maiwa (Papua New Guinea)", + "mtj": "Moskona", + "mtk": "Mbe'", + "mtl": "Montol", + "mtm": "Mator", + "mtn": "Matagalpa", + "mto": "Totontepec Mixe", + "mtp": "Wichí Lhamtés Nocten", + "mtq": "Muong", + "mtr": "Mewari", + "mts": "Yora", + "mtt": "Mota", + "mtu": "Tututepec Mixtec", + "mtv": "Asaro'o", + "mtw": "Southern Binukidnon", + "mtx": "Tidaá Mixtec", + "mty": "Nabi", + "mua": "Mundang", + "mub": "Mubi", + "muc": "Ajumbu", + "mud": "Mednyj Aleut", + "mue": "Media Lengua", + "mug": "Musgu", + "muh": "Mündü", + "mui": "Musi", + "muj": "Mabire", + "muk": "Mugom", + "mum": "Maiwala", + "mun": "Munda languages", + "muo": "Nyong", + "mup": "Malvi", + "muq": "Eastern Xiangxi Miao", + "mur": "Murle", + "mus": "Creek", + "mut": "Western Muria", + "muu": "Yaaku", + "muv": "Muthuvan", + "mux": "Bo-Ung", + "muy": "Muyang", + "muz": "Mursi", + "mva": "Manam", + "mvb": "Mattole", + "mvd": "Mamboru", + "mve": "Marwari (Pakistan)", + "mvf": "Peripheral Mongolian", + "mvg": "Yucuañe Mixtec", + "mvh": "Mulgi", + "mvi": "Miyako", + "mvk": "Mekmek", + "mvl": "Mbara (Australia)", + "mvn": "Minaveha", + "mvo": "Marovo", + "mvp": "Duri", + "mvq": "Moere", + "mvr": "Marau", + "mvs": "Massep", + "mvt": "Mpotovoro", + "mvu": "Marfa", + "mvv": "Tagal Murut", + "mvw": "Machinga", + "mvx": "Meoswar", + "mvy": "Indus Kohistani", + "mvz": "Mesqan", + "mwa": "Mwatebu", + "mwb": "Juwal", + "mwc": "Are", + "mwe": "Mwera (Chimwera)", + "mwf": "Murrinh-Patha", + "mwg": "Aiklep", + "mwh": "Mouk-Aria", + "mwi": "Labo; Ninde", + "mwk": "Kita Maninkakan", + "mwl": "Mirandese", + "mwm": "Sar", + "mwn": "Nyamwanga", + "mwo": "Central Maewo", + "mwp": "Kala Lagaw Ya", + "mwq": "Mün Chin", + "mwr": "Marwari", + "mws": "Mwimbi-Muthambi", + "mwt": "Moken", + "mwu": "Mittu", + "mwv": "Mentawai", + "mww": "Hmong Daw", + "mwz": "Moingi", + "mxa": "Northwest Oaxaca Mixtec", + "mxb": "Tezoatlán Mixtec", + "mxc": "Manyika", + "mxd": "Modang", + "mxe": "Mele-Fila", + "mxf": "Malgbe", + "mxg": "Mbangala", + "mxh": "Mvuba", + "mxi": "Mozarabic", + "mxj": "Miju-Mishmi; Geman Deng", + "mxk": "Monumbo", + "mxl": "Maxi Gbe", + "mxm": "Meramera", + "mxn": "Moi (Indonesia)", + "mxo": "Mbowe", + "mxp": "Tlahuitoltepec Mixe", + "mxq": "Juquila Mixe", + "mxr": "Murik (Malaysia)", + "mxs": "Huitepec Mixtec", + "mxt": "Jamiltepec Mixtec", + "mxu": "Mada (Cameroon)", + "mxv": "Metlatónoc Mixtec", + "mxw": "Namo", + "mxx": "Mahou; Mawukakan", + "mxy": "Southeastern Nochixtlán Mixtec", + "mxz": "Central Masela", + "my": "Burmese", + "myb": "Mbay", + "myc": "Mayeka", + "mye": "Myene", + "myf": "Bambassi", + "myg": "Manta", + "myh": "Makah", + "myj": "Mangayat", + "myk": "Mamara Senoufo", + "myl": "Moma", + "mym": "Me'en", + "myn": "Mayan languages", + "myo": "Anfillo", + "myp": "Pirahã", + "myr": "Muniche", + "mys": "Mesmes", + "myu": "Mundurukú", + "myv": "Erzya", + "myw": "Muyuw", + "myx": "Masaaba", + "myy": "Macuna", + "myz": "Classical Mandaic", + "mza": "Santa María Zacatepec Mixtec", + "mzb": "Tumzabt", + "mzc": "Madagascar Sign Language", + "mzd": "Malimba", + "mze": "Morawa", + "mzg": "Monastic Sign Language", + "mzh": "Wichí Lhamtés Güisnay", + "mzi": "Ixcatlán Mazatec", + "mzj": "Manya", + "mzk": "Nigeria Mambila", + "mzl": "Mazatlán Mixe", + "mzm": "Mumuye", + "mzn": "Mazanderani", + "mzo": "Matipuhy", + "mzp": "Movima", + "mzq": "Mori Atas", + "mzr": "Marúbo", + "mzs": "Macanese", + "mzt": "Mintil", + "mzu": "Inapang", + "mzv": "Manza", + "mzw": "Deg", + "mzx": "Mawayana", + "mzy": "Mozambican Sign Language", + "mzz": "Maiadomu", + "na": "Nauru", + "naa": "Namla", + "nab": "Southern Nambikuára", + "nac": "Narak", + "nae": "Naka'ela", + "naf": "Nabak", + "nag": "Naga Pidgin", + "nah": "Nahuatl languages", + "nai": "North American Indian languages", + "naj": "Nalu", + "nak": "Nakanai", + "nal": "Nalik", + "nam": "Ngan'gityemerri", + "nan": "Min Nan Chinese", + "nao": "Naaba", + "nap": "Neapolitan", + "naq": "Khoekhoe; Nama (Namibia)", + "nar": "Iguta", + "nas": "Naasioi", + "nat": "Ca̱hungwa̱rya̱; Hungworo", + "naw": "Nawuri", + "nax": "Nakwi", + "nay": "Ngarrindjeri", + "naz": "Coatepec Nahuatl", + "nb": "Norwegian Bokmål", + "nba": "Nyemba", + "nbb": "Ndoe", + "nbc": "Chang Naga", + "nbd": "Ngbinda", + "nbe": "Konyak Naga", + "nbg": "Nagarchal", + "nbh": "Ngamo", + "nbi": "Mao Naga", + "nbj": "Ngarinyman", + "nbk": "Nake", + "nbm": "Ngbaka Ma'bo", + "nbn": "Kuri", + "nbo": "Nkukoli", + "nbp": "Nnam", + "nbq": "Nggem", + "nbr": "Numana", + "nbs": "Namibian Sign Language", + "nbt": "Na", + "nbu": "Rongmei Naga", + "nbv": "Ngamambo", + "nbw": "Southern Ngbandi", + "nby": "Ningera", + "nca": "Iyo", + "ncb": "Central Nicobarese", + "ncc": "Ponam", + "ncd": "Nachering", + "nce": "Yale", + "ncf": "Notsi", + "ncg": "Nisga'a", + "nch": "Central Huasteca Nahuatl", + "nci": "Classical Nahuatl", + "ncj": "Northern Puebla Nahuatl", + "nck": "Na-kara", + "ncl": "Michoacán Nahuatl", + "ncm": "Nambo", + "ncn": "Nauna", + "nco": "Sibe", + "ncq": "Northern Katang", + "ncr": "Ncane", + "ncs": "Nicaraguan Sign Language", + "nct": "Chothe Naga", + "ncu": "Chumburung", + "ncx": "Central Puebla Nahuatl", + "ncz": "Natchez", + "nd": "North Ndebele", + "nda": "Ndasa", + "ndb": "Kenswei Nsei", + "ndc": "Ndau", + "ndd": "Nde-Nsele-Nta", + "ndf": "Nadruvian", + "ndg": "Ndengereko", + "ndh": "Ndali", + "ndi": "Samba Leko", + "ndj": "Ndamba", + "ndk": "Ndaka", + "ndl": "Ndolo", + "ndm": "Ndam", + "ndn": "Ngundi", + "ndp": "Ndo", + "ndq": "Ndombe", + "ndr": "Ndoola", + "nds": "Low German; Low Saxon", + "ndt": "Ndunga", + "ndu": "Dugun", + "ndv": "Ndut", + "ndw": "Ndobo", + "ndx": "Nduga", + "ndy": "Lutos", + "ndz": "Ndogo", + "ne": "Nepali (macrolanguage)", + "nea": "Eastern Ngad'a", + "neb": "Toura (Côte d'Ivoire)", + "nec": "Nedebang", + "ned": "Nde-Gbite", + "nee": "Nêlêmwa-Nixumwak", + "nef": "Nefamese", + "neg": "Negidal", + "neh": "Nyenkha", + "nei": "Neo-Hittite", + "nej": "Neko", + "nek": "Neku", + "nem": "Nemi", + "nen": "Nengone", + "neo": "Ná-Meo", + "neq": "North Central Mixe", + "ner": "Yahadian", + "nes": "Bhoti Kinnauri", + "net": "Nete", + "neu": "Neo", + "nev": "Nyaheun", + "new": "Newari; Nepal Bhasa", + "nex": "Neme", + "ney": "Neyo", + "nez": "Nez Perce", + "nfa": "Dhao", + "nfd": "Ahwai", + "nfl": "Ayiwo; Äiwoo", + "nfr": "Nafaanra", + "nfu": "Mfumte", + "ng": "Ndonga", + "nga": "Ngbaka", + "ngb": "Northern Ngbandi", + "ngc": "Ngombe (Democratic Republic of Congo)", + "ngd": "Ngando (Central African Republic)", + "nge": "Ngemba", + "ngf": "Trans-New Guinea languages", + "ngg": "Ngbaka Manza", + "ngh": "Nǁng", + "ngi": "Ngizim", + "ngj": "Ngie", + "ngk": "Dalabon", + "ngl": "Lomwe", + "ngm": "Ngatik Men's Creole", + "ngn": "Ngwo", + "ngp": "Ngulu", + "ngq": "Ngurimi; Ngoreme", + "ngr": "Engdewu", + "ngs": "Gvoko", + "ngt": "Kriang; Ngeq", + "ngu": "Guerrero Nahuatl", + "ngv": "Nagumi", + "ngw": "Ngwaba", + "ngx": "Nggwahyi", + "ngy": "Tibea", + "ngz": "Ngungwel", + "nha": "Nhanda", + "nhb": "Beng", + "nhc": "Tabasco Nahuatl", + "nhd": "Chiripá; Ava Guaraní", + "nhe": "Eastern Huasteca Nahuatl", + "nhf": "Nhuwala", + "nhg": "Tetelcingo Nahuatl", + "nhh": "Nahari", + "nhi": "Zacatlán-Ahuacatlán-Tepetzintla Nahuatl", + "nhk": "Isthmus-Cosoleacaque Nahuatl", + "nhm": "Morelos Nahuatl", + "nhn": "Central Nahuatl", + "nho": "Takuu", + "nhp": "Isthmus-Pajapan Nahuatl", + "nhq": "Huaxcaleca Nahuatl", + "nhr": "Naro", + "nht": "Ometepec Nahuatl", + "nhu": "Noone", + "nhv": "Temascaltepec Nahuatl", + "nhw": "Western Huasteca Nahuatl", + "nhx": "Isthmus-Mecayapan Nahuatl", + "nhy": "Northern Oaxaca Nahuatl", + "nhz": "Santa María La Alta Nahuatl", + "nia": "Nias", + "nib": "Nakame", + "nic": "Niger-Kordofanian languages", + "nid": "Ngandi", + "nie": "Niellim", + "nif": "Nek", + "nig": "Ngalakgan", + "nih": "Nyiha (Tanzania)", + "nii": "Nii", + "nij": "Ngaju", + "nik": "Southern Nicobarese", + "nil": "Nila", + "nim": "Nilamba", + "nin": "Ninzo", + "nio": "Nganasan", + "niq": "Nandi", + "nir": "Nimboran", + "nis": "Nimi", + "nit": "Southeastern Kolami", + "niu": "Niuean", + "niv": "Gilyak", + "niw": "Nimo", + "nix": "Hema", + "niy": "Ngiti", + "niz": "Ningil", + "nja": "Nzanyi", + "njb": "Nocte Naga", + "njd": "Ndonde Hamba", + "njh": "Lotha Naga", + "nji": "Gudanji", + "njj": "Njen", + "njl": "Njalgulgule", + "njm": "Angami Naga", + "njn": "Liangmai Naga", + "njo": "Ao Naga", + "njr": "Njerep", + "njs": "Nisa", + "njt": "Ndyuka-Trio Pidgin", + "nju": "Ngadjunmaya", + "njx": "Kunyi", + "njy": "Njyem", + "njz": "Nyishi", + "nka": "Nkoya", + "nkb": "Khoibu Naga", + "nkc": "Nkongho", + "nkd": "Koireng", + "nke": "Duke", + "nkf": "Inpui Naga", + "nkg": "Nekgini", + "nkh": "Khezha Naga", + "nki": "Thangal Naga", + "nkj": "Nakai", + "nkk": "Nokuku", + "nkm": "Namat", + "nkn": "Nkangala", + "nko": "Nkonya", + "nkp": "Niuatoputapu", + "nkq": "Nkami", + "nkr": "Nukuoro", + "nks": "North Asmat", + "nkt": "Nyika (Tanzania)", + "nku": "Bouna Kulango", + "nkv": "Nyika (Malawi and Zambia)", + "nkw": "Nkutu", + "nkx": "Nkoroo", + "nkz": "Nkari", + "nl": "Dutch; Flemish", + "nla": "Ngombale", + "nlc": "Nalca", + "nle": "East Nyala", + "nlg": "Gela", + "nli": "Grangali", + "nlj": "Nyali", + "nlk": "Ninia Yali", + "nll": "Nihali", + "nlm": "Mankiyali", + "nlo": "Ngul", + "nlq": "Lao Naga", + "nlu": "Nchumbulu", + "nlv": "Orizaba Nahuatl", + "nlw": "Walangama", + "nlx": "Nahali", + "nly": "Nyamal", + "nlz": "Nalögo", + "nma": "Maram Naga", + "nmb": "Big Nambas; V'ënen Taut", + "nmc": "Ngam", + "nmd": "Ndumu", + "nme": "Mzieme Naga", + "nmf": "Tangkhul Naga (India)", + "nmg": "Kwasio", + "nmh": "Monsang Naga", + "nmi": "Nyam", + "nmj": "Ngombe (Central African Republic)", + "nmk": "Namakura", + "nml": "Ndemli", + "nmm": "Manangba", + "nmn": "ǃXóõ", + "nmo": "Moyon Naga", + "nmp": "Nimanbur", + "nmq": "Nambya", + "nmr": "Nimbari", + "nms": "Letemboi", + "nmt": "Namonuito", + "nmu": "Northeast Maidu", + "nmv": "Ngamini", + "nmw": "Nimoa; Rifao", + "nmx": "Nama (Papua New Guinea)", + "nmy": "Namuyi", + "nmz": "Nawdm", + "nn": "Norwegian Nynorsk", + "nna": "Nyangumarta", + "nnb": "Nande", + "nnc": "Nancere", + "nnd": "West Ambae", + "nne": "Ngandyera", + "nnf": "Ngaing", + "nng": "Maring Naga", + "nnh": "Ngiemboon", + "nni": "North Nuaulu", + "nnj": "Nyangatom", + "nnk": "Nankina", + "nnl": "Northern Rengma Naga", + "nnm": "Namia", + "nnn": "Ngete", + "nnp": "Wancho Naga", + "nnq": "Ngindo", + "nnr": "Narungga", + "nnt": "Nanticoke", + "nnu": "Dwang", + "nnv": "Nugunu (Australia)", + "nnw": "Southern Nuni", + "nny": "Nyangga", + "nnz": "Nda'nda'", + "no": "Norwegian", + "noa": "Woun Meu", + "noc": "Nuk", + "nod": "Northern Thai", + "noe": "Nimadi", + "nof": "Nomane", + "nog": "Nogai", + "noh": "Nomu", + "noi": "Noiri", + "noj": "Nonuya", + "nok": "Nooksack", + "nol": "Nomlaki", + "nom": "Nocamán", + "non": "Old Norse", + "nop": "Numanggang", + "noq": "Ngongo", + "nos": "Eastern Nisu", + "not": "Nomatsiguenga", + "nou": "Ewage-Notu", + "nov": "Novial", + "now": "Nyambo", + "noy": "Noy", + "noz": "Nayi", + "npa": "Nar Phu", + "npb": "Nupbikha", + "npg": "Ponyo-Gongwang Naga", + "nph": "Phom Naga", + "npi": "Nepali (individual language)", + "npl": "Southeastern Puebla Nahuatl", + "npn": "Mondropolon", + "npo": "Pochuri Naga", + "nps": "Nipsan", + "npu": "Puimei Naga", + "npx": "Noipx", + "npy": "Napu", + "nqg": "Southern Nago", + "nqk": "Kura Ede Nago", + "nql": "Ngendelengo", + "nqm": "Ndom", + "nqn": "Nen", + "nqo": "N'Ko; N’Ko", + "nqq": "Kyan-Karyaw Naga", + "nqt": "Nteng", + "nqy": "Akyaung Ari Naga", + "nr": "South Ndebele", + "nra": "Ngom", + "nrb": "Nara", + "nrc": "Noric", + "nre": "Southern Rengma Naga", + "nrf": "Jèrriais; Guernésiais", + "nrg": "Narango", + "nri": "Chokri Naga", + "nrk": "Ngarla", + "nrl": "Ngarluma", + "nrm": "Narom", + "nrn": "Norn", + "nrp": "North Picene", + "nrr": "Norra; Nora", + "nrt": "Northern Kalapuya", + "nru": "Narua", + "nrx": "Ngurmbur", + "nrz": "Lala", + "nsa": "Sangtam Naga", + "nsb": "Lower Nossob", + "nsc": "Nshi", + "nsd": "Southern Nisu", + "nse": "Nsenga", + "nsf": "Northwestern Nisu", + "nsg": "Ngasa", + "nsh": "Ngoshie", + "nsi": "Nigerian Sign Language", + "nsk": "Naskapi", + "nsl": "Norwegian Sign Language", + "nsm": "Sumi Naga", + "nsn": "Nehan", + "nso": "Pedi; Northern Sotho; Sepedi", + "nsp": "Nepalese Sign Language", + "nsq": "Northern Sierra Miwok", + "nsr": "Maritime Sign Language", + "nss": "Nali", + "nst": "Tase Naga", + "nsu": "Sierra Negra Nahuatl", + "nsv": "Southwestern Nisu", + "nsw": "Navut", + "nsx": "Nsongo", + "nsy": "Nasal", + "nsz": "Nisenan", + "ntd": "Northern Tidung", + "nte": "Nathembo", + "ntg": "Ngantangarra", + "nti": "Natioro", + "ntj": "Ngaanyatjarra", + "ntk": "Ikoma-Nata-Isenye", + "ntm": "Nateni", + "nto": "Ntomba", + "ntp": "Northern Tepehuan", + "ntr": "Delo", + "ntu": "Natügu", + "ntw": "Nottoway", + "ntx": "Tangkhul Naga (Myanmar)", + "nty": "Mantsi", + "ntz": "Natanzi", + "nua": "Yuanga", + "nub": "Nubian languages", + "nuc": "Nukuini", + "nud": "Ngala", + "nue": "Ngundu", + "nuf": "Nusu", + "nug": "Nungali", + "nuh": "Ndunda", + "nui": "Ngumbi", + "nuj": "Nyole", + "nuk": "Nuu-chah-nulth; Nuuchahnulth", + "nul": "Nusa Laut", + "num": "Niuafo'ou", + "nun": "Anong", + "nuo": "Nguôn", + "nup": "Nupe-Nupe-Tako", + "nuq": "Nukumanu", + "nur": "Nukuria", + "nus": "Nuer", + "nut": "Nung (Viet Nam)", + "nuu": "Ngbundu", + "nuv": "Northern Nuni", + "nuw": "Nguluwan", + "nux": "Mehek", + "nuy": "Nunggubuyu", + "nuz": "Tlamacazapa Nahuatl", + "nv": "Navajo; Navaho", + "nvh": "Nasarian", + "nvm": "Namiae", + "nvo": "Nyokon", + "nwa": "Nawathinehena", + "nwb": "Nyabwa", + "nwc": "Classical Newari; Classical Nepal Bhasa; Old Newari", + "nwe": "Ngwe", + "nwg": "Ngayawung", + "nwi": "Southwest Tanna", + "nwm": "Nyamusa-Molo", + "nwo": "Nauo", + "nwr": "Nawaru", + "nww": "Ndwewe", + "nwx": "Middle Newar", + "nwy": "Nottoway-Meherrin", + "nxa": "Nauete", + "nxd": "Ngando (Democratic Republic of Congo)", + "nxe": "Nage", + "nxg": "Ngad'a", + "nxi": "Nindi", + "nxk": "Koki Naga", + "nxl": "South Nuaulu", + "nxm": "Numidian", + "nxn": "Ngawun", + "nxo": "Ndambomo", + "nxq": "Naxi", + "nxr": "Ninggerum", + "nxx": "Nafri", + "ny": "Nyanja; Chewa; Chichewa", + "nyb": "Nyangbo", + "nyc": "Nyanga-li", + "nyd": "Nyore; Olunyole", + "nye": "Nyengo", + "nyf": "Giryama; Kigiryama", + "nyg": "Nyindu", + "nyh": "Nyikina", + "nyi": "Ama (Sudan)", + "nyj": "Nyanga", + "nyk": "Nyaneka", + "nyl": "Nyeu", + "nym": "Nyamwezi", + "nyn": "Nyankole", + "nyo": "Nyoro", + "nyp": "Nyang'i", + "nyq": "Nayini", + "nyr": "Nyiha (Malawi)", + "nys": "Nyungar", + "nyt": "Nyawaygi", + "nyu": "Nyungwe", + "nyv": "Nyulnyul", + "nyw": "Nyaw", + "nyx": "Nganyaywana", + "nyy": "Nyakyusa-Ngonde", + "nza": "Tigon Mbembe", + "nzb": "Njebi", + "nzd": "Nzadi", + "nzi": "Nzima", + "nzk": "Nzakara", + "nzm": "Zeme Naga", + "nzs": "New Zealand Sign Language", + "nzu": "Teke-Nzikou", + "nzy": "Nzakambay", + "nzz": "Nanga Dama Dogon", + "oaa": "Orok", + "oac": "Oroch", + "oar": "Old Aramaic (up to 700 BCE); Ancient Aramaic (up to 700 BCE)", + "oav": "Old Avar", + "obi": "Obispeño", + "obk": "Southern Bontok", + "obl": "Oblo", + "obm": "Moabite", + "obo": "Obo Manobo", + "obr": "Old Burmese", + "obt": "Old Breton", + "obu": "Obulom", + "oc": "Occitan (post 1500)", + "oca": "Ocaina", + "och": "Old Chinese", + "ocm": "Old Cham", + "oco": "Old Cornish", + "ocu": "Atzingo Matlatzinca", + "oda": "Odut", + "odk": "Od", + "odt": "Old Dutch", + "odu": "Odual", + "ofo": "Ofo", + "ofs": "Old Frisian", + "ofu": "Efutop", + "ogb": "Ogbia", + "ogc": "Ogbah", + "oge": "Old Georgian", + "ogg": "Ogbogolo", + "ogo": "Khana", + "ogu": "Ogbronuagum", + "oht": "Old Hittite", + "ohu": "Old Hungarian", + "oia": "Oirata", + "oie": "Okolie", + "oin": "Inebu One", + "oj": "Ojibwa", + "ojb": "Northwestern Ojibwa", + "ojc": "Central Ojibwa", + "ojg": "Eastern Ojibwa", + "ojp": "Old Japanese", + "ojs": "Severn Ojibwa", + "ojv": "Ontong Java", + "ojw": "Western Ojibwa", + "oka": "Okanagan", + "okb": "Okobo", + "okc": "Kobo", + "okd": "Okodia", + "oke": "Okpe (Southwestern Edo)", + "okg": "Koko Babangk", + "okh": "Koresh-e Rostam", + "oki": "Okiek", + "okj": "Oko-Juwoi", + "okk": "Kwamtim One", + "okl": "Old Kentish Sign Language", + "okm": "Middle Korean (10th-16th cent.)", + "okn": "Oki-No-Erabu", + "oko": "Old Korean (3rd-9th cent.)", + "okr": "Kirike", + "oks": "Oko-Eni-Osayen", + "oku": "Oku", + "okv": "Orokaiva", + "okx": "Okpe (Northwestern Edo)", + "okz": "Old Khmer", + "ola": "Walungge", + "old": "Mochi", + "ole": "Olekha", + "olk": "Olkol", + "olm": "Oloma", + "olo": "Livvi", + "olr": "Olrat", + "olt": "Old Lithuanian", + "olu": "Kuvale", + "om": "Oromo", + "oma": "Omaha-Ponca", + "omb": "East Ambae", + "omc": "Mochica", + "omg": "Omagua", + "omi": "Omi", + "omk": "Omok", + "oml": "Ombo", + "omn": "Minoan", + "omo": "Utarmbung", + "omp": "Old Manipuri", + "omq": "Oto-Manguean languages", + "omr": "Old Marathi", + "omt": "Omotik", + "omu": "Omurano", + "omv": "Omotic languages", + "omw": "South Tairora", + "omx": "Old Mon", + "omy": "Old Malay", + "ona": "Ona", + "onb": "Lingao", + "one": "Oneida", + "ong": "Olo", + "oni": "Onin", + "onj": "Onjob", + "onk": "Kabore One", + "onn": "Onobasulu", + "ono": "Onondaga", + "onp": "Sartang", + "onr": "Northern One", + "ons": "Ono", + "ont": "Ontenu", + "onu": "Unua", + "onw": "Old Nubian", + "onx": "Onin Based Pidgin", + "ood": "Tohono O'odham", + "oog": "Ong", + "oon": "Önge", + "oor": "Oorlams", + "oos": "Old Ossetic", + "opa": "Okpamheri", + "opk": "Kopkaka", + "opm": "Oksapmin", + "opo": "Opao", + "opt": "Opata", + "opy": "Ofayé", + "or": "Oriya (macrolanguage); Odia (macrolanguage)", + "ora": "Oroha", + "orc": "Orma", + "ore": "Orejón", + "org": "Oring", + "orh": "Oroqen", + "orn": "Orang Kanaq", + "oro": "Orokolo", + "orr": "Oruma", + "ors": "Orang Seletar", + "ort": "Adivasi Oriya", + "oru": "Ormuri", + "orv": "Old Russian", + "orw": "Oro Win", + "orx": "Oro", + "ory": "Odia (individual language); Oriya (individual language)", + "orz": "Ormu", + "os": "Ossetian; Ossetic", + "osa": "Osage", + "osc": "Oscan", + "osi": "Osing", + "osn": "Old Sundanese", + "oso": "Ososo", + "osp": "Old Spanish", + "ost": "Osatu", + "osu": "Southern One", + "osx": "Old Saxon", + "ota": "Ottoman Turkish (1500-1928)", + "otb": "Old Tibetan", + "otd": "Ot Danum", + "ote": "Mezquital Otomi", + "oti": "Oti", + "otk": "Old Turkish", + "otl": "Tilapa Otomi", + "otm": "Eastern Highland Otomi", + "otn": "Tenango Otomi", + "oto": "Otomian languages", + "otq": "Querétaro Otomi", + "otr": "Otoro", + "ots": "Estado de México Otomi", + "ott": "Temoaya Otomi", + "otu": "Otuke", + "otw": "Ottawa", + "otx": "Texcatepec Otomi", + "oty": "Old Tamil", + "otz": "Ixtenco Otomi", + "oua": "Tagargrent", + "oub": "Glio-Oubi", + "oue": "Oune", + "oui": "Old Uighur", + "oum": "Ouma", + "ovd": "Elfdalian; Övdalian", + "owi": "Owiniga", + "owl": "Old Welsh", + "oyb": "Oy", + "oyd": "Oyda", + "oym": "Wayampi", + "oyy": "Oya'oya", + "ozm": "Koonzime", + "pa": "Panjabi; Punjabi", + "paa": "Papuan languages", + "pab": "Parecís", + "pac": "Pacoh", + "pad": "Paumarí", + "pae": "Pagibete", + "paf": "Paranawát", + "pag": "Pangasinan", + "pah": "Tenharim", + "pai": "Pe", + "pak": "Parakanã", + "pal": "Pahlavi", + "pam": "Pampanga; Kapampangan", + "pao": "Northern Paiute", + "pap": "Papiamento", + "paq": "Parya", + "par": "Panamint; Timbisha", + "pas": "Papasena", + "pau": "Palauan", + "pav": "Pakaásnovos", + "paw": "Pawnee", + "pax": "Pankararé", + "pay": "Pech", + "paz": "Pankararú", + "pbb": "Páez", + "pbc": "Patamona", + "pbe": "Mezontla Popoloca", + "pbf": "Coyotepec Popoloca", + "pbg": "Paraujano", + "pbh": "E'ñapa Woromaipu", + "pbi": "Parkwa", + "pbl": "Mak (Nigeria)", + "pbm": "Puebla Mazatec", + "pbn": "Kpasam", + "pbo": "Papel", + "pbp": "Badyara", + "pbr": "Pangwa", + "pbs": "Central Pame", + "pbt": "Southern Pashto", + "pbu": "Northern Pashto", + "pbv": "Pnar", + "pby": "Pyu (Papua New Guinea)", + "pca": "Santa Inés Ahuatempan Popoloca", + "pcb": "Pear", + "pcc": "Bouyei", + "pcd": "Picard", + "pce": "Ruching Palaung", + "pcf": "Paliyan", + "pcg": "Paniya", + "pch": "Pardhan", + "pci": "Duruwa", + "pcj": "Parenga", + "pck": "Paite Chin", + "pcl": "Pardhi", + "pcm": "Nigerian Pidgin", + "pcn": "Piti", + "pcp": "Pacahuara", + "pcw": "Pyapun", + "pda": "Anam", + "pdc": "Pennsylvania German", + "pdi": "Pa Di", + "pdn": "Podena; Fedan", + "pdo": "Padoe", + "pdt": "Plautdietsch", + "pdu": "Kayan", + "pea": "Peranakan Indonesian", + "peb": "Eastern Pomo", + "ped": "Mala (Papua New Guinea)", + "pee": "Taje", + "pef": "Northeastern Pomo", + "peg": "Pengo", + "peh": "Bonan", + "pei": "Chichimeca-Jonaz", + "pej": "Northern Pomo", + "pek": "Penchal", + "pel": "Pekal", + "pem": "Phende", + "peo": "Old Persian (ca. 600-400 B.C.)", + "pep": "Kunja", + "peq": "Southern Pomo", + "pes": "Iranian Persian", + "pev": "Pémono", + "pex": "Petats", + "pey": "Petjo", + "pez": "Eastern Penan", + "pfa": "Pááfang", + "pfe": "Pere", + "pfl": "Pfaelzisch", + "pga": "Sudanese Creole Arabic", + "pgd": "Gāndhārī", + "pgg": "Pangwali", + "pgi": "Pagi", + "pgk": "Rerep", + "pgl": "Primitive Irish", + "pgn": "Paelignian", + "pgs": "Pangseng", + "pgu": "Pagu", + "pgz": "Papua New Guinean Sign Language", + "pha": "Pa-Hng", + "phd": "Phudagi", + "phg": "Phuong", + "phh": "Phukha", + "phi": "Philippine languages", + "phj": "Pahari", + "phk": "Phake", + "phl": "Phalura; Palula", + "phm": "Phimbi", + "phn": "Phoenician", + "pho": "Phunoi", + "phq": "Phana'", + "phr": "Pahari-Potwari", + "pht": "Phu Thai", + "phu": "Phuan", + "phv": "Pahlavani", + "phw": "Phangduwali", + "pi": "Pali", + "pia": "Pima Bajo", + "pib": "Yine", + "pic": "Pinji", + "pid": "Piaroa", + "pie": "Piro", + "pif": "Pingelapese", + "pig": "Pisabo", + "pih": "Pitcairn-Norfolk", + "pij": "Pijao", + "pil": "Yom", + "pim": "Powhatan", + "pin": "Piame", + "pio": "Piapoco", + "pip": "Pero", + "pir": "Piratapuyo", + "pis": "Pijin", + "pit": "Pitta Pitta", + "piu": "Pintupi-Luritja", + "piv": "Pileni; Vaeakau-Taumako", + "piw": "Pimbwe", + "pix": "Piu", + "piy": "Piya-Kwonci", + "piz": "Pije", + "pjt": "Pitjantjatjara", + "pka": "Ardhamāgadhī Prākrit", + "pkb": "Pokomo; Kipfokomo", + "pkc": "Paekche", + "pkg": "Pak-Tong", + "pkh": "Pankhu", + "pkn": "Pakanha", + "pko": "Pökoot", + "pkp": "Pukapuka", + "pkr": "Attapady Kurumba", + "pks": "Pakistan Sign Language", + "pkt": "Maleng", + "pku": "Paku", + "pl": "Polish", + "pla": "Miani", + "plb": "Polonombauk", + "plc": "Central Palawano", + "pld": "Polari", + "ple": "Palu'e", + "plf": "Central Malayo-Polynesian languages", + "plg": "Pilagá", + "plh": "Paulohi", + "plj": "Polci", + "plk": "Kohistani Shina", + "pll": "Shwe Palaung", + "pln": "Palenquero", + "plo": "Oluta Popoluca", + "plq": "Palaic", + "plr": "Palaka Senoufo", + "pls": "San Marcos Tlacoyalco Popoloca; San Marcos Tlalcoyalco Popoloca", + "plt": "Plateau Malagasy", + "plu": "Palikúr", + "plv": "Southwest Palawano", + "plw": "Brooke's Point Palawano", + "ply": "Bolyu", + "plz": "Paluan", + "pma": "Paama", + "pmb": "Pambia", + "pmd": "Pallanganmiddang", + "pme": "Pwaamei", + "pmf": "Pamona", + "pmh": "Māhārāṣṭri Prākrit", + "pmi": "Northern Pumi", + "pmj": "Southern Pumi", + "pmk": "Pamlico", + "pml": "Lingua Franca", + "pmm": "Pomo", + "pmn": "Pam", + "pmo": "Pom", + "pmq": "Northern Pame", + "pmr": "Paynamar", + "pms": "Piemontese", + "pmt": "Tuamotuan", + "pmw": "Plains Miwok", + "pmx": "Poumei Naga", + "pmy": "Papuan Malay", + "pmz": "Southern Pame", + "pna": "Punan Bah-Biau", + "pnb": "Western Panjabi", + "pnc": "Pannei", + "pnd": "Mpinda", + "pne": "Western Penan", + "png": "Pangu; Pongu", + "pnh": "Penrhyn", + "pni": "Aoheng", + "pnj": "Pinjarup", + "pnk": "Paunaka", + "pnl": "Paleni", + "pnm": "Punan Batu 1", + "pnn": "Pinai-Hagahai", + "pno": "Panobo", + "pnp": "Pancana", + "pnq": "Pana (Burkina Faso)", + "pnr": "Panim", + "pns": "Ponosakan", + "pnt": "Pontic", + "pnu": "Jiongnai Bunu", + "pnv": "Pinigura", + "pnw": "Banyjima; Panytyima", + "pnx": "Phong-Kniang", + "pny": "Pinyin", + "pnz": "Pana (Central African Republic)", + "poc": "Poqomam", + "poe": "San Juan Atzingo Popoloca", + "pof": "Poke", + "pog": "Potiguára", + "poh": "Poqomchi'", + "poi": "Highland Popoluca", + "pok": "Pokangá", + "pom": "Southeastern Pomo", + "pon": "Pohnpeian", + "poo": "Central Pomo", + "pop": "Pwapwâ", + "poq": "Texistepec Popoluca", + "pos": "Sayula Popoluca", + "pot": "Potawatomi", + "pov": "Upper Guinea Crioulo", + "pow": "San Felipe Otlaltepec Popoloca", + "pox": "Polabian", + "poy": "Pogolo", + "poz": "Malayo-Polynesian languages", + "ppe": "Papi", + "ppi": "Paipai", + "ppk": "Uma", + "ppl": "Pipil; Nicarao", + "ppm": "Papuma", + "ppn": "Papapana", + "ppo": "Folopa", + "ppp": "Pelende", + "ppq": "Pei", + "pps": "San Luís Temalacayuca Popoloca", + "ppt": "Pare", + "ppu": "Papora", + "pqa": "Pa'a", + "pqe": "Eastern Malayo-Polynesian languages", + "pqm": "Malecite-Passamaquoddy", + "pqw": "Western Malayo-Polynesian languages", + "pra": "Prakrit languages", + "prc": "Parachi", + "prd": "Parsi-Dari", + "pre": "Principense", + "prf": "Paranan", + "prg": "Prussian", + "prh": "Porohanon", + "pri": "Paicî", + "prk": "Parauk", + "prl": "Peruvian Sign Language", + "prm": "Kibiri", + "prn": "Prasuni", + "pro": "Old Provençal (to 1500); Old Occitan (to 1500)", + "prp": "Parsi", + "prq": "Ashéninka Perené", + "prr": "Puri", + "prs": "Dari; Afghan Persian", + "prt": "Phai", + "pru": "Puragi", + "prw": "Parawen", + "prx": "Purik", + "prz": "Providencia Sign Language", + "ps": "Pushto; Pashto", + "psa": "Asue Awyu", + "psc": "Iranian Sign Language; Persian Sign Language", + "psd": "Plains Indian Sign Language", + "pse": "Central Malay", + "psg": "Penang Sign Language", + "psh": "Southwest Pashai; Southwest Pashayi", + "psi": "Southeast Pashai; Southeast Pashayi", + "psl": "Puerto Rican Sign Language", + "psm": "Pauserna", + "psn": "Panasuan", + "pso": "Polish Sign Language", + "psp": "Philippine Sign Language", + "psq": "Pasi", + "psr": "Portuguese Sign Language", + "pss": "Kaulong", + "pst": "Central Pashto", + "psu": "Sauraseni Prākrit", + "psw": "Port Sandwich", + "psy": "Piscataway", + "pt": "Portuguese", + "pta": "Pai Tavytera", + "pth": "Pataxó Hã-Ha-Hãe", + "pti": "Pindiini; Wangkatha", + "ptn": "Patani", + "pto": "Zo'é", + "ptp": "Patep", + "ptq": "Pattapu", + "ptr": "Piamatsina", + "ptt": "Enrekang", + "ptu": "Bambam", + "ptv": "Port Vato", + "ptw": "Pentlatch", + "pty": "Pathiya", + "pua": "Western Highland Purepecha", + "pub": "Purum", + "puc": "Punan Merap", + "pud": "Punan Aput", + "pue": "Puelche", + "puf": "Punan Merah", + "pug": "Phuie", + "pui": "Puinave", + "puj": "Punan Tubu", + "pum": "Puma", + "puo": "Puoc", + "pup": "Pulabu", + "puq": "Puquina", + "pur": "Puruborá", + "put": "Putoh", + "puu": "Punu", + "puw": "Puluwatese", + "pux": "Puare", + "puy": "Purisimeño", + "pwa": "Pawaia", + "pwb": "Panawa", + "pwg": "Gapapaiwa", + "pwi": "Patwin", + "pwm": "Molbog", + "pwn": "Paiwan", + "pwo": "Pwo Western Karen", + "pwr": "Powari", + "pww": "Pwo Northern Karen", + "pxm": "Quetzaltepec Mixe", + "pye": "Pye Krumen", + "pym": "Fyam", + "pyn": "Poyanáwa", + "pys": "Paraguayan Sign Language; Lengua de Señas del Paraguay", + "pyu": "Puyuma", + "pyx": "Pyu (Myanmar)", + "pyy": "Pyen", + "pzh": "Pazeh", + "pzn": "Jejara Naga; Para Naga", + "qu": "Quechua", + "qua": "Quapaw", + "qub": "Huallaga Huánuco Quechua", + "quc": "K'iche'; Quiché", + "qud": "Calderón Highland Quichua", + "quf": "Lambayeque Quechua", + "qug": "Chimborazo Highland Quichua", + "quh": "South Bolivian Quechua", + "qui": "Quileute", + "quk": "Chachapoyas Quechua", + "qul": "North Bolivian Quechua", + "qum": "Sipacapense", + "qun": "Quinault", + "qup": "Southern Pastaza Quechua", + "quq": "Quinqui", + "qur": "Yanahuanca Pasco Quechua", + "qus": "Santiago del Estero Quichua", + "quv": "Sacapulteco", + "quw": "Tena Lowland Quichua", + "qux": "Yauyos Quechua", + "quy": "Ayacucho Quechua", + "quz": "Cusco Quechua", + "qva": "Ambo-Pasco Quechua", + "qvc": "Cajamarca Quechua", + "qve": "Eastern Apurímac Quechua", + "qvh": "Huamalíes-Dos de Mayo Huánuco Quechua", + "qvi": "Imbabura Highland Quichua", + "qvj": "Loja Highland Quichua", + "qvl": "Cajatambo North Lima Quechua", + "qvm": "Margos-Yarowilca-Lauricocha Quechua", + "qvn": "North Junín Quechua", + "qvo": "Napo Lowland Quechua", + "qvp": "Pacaraos Quechua", + "qvs": "San Martín Quechua", + "qvw": "Huaylla Wanca Quechua", + "qvy": "Queyu", + "qvz": "Northern Pastaza Quichua", + "qwa": "Corongo Ancash Quechua", + "qwc": "Classical Quechua", + "qwe": "Quechuan (family)", + "qwh": "Huaylas Ancash Quechua", + "qwm": "Kuman (Russia)", + "qws": "Sihuas Ancash Quechua", + "qwt": "Kwalhioqua-Tlatskanai", + "qxa": "Chiquián Ancash Quechua", + "qxc": "Chincha Quechua", + "qxh": "Panao Huánuco Quechua", + "qxl": "Salasaca Highland Quichua", + "qxn": "Northern Conchucos Ancash Quechua", + "qxo": "Southern Conchucos Ancash Quechua", + "qxp": "Puno Quechua", + "qxq": "Qashqa'i", + "qxr": "Cañar Highland Quichua", + "qxs": "Southern Qiang", + "qxt": "Santa Ana de Tusi Pasco Quechua", + "qxu": "Arequipa-La Unión Quechua", + "qxw": "Jauja Wanca Quechua", + "qya": "Quenya", + "qyp": "Quiripi", + "raa": "Dungmali", + "rab": "Camling", + "rac": "Rasawa", + "rad": "Rade", + "raf": "Western Meohang", + "rag": "Logooli; Lulogooli", + "rah": "Rabha", + "rai": "Ramoaaina", + "raj": "Rajasthani", + "rak": "Tulu-Bohuai", + "ral": "Ralte", + "ram": "Canela", + "ran": "Riantana", + "rao": "Rao", + "rap": "Rapanui", + "raq": "Saam", + "rar": "Rarotongan; Cook Islands Maori", + "ras": "Tegali", + "rat": "Razajerdi", + "rau": "Raute", + "rav": "Sampang", + "raw": "Rawang", + "rax": "Rang", + "ray": "Rapa", + "raz": "Rahambuu", + "rbb": "Rumai Palaung", + "rbk": "Northern Bontok", + "rbl": "Miraya Bikol", + "rbp": "Barababaraba", + "rcf": "Réunion Creole French", + "rdb": "Rudbari", + "rea": "Rerau", + "reb": "Rembong", + "ree": "Rejang Kayan", + "reg": "Kara (Tanzania)", + "rei": "Reli", + "rej": "Rejang", + "rel": "Rendille", + "rem": "Remo", + "ren": "Rengao", + "rer": "Rer Bare", + "res": "Reshe", + "ret": "Retta", + "rey": "Reyesano", + "rga": "Roria", + "rge": "Romano-Greek", + "rgk": "Rangkas", + "rgn": "Romagnol", + "rgr": "Resígaro", + "rgs": "Southern Roglai", + "rgu": "Ringgou", + "rhg": "Rohingya", + "rhp": "Yahang", + "ria": "Riang (India)", + "rib": "Bribri Sign Language", + "rif": "Tarifit", + "ril": "Riang Lang; Riang (Myanmar)", + "rim": "Nyaturu", + "rin": "Nungu", + "rir": "Ribun", + "rit": "Ritharrngu", + "riu": "Riung", + "rjg": "Rajong", + "rji": "Raji", + "rjs": "Rajbanshi", + "rka": "Kraol", + "rkb": "Rikbaktsa", + "rkh": "Rakahanga-Manihiki", + "rki": "Rakhine", + "rkm": "Marka", + "rkt": "Rangpuri; Kamta", + "rkw": "Arakwal", + "rm": "Romansh", + "rma": "Rama", + "rmb": "Rembarrnga", + "rmc": "Carpathian Romani", + "rmd": "Traveller Danish", + "rme": "Angloromani", + "rmf": "Kalo Finnish Romani", + "rmg": "Traveller Norwegian", + "rmh": "Murkim", + "rmi": "Lomavren", + "rmk": "Romkun", + "rml": "Baltic Romani", + "rmm": "Roma", + "rmn": "Balkan Romani", + "rmo": "Sinte Romani", + "rmp": "Rempi", + "rmq": "Caló", + "rms": "Romanian Sign Language", + "rmt": "Domari", + "rmu": "Tavringer Romani", + "rmv": "Romanova", + "rmw": "Welsh Romani", + "rmx": "Romam", + "rmy": "Vlax Romani", + "rmz": "Marma", + "rn": "Rundi", + "rnb": "Brunca Sign Language", + "rnd": "Ruund", + "rng": "Ronga", + "rnl": "Ranglong", + "rnn": "Roon", + "rnp": "Rongpo", + "rnr": "Nari Nari", + "rnw": "Rungwa", + "ro": "Romanian; Moldavian; Moldovan", + "roa": "Romance languages", + "rob": "Tae'", + "roc": "Cacgia Roglai", + "rod": "Rogo", + "roe": "Ronji", + "rof": "Rombo", + "rog": "Northern Roglai", + "rol": "Romblomanon", + "rom": "Romany", + "roo": "Rotokas", + "rop": "Kriol", + "ror": "Rongga", + "rou": "Runga", + "row": "Dela-Oenale", + "rpn": "Repanbitip", + "rpt": "Rapting", + "rri": "Ririo", + "rro": "Waima", + "rrt": "Arritinngithigh", + "rsb": "Romano-Serbian", + "rsk": "Ruthenian; Rusyn", + "rsl": "Russian Sign Language", + "rsm": "Miriwoong Sign Language", + "rsn": "Rwandan Sign Language", + "rtc": "Rungtu Chin", + "rth": "Ratahan", + "rtm": "Rotuman", + "rts": "Yurats", + "rtw": "Rathawi", + "ru": "Russian", + "rub": "Gungu", + "ruc": "Ruuli", + "rue": "Rusyn", + "ruf": "Luguru", + "rug": "Roviana", + "ruh": "Ruga", + "rui": "Rufiji", + "ruk": "Che", + "ruo": "Istro Romanian", + "rup": "Macedo-Romanian; Aromanian; Arumanian", + "ruq": "Megleno Romanian", + "rut": "Rutul", + "ruu": "Lanas Lobu", + "ruy": "Mala (Nigeria)", + "ruz": "Ruma", + "rw": "Kinyarwanda", + "rwa": "Rawo", + "rwk": "Rwa", + "rwl": "Ruwila", + "rwm": "Amba (Uganda)", + "rwo": "Rawa", + "rwr": "Marwari (India)", + "rxd": "Ngardi", + "rxw": "Karuwali; Garuwali", + "ryn": "Northern Amami-Oshima", + "rys": "Yaeyama", + "ryu": "Central Okinawan", + "rzh": "Rāziḥī", + "sa": "Sanskrit", + "saa": "Saba", + "sab": "Buglere", + "sac": "Meskwaki", + "sad": "Sandawe", + "sae": "Sabanê", + "saf": "Safaliba", + "sah": "Yakut", + "sai": "South American Indian languages", + "saj": "Sahu", + "sak": "Sake", + "sal": "Salishan languages", + "sam": "Samaritan Aramaic", + "sao": "Sause", + "saq": "Samburu", + "sar": "Saraveca", + "sas": "Sasak", + "sat": "Santali", + "sau": "Saleman", + "sav": "Saafi-Saafi", + "saw": "Sawi", + "sax": "Sa", + "say": "Saya", + "saz": "Saurashtra", + "sba": "Ngambay", + "sbb": "Simbo", + "sbc": "Kele (Papua New Guinea)", + "sbd": "Southern Samo", + "sbe": "Saliba", + "sbf": "Chabu; Shabo", + "sbg": "Seget", + "sbh": "Sori-Harengan", + "sbi": "Seti", + "sbj": "Surbakhal", + "sbk": "Safwa", + "sbl": "Botolan Sambal", + "sbm": "Sagala", + "sbn": "Sindhi Bhil", + "sbo": "Sabüm", + "sbp": "Sangu (Tanzania)", + "sbq": "Sileibi", + "sbr": "Sembakung Murut", + "sbs": "Subiya", + "sbt": "Kimki", + "sbu": "Stod Bhoti", + "sbv": "Sabine", + "sbw": "Simba", + "sbx": "Seberuang", + "sby": "Soli", + "sbz": "Sara Kaba", + "sc": "Sardinian", + "scb": "Chut", + "sce": "Dongxiang", + "scf": "San Miguel Creole French", + "scg": "Sanggau", + "sch": "Sakachep", + "sci": "Sri Lankan Creole Malay", + "sck": "Sadri", + "scl": "Shina", + "scn": "Sicilian", + "sco": "Scots", + "scp": "Hyolmo; Helambu Sherpa", + "scq": "Sa'och", + "scs": "North Slavey", + "sct": "Southern Katang", + "scu": "Shumcho", + "scv": "Sheni", + "scw": "Sha", + "scx": "Sicel", + "sd": "Sindhi", + "sda": "Toraja-Sa'dan", + "sdb": "Shabak", + "sdc": "Sassarese Sardinian", + "sde": "Surubu", + "sdf": "Sarli", + "sdg": "Savi", + "sdh": "Southern Kurdish", + "sdj": "Suundi", + "sdk": "Sos Kundi", + "sdl": "Saudi Arabian Sign Language", + "sdn": "Gallurese Sardinian", + "sdo": "Bukar-Sadung Bidayuh", + "sdp": "Sherdukpen", + "sdq": "Semandang", + "sdr": "Oraon Sadri", + "sds": "Sened", + "sdt": "Shuadit", + "sdu": "Sarudu", + "sdv": "Eastern Sudanic languages", + "sdx": "Sibu Melanau", + "sdz": "Sallands", + "se": "Northern Sami", + "sea": "Semai", + "seb": "Shempire Senoufo", + "sec": "Sechelt", + "sed": "Sedang", + "see": "Seneca", + "sef": "Cebaara Senoufo", + "seg": "Segeju", + "seh": "Sena", + "sei": "Seri", + "sej": "Sene", + "sek": "Sekani", + "sel": "Selkup", + "sem": "Semitic languages", + "sen": "Nanerigé Sénoufo", + "seo": "Suarmin", + "sep": "Sìcìté Sénoufo", + "seq": "Senara Sénoufo", + "ser": "Serrano", + "ses": "Koyraboro Senni Songhai", + "set": "Sentani", + "seu": "Serui-Laut", + "sev": "Nyarafolo Senoufo", + "sew": "Sewa Bay", + "sey": "Secoya", + "sez": "Senthang Chin", + "sfb": "Langue des signes de Belgique Francophone; French Belgian Sign Language", + "sfe": "Eastern Subanen", + "sfm": "Small Flowery Miao", + "sfs": "South African Sign Language", + "sfw": "Sehwi", + "sg": "Sango", + "sga": "Old Irish (to 900)", + "sgb": "Mag-antsi Ayta", + "sgc": "Kipsigis", + "sgd": "Surigaonon", + "sge": "Segai", + "sgg": "Swiss-German Sign Language", + "sgh": "Shughni", + "sgi": "Suga", + "sgj": "Surgujia", + "sgk": "Sangkong", + "sgm": "Singa", + "sgn": "Sign languages", + "sgp": "Singpho", + "sgr": "Sangisari", + "sgs": "Samogitian", + "sgt": "Brokpake", + "sgu": "Salas", + "sgw": "Sebat Bet Gurage", + "sgx": "Sierra Leone Sign Language", + "sgy": "Sanglechi", + "sgz": "Sursurunga", + "sh": "Serbo-Croatian", + "sha": "Shall-Zwall", + "shb": "Ninam", + "shc": "Sonde", + "shd": "Kundal Shahi", + "she": "Sheko", + "shg": "Shua", + "shh": "Shoshoni", + "shi": "Tachelhit", + "shj": "Shatt", + "shk": "Shilluk", + "shl": "Shendu", + "shm": "Shahrudi", + "shn": "Shan", + "sho": "Shanga", + "shp": "Shipibo-Conibo", + "shq": "Sala", + "shr": "Shi", + "shs": "Shuswap", + "sht": "Shasta", + "shu": "Chadian Arabic", + "shv": "Shehri", + "shw": "Shwai", + "shx": "She", + "shy": "Tachawit", + "shz": "Syenara Senoufo", + "si": "Sinhala; Sinhalese", + "sia": "Akkala Sami", + "sib": "Sebop", + "sid": "Sidamo", + "sie": "Simaa", + "sif": "Siamou", + "sig": "Paasaal", + "sih": "Zire; Sîshëë", + "sii": "Shom Peng", + "sij": "Numbami", + "sik": "Sikiana", + "sil": "Tumulung Sisaala", + "sim": "Mende (Papua New Guinea)", + "sio": "Siouan languages", + "sip": "Sikkimese", + "siq": "Sonia", + "sir": "Siri", + "sis": "Siuslaw", + "sit": "Sino-Tibetan languages", + "siu": "Sinagen", + "siv": "Sumariup", + "siw": "Siwai", + "six": "Sumau", + "siy": "Sivandi", + "siz": "Siwi", + "sja": "Epena", + "sjb": "Sajau Basap", + "sjd": "Kildin Sami", + "sje": "Pite Sami", + "sjg": "Assangori", + "sjk": "Kemi Sami", + "sjl": "Sajalong; Miji", + "sjm": "Mapun", + "sjn": "Sindarin", + "sjo": "Xibe", + "sjp": "Surjapuri", + "sjr": "Siar-Lak", + "sjs": "Senhaja De Srair", + "sjt": "Ter Sami", + "sju": "Ume Sami", + "sjw": "Shawnee", + "sk": "Slovak", + "ska": "Skagit", + "skb": "Saek", + "skc": "Ma Manda", + "skd": "Southern Sierra Miwok", + "ske": "Seke (Vanuatu)", + "skf": "Sakirabiá", + "skg": "Sakalava Malagasy", + "skh": "Sikule", + "ski": "Sika", + "skj": "Seke (Nepal)", + "skm": "Kutong", + "skn": "Kolibugan Subanon", + "sko": "Seko Tengah", + "skp": "Sekapan", + "skq": "Sininkere", + "skr": "Saraiki; Seraiki", + "sks": "Maia", + "skt": "Sakata", + "sku": "Sakao", + "skv": "Skou", + "skw": "Skepi Creole Dutch", + "skx": "Seko Padang", + "sky": "Sikaiana", + "skz": "Sekar", + "sl": "Slovenian", + "sla": "Slavic languages", + "slc": "Sáliba", + "sld": "Sissala", + "sle": "Sholaga", + "slf": "Swiss-Italian Sign Language", + "slg": "Selungai Murut", + "slh": "Southern Puget Sound Salish", + "sli": "Lower Silesian", + "slj": "Salumá", + "sll": "Salt-Yui", + "slm": "Pangutaran Sama", + "sln": "Salinan", + "slp": "Lamaholot", + "slq": "Salchuq", + "slr": "Salar", + "sls": "Singapore Sign Language", + "slt": "Sila", + "slu": "Selaru", + "slw": "Sialum", + "slx": "Salampasu", + "sly": "Selayar", + "slz": "Ma'ya", + "sm": "Samoan", + "sma": "Southern Sami", + "smb": "Simbari", + "smc": "Som", + "smf": "Auwe", + "smg": "Simbali", + "smh": "Samei", + "smi": "Sami languages", + "smj": "Lule Sami", + "smk": "Bolinao", + "sml": "Central Sama", + "smm": "Musasa", + "smn": "Inari Sami", + "smp": "Samaritan", + "smq": "Samo", + "smr": "Simeulue", + "sms": "Skolt Sami", + "smt": "Simte", + "smu": "Somray", + "smv": "Samvedi", + "smw": "Sumbawa", + "smx": "Samba", + "smy": "Semnani", + "smz": "Simeku", + "sn": "Shona", + "snc": "Sinaugoro", + "sne": "Bau Bidayuh", + "snf": "Noon", + "sng": "Sanga (Democratic Republic of Congo)", + "sni": "Sensi", + "snj": "Riverain Sango", + "snk": "Soninke", + "snl": "Sangil", + "snm": "Southern Ma'di", + "snn": "Siona", + "sno": "Snohomish", + "snp": "Siane", + "snq": "Sangu (Gabon)", + "snr": "Sihan", + "sns": "South West Bay; Nahavaq", + "snu": "Senggi; Viid", + "snv": "Sa'ban", + "snw": "Selee", + "snx": "Sam", + "sny": "Saniyo-Hiyewe", + "snz": "Kou", + "so": "Somali", + "soa": "Thai Song", + "sob": "Sobei", + "soc": "So (Democratic Republic of Congo)", + "sod": "Songoora", + "soe": "Songomeno", + "sog": "Sogdian", + "soh": "Aka", + "soi": "Sonha", + "soj": "Soi", + "sok": "Sokoro", + "sol": "Solos", + "son": "Songhai languages", + "soo": "Songo", + "sop": "Songe", + "soq": "Kanasi", + "sor": "Somrai", + "sos": "Seeku", + "sou": "Southern Thai", + "sov": "Sonsorol", + "sow": "Sowanda", + "sox": "Swo", + "soy": "Miyobe", + "soz": "Temi", + "spb": "Sepa (Indonesia)", + "spc": "Sapé", + "spd": "Saep", + "spe": "Sepa (Papua New Guinea)", + "spg": "Sian", + "spi": "Saponi", + "spk": "Sengo", + "spl": "Selepet", + "spm": "Akukem", + "spn": "Sanapaná", + "spo": "Spokane", + "spp": "Supyire Senoufo", + "spq": "Loreto-Ucayali Spanish", + "spr": "Saparua", + "sps": "Saposa", + "spt": "Spiti Bhoti", + "spu": "Sapuan", + "spv": "Sambalpuri; Kosli", + "spx": "South Picene", + "spy": "Sabaot", + "sq": "Albanian", + "sqa": "Shama-Sambuga", + "sqh": "Shau", + "sqj": "Albanian languages", + "sqk": "Albanian Sign Language", + "sqm": "Suma", + "sqn": "Susquehannock", + "sqo": "Sorkhei", + "sqq": "Sou", + "sqr": "Siculo Arabic", + "sqs": "Sri Lankan Sign Language", + "sqt": "Soqotri", + "squ": "Squamish", + "sqx": "Kufr Qassem Sign Language (KQSL)", + "sr": "Serbian", + "sra": "Saruga", + "srb": "Sora", + "src": "Logudorese Sardinian", + "sre": "Sara", + "srf": "Nafi", + "srg": "Sulod", + "srh": "Sarikoli", + "sri": "Siriano", + "srk": "Serudung Murut", + "srl": "Isirawa", + "srm": "Saramaccan", + "srn": "Sranan Tongo", + "sro": "Campidanese Sardinian", + "srq": "Sirionó", + "srr": "Serer", + "srs": "Sarsi", + "srt": "Sauri", + "sru": "Suruí", + "srv": "Southern Sorsoganon", + "srw": "Serua", + "srx": "Sirmauri", + "sry": "Sera", + "srz": "Shahmirzadi", + "ss": "Swati", + "ssa": "Nilo-Saharan languages", + "ssb": "Southern Sama", + "ssc": "Suba-Simbiti", + "ssd": "Siroi", + "sse": "Balangingi; Bangingih Sama", + "ssf": "Thao", + "ssg": "Seimat", + "ssh": "Shihhi Arabic", + "ssi": "Sansi", + "ssj": "Sausi", + "ssk": "Sunam", + "ssl": "Western Sisaala", + "ssm": "Semnam", + "ssn": "Waata", + "sso": "Sissano", + "ssp": "Spanish Sign Language", + "ssq": "So'a", + "ssr": "Swiss-French Sign Language", + "sss": "Sô", + "sst": "Sinasina", + "ssu": "Susuami", + "ssv": "Shark Bay", + "ssx": "Samberigi", + "ssy": "Saho", + "ssz": "Sengseng", + "st": "Southern Sotho", + "sta": "Settla", + "stb": "Northern Subanen", + "std": "Sentinel", + "ste": "Liana-Seti", + "stf": "Seta", + "stg": "Trieng", + "sth": "Shelta", + "sti": "Bulo Stieng", + "stj": "Matya Samo", + "stk": "Arammba", + "stl": "Stellingwerfs", + "stm": "Setaman", + "stn": "Owa", + "sto": "Stoney", + "stp": "Southeastern Tepehuan", + "stq": "Saterfriesisch", + "str": "Straits Salish", + "sts": "Shumashti", + "stt": "Budeh Stieng", + "stu": "Samtao", + "stv": "Silt'e", + "stw": "Satawalese", + "sty": "Siberian Tatar", + "su": "Sundanese", + "sua": "Sulka", + "sub": "Suku", + "suc": "Western Subanon", + "sue": "Suena", + "sug": "Suganga", + "sui": "Suki", + "suj": "Shubi", + "suk": "Sukuma", + "suo": "Bouni", + "suq": "Tirmaga-Chai Suri; Suri", + "sur": "Mwaghavul", + "sus": "Susu", + "sut": "Subtiaba", + "suv": "Puroik", + "suw": "Sumbwa", + "sux": "Sumerian", + "suy": "Suyá", + "suz": "Sunwar", + "sv": "Swedish", + "sva": "Svan", + "svb": "Ulau-Suain", + "svc": "Vincentian Creole English", + "sve": "Serili", + "svk": "Slovakian Sign Language", + "svm": "Slavomolisano", + "svs": "Savosavo", + "svx": "Skalvian", + "sw": "Swahili (macrolanguage)", + "swb": "Maore Comorian", + "swc": "Congo Swahili", + "swf": "Sere", + "swg": "Swabian", + "swh": "Swahili (individual language); Kiswahili", + "swi": "Sui", + "swj": "Sira", + "swk": "Malawi Sena", + "swl": "Swedish Sign Language", + "swm": "Samosa", + "swn": "Sawknah", + "swo": "Shanenawa", + "swp": "Suau", + "swq": "Sharwa", + "swr": "Saweru", + "sws": "Seluwasan", + "swt": "Sawila", + "swu": "Suwawa", + "swv": "Shekhawati", + "sww": "Sowa", + "swx": "Suruahá", + "swy": "Sarua", + "sxb": "Suba", + "sxc": "Sicanian", + "sxe": "Sighu", + "sxg": "Shuhi; Shixing", + "sxk": "Southern Kalapuya", + "sxl": "Selian", + "sxm": "Samre", + "sxn": "Sangir", + "sxo": "Sorothaptic", + "sxr": "Saaroa", + "sxs": "Sasaru", + "sxu": "Upper Saxon", + "sxw": "Saxwe Gbe", + "sya": "Siang", + "syb": "Central Subanen", + "syc": "Classical Syriac", + "syd": "Samoyedic languages", + "syi": "Seki", + "syk": "Sukur", + "syl": "Sylheti", + "sym": "Maya Samo", + "syn": "Senaya", + "syo": "Suoy", + "syr": "Syriac", + "sys": "Sinyar", + "syw": "Kagate", + "syx": "Samay", + "syy": "Al-Sayyid Bedouin Sign Language", + "sza": "Semelai", + "szb": "Ngalum", + "szc": "Semaq Beri", + "szd": "Seru", + "sze": "Seze", + "szg": "Sengele", + "szl": "Silesian", + "szn": "Sula", + "szp": "Suabo", + "szs": "Solomon Islands Sign Language", + "szv": "Isu (Fako Division)", + "szw": "Sawai", + "szy": "Sakizaya", + "ta": "Tamil", + "taa": "Lower Tanana", + "tab": "Tabassaran", + "tac": "Lowland Tarahumara", + "tad": "Tause", + "tae": "Tariana", + "taf": "Tapirapé", + "tag": "Tagoi", + "tai": "Tai languages", + "taj": "Eastern Tamang", + "tak": "Tala", + "tal": "Tal", + "tan": "Tangale", + "tao": "Yami", + "tap": "Taabwa", + "taq": "Tamasheq", + "tar": "Central Tarahumara", + "tas": "Tay Boi", + "tau": "Upper Tanana", + "tav": "Tatuyo", + "taw": "Tai", + "tax": "Tamki", + "tay": "Atayal", + "taz": "Tocho", + "tba": "Aikanã", + "tbc": "Takia", + "tbd": "Kaki Ae", + "tbe": "Tanimbili", + "tbf": "Mandara", + "tbg": "North Tairora", + "tbh": "Dharawal; Thurawal", + "tbi": "Gaam", + "tbj": "Tiang", + "tbk": "Calamian Tagbanwa", + "tbl": "Tboli", + "tbm": "Tagbu", + "tbn": "Barro Negro Tunebo", + "tbo": "Tawala", + "tbp": "Taworta; Diebroud", + "tbq": "Tibeto-Burman languages", + "tbr": "Tumtum", + "tbs": "Tanguat", + "tbt": "Tembo (Kitembo)", + "tbu": "Tubar", + "tbv": "Tobo", + "tbw": "Tagbanwa", + "tbx": "Kapin", + "tby": "Tabaru", + "tbz": "Ditammari", + "tca": "Ticuna", + "tcb": "Tanacross", + "tcc": "Datooga", + "tcd": "Tafi", + "tce": "Southern Tutchone", + "tcf": "Malinaltepec Me'phaa; Malinaltepec Tlapanec", + "tcg": "Tamagario", + "tch": "Turks And Caicos Creole English", + "tci": "Wára", + "tck": "Tchitchege", + "tcl": "Taman (Myanmar)", + "tcm": "Tanahmerah", + "tcn": "Tichurong", + "tco": "Taungyo", + "tcp": "Tawr Chin", + "tcq": "Kaiy", + "tcs": "Torres Strait Creole; Yumplatok", + "tct": "T'en", + "tcu": "Southeastern Tarahumara", + "tcw": "Tecpatlán Totonac", + "tcx": "Toda", + "tcy": "Tulu", + "tcz": "Thado Chin", + "tda": "Tagdal", + "tdb": "Panchpargania", + "tdc": "Emberá-Tadó", + "tdd": "Tai Nüa", + "tde": "Tiranige Diga Dogon", + "tdf": "Talieng", + "tdg": "Western Tamang", + "tdh": "Thulung", + "tdi": "Tomadino", + "tdj": "Tajio", + "tdk": "Tambas", + "tdl": "Sur", + "tdm": "Taruma", + "tdn": "Tondano", + "tdo": "Teme", + "tdq": "Tita", + "tdr": "Todrah", + "tds": "Doutai", + "tdt": "Tetun Dili", + "tdv": "Toro", + "tdx": "Tandroy-Mahafaly Malagasy", + "tdy": "Tadyawan", + "te": "Telugu", + "tea": "Temiar", + "teb": "Tetete", + "tec": "Terik", + "ted": "Tepo Krumen", + "tee": "Huehuetla Tepehua", + "tef": "Teressa", + "teg": "Teke-Tege", + "teh": "Tehuelche", + "tei": "Torricelli", + "tek": "Ibali Teke", + "tem": "Timne", + "ten": "Tama (Colombia)", + "teo": "Teso", + "tep": "Tepecano", + "teq": "Temein", + "ter": "Tereno", + "tes": "Tengger", + "tet": "Tetum", + "teu": "Soo", + "tev": "Teor", + "tew": "Tewa (USA)", + "tex": "Tennet", + "tey": "Tulishi", + "tez": "Tetserret", + "tfi": "Tofin Gbe", + "tfn": "Tanaina", + "tfo": "Tefaro", + "tfr": "Teribe", + "tft": "Ternate", + "tg": "Tajik", + "tga": "Sagalla", + "tgb": "Tobilung", + "tgc": "Tigak", + "tgd": "Ciwogai", + "tge": "Eastern Gorkha Tamang", + "tgf": "Chalikha", + "tgh": "Tobagonian Creole English", + "tgi": "Lawunuia", + "tgj": "Tagin", + "tgn": "Tandaganon", + "tgo": "Sudest", + "tgp": "Tangoa", + "tgq": "Tring", + "tgr": "Tareng", + "tgs": "Nume", + "tgt": "Central Tagbanwa", + "tgu": "Tanggu", + "tgv": "Tingui-Boto", + "tgw": "Tagwana Senoufo", + "tgx": "Tagish", + "tgy": "Togoyo", + "tgz": "Tagalaka", + "th": "Thai", + "thd": "Kuuk Thaayorre; Thayore", + "the": "Chitwania Tharu", + "thf": "Thangmi", + "thh": "Northern Tarahumara", + "thi": "Tai Long", + "thk": "Tharaka; Kitharaka", + "thl": "Dangaura Tharu", + "thm": "Aheu", + "thn": "Thachanadan", + "thp": "Thompson", + "thq": "Kochila Tharu", + "thr": "Rana Tharu", + "ths": "Thakali", + "tht": "Tahltan", + "thu": "Thuri", + "thv": "Tahaggart Tamahaq", + "thy": "Tha", + "thz": "Tayart Tamajeq", + "ti": "Tigrinya", + "tia": "Tidikelt Tamazight", + "tic": "Tira", + "tif": "Tifal", + "tig": "Tigre", + "tih": "Timugon Murut", + "tii": "Tiene", + "tij": "Tilung", + "tik": "Tikar", + "til": "Tillamook", + "tim": "Timbe", + "tin": "Tindi", + "tio": "Teop", + "tip": "Trimuris", + "tiq": "Tiéfo", + "tis": "Masadiit Itneg", + "tit": "Tinigua", + "tiu": "Adasen", + "tiv": "Tiv", + "tiw": "Tiwi", + "tix": "Southern Tiwa", + "tiy": "Tiruray", + "tiz": "Tai Hongjin", + "tja": "Tajuasohn", + "tjg": "Tunjung", + "tji": "Northern Tujia", + "tjj": "Tjungundji", + "tjl": "Tai Laing", + "tjm": "Timucua", + "tjn": "Tonjon", + "tjo": "Temacine Tamazight", + "tjp": "Tjupany", + "tjs": "Southern Tujia", + "tju": "Tjurruru", + "tjw": "Djabwurrung", + "tk": "Turkmen", + "tka": "Truká", + "tkb": "Buksa", + "tkd": "Tukudede", + "tke": "Takwane", + "tkf": "Tukumanféd", + "tkg": "Tesaka Malagasy", + "tkl": "Tokelau", + "tkm": "Takelma", + "tkn": "Toku-No-Shima", + "tkp": "Tikopia", + "tkq": "Tee", + "tkr": "Tsakhur", + "tks": "Takestani", + "tkt": "Kathoriya Tharu", + "tku": "Upper Necaxa Totonac", + "tkv": "Mur Pano", + "tkw": "Teanu", + "tkx": "Tangko", + "tkz": "Takua", + "tl": "Tagalog", + "tla": "Southwestern Tepehuan", + "tlb": "Tobelo", + "tlc": "Yecuatla Totonac", + "tld": "Talaud", + "tlf": "Telefol", + "tlg": "Tofanma", + "tlh": "Klingon; tlhIngan Hol", + "tli": "Tlingit", + "tlj": "Talinga-Bwisi", + "tlk": "Taloki", + "tll": "Tetela", + "tlm": "Tolomako", + "tln": "Talondo'", + "tlo": "Talodi", + "tlp": "Filomena Mata-Coahuitlán Totonac", + "tlq": "Tai Loi", + "tlr": "Talise", + "tls": "Tambotalo", + "tlt": "Sou Nama; Teluti", + "tlu": "Tulehu", + "tlv": "Taliabu", + "tlx": "Khehek", + "tly": "Talysh", + "tma": "Tama (Chad)", + "tmb": "Katbol; Avava", + "tmc": "Tumak", + "tmd": "Haruai", + "tme": "Tremembé", + "tmf": "Toba-Maskoy", + "tmg": "Ternateño", + "tmh": "Tamashek", + "tmi": "Tutuba", + "tmj": "Samarokena", + "tmk": "Northwestern Tamang", + "tml": "Tamnim Citak", + "tmm": "Tai Thanh", + "tmn": "Taman (Indonesia)", + "tmo": "Temoq", + "tmq": "Tumleo", + "tmr": "Jewish Babylonian Aramaic (ca. 200-1200 CE)", + "tms": "Tima", + "tmt": "Tasmate", + "tmu": "Iau", + "tmv": "Tembo (Motembo)", + "tmw": "Temuan", + "tmy": "Tami", + "tmz": "Tamanaku", + "tn": "Tswana", + "tna": "Tacana", + "tnb": "Western Tunebo", + "tnc": "Tanimuca-Retuarã", + "tnd": "Angosturas Tunebo", + "tng": "Tobanga", + "tnh": "Maiani", + "tni": "Tandia", + "tnk": "Kwamera", + "tnl": "Lenakel", + "tnm": "Tabla", + "tnn": "North Tanna", + "tno": "Toromono", + "tnp": "Whitesands", + "tnq": "Taino", + "tnr": "Ménik", + "tns": "Tenis", + "tnt": "Tontemboan", + "tnu": "Tay Khang", + "tnv": "Tangchangya", + "tnw": "Tonsawang", + "tnx": "Tanema", + "tny": "Tongwe", + "tnz": "Ten'edn", + "to": "Tonga (Tonga Islands)", + "tob": "Toba", + "toc": "Coyutla Totonac", + "tod": "Toma", + "tof": "Gizrra", + "tog": "Tonga (Nyasa)", + "toh": "Gitonga", + "toi": "Tonga (Zambia)", + "toj": "Tojolabal", + "tok": "Toki Pona", + "tol": "Tolowa", + "tom": "Tombulu", + "too": "Xicotepec De Juárez Totonac", + "top": "Papantla Totonac", + "toq": "Toposa", + "tor": "Togbo-Vara Banda", + "tos": "Highland Totonac", + "tou": "Tho", + "tov": "Upper Taromi", + "tow": "Jemez", + "tox": "Tobian", + "toy": "Topoiyo", + "toz": "To", + "tpa": "Taupota", + "tpc": "Azoyú Me'phaa; Azoyú Tlapanec", + "tpe": "Tippera", + "tpf": "Tarpia", + "tpg": "Kula", + "tpi": "Tok Pisin", + "tpj": "Tapieté", + "tpk": "Tupinikin", + "tpl": "Tlacoapa Me'phaa; Tlacoapa Tlapanec", + "tpm": "Tampulma", + "tpn": "Tupinambá", + "tpo": "Tai Pao", + "tpp": "Pisaflores Tepehua", + "tpq": "Tukpa", + "tpr": "Tuparí", + "tpt": "Tlachichilco Tepehua", + "tpu": "Tampuan", + "tpv": "Tanapag", + "tpw": "Tupí", + "tpx": "Acatepec Me'phaa; Acatepec Tlapanec", + "tpy": "Trumai", + "tpz": "Tinputz", + "tqb": "Tembé", + "tql": "Lehali", + "tqm": "Turumsa", + "tqn": "Tenino", + "tqo": "Toaripi", + "tqp": "Tomoip", + "tqq": "Tunni", + "tqr": "Torona", + "tqt": "Western Totonac", + "tqu": "Touo", + "tqw": "Tonkawa", + "tr": "Turkish", + "tra": "Tirahi", + "trb": "Terebu", + "trc": "Copala Triqui", + "trd": "Turi", + "tre": "East Tarangan", + "trf": "Trinidadian Creole English", + "trg": "Lishán Didán", + "trh": "Turaka", + "tri": "Trió", + "trj": "Toram", + "trk": "Turkic languages", + "trl": "Traveller Scottish", + "trm": "Tregami", + "trn": "Trinitario", + "tro": "Tarao Naga", + "trp": "Kok Borok", + "trq": "San Martín Itunyoso Triqui", + "trr": "Taushiro", + "trs": "Chicahuaxtla Triqui", + "trt": "Tunggare", + "tru": "Turoyo; Surayt", + "trv": "Sediq; Seediq; Taroko", + "trw": "Torwali", + "trx": "Tringgus-Sembaan Bidayuh", + "try": "Turung", + "trz": "Torá", + "ts": "Tsonga", + "tsa": "Tsaangi", + "tsb": "Tsamai", + "tsc": "Tswa", + "tsd": "Tsakonian", + "tse": "Tunisian Sign Language", + "tsg": "Tausug", + "tsh": "Tsuvan", + "tsi": "Tsimshian", + "tsj": "Tshangla", + "tsk": "Tseku", + "tsl": "Ts'ün-Lao", + "tsm": "Turkish Sign Language; Türk İşaret Dili", + "tsp": "Northern Toussian", + "tsq": "Thai Sign Language", + "tsr": "Akei", + "tss": "Taiwan Sign Language", + "tst": "Tondi Songway Kiini", + "tsu": "Tsou", + "tsv": "Tsogo", + "tsw": "Tsishingini", + "tsx": "Mubami", + "tsy": "Tebul Sign Language", + "tsz": "Purepecha", + "tt": "Tatar", + "tta": "Tutelo", + "ttb": "Gaa", + "ttc": "Tektiteko", + "ttd": "Tauade", + "tte": "Bwanabwana", + "ttf": "Tuotomb", + "ttg": "Tutong", + "tth": "Upper Ta'oih", + "tti": "Tobati", + "ttj": "Tooro", + "ttk": "Totoro", + "ttl": "Totela", + "ttm": "Northern Tutchone", + "ttn": "Towei", + "tto": "Lower Ta'oih", + "ttp": "Tombelala", + "ttq": "Tawallammat Tamajaq", + "ttr": "Tera", + "tts": "Northeastern Thai", + "ttt": "Muslim Tat", + "ttu": "Torau", + "ttv": "Titan", + "ttw": "Long Wat", + "tty": "Sikaritai", + "ttz": "Tsum", + "tua": "Wiarumus", + "tub": "Tübatulabal", + "tuc": "Mutu", + "tud": "Tuxá", + "tue": "Tuyuca", + "tuf": "Central Tunebo", + "tug": "Tunia", + "tuh": "Taulil", + "tui": "Tupuri", + "tuj": "Tugutil", + "tul": "Tula", + "tum": "Tumbuka", + "tun": "Tunica", + "tuo": "Tucano", + "tup": "Tupi languages", + "tuq": "Tedaga", + "tus": "Tuscarora", + "tut": "Altaic languages", + "tuu": "Tututni", + "tuv": "Turkana", + "tuw": "Tungus languages", + "tux": "Tuxináwa", + "tuy": "Tugen", + "tuz": "Turka", + "tva": "Vaghua", + "tvd": "Tsuvadi", + "tve": "Te'un", + "tvk": "Southeast Ambrym", + "tvl": "Tuvalu", + "tvm": "Tela-Masbuar", + "tvn": "Tavoyan", + "tvo": "Tidore", + "tvs": "Taveta", + "tvt": "Tutsa Naga", + "tvu": "Tunen", + "tvw": "Sedoa", + "tvx": "Taivoan", + "tvy": "Timor Pidgin", + "tw": "Twi", + "twa": "Twana", + "twb": "Western Tawbuid", + "twc": "Teshenawa", + "twd": "Twents", + "twe": "Tewa (Indonesia)", + "twf": "Northern Tiwa", + "twg": "Tereweng", + "twh": "Tai Dón", + "twl": "Tawara", + "twm": "Tawang Monpa", + "twn": "Twendi", + "two": "Tswapong", + "twp": "Ere", + "twq": "Tasawaq", + "twr": "Southwestern Tarahumara", + "twt": "Turiwára", + "twu": "Termanu", + "tww": "Tuwari", + "twx": "Tewe", + "twy": "Tawoyan", + "txa": "Tombonuo", + "txb": "Tokharian B", + "txc": "Tsetsaut", + "txe": "Totoli", + "txg": "Tangut", + "txh": "Thracian", + "txi": "Ikpeng", + "txj": "Tarjumo", + "txm": "Tomini", + "txn": "West Tarangan", + "txo": "Toto", + "txq": "Tii", + "txr": "Tartessian", + "txs": "Tonsea", + "txt": "Citak", + "txu": "Kayapó", + "txx": "Tatana", + "txy": "Tanosy Malagasy", + "ty": "Tahitian", + "tya": "Tauya", + "tye": "Kyanga", + "tyh": "O'du", + "tyi": "Teke-Tsaayi", + "tyj": "Tai Do; Tai Yo", + "tyl": "Thu Lao", + "tyn": "Kombai", + "typ": "Thaypan", + "tyr": "Tai Daeng", + "tys": "Tày Sa Pa", + "tyt": "Tày Tac", + "tyu": "Kua", + "tyv": "Tuvinian", + "tyx": "Teke-Tyee", + "tyy": "Tiyaa", + "tyz": "Tày", + "tza": "Tanzanian Sign Language", + "tzh": "Tzeltal", + "tzj": "Tz'utujil", + "tzl": "Talossan", + "tzm": "Central Atlas Tamazight", + "tzn": "Tugun", + "tzo": "Tzotzil", + "tzx": "Tabriak", + "uam": "Uamué", + "uan": "Kuan", + "uar": "Tairuma", + "uba": "Ubang", + "ubi": "Ubi", + "ubl": "Buhi'non Bikol", + "ubr": "Ubir", + "ubu": "Umbu-Ungu", + "uby": "Ubykh", + "uda": "Uda", + "ude": "Udihe", + "udg": "Muduga", + "udi": "Udi", + "udj": "Ujir", + "udl": "Wuzlam", + "udm": "Udmurt", + "udu": "Uduk", + "ues": "Kioko", + "ufi": "Ufim", + "ug": "Uighur; Uyghur", + "uga": "Ugaritic", + "ugb": "Kuku-Ugbanh", + "uge": "Ughele", + "ugh": "Kubachi", + "ugn": "Ugandan Sign Language", + "ugo": "Ugong", + "ugy": "Uruguayan Sign Language", + "uha": "Uhami", + "uhn": "Damal", + "uis": "Uisai", + "uiv": "Iyive", + "uji": "Tanjijili", + "uk": "Ukrainian", + "uka": "Kaburi", + "ukg": "Ukuriguma", + "ukh": "Ukhwejo", + "uki": "Kui (India)", + "ukk": "Muak Sa-aak", + "ukl": "Ukrainian Sign Language", + "ukp": "Ukpe-Bayobiri", + "ukq": "Ukwa", + "uks": "Urubú-Kaapor Sign Language; Kaapor Sign Language", + "uku": "Ukue", + "ukv": "Kuku", + "ukw": "Ukwuani-Aboh-Ndoni", + "uky": "Kuuk-Yak", + "ula": "Fungwa", + "ulb": "Ulukwumi", + "ulc": "Ulch", + "ule": "Lule", + "ulf": "Usku; Afra", + "uli": "Ulithian", + "ulk": "Meriam Mir", + "ull": "Ullatan", + "ulm": "Ulumanda'", + "uln": "Unserdeutsch", + "ulu": "Uma' Lung", + "ulw": "Ulwa", + "uma": "Umatilla", + "umb": "Umbundu", + "umc": "Marrucinian", + "umd": "Umbindhamu", + "umg": "Morrobalama; Umbuygamu", + "umi": "Ukit", + "umm": "Umon", + "umn": "Makyan Naga", + "umo": "Umotína", + "ump": "Umpila", + "umr": "Umbugarla", + "ums": "Pendau", + "umu": "Munsee", + "una": "North Watut", + "und": "Undetermined", + "une": "Uneme", + "ung": "Ngarinyin", + "uni": "Uni", + "unk": "Enawené-Nawé", + "unm": "Unami", + "unn": "Kurnai", + "unr": "Mundari", + "unu": "Unubahe", + "unx": "Munda", + "unz": "Unde Kaili", + "uon": "Kulon", + "upi": "Umeda", + "upv": "Uripiv-Wala-Rano-Atchin", + "ur": "Urdu", + "ura": "Urarina", + "urb": "Urubú-Kaapor; Kaapor", + "urc": "Urningangg", + "ure": "Uru", + "urf": "Uradhi", + "urg": "Urigina", + "urh": "Urhobo", + "uri": "Urim", + "urj": "Uralic languages", + "urk": "Urak Lawoi'", + "url": "Urali", + "urm": "Urapmin", + "urn": "Uruangnirin", + "uro": "Ura (Papua New Guinea)", + "urp": "Uru-Pa-In", + "urr": "Lehalurup; Löyöp", + "urt": "Urat", + "uru": "Urumi", + "urv": "Uruava", + "urw": "Sop", + "urx": "Urimo", + "ury": "Orya", + "urz": "Uru-Eu-Wau-Wau", + "usa": "Usarufa", + "ush": "Ushojo", + "usi": "Usui", + "usk": "Usaghade", + "usp": "Uspanteco", + "uss": "us-Saare", + "usu": "Uya", + "uta": "Otank", + "ute": "Ute-Southern Paiute", + "uth": "ut-Hun", + "utp": "Amba (Solomon Islands)", + "utr": "Etulo", + "utu": "Utu", + "uum": "Urum", + "uur": "Ura (Vanuatu)", + "uuu": "U", + "uve": "West Uvean; Fagauvea", + "uvh": "Uri", + "uvl": "Lote", + "uwa": "Kuku-Uwanh", + "uya": "Doko-Uyanga", + "uz": "Uzbek", + "uzn": "Northern Uzbek", + "uzs": "Southern Uzbek", + "vaa": "Vaagri Booli", + "vae": "Vale", + "vaf": "Vafsi", + "vag": "Vagla", + "vah": "Varhadi-Nagpuri", + "vai": "Vai", + "vaj": "Sekele; Northwestern ǃKung; Vasekele", + "val": "Vehes", + "vam": "Vanimo", + "van": "Valman", + "vao": "Vao", + "vap": "Vaiphei", + "var": "Huarijio", + "vas": "Vasavi", + "vau": "Vanuma", + "vav": "Varli", + "vay": "Wayu", + "vbb": "Southeast Babar", + "vbk": "Southwestern Bontok", + "ve": "Venda", + "vec": "Venetian", + "ved": "Veddah", + "vel": "Veluws", + "vem": "Vemgo-Mabas", + "veo": "Ventureño", + "vep": "Veps", + "ver": "Mom Jango", + "vgr": "Vaghri", + "vgt": "Vlaamse Gebarentaal; Flemish Sign Language", + "vi": "Vietnamese", + "vic": "Virgin Islands Creole English", + "vid": "Vidunda", + "vif": "Vili", + "vig": "Viemo", + "vil": "Vilela", + "vin": "Vinza", + "vis": "Vishavan", + "vit": "Viti", + "viv": "Iduna", + "vka": "Kariyarra", + "vkj": "Kujarge", + "vkk": "Kaur", + "vkl": "Kulisusu", + "vkm": "Kamakan", + "vkn": "Koro Nulu", + "vko": "Kodeoha", + "vkp": "Korlai Creole Portuguese", + "vkt": "Tenggarong Kutai Malay", + "vku": "Kurrama", + "vkz": "Koro Zuba", + "vlp": "Valpei", + "vls": "Vlaams", + "vma": "Martuyhunira", + "vmb": "Barbaram", + "vmc": "Juxtlahuaca Mixtec", + "vmd": "Mudu Koraga", + "vme": "East Masela", + "vmf": "Mainfränkisch", + "vmg": "Lungalunga", + "vmh": "Maraghei", + "vmi": "Miwa", + "vmj": "Ixtayutla Mixtec", + "vmk": "Makhuwa-Shirima", + "vml": "Malgana", + "vmm": "Mitlatongo Mixtec", + "vmp": "Soyaltepec Mazatec", + "vmq": "Soyaltepec Mixtec", + "vmr": "Marenje", + "vms": "Moksela", + "vmu": "Muluridyi", + "vmv": "Valley Maidu", + "vmw": "Makhuwa", + "vmx": "Tamazola Mixtec", + "vmy": "Ayautla Mazatec", + "vmz": "Mazatlán Mazatec", + "vnk": "Vano; Lovono", + "vnm": "Vinmavis; Neve'ei", + "vnp": "Vunapu", + "vo": "Volapük", + "vor": "Voro", + "vot": "Votic", + "vra": "Vera'a", + "vro": "Võro", + "vrs": "Varisi", + "vrt": "Burmbar; Banam Bay", + "vsi": "Moldova Sign Language", + "vsl": "Venezuelan Sign Language", + "vsv": "Valencian Sign Language; Llengua de signes valenciana", + "vto": "Vitou", + "vum": "Vumbu", + "vun": "Vunjo", + "vut": "Vute", + "vwa": "Awa (China)", + "wa": "Walloon", + "waa": "Walla Walla", + "wab": "Wab", + "wac": "Wasco-Wishram", + "wad": "Wamesa; Wondama", + "wae": "Walser", + "waf": "Wakoná", + "wag": "Wa'ema", + "wah": "Watubela", + "wai": "Wares", + "waj": "Waffa", + "wak": "Wakashan languages", + "wal": "Wolaytta; Wolaitta", + "wam": "Wampanoag", + "wan": "Wan", + "wao": "Wappo", + "wap": "Wapishana", + "waq": "Wagiman", + "war": "Waray (Philippines)", + "was": "Washo", + "wat": "Kaninuwa", + "wau": "Waurá", + "wav": "Waka", + "waw": "Waiwai", + "wax": "Watam; Marangis", + "way": "Wayana", + "waz": "Wampur", + "wba": "Warao", + "wbb": "Wabo", + "wbe": "Waritai", + "wbf": "Wara", + "wbh": "Wanda", + "wbi": "Vwanji", + "wbj": "Alagwa", + "wbk": "Waigali", + "wbl": "Wakhi", + "wbm": "Wa", + "wbp": "Warlpiri", + "wbq": "Waddar", + "wbr": "Wagdi", + "wbs": "West Bengal Sign Language", + "wbt": "Warnman", + "wbv": "Wajarri", + "wbw": "Woi", + "wca": "Yanomámi", + "wci": "Waci Gbe", + "wdd": "Wandji", + "wdg": "Wadaginam", + "wdj": "Wadjiginy", + "wdk": "Wadikali", + "wdt": "Wendat", + "wdu": "Wadjigu", + "wdy": "Wadjabangayi", + "wea": "Wewaw", + "wec": "Wè Western", + "wed": "Wedau", + "weg": "Wergaia", + "weh": "Weh", + "wei": "Kiunum", + "wem": "Weme Gbe", + "wen": "Sorbian languages", + "weo": "Wemale", + "wep": "Westphalien", + "wer": "Weri", + "wes": "Cameroon Pidgin", + "wet": "Perai", + "weu": "Rawngtu Chin", + "wew": "Wejewa", + "wfg": "Yafi; Zorop", + "wga": "Wagaya", + "wgb": "Wagawaga", + "wgg": "Wangkangurru; Wangganguru", + "wgi": "Wahgi", + "wgo": "Waigeo", + "wgu": "Wirangu", + "wgy": "Warrgamay", + "wha": "Sou Upaa; Manusela", + "whg": "North Wahgi", + "whk": "Wahau Kenyah", + "whu": "Wahau Kayan", + "wib": "Southern Toussian", + "wic": "Wichita", + "wie": "Wik-Epa", + "wif": "Wik-Keyangan", + "wig": "Wik Ngathan", + "wih": "Wik-Me'anha", + "wii": "Minidien", + "wij": "Wik-Iiyanh", + "wik": "Wikalkan", + "wil": "Wilawila", + "wim": "Wik-Mungkan", + "win": "Ho-Chunk", + "wir": "Wiraféd", + "wiu": "Wiru", + "wiv": "Vitu", + "wiy": "Wiyot", + "wja": "Waja", + "wji": "Warji", + "wka": "Kw'adza", + "wkb": "Kumbaran", + "wkd": "Wakde; Mo", + "wkl": "Kalanadi", + "wkr": "Keerray-Woorroong", + "wku": "Kunduvadi", + "wkw": "Wakawaka", + "wky": "Wangkayutyuru", + "wla": "Walio", + "wlc": "Mwali Comorian", + "wle": "Wolane", + "wlg": "Kunbarlang", + "wlh": "Welaun", + "wli": "Waioli", + "wlk": "Wailaki", + "wll": "Wali (Sudan)", + "wlm": "Middle Welsh", + "wlo": "Wolio", + "wlr": "Wailapa", + "wls": "Wallisian", + "wlu": "Wuliwuli", + "wlv": "Wichí Lhamtés Vejoz", + "wlw": "Walak", + "wlx": "Wali (Ghana)", + "wly": "Waling", + "wma": "Mawa (Nigeria)", + "wmb": "Wambaya", + "wmc": "Wamas", + "wmd": "Mamaindé", + "wme": "Wambule", + "wmg": "Western Minyag", + "wmh": "Waima'a", + "wmi": "Wamin", + "wmm": "Maiwa (Indonesia)", + "wmn": "Waamwang", + "wmo": "Wom (Papua New Guinea)", + "wms": "Wambon", + "wmt": "Walmajarri", + "wmw": "Mwani", + "wmx": "Womo", + "wnb": "Wanambre", + "wnc": "Wantoat", + "wnd": "Wandarang", + "wne": "Waneci", + "wng": "Wanggom", + "wni": "Ndzwani Comorian", + "wnk": "Wanukaka", + "wnm": "Wanggamala", + "wnn": "Wunumara", + "wno": "Wano", + "wnp": "Wanap", + "wnu": "Usan", + "wnw": "Wintu", + "wny": "Wanyi; Waanyi", + "wo": "Wolof", + "woa": "Kuwema; Tyaraity", + "wob": "Wè Northern", + "woc": "Wogeo", + "wod": "Wolani", + "woe": "Woleaian", + "wof": "Gambian Wolof", + "wog": "Wogamusin", + "woi": "Kamang", + "wok": "Longto", + "wom": "Wom (Nigeria)", + "won": "Wongo", + "woo": "Manombai", + "wor": "Woria", + "wos": "Hanga Hundi", + "wow": "Wawonii", + "woy": "Weyto", + "wpc": "Maco", + "wrb": "Waluwarra; Warluwara", + "wrg": "Warungu; Gudjal", + "wrh": "Wiradjuri", + "wri": "Wariyangga", + "wrk": "Garrwa", + "wrl": "Warlmanpa", + "wrm": "Warumungu", + "wrn": "Warnang", + "wro": "Worrorra", + "wrp": "Waropen", + "wrr": "Wardaman", + "wrs": "Waris", + "wru": "Waru", + "wrv": "Waruna", + "wrw": "Gugu Warra", + "wrx": "Wae Rana", + "wry": "Merwari", + "wrz": "Waray (Australia)", + "wsa": "Warembori", + "wsg": "Adilabad Gondi", + "wsi": "Wusi", + "wsk": "Waskia", + "wsr": "Owenia", + "wss": "Wasa", + "wsu": "Wasu", + "wsv": "Wotapuri-Katarqalai", + "wtf": "Watiwa", + "wth": "Wathawurrung", + "wti": "Berta", + "wtk": "Watakataui", + "wtm": "Mewati", + "wtw": "Wotu", + "wua": "Wikngenchera", + "wub": "Wunambal", + "wud": "Wudu", + "wuh": "Wutunhua", + "wul": "Silimo", + "wum": "Wumbvu", + "wun": "Bungu", + "wur": "Wurrugu", + "wut": "Wutung", + "wuu": "Wu Chinese", + "wuv": "Wuvulu-Aua", + "wux": "Wulna", + "wuy": "Wauyai", + "wwa": "Waama", + "wwb": "Wakabunga", + "wwo": "Wetamut; Dorig", + "wwr": "Warrwa", + "www": "Wawa", + "wxa": "Waxianghua", + "wxw": "Wardandi", + "wyb": "Wangaaybuwan-Ngiyambaa", + "wyi": "Woiwurrung", + "wym": "Wymysorys", + "wyn": "Wyandot", + "wyr": "Wayoró", + "wyy": "Western Fijian", + "xaa": "Andalusian Arabic", + "xab": "Sambe", + "xac": "Kachari", + "xad": "Adai", + "xae": "Aequian", + "xag": "Aghwan", + "xai": "Kaimbé", + "xaj": "Ararandewára", + "xak": "Máku", + "xal": "Kalmyk; Oirat", + "xam": "ǀXam", + "xan": "Xamtanga", + "xao": "Khao", + "xap": "Apalachee", + "xaq": "Aquitanian", + "xar": "Karami", + "xas": "Kamas", + "xat": "Katawixi", + "xau": "Kauwera", + "xav": "Xavánte", + "xaw": "Kawaiisu", + "xay": "Kayan Mahakam", + "xbb": "Lower Burdekin", + "xbc": "Bactrian", + "xbd": "Bindal", + "xbe": "Bigambal", + "xbg": "Bunganditj", + "xbi": "Kombio", + "xbj": "Birrpayi", + "xbm": "Middle Breton", + "xbn": "Kenaboi", + "xbo": "Bolgarian", + "xbp": "Bibbulman", + "xbr": "Kambera", + "xbw": "Kambiwá", + "xby": "Batjala; Batyala", + "xcb": "Cumbric", + "xcc": "Camunic", + "xce": "Celtiberian", + "xcg": "Cisalpine Gaulish", + "xch": "Chemakum; Chimakum", + "xcl": "Classical Armenian", + "xcm": "Comecrudo", + "xcn": "Cotoname", + "xco": "Chorasmian", + "xcr": "Carian", + "xct": "Classical Tibetan", + "xcu": "Curonian", + "xcv": "Chuvantsy", + "xcw": "Coahuilteco", + "xcy": "Cayuse", + "xda": "Darkinyung", + "xdc": "Dacian", + "xdk": "Dharuk", + "xdm": "Edomite", + "xdo": "Kwandu", + "xdq": "Kaitag", + "xdy": "Malayic Dayak", + "xeb": "Eblan", + "xed": "Hdi", + "xeg": "ǁXegwi", + "xel": "Kelo", + "xem": "Kembayan", + "xep": "Epi-Olmec", + "xer": "Xerénte", + "xes": "Kesawai", + "xet": "Xetá", + "xeu": "Keoru-Ahia", + "xfa": "Faliscan", + "xga": "Galatian", + "xgb": "Gbin", + "xgd": "Gudang", + "xgf": "Gabrielino-Fernandeño", + "xgg": "Goreng", + "xgi": "Garingbal", + "xgl": "Galindan", + "xgm": "Dharumbal; Guwinmal", + "xgn": "Mongolian languages", + "xgr": "Garza", + "xgu": "Unggumi", + "xgw": "Guwa", + "xh": "Xhosa", + "xha": "Harami", + "xhc": "Hunnic", + "xhd": "Hadrami", + "xhe": "Khetrani", + "xhm": "Middle Khmer (1400 to 1850 CE)", + "xhr": "Hernican", + "xht": "Hattic", + "xhu": "Hurrian", + "xhv": "Khua", + "xib": "Iberian", + "xii": "Xiri", + "xil": "Illyrian", + "xin": "Xinca", + "xir": "Xiriâna", + "xis": "Kisan", + "xiv": "Indus Valley Language", + "xiy": "Xipaya", + "xjb": "Minjungbal", + "xjt": "Jaitmatang", + "xka": "Kalkoti", + "xkb": "Northern Nago", + "xkc": "Kho'ini", + "xkd": "Mendalam Kayan", + "xke": "Kereho", + "xkf": "Khengkha", + "xkg": "Kagoro", + "xki": "Kenyan Sign Language", + "xkj": "Kajali", + "xkk": "Kachok; Kaco'", + "xkl": "Mainstream Kenyah", + "xkn": "Kayan River Kayan", + "xko": "Kiorr", + "xkp": "Kabatei", + "xkq": "Koroni", + "xkr": "Xakriabá", + "xks": "Kumbewaha", + "xkt": "Kantosi", + "xku": "Kaamba", + "xkv": "Kgalagadi", + "xkw": "Kembra", + "xkx": "Karore", + "xky": "Uma' Lasan", + "xkz": "Kurtokha", + "xla": "Kamula", + "xlb": "Loup B", + "xlc": "Lycian", + "xld": "Lydian", + "xle": "Lemnian", + "xlg": "Ligurian (Ancient)", + "xli": "Liburnian", + "xln": "Alanic", + "xlo": "Loup A", + "xlp": "Lepontic", + "xls": "Lusitanian", + "xlu": "Cuneiform Luwian", + "xly": "Elymian", + "xma": "Mushungulu", + "xmb": "Mbonga", + "xmc": "Makhuwa-Marrevone", + "xmd": "Mbudum", + "xme": "Median", + "xmf": "Mingrelian", + "xmg": "Mengaka", + "xmh": "Kugu-Muminh", + "xmj": "Majera", + "xmk": "Ancient Macedonian", + "xml": "Malaysian Sign Language", + "xmm": "Manado Malay", + "xmn": "Manichaean Middle Persian", + "xmo": "Morerebi", + "xmp": "Kuku-Mu'inh", + "xmq": "Kuku-Mangk", + "xmr": "Meroitic", + "xms": "Moroccan Sign Language", + "xmt": "Matbat", + "xmu": "Kamu", + "xmv": "Antankarana Malagasy; Tankarana Malagasy", + "xmw": "Tsimihety Malagasy", + "xmx": "Salawati; Maden", + "xmy": "Mayaguduna", + "xmz": "Mori Bawah", + "xna": "Ancient North Arabian", + "xnb": "Kanakanabu", + "xnd": "Na-Dene languages", + "xng": "Middle Mongolian", + "xnh": "Kuanhua", + "xni": "Ngarigu", + "xnj": "Ngoni (Tanzania)", + "xnk": "Nganakarti", + "xnm": "Ngumbarl", + "xnn": "Northern Kankanay", + "xno": "Anglo-Norman", + "xnq": "Ngoni (Mozambique)", + "xnr": "Kangri", + "xns": "Kanashi", + "xnt": "Narragansett", + "xnu": "Nukunul", + "xny": "Nyiyaparli", + "xnz": "Kenzi; Mattoki", + "xoc": "O'chi'chi'", + "xod": "Kokoda", + "xog": "Soga", + "xoi": "Kominimung", + "xok": "Xokleng", + "xom": "Komo (Sudan)", + "xon": "Konkomba", + "xoo": "Xukurú", + "xop": "Kopar", + "xor": "Korubo", + "xow": "Kowaki", + "xpa": "Pirriya", + "xpb": "Northeastern Tasmanian; Pyemmairrener", + "xpc": "Pecheneg", + "xpd": "Oyster Bay Tasmanian", + "xpe": "Liberia Kpelle", + "xpf": "Southeast Tasmanian; Nuenonne", + "xpg": "Phrygian", + "xph": "North Midlands Tasmanian; Tyerrenoterpanner", + "xpi": "Pictish", + "xpj": "Mpalitjanh", + "xpk": "Kulina Pano", + "xpl": "Port Sorell Tasmanian", + "xpm": "Pumpokol", + "xpn": "Kapinawá", + "xpo": "Pochutec", + "xpp": "Puyo-Paekche", + "xpq": "Mohegan-Pequot", + "xpr": "Parthian", + "xps": "Pisidian", + "xpt": "Punthamara", + "xpu": "Punic", + "xpv": "Northern Tasmanian; Tommeginne", + "xpw": "Northwestern Tasmanian; Peerapper", + "xpx": "Southwestern Tasmanian; Toogee", + "xpy": "Puyo", + "xpz": "Bruny Island Tasmanian", + "xqa": "Karakhanid", + "xqt": "Qatabanian", + "xra": "Krahô", + "xrb": "Eastern Karaboro", + "xrd": "Gundungurra", + "xre": "Kreye", + "xrg": "Minang", + "xri": "Krikati-Timbira", + "xrm": "Armazic", + "xrn": "Arin", + "xrr": "Raetic", + "xrt": "Aranama-Tamique", + "xru": "Marriammu", + "xrw": "Karawa", + "xsa": "Sabaean", + "xsb": "Sambal", + "xsc": "Scythian", + "xsd": "Sidetic", + "xse": "Sempan", + "xsh": "Shamang", + "xsi": "Sio", + "xsj": "Subi", + "xsl": "South Slavey", + "xsm": "Kasem", + "xsn": "Sanga (Nigeria)", + "xso": "Solano", + "xsp": "Silopi", + "xsq": "Makhuwa-Saka", + "xsr": "Sherpa", + "xss": "Assan", + "xsu": "Sanumá", + "xsv": "Sudovian", + "xsy": "Saisiyat", + "xta": "Alcozauca Mixtec", + "xtb": "Chazumba Mixtec", + "xtc": "Katcha-Kadugli-Miri", + "xtd": "Diuxi-Tilantongo Mixtec", + "xte": "Ketengban", + "xtg": "Transalpine Gaulish", + "xth": "Yitha Yitha", + "xti": "Sinicahua Mixtec", + "xtj": "San Juan Teita Mixtec", + "xtl": "Tijaltepec Mixtec", + "xtm": "Magdalena Peñasco Mixtec", + "xtn": "Northern Tlaxiaco Mixtec", + "xto": "Tokharian A", + "xtp": "San Miguel Piedras Mixtec", + "xtq": "Tumshuqese", + "xtr": "Early Tripuri", + "xts": "Sindihui Mixtec", + "xtt": "Tacahua Mixtec", + "xtu": "Cuyamecalco Mixtec", + "xtv": "Thawa", + "xtw": "Tawandê", + "xty": "Yoloxochitl Mixtec", + "xua": "Alu Kurumba", + "xub": "Betta Kurumba", + "xud": "Umiida", + "xug": "Kunigami", + "xuj": "Jennu Kurumba", + "xul": "Ngunawal; Nunukul", + "xum": "Umbrian", + "xun": "Unggaranggu", + "xuo": "Kuo", + "xup": "Upper Umpqua", + "xur": "Urartian", + "xut": "Kuthant", + "xuu": "Kxoe; Khwedam", + "xve": "Venetic", + "xvi": "Kamviri", + "xvn": "Vandalic", + "xvo": "Volscian", + "xvs": "Vestinian", + "xwa": "Kwaza", + "xwc": "Woccon", + "xwd": "Wadi Wadi", + "xwe": "Xwela Gbe", + "xwg": "Kwegu", + "xwj": "Wajuk", + "xwk": "Wangkumara", + "xwl": "Western Xwla Gbe", + "xwo": "Written Oirat", + "xwr": "Kwerba Mamberamo", + "xwt": "Wotjobaluk", + "xww": "Wemba Wemba", + "xxb": "Boro (Ghana)", + "xxk": "Ke'o", + "xxm": "Minkin", + "xxr": "Koropó", + "xxt": "Tambora", + "xya": "Yaygir", + "xyb": "Yandjibara", + "xyj": "Mayi-Yapi", + "xyk": "Mayi-Kulan", + "xyl": "Yalakalore", + "xyt": "Mayi-Thakurti", + "xyy": "Yorta Yorta", + "xzh": "Zhang-Zhung", + "xzm": "Zemgalian", + "xzp": "Ancient Zapotec", + "yaa": "Yaminahua", + "yab": "Yuhup", + "yac": "Pass Valley Yali", + "yad": "Yagua", + "yae": "Pumé", + "yaf": "Yaka (Democratic Republic of Congo)", + "yag": "Yámana", + "yah": "Yazgulyam", + "yai": "Yagnobi", + "yaj": "Banda-Yangere", + "yak": "Yakama", + "yal": "Yalunka", + "yam": "Yamba", + "yan": "Mayangna", + "yao": "Yao", + "yap": "Yapese", + "yaq": "Yaqui", + "yar": "Yabarana", + "yas": "Nugunu (Cameroon)", + "yat": "Yambeta", + "yau": "Yuwana", + "yav": "Yangben", + "yaw": "Yawalapití", + "yax": "Yauma", + "yay": "Agwagwune", + "yaz": "Lokaa", + "yba": "Yala", + "ybb": "Yemba", + "ybe": "West Yugur", + "ybh": "Yakha", + "ybi": "Yamphu", + "ybj": "Hasha", + "ybk": "Bokha", + "ybl": "Yukuben", + "ybm": "Yaben", + "ybn": "Yabaâna", + "ybo": "Yabong", + "ybx": "Yawiyo", + "yby": "Yaweyuha", + "ych": "Chesu", + "ycl": "Lolopo", + "ycn": "Yucuna", + "ycp": "Chepya", + "yda": "Yanda", + "ydd": "Eastern Yiddish", + "yde": "Yangum Dey", + "ydg": "Yidgha", + "ydk": "Yoidik", + "yea": "Ravula", + "yec": "Yeniche", + "yee": "Yimas", + "yei": "Yeni", + "yej": "Yevanic", + "yel": "Yela", + "yer": "Tarok", + "yes": "Nyankpa", + "yet": "Yetfa", + "yeu": "Yerukula", + "yev": "Yapunda", + "yey": "Yeyi", + "yga": "Malyangapa", + "ygi": "Yiningayi", + "ygl": "Yangum Gel", + "ygm": "Yagomi", + "ygp": "Gepo", + "ygr": "Yagaria", + "ygs": "Yolŋu Sign Language", + "ygu": "Yugul", + "ygw": "Yagwoia", + "yha": "Baha Buyang", + "yhd": "Judeo-Iraqi Arabic", + "yhl": "Hlepho Phowa", + "yhs": "Yan-nhaŋu Sign Language", + "yi": "Yiddish", + "yia": "Yinggarda", + "yif": "Ache", + "yig": "Wusa Nasu", + "yih": "Western Yiddish", + "yii": "Yidiny", + "yij": "Yindjibarndi", + "yik": "Dongshanba Lalo", + "yil": "Yindjilandji", + "yim": "Yimchungru Naga", + "yin": "Riang Lai; Yinchia", + "yip": "Pholo", + "yiq": "Miqie", + "yir": "North Awyu", + "yis": "Yis", + "yit": "Eastern Lalu", + "yiu": "Awu", + "yiv": "Northern Nisu", + "yix": "Axi Yi", + "yiz": "Azhe", + "yka": "Yakan", + "ykg": "Northern Yukaghir", + "yki": "Yoke", + "ykk": "Yakaikeke", + "ykl": "Khlula", + "ykm": "Kap", + "ykn": "Kua-nsi", + "yko": "Yasa", + "ykr": "Yekora", + "ykt": "Kathu", + "yku": "Kuamasi", + "yky": "Yakoma", + "yla": "Yaul", + "ylb": "Yaleba", + "yle": "Yele", + "ylg": "Yelogu", + "yli": "Angguruk Yali", + "yll": "Yil", + "ylm": "Limi", + "yln": "Langnian Buyang", + "ylo": "Naluo Yi", + "ylr": "Yalarnnga", + "ylu": "Aribwaung", + "yly": "Nyâlayu; Nyelâyu", + "ymb": "Yambes", + "ymc": "Southern Muji", + "ymd": "Muda", + "yme": "Yameo", + "ymg": "Yamongeri", + "ymh": "Mili", + "ymi": "Moji", + "ymk": "Makwe", + "yml": "Iamalele", + "ymm": "Maay", + "ymn": "Yamna; Sunum", + "ymo": "Yangum Mon", + "ymp": "Yamap", + "ymq": "Qila Muji", + "ymr": "Malasar", + "yms": "Mysian", + "ymx": "Northern Muji", + "ymz": "Muzi", + "yna": "Aluo", + "ynd": "Yandruwandha", + "yne": "Lang'e", + "yng": "Yango", + "ynk": "Naukan Yupik", + "ynl": "Yangulam", + "ynn": "Yana", + "yno": "Yong", + "ynq": "Yendang", + "yns": "Yansi", + "ynu": "Yahuna", + "yo": "Yoruba", + "yob": "Yoba", + "yog": "Yogad", + "yoi": "Yonaguni", + "yok": "Yokuts", + "yol": "Yola", + "yom": "Yombe", + "yon": "Yongkom", + "yot": "Yotti", + "yox": "Yoron", + "yoy": "Yoy", + "ypa": "Phala", + "ypb": "Labo Phowa", + "ypg": "Phola", + "yph": "Phupha", + "ypk": "Yupik languages", + "ypm": "Phuma", + "ypn": "Ani Phowa", + "ypo": "Alo Phola", + "ypp": "Phupa", + "ypz": "Phuza", + "yra": "Yerakai", + "yrb": "Yareba", + "yre": "Yaouré", + "yrk": "Nenets", + "yrl": "Nhengatu", + "yrm": "Yirrk-Mel", + "yrn": "Yerong", + "yro": "Yaroamë", + "yrs": "Yarsun", + "yrw": "Yarawata", + "yry": "Yarluyandi", + "ysc": "Yassic", + "ysd": "Samatao", + "ysg": "Sonaga", + "ysl": "Yugoslavian Sign Language", + "ysm": "Myanmar Sign Language", + "ysn": "Sani", + "yso": "Nisi (China)", + "ysp": "Southern Lolopo", + "ysr": "Sirenik Yupik", + "yss": "Yessan-Mayo", + "ysy": "Sanie", + "yta": "Talu", + "ytl": "Tanglang", + "ytp": "Thopho", + "ytw": "Yout Wam", + "yty": "Yatay", + "yua": "Yucateco; Yucatec Maya", + "yub": "Yugambal", + "yuc": "Yuchi", + "yud": "Judeo-Tripolitanian Arabic", + "yue": "Yue Chinese; Cantonese", + "yuf": "Havasupai-Walapai-Yavapai", + "yug": "Yug", + "yui": "Yurutí", + "yuj": "Karkar-Yuri", + "yuk": "Yuki", + "yul": "Yulu", + "yum": "Quechan", + "yun": "Bena (Nigeria)", + "yup": "Yukpa", + "yuq": "Yuqui", + "yur": "Yurok", + "yut": "Yopno", + "yuw": "Yau (Morobe Province)", + "yux": "Southern Yukaghir", + "yuy": "East Yugur", + "yuz": "Yuracare", + "yva": "Yawa", + "yvt": "Yavitero", + "ywa": "Kalou", + "ywg": "Yinhawangka", + "ywl": "Western Lalu", + "ywn": "Yawanawa", + "ywq": "Wuding-Luquan Yi", + "ywr": "Yawuru", + "ywt": "Xishanba Lalo; Central Lalo", + "ywu": "Wumeng Nasu", + "yww": "Yawarawarga", + "yxa": "Mayawali", + "yxg": "Yagara", + "yxl": "Yardliyawarra", + "yxm": "Yinwum", + "yxu": "Yuyu", + "yxy": "Yabula Yabula", + "yyr": "Yir Yoront", + "yyu": "Yau (Sandaun Province)", + "yyz": "Ayizi", + "yzg": "E'ma Buyang", + "yzk": "Zokhuo", + "za": "Zhuang; Chuang", + "zaa": "Sierra de Juárez Zapotec", + "zab": "Western Tlacolula Valley Zapotec; San Juan Guelavía Zapotec", + "zac": "Ocotlán Zapotec", + "zad": "Cajonos Zapotec", + "zae": "Yareni Zapotec", + "zaf": "Ayoquesco Zapotec", + "zag": "Zaghawa", + "zah": "Zangwal", + "zai": "Isthmus Zapotec", + "zaj": "Zaramo", + "zak": "Zanaki", + "zal": "Zauzou", + "zam": "Miahuatlán Zapotec", + "zao": "Ozolotepec Zapotec", + "zap": "Zapotec", + "zaq": "Aloápam Zapotec", + "zar": "Rincón Zapotec", + "zas": "Santo Domingo Albarradas Zapotec", + "zat": "Tabaa Zapotec", + "zau": "Zangskari", + "zav": "Yatzachi Zapotec", + "zaw": "Mitla Zapotec", + "zax": "Xadani Zapotec", + "zay": "Zayse-Zergulla; Zaysete", + "zaz": "Zari", + "zba": "Balaibalan", + "zbc": "Central Berawan", + "zbe": "East Berawan", + "zbl": "Blissymbols; Bliss; Blissymbolics", + "zbt": "Batui", + "zbu": "Bu (Bauchi State)", + "zbw": "West Berawan", + "zca": "Coatecas Altas Zapotec", + "zcd": "Las Delicias Zapotec", + "zch": "Central Hongshuihe Zhuang", + "zdj": "Ngazidja Comorian", + "zea": "Zeeuws", + "zeg": "Zenag", + "zeh": "Eastern Hongshuihe Zhuang", + "zen": "Zenaga", + "zga": "Kinga", + "zgb": "Guibei Zhuang", + "zgh": "Standard Moroccan Tamazight", + "zgm": "Minz Zhuang", + "zgn": "Guibian Zhuang", + "zgr": "Magori", + "zh": "Chinese", + "zhb": "Zhaba", + "zhd": "Dai Zhuang", + "zhi": "Zhire", + "zhn": "Nong Zhuang", + "zhw": "Zhoa", + "zhx": "Chinese (family)", + "zia": "Zia", + "zib": "Zimbabwe Sign Language", + "zik": "Zimakani", + "zil": "Zialo", + "zim": "Mesme", + "zin": "Zinza", + "ziw": "Zigula", + "ziz": "Zizilivakan", + "zka": "Kaimbulawa", + "zkb": "Koibal", + "zkd": "Kadu", + "zkg": "Koguryo", + "zkh": "Khorezmian", + "zkk": "Karankawa", + "zkn": "Kanan", + "zko": "Kott", + "zkp": "São Paulo Kaingáng", + "zkr": "Zakhring", + "zkt": "Kitan", + "zku": "Kaurna", + "zkv": "Krevinian", + "zkz": "Khazar", + "zla": "Zula", + "zle": "East Slavic languages", + "zlj": "Liujiang Zhuang", + "zlm": "Malay (individual language)", + "zln": "Lianshan Zhuang", + "zlq": "Liuqian Zhuang", + "zls": "South Slavic languages", + "zlw": "West Slavic languages", + "zma": "Manda (Australia)", + "zmb": "Zimba", + "zmc": "Margany", + "zmd": "Maridan", + "zme": "Mangerr", + "zmf": "Mfinu", + "zmg": "Marti Ke", + "zmh": "Makolkol", + "zmi": "Negeri Sembilan Malay", + "zmj": "Maridjabin", + "zmk": "Mandandanyi", + "zml": "Matngala", + "zmm": "Marimanindji; Marramaninyshi", + "zmn": "Mbangwe", + "zmo": "Molo", + "zmp": "Mpuono", + "zmq": "Mituku", + "zmr": "Maranunggu", + "zms": "Mbesa", + "zmt": "Maringarr", + "zmu": "Muruwari", + "zmv": "Mbariman-Gudhinma", + "zmw": "Mbo (Democratic Republic of Congo)", + "zmx": "Bomitaba", + "zmy": "Mariyedi", + "zmz": "Mbandja", + "zna": "Zan Gula", + "znd": "Zande languages", + "zne": "Zande (individual language)", + "zng": "Mang", + "znk": "Manangkari", + "zns": "Mangas", + "zoc": "Copainalá Zoque", + "zoh": "Chimalapa Zoque", + "zom": "Zou", + "zoo": "Asunción Mixtepec Zapotec", + "zoq": "Tabasco Zoque", + "zor": "Rayón Zoque", + "zos": "Francisco León Zoque", + "zpa": "Lachiguiri Zapotec", + "zpb": "Yautepec Zapotec", + "zpc": "Choapan Zapotec", + "zpd": "Southeastern Ixtlán Zapotec", + "zpe": "Petapa Zapotec", + "zpf": "San Pedro Quiatoni Zapotec", + "zpg": "Guevea De Humboldt Zapotec", + "zph": "Totomachapan Zapotec", + "zpi": "Santa María Quiegolani Zapotec", + "zpj": "Quiavicuzas Zapotec", + "zpk": "Tlacolulita Zapotec", + "zpl": "Lachixío Zapotec", + "zpm": "Mixtepec Zapotec", + "zpn": "Santa Inés Yatzechi Zapotec", + "zpo": "Amatlán Zapotec", + "zpp": "El Alto Zapotec", + "zpq": "Zoogocho Zapotec", + "zpr": "Santiago Xanica Zapotec", + "zps": "Coatlán Zapotec", + "zpt": "San Vicente Coatlán Zapotec", + "zpu": "Yalálag Zapotec", + "zpv": "Chichicapan Zapotec", + "zpw": "Zaniza Zapotec", + "zpx": "San Baltazar Loxicha Zapotec", + "zpy": "Mazaltepec Zapotec", + "zpz": "Texmelucan Zapotec", + "zqe": "Qiubei Zhuang", + "zra": "Kara (Korea)", + "zrg": "Mirgan", + "zrn": "Zerenkel", + "zro": "Záparo", + "zrp": "Zarphatic", + "zrs": "Mairasi", + "zsa": "Sarasira", + "zsk": "Kaskean", + "zsl": "Zambian Sign Language", + "zsm": "Standard Malay", + "zsr": "Southern Rincon Zapotec", + "zsu": "Sukurum", + "zte": "Elotepec Zapotec", + "ztg": "Xanaguía Zapotec", + "ztl": "Lapaguía-Guivini Zapotec", + "ztm": "San Agustín Mixtepec Zapotec", + "ztn": "Santa Catarina Albarradas Zapotec", + "ztp": "Loxicha Zapotec", + "ztq": "Quioquitani-Quierí Zapotec", + "zts": "Tilquiapan Zapotec", + "ztt": "Tejalapan Zapotec", + "ztu": "Güilá Zapotec", + "ztx": "Zaachila Zapotec", + "zty": "Yatee Zapotec", + "zu": "Zulu", + "zua": "Zeem", + "zuh": "Tokano", + "zum": "Kumzari", + "zun": "Zuni", + "zuy": "Zumaya", + "zwa": "Zay", + "zyb": "Yongbei Zhuang", + "zyg": "Yang Zhuang", + "zyj": "Youjiang Zhuang", + "zyn": "Yongnan Zhuang", + "zyp": "Zyphe Chin", + "zza": "Zaza; Dimili; Dimli (macrolanguage); Kirdki; Kirmanjki (macrolanguage); Zazaki", + "zzj": "Zuojiang Zhuang" +} \ No newline at end of file diff --git a/src/datasets/utils/resources/multilingualities.json b/src/datasets/utils/resources/multilingualities.json new file mode 100644 index 0000000..a35c79f --- /dev/null +++ b/src/datasets/utils/resources/multilingualities.json @@ -0,0 +1,6 @@ +{ + "monolingual": "contains a single language", + "multilingual": "contains multiple languages", + "translation": "contains translated or aligned text", + "other": "other type of language distribution" +} diff --git a/src/datasets/utils/resources/readme_structure.yaml b/src/datasets/utils/resources/readme_structure.yaml new file mode 100644 index 0000000..5b781e1 --- /dev/null +++ b/src/datasets/utils/resources/readme_structure.yaml @@ -0,0 +1,116 @@ +name: "" # Filename comes here +allow_empty: false +allow_empty_text: true +subsections: + - name: "Dataset Card for X" # First-level markdown heading + allow_empty: false + allow_empty_text: true + subsections: + - name: "Table of Contents" + allow_empty: false + allow_empty_text: false + subsections: null # meaning it should not be checked. + - name: "Dataset Description" + allow_empty: false + allow_empty_text: false + subsections: + - name: "Dataset Summary" + allow_empty: false + allow_empty_text: false + subsections: null + - name: "Supported Tasks and Leaderboards" + allow_empty: true + allow_empty_text: true + subsections: null + - name: Languages + allow_empty: true + allow_empty_text: true + subsections: null + - name: "Dataset Structure" + allow_empty: false + allow_empty_text: true + subsections: + - name: "Data Instances" + allow_empty: false + allow_empty_text: true + subsections: null + - name: "Data Fields" + allow_empty: false + allow_empty_text: true + subsections: null + - name: "Data Splits" + allow_empty: false + allow_empty_text: true + subsections: null + - name: "Dataset Creation" + allow_empty: false + allow_empty_text: true + subsections: + - name: "Curation Rationale" + allow_empty: true + allow_empty_text: true + subsections: null + - name: "Source Data" + allow_empty: false + allow_empty_text: true + subsections: + - name: "Initial Data Collection and Normalization" + allow_empty: true + allow_empty_text: true + subsections: null + - name: "Who are the source language producers?" + allow_empty: true + allow_empty_text: true + subsections: null + - name: "Annotations" + allow_empty: false + allow_empty_text: true + subsections: + - name: "Annotation process" + allow_empty: true + allow_empty_text: true + subsections: null + - name: "Who are the annotators?" + allow_empty: true + allow_empty_text: true + subsections: null + - name: "Personal and Sensitive Information" + allow_empty: true + allow_empty_text: true + subsections: null + - name: "Considerations for Using the Data" + allow_empty: true + allow_empty_text: true + subsections: + - name: "Social Impact of Dataset" + allow_empty: true + allow_empty_text: true + subsections: null + - name: "Discussion of Biases" + allow_empty: true + allow_empty_text: true + subsections: null + - name: "Other Known Limitations" + allow_empty: true + allow_empty_text: true + subsections: null + - name: "Additional Information" + allow_empty: true + allow_empty_text: true + subsections: + - name: "Dataset Curators" + allow_empty: true + allow_empty_text: true + subsections: null + - name: "Licensing Information" + allow_empty: true + allow_empty_text: true + subsections: null + - name: "Citation Information" + allow_empty: false + allow_empty_text: true + subsections: null + - name: "Contributions" + allow_empty: false + allow_empty_text: false + subsections: null diff --git a/src/datasets/utils/resources/size_categories.json b/src/datasets/utils/resources/size_categories.json new file mode 100644 index 0000000..983ce0c --- /dev/null +++ b/src/datasets/utils/resources/size_categories.json @@ -0,0 +1,14 @@ +[ + "unknown", + "n<1K", + "1K1T" +] diff --git a/src/datasets/utils/sharding.py b/src/datasets/utils/sharding.py new file mode 100644 index 0000000..753bdf6 --- /dev/null +++ b/src/datasets/utils/sharding.py @@ -0,0 +1,92 @@ +import numpy as np + + +def _number_of_shards_in_gen_kwargs(gen_kwargs: dict) -> int: + """Return the number of possible shards according to the input gen_kwargs""" + # Having lists of different sizes makes sharding ambigious, raise an error in this case + # until we decide how to define sharding without ambiguity for users + lists_lengths = {key: len(value) for key, value in gen_kwargs.items() if isinstance(value, list)} + if len(set(lists_lengths.values())) > 1: + raise RuntimeError( + "Sharding is ambiguous for this dataset: " + + "we found several data sources lists of different lengths, and we don't know over which list we should parallelize:\n" + + "\n".join(f"\t- key {key} has length {length}" for key, length in lists_lengths.items()) + + "\nTo fix this, check the 'gen_kwargs' and make sure to use lists only for data sources, " + + "and use tuples otherwise. In the end there should only be one single list, or several lists with the same length." + ) + max_length = max(lists_lengths.values(), default=0) + return max(1, max_length) + + +def _distribute_shards(num_shards: int, max_num_jobs: int) -> list[range]: + """ + Get the range of shard indices per job. + If num_shards>> _distribute_shards(2, max_num_jobs=4) + [range(0, 1), range(1, 2)] + >>> _distribute_shards(10, max_num_jobs=3) + [range(0, 4), range(4, 7), range(7, 10)] + ``` + """ + shards_indices_per_group = [] + for group_idx in range(max_num_jobs): + num_shards_to_add = num_shards // max_num_jobs + (group_idx < (num_shards % max_num_jobs)) + if num_shards_to_add == 0: + break + start = shards_indices_per_group[-1].stop if shards_indices_per_group else 0 + shard_indices = range(start, start + num_shards_to_add) + shards_indices_per_group.append(shard_indices) + return shards_indices_per_group + + +def _split_gen_kwargs(gen_kwargs: dict, max_num_jobs: int) -> list[dict]: + """Split the gen_kwargs into `max_num_job` gen_kwargs""" + # Having lists of different sizes makes sharding ambigious, raise an error in this case + num_shards = _number_of_shards_in_gen_kwargs(gen_kwargs) + if num_shards == 1: + return [dict(gen_kwargs)] + else: + shard_indices_per_group = _distribute_shards(num_shards=num_shards, max_num_jobs=max_num_jobs) + return [ + { + key: [value[shard_idx] for shard_idx in shard_indices_per_group[group_idx]] + if isinstance(value, list) + else value + for key, value in gen_kwargs.items() + } + for group_idx in range(len(shard_indices_per_group)) + ] + + +def _merge_gen_kwargs(gen_kwargs_list: list[dict]) -> dict: + return { + key: [value for gen_kwargs in gen_kwargs_list for value in gen_kwargs[key]] + if isinstance(gen_kwargs_list[0][key], list) + else gen_kwargs_list[0][key] + for key in gen_kwargs_list[0] + } + + +def _shuffle_gen_kwargs(rng: np.random.Generator, gen_kwargs: dict) -> dict: + """Return a shuffled copy of the input gen_kwargs""" + # We must shuffle all the lists, and lists of the same size must have the same shuffling. + # This way entangled lists of (shard, shard_metadata) are still in the right order. + + # First, let's generate the shuffled indices per list size + list_sizes = {len(value) for value in gen_kwargs.values() if isinstance(value, list)} + indices_per_size = {} + for size in list_sizes: + indices_per_size[size] = list(range(size)) + rng.shuffle(indices_per_size[size]) + # Now let's copy the gen_kwargs and shuffle the lists based on their sizes + shuffled_kwargs = dict(gen_kwargs) + for key, value in shuffled_kwargs.items(): + if isinstance(value, list): + shuffled_kwargs[key] = [value[i] for i in indices_per_size[len(value)]] + return shuffled_kwargs diff --git a/src/datasets/utils/stratify.py b/src/datasets/utils/stratify.py new file mode 100644 index 0000000..6dab046 --- /dev/null +++ b/src/datasets/utils/stratify.py @@ -0,0 +1,107 @@ +import numpy as np + + +def approximate_mode(class_counts, n_draws, rng): + """Computes approximate mode of multivariate hypergeometric. + This is an approximation to the mode of the multivariate + hypergeometric given by class_counts and n_draws. + It shouldn't be off by more than one. + It is the mostly likely outcome of drawing n_draws many + samples from the population given by class_counts. + Args + ---------- + class_counts : ndarray of int + Population per class. + n_draws : int + Number of draws (samples to draw) from the overall population. + rng : random state + Used to break ties. + Returns + ------- + sampled_classes : ndarray of int + Number of samples drawn from each class. + np.sum(sampled_classes) == n_draws + + """ + # this computes a bad approximation to the mode of the + # multivariate hypergeometric given by class_counts and n_draws + continuous = n_draws * class_counts / class_counts.sum() + # floored means we don't overshoot n_samples, but probably undershoot + floored = np.floor(continuous) + # we add samples according to how much "left over" probability + # they had, until we arrive at n_samples + need_to_add = int(n_draws - floored.sum()) + if need_to_add > 0: + remainder = continuous - floored + values = np.sort(np.unique(remainder))[::-1] + # add according to remainder, but break ties + # randomly to avoid biases + for value in values: + (inds,) = np.where(remainder == value) + # if we need_to_add less than what's in inds + # we draw randomly from them. + # if we need to add more, we add them all and + # go to the next value + add_now = min(len(inds), need_to_add) + inds = rng.choice(inds, size=add_now, replace=False) + floored[inds] += 1 + need_to_add -= add_now + if need_to_add == 0: + break + return floored.astype(np.int64) + + +def stratified_shuffle_split_generate_indices(y, n_train, n_test, rng, n_splits=10): + """ + + Provides train/test indices to split data in train/test sets. + It's reference is taken from StratifiedShuffleSplit implementation + of scikit-learn library. + + Args + ---------- + + n_train : int, + represents the absolute number of train samples. + + n_test : int, + represents the absolute number of test samples. + + random_state : int or RandomState instance, default=None + Controls the randomness of the training and testing indices produced. + Pass an int for reproducible output across multiple function calls. + + n_splits : int, default=10 + Number of re-shuffling & splitting iterations. + """ + classes, y_indices = np.unique(y, return_inverse=True) + n_classes = classes.shape[0] + class_counts = np.bincount(y_indices) + if np.min(class_counts) < 2: + raise ValueError("Minimum class count error") + if n_train < n_classes: + raise ValueError( + "The train_size = %d should be greater or equal to the number of classes = %d" % (n_train, n_classes) + ) + if n_test < n_classes: + raise ValueError( + "The test_size = %d should be greater or equal to the number of classes = %d" % (n_test, n_classes) + ) + class_indices = np.split(np.argsort(y_indices, kind="mergesort"), np.cumsum(class_counts)[:-1]) + for _ in range(n_splits): + n_i = approximate_mode(class_counts, n_train, rng) + class_counts_remaining = class_counts - n_i + t_i = approximate_mode(class_counts_remaining, n_test, rng) + + train = [] + test = [] + + for i in range(n_classes): + permutation = rng.permutation(class_counts[i]) + perm_indices_class_i = class_indices[i].take(permutation, mode="clip") + train.extend(perm_indices_class_i[: n_i[i]]) + test.extend(perm_indices_class_i[n_i[i] : n_i[i] + t_i[i]]) + train = rng.permutation(train) + test = rng.permutation(test) + + yield train, test diff --git a/src/datasets/utils/tf_utils.py b/src/datasets/utils/tf_utils.py new file mode 100644 index 0000000..10ae3ef --- /dev/null +++ b/src/datasets/utils/tf_utils.py @@ -0,0 +1,564 @@ +# Copyright 2022 The HuggingFace Datasets Authors and the TensorFlow Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""TF-specific utils import.""" + +import os +import warnings +from functools import partial +from math import ceil +from uuid import uuid4 + +import numpy as np +import pyarrow as pa +from multiprocess import get_context + + +try: + from multiprocess.shared_memory import SharedMemory +except ImportError: + SharedMemory = None # Version checks should prevent this being called on older Python versions + +from .. import config + + +def minimal_tf_collate_fn(features): + if isinstance(features, dict): # case batch_size=None: nothing to collate + return features + elif config.TF_AVAILABLE: + import tensorflow as tf + else: + raise ImportError("Called a Tensorflow-specific function but Tensorflow is not installed.") + + first = features[0] + batch = {} + for k, v in first.items(): + if isinstance(v, np.ndarray): + batch[k] = np.stack([f[k] for f in features]) + elif isinstance(v, tf.Tensor): + batch[k] = tf.stack([f[k] for f in features]) + else: + batch[k] = np.array([f[k] for f in features]) + return batch + + +def minimal_tf_collate_fn_with_renaming(features): + batch = minimal_tf_collate_fn(features) + if "label" in batch: + batch["labels"] = batch["label"] + del batch["label"] + return batch + + +def is_numeric_pa_type(pa_type): + if pa.types.is_list(pa_type): + return is_numeric_pa_type(pa_type.value_type) + return pa.types.is_integer(pa_type) or pa.types.is_floating(pa_type) or pa.types.is_decimal(pa_type) + + +def np_get_batch( + indices, dataset, cols_to_retain, collate_fn, collate_fn_args, columns_to_np_types, return_dict=False +): + if not isinstance(indices, np.ndarray): + indices = indices.numpy() + + is_batched = True + # Optimization - if we're loading a sequential batch, do it with slicing instead of a list of indices + if isinstance(indices, np.integer): + batch = dataset[indices.item()] + is_batched = False + elif np.all(np.diff(indices) == 1): + batch = dataset[indices[0] : indices[-1] + 1] + elif isinstance(indices, np.ndarray): + batch = dataset[indices] + else: + raise RuntimeError(f"Unexpected type for indices: {type(indices)}") + + if cols_to_retain is not None: + batch = { + key: value + for key, value in batch.items() + if key in cols_to_retain or key in ("label", "label_ids", "labels") + } + + if is_batched: + actual_size = len(list(batch.values())[0]) # Get the length of one of the arrays, assume all same + # Our collators expect a list of dicts, not a dict of lists/arrays, so we invert + batch = [{key: value[i] for key, value in batch.items()} for i in range(actual_size)] + batch = collate_fn(batch, **collate_fn_args) + + if return_dict: + out_batch = {} + for col, cast_dtype in columns_to_np_types.items(): + # In case the collate_fn returns something strange + array = np.array(batch[col]) + array = array.astype(cast_dtype) + out_batch[col] = array + else: + out_batch = [] + for col, cast_dtype in columns_to_np_types.items(): + # In case the collate_fn returns something strange + array = np.array(batch[col]) + array = array.astype(cast_dtype) + out_batch.append(array) + return out_batch + + +def dataset_to_tf( + dataset, + cols_to_retain, + collate_fn, + collate_fn_args, + columns_to_np_types, + output_signature, + shuffle, + batch_size, + drop_remainder, +): + """Create a tf.data.Dataset from the underlying Dataset. This is a single-process method - the multiprocess + equivalent is multiprocess_dataset_to_tf. + + Args: + dataset (`Dataset`): Dataset to wrap with tf.data.Dataset. + cols_to_retain (`List[str]`): Dataset column(s) to load in the + tf.data.Dataset. It is acceptable to include column names that are created by the `collate_fn` and + that do not exist in the original dataset. + collate_fn(`Callable`): A function or callable object (such as a `DataCollator`) that will collate + lists of samples into a batch. + collate_fn_args (`Dict`): A `dict` of keyword arguments to be passed to the + `collate_fn`. Can be empty. + columns_to_np_types (`Dict[str, np.dtype]`): A `dict` mapping column names to numpy dtypes. + output_signature (`Dict[str, tf.TensorSpec]`): A `dict` mapping column names to + `tf.TensorSpec` objects. + shuffle(`bool`): Shuffle the dataset order when loading. Recommended True for training, False for + validation/evaluation. + batch_size (`int`, default `None`): Size of batches to load from the dataset. Defaults to `None`, which implies that + the dataset won't be batched, but the returned dataset can be batched later with `tf_dataset.batch(batch_size)`. + drop_remainder(`bool`, default `None`): Drop the last incomplete batch when loading. If not provided, + defaults to the same setting as shuffle. + + Returns: + `tf.data.Dataset` + """ + if config.TF_AVAILABLE: + import tensorflow as tf + else: + raise ImportError("Called a Tensorflow-specific function but Tensorflow is not installed.") + + # TODO Matt: When our minimum Python version is 3.8 or higher, we can delete all of this and move everything + # to the NumPy multiprocessing path. + if hasattr(tf, "random_index_shuffle"): + random_index_shuffle = tf.random_index_shuffle + elif hasattr(tf.random.experimental, "index_shuffle"): + random_index_shuffle = tf.random.experimental.index_shuffle + else: + if len(dataset) > 10_000_000: + warnings.warn( + "to_tf_dataset() can be memory-inefficient on versions of TensorFlow older than 2.9. " + "If you are iterating over a dataset with a very large number of samples, consider " + "upgrading to TF >= 2.9." + ) + random_index_shuffle = None + + getter_fn = partial( + np_get_batch, + dataset=dataset, + cols_to_retain=cols_to_retain, + collate_fn=collate_fn, + collate_fn_args=collate_fn_args, + columns_to_np_types=columns_to_np_types, + return_dict=False, + ) + + # This works because dictionaries always output in the same order + tout = [tf.dtypes.as_dtype(dtype) for dtype in columns_to_np_types.values()] + + @tf.function(input_signature=[tf.TensorSpec(None, tf.int64)]) + def fetch_function(indices): + output = tf.py_function( + getter_fn, + inp=[indices], + Tout=tout, + ) + return {key: output[i] for i, key in enumerate(columns_to_np_types.keys())} + + tf_dataset = tf.data.Dataset.range(len(dataset)) + + if shuffle and random_index_shuffle is not None: + base_seed = tf.fill((3,), value=tf.cast(-1, dtype=tf.int64)) + + def scan_random_index(state, index): + if tf.reduce_all(state == -1): + # This generates a new random seed once per epoch only, + # to ensure that we iterate over each sample exactly once per epoch + state = tf.random.uniform(shape=(3,), maxval=2**62, dtype=tf.int64) + shuffled_index = random_index_shuffle(index=index, seed=state, max_index=len(dataset) - 1) + return state, shuffled_index + + tf_dataset = tf_dataset.scan(base_seed, scan_random_index) + elif shuffle: + tf_dataset = tf_dataset.shuffle(tf_dataset.cardinality()) + + if batch_size is not None: + tf_dataset = tf_dataset.batch(batch_size, drop_remainder=drop_remainder) + + tf_dataset = tf_dataset.map(fetch_function) + + if batch_size is not None: + + def ensure_shapes(input_dict): + return {key: tf.ensure_shape(val, output_signature[key].shape) for key, val in input_dict.items()} + + else: + # Ensure shape but remove batch dimension of output_signature[key].shape + def ensure_shapes(input_dict): + return {key: tf.ensure_shape(val, output_signature[key].shape[1:]) for key, val in input_dict.items()} + + return tf_dataset.map(ensure_shapes) + + +class SharedMemoryContext: + # This is a context manager for creating shared memory that ensures cleanup happens even if a process is interrupted + # The process that creates shared memory is always the one responsible for unlinking it in the end + def __init__(self): + self.created_shms = [] + self.opened_shms = [] + + def get_shm(self, name, size, create): + shm = SharedMemory(size=int(size), name=name, create=create) + if create: + # We only unlink the ones we created in this context + self.created_shms.append(shm) + else: + # If we didn't create it, we only close it when done, we don't unlink it + self.opened_shms.append(shm) + return shm + + def get_array(self, name, shape, dtype, create): + shm = self.get_shm(name=name, size=np.prod(shape) * np.dtype(dtype).itemsize, create=create) + return np.ndarray(shape, dtype=dtype, buffer=shm.buf) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + for shm in self.created_shms: + shm.close() + shm.unlink() + for shm in self.opened_shms: + shm.close() + + +class NumpyMultiprocessingGenerator: + def __init__( + self, + dataset, + cols_to_retain, + collate_fn, + collate_fn_args, + columns_to_np_types, + output_signature, + shuffle, + batch_size, + drop_remainder, + num_workers, + ): + self.dataset = dataset + self.cols_to_retain = cols_to_retain + self.collate_fn = collate_fn + self.collate_fn_args = collate_fn_args + self.string_columns = [col for col, dtype in columns_to_np_types.items() if dtype is np.str_] + # Strings will be converted to arrays of single unicode chars, so that we can have a constant itemsize + self.columns_to_np_types = { + col: dtype if col not in self.string_columns else np.dtype("U1") + for col, dtype in columns_to_np_types.items() + } + self.output_signature = output_signature + self.shuffle = shuffle + self.batch_size = batch_size + self.drop_remainder = drop_remainder + self.num_workers = num_workers + # Because strings are converted to characters, we need to add one extra dimension to the shape + self.columns_to_ranks = { + col: int(spec.shape.rank) if col not in self.string_columns else int(spec.shape.rank) + 1 + for col, spec in output_signature.items() + } + + def __iter__(self): + # Make sure we only spawn workers if they have work to do + num_workers = min(self.num_workers, int(ceil(len(self.dataset) / self.batch_size))) + # Do the shuffling in iter so that it's done at the start of each epoch + per_worker_batches, final_batch, final_batch_worker = self.distribute_batches( + self.dataset, self.batch_size, self.drop_remainder, num_workers, self.shuffle + ) + ctx = get_context("spawn") + names = [] + shape_arrays = [] + workers = [] + array_ready_events = [ctx.Event() for _ in range(num_workers)] + array_loaded_events = [ctx.Event() for _ in range(num_workers)] + + base_args = { + "dataset": self.dataset, + "cols_to_retain": self.cols_to_retain, + "collate_fn": self.collate_fn, + "collate_fn_args": self.collate_fn_args, + "columns_to_np_types": self.columns_to_np_types, + "columns_to_ranks": self.columns_to_ranks, + "string_columns": self.string_columns, + } + with SharedMemoryContext() as shm_ctx: + for i in range(num_workers): + worker_random_id = str(uuid4()) + worker_name = f"dw_{i}_{worker_random_id}"[:10] + names.append(worker_name) + + worker_shape_arrays = { + col: shm_ctx.get_array(f"{worker_name}_{col}_shape", shape=(rank,), dtype=np.int64, create=True) + for col, rank in self.columns_to_ranks.items() + } + shape_arrays.append(worker_shape_arrays) + + worker_indices = per_worker_batches[i] + if i == final_batch_worker and final_batch is not None: + final_batch_arg = final_batch + else: + final_batch_arg = None + worker_kwargs = { + "worker_name": worker_name, + "indices": worker_indices, + "extra_batch": final_batch_arg, + "array_ready_event": array_ready_events[i], + "array_loaded_event": array_loaded_events[i], + **base_args, + } + worker = ctx.Process(target=self.worker_loop, kwargs=worker_kwargs, daemon=True) + worker.start() + workers.append(worker) + + end_signal_received = False + while not end_signal_received: + for i in range(num_workers): + if not array_ready_events[i].wait(timeout=60): + raise TimeoutError("Data loading worker timed out!") + array_ready_events[i].clear() + array_shapes = shape_arrays[i] + if any(np.any(shape < 0) for shape in array_shapes.values()): + # Child processes send negative array shapes to indicate + # that no more data is going to be sent + end_signal_received = True + break + # Matt: Because array shapes are variable we recreate the shared memory each iteration. + # I suspect repeatedly opening lots of shared memory is the bottleneck for the parent process. + # A future optimization, at the cost of some code complexity, could be to reuse shared memory + # between iterations, but this would require knowing in advance the maximum size, or having + # a system to only create a new memory block when a new maximum size is seen. + # Another potential optimization would be to figure out which memory copies are necessary, + # or whether we can yield objects straight out of shared memory. + with SharedMemoryContext() as batch_shm_ctx: + # This memory context only lasts long enough to copy everything out of the batch + arrays = { + col: batch_shm_ctx.get_array( + f"{names[i]}_{col}", + shape=shape, + dtype=self.columns_to_np_types[col], + create=False, + ) + for col, shape in array_shapes.items() + } + # Copy everything out of shm because the memory + # will be unlinked by the child process at some point + arrays = {col: np.copy(arr) for col, arr in arrays.items()} + # Now we convert any unicode char arrays to strings + for string_col in self.string_columns: + arrays[string_col] = ( + arrays[string_col].view(f"U{arrays[string_col].shape[-1]}").squeeze(-1) + ) + yield arrays + array_loaded_events[i].set() + # Now we just do some cleanup + # Shared memory is cleaned up by the context manager, so we just make sure workers finish + for worker in workers: + worker.join() + + def __call__(self): + return self + + @staticmethod + def worker_loop( + dataset, + cols_to_retain, + collate_fn, + collate_fn_args, + columns_to_np_types, + columns_to_ranks, + string_columns, + indices, + extra_batch, + worker_name, + array_ready_event, + array_loaded_event, + ): + os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" + + if config.TF_AVAILABLE: + import tensorflow as tf + else: + raise ImportError("Called a Tensorflow-specific function but Tensorflow is not installed.") + + tf.config.set_visible_devices([], "GPU") # Make sure workers don't try to allocate GPU memory + + def send_batch_to_parent(indices): + batch = np_get_batch( + indices=indices, + dataset=dataset, + cols_to_retain=cols_to_retain, + collate_fn=collate_fn, + collate_fn_args=collate_fn_args, + columns_to_np_types=columns_to_np_types, + return_dict=True, + ) + + # Now begins the fun part where we start shovelling shared memory at the parent process + out_arrays = {} + with SharedMemoryContext() as batch_shm_ctx: + # The batch shared memory context exists only as long as it takes for the parent process + # to read everything, after which it cleans everything up again + for col, cast_dtype in columns_to_np_types.items(): + # Everything has to be np.array for this to work, even if the collate_fn is giving us tf.Tensor + array = batch[col] + if col in string_columns: + # We can't send unicode arrays over shared memory, so we convert to single chars ("U1") + # which have a fixed width of 4 bytes. The parent process will convert these back to strings. + array = array.view("U1").reshape(array.shape + (-1,)) + shape_arrays[col][:] = array.shape + out_arrays[col] = batch_shm_ctx.get_array( + f"{worker_name}_{col}", shape=array.shape, dtype=cast_dtype, create=True + ) + out_arrays[col][:] = array + + array_ready_event.set() + array_loaded_event.wait() + array_loaded_event.clear() + + with SharedMemoryContext() as shm_ctx: + shape_arrays = { + col: shm_ctx.get_array(f"{worker_name}_{col}_shape", shape=(rank,), dtype=np.int64, create=False) + for col, rank in columns_to_ranks.items() + } + + for batch in indices: + send_batch_to_parent(batch) + if extra_batch is not None: + send_batch_to_parent(extra_batch) + # Now we send a batsignal to the parent process that we're done + for col, array in shape_arrays.items(): + array[:] = -1 + array_ready_event.set() + + @staticmethod + def distribute_batches(dataset, batch_size, drop_remainder, num_workers, shuffle): + indices = np.arange(len(dataset)) + if shuffle: + np.random.shuffle(indices) + num_samples = len(indices) + # We distribute the batches so that reading from the workers in round-robin order yields the exact + # order specified in indices. This is only important when shuffle is False, but we do it regardless. + incomplete_batch_cutoff = num_samples - (num_samples % batch_size) + indices, last_incomplete_batch = np.split(indices, [incomplete_batch_cutoff]) + if drop_remainder or len(last_incomplete_batch) == 0: + last_incomplete_batch = None + + indices = indices.reshape(-1, batch_size) + num_batches = len(indices) + final_batches_cutoff = num_batches - (num_batches % num_workers) + indices, final_batches = np.split(indices, [final_batches_cutoff]) + indices = indices.reshape(-1, num_workers, batch_size) + + per_worker_indices = np.split(indices, indices.shape[1], axis=1) + per_worker_indices = [np.squeeze(worker_indices, 1) for worker_indices in per_worker_indices] + # Distribute the final batches to the first workers + for i in range(len(final_batches)): + # len(final_batches) can be zero, and is always less than num_workers + per_worker_indices[i] = np.concatenate([per_worker_indices[i], final_batches[i].reshape(1, -1)], axis=0) + # Add the last incomplete batch to the next worker, which might be the first worker + if last_incomplete_batch is not None: + incomplete_batch_worker_idx = len(final_batches) + else: + incomplete_batch_worker_idx = None + return per_worker_indices, last_incomplete_batch, incomplete_batch_worker_idx + + +def multiprocess_dataset_to_tf( + dataset, + cols_to_retain, + collate_fn, + collate_fn_args, + columns_to_np_types, + output_signature, + shuffle, + batch_size, + drop_remainder, + num_workers, +): + """Create a tf.data.Dataset from the underlying Dataset. This is a multi-process method - the single-process + equivalent is dataset_to_tf. + + Args: + dataset (`Dataset`): Dataset to wrap with tf.data.Dataset. + cols_to_retain (`List[str]`): Dataset column(s) to load in the + tf.data.Dataset. It is acceptable to include column names that are created by the `collate_fn` and + that do not exist in the original dataset. + collate_fn(`Callable`): A function or callable object (such as a `DataCollator`) that will collate + lists of samples into a batch. + collate_fn_args (`Dict`): A `dict` of keyword arguments to be passed to the + `collate_fn`. Can be empty. + columns_to_np_types (`Dict[str, np.dtype]`): A `dict` mapping column names to numpy dtypes. + output_signature (`Dict[str, tf.TensorSpec]`): A `dict` mapping column names to + `tf.TensorSpec` objects. + shuffle(`bool`): Shuffle the dataset order when loading. Recommended True for training, False for + validation/evaluation. + batch_size (`int`, default `None`): Size of batches to load from the dataset. Defaults to `None`, which implies that + the dataset won't be batched, but the returned dataset can be batched later with `tf_dataset.batch(batch_size)`. + drop_remainder(`bool`, default `None`): Drop the last incomplete batch when loading. If not provided, + defaults to the same setting as shuffle. + num_workers (`int`): Number of workers to use for loading the dataset. Should be >= 1. + + Returns: + `tf.data.Dataset` + """ + if config.TF_AVAILABLE: + import tensorflow as tf + else: + raise ImportError("Called a Tensorflow-specific function but Tensorflow is not installed.") + + data_generator = NumpyMultiprocessingGenerator( + dataset=dataset, + cols_to_retain=cols_to_retain, + collate_fn=collate_fn, + collate_fn_args=collate_fn_args, + columns_to_np_types=columns_to_np_types, + output_signature=output_signature, + shuffle=shuffle, + batch_size=batch_size, + drop_remainder=drop_remainder, + num_workers=num_workers, + ) + + tf_dataset = tf.data.Dataset.from_generator(data_generator, output_signature=output_signature) + if drop_remainder: + dataset_length = int(len(dataset) // batch_size) + else: + dataset_length = int(ceil(len(dataset) / batch_size)) + return tf_dataset.apply(tf.data.experimental.assert_cardinality(dataset_length)) diff --git a/src/datasets/utils/tqdm.py b/src/datasets/utils/tqdm.py new file mode 100644 index 0000000..88ab7c0 --- /dev/null +++ b/src/datasets/utils/tqdm.py @@ -0,0 +1,135 @@ +"""Utility helpers to handle progress bars in `datasets`. + +Example: + 1. Use `datasets.utils.tqdm` as you would use `tqdm.tqdm` or `tqdm.auto.tqdm`. + 2. To disable progress bars, either use `disable_progress_bars()` helper or set the + environment variable `HF_DATASETS_DISABLE_PROGRESS_BARS` to 1. + 3. To re-enable progress bars, use `enable_progress_bars()`. + 4. To check whether progress bars are disabled, use `are_progress_bars_disabled()`. + +NOTE: Environment variable `HF_DATASETS_DISABLE_PROGRESS_BARS` has the priority. + +Example: + ```py + from datasets.utils import ( + are_progress_bars_disabled, + disable_progress_bars, + enable_progress_bars, + tqdm, + ) + + # Disable progress bars globally + disable_progress_bars() + + # Use as normal `tqdm` + for _ in tqdm(range(5)): + do_something() + + # Still not showing progress bars, as `disable=False` is overwritten to `True`. + for _ in tqdm(range(5), disable=False): + do_something() + + are_progress_bars_disabled() # True + + # Re-enable progress bars globally + enable_progress_bars() + + # Progress bar will be shown ! + for _ in tqdm(range(5)): + do_something() + ``` +""" + +import os +import warnings + +from tqdm.auto import tqdm as old_tqdm + +from ..config import HF_DATASETS_DISABLE_PROGRESS_BARS + + +# `HF_DATASETS_DISABLE_PROGRESS_BARS` is `Optional[bool]` while `_hf_datasets_progress_bars_disabled` +# is a `bool`. If `HF_DATASETS_DISABLE_PROGRESS_BARS` is set to True or False, it has priority. +# If `HF_DATASETS_DISABLE_PROGRESS_BARS` is None, it means the user have not set the +# environment variable and is free to enable/disable progress bars programmatically. +# TL;DR: env variable has priority over code. +# +# By default, progress bars are enabled. +_hf_datasets_progress_bars_disabled: bool = HF_DATASETS_DISABLE_PROGRESS_BARS or False + + +def disable_progress_bars() -> None: + """ + Disable globally progress bars used in `datasets` except if `HF_DATASETS_DISABLE_PROGRESS_BARS` environment + variable has been set. + + Use [`~utils.enable_progress_bars`] to re-enable them. + """ + if HF_DATASETS_DISABLE_PROGRESS_BARS is False: + warnings.warn( + "Cannot disable progress bars: environment variable `HF_DATASETS_DISABLE_PROGRESS_BARS=0` is set and has" + " priority." + ) + return + global _hf_datasets_progress_bars_disabled + _hf_datasets_progress_bars_disabled = True + + +def enable_progress_bars() -> None: + """ + Enable globally progress bars used in `datasets` except if `HF_DATASETS_DISABLE_PROGRESS_BARS` environment + variable has been set. + + Use [`~utils.disable_progress_bars`] to disable them. + """ + if HF_DATASETS_DISABLE_PROGRESS_BARS is True: + warnings.warn( + "Cannot enable progress bars: environment variable `HF_DATASETS_DISABLE_PROGRESS_BARS=1` is set and has" + " priority." + ) + return + global _hf_datasets_progress_bars_disabled + _hf_datasets_progress_bars_disabled = False + + +def are_progress_bars_disabled() -> bool: + """Return whether progress bars are globally disabled or not. + + Progress bars used in `datasets` can be enable or disabled globally using [`~utils.enable_progress_bars`] + and [`~utils.disable_progress_bars`] or by setting `HF_DATASETS_DISABLE_PROGRESS_BARS` as environment variable. + """ + global _hf_datasets_progress_bars_disabled + return _hf_datasets_progress_bars_disabled + + +class tqdm(old_tqdm): + """ + Class to override `disable` argument in case progress bars are globally disabled. + + Taken from https://github.com/tqdm/tqdm/issues/619#issuecomment-619639324. + """ + + def __init__(self, *args, **kwargs): + if are_progress_bars_disabled(): + kwargs["disable"] = True + elif kwargs.get("disable") is None and os.getenv("TQDM_POSITION") == "-1": + # Force-enable progress bars in cloud environments when disable=None + kwargs["disable"] = False + super().__init__(*args, **kwargs) + + def __delattr__(self, attr: str) -> None: + """Fix for https://github.com/huggingface/datasets/issues/6066""" + try: + super().__delattr__(attr) + except AttributeError: + if attr != "_lock": + raise + + +# backward compatibility +enable_progress_bar = enable_progress_bars +disable_progress_bar = disable_progress_bars + + +def is_progress_bar_enabled(): + return not are_progress_bars_disabled() diff --git a/src/datasets/utils/track.py b/src/datasets/utils/track.py new file mode 100644 index 0000000..ffd3434 --- /dev/null +++ b/src/datasets/utils/track.py @@ -0,0 +1,61 @@ +from collections.abc import Iterable, Iterator + + +class tracked_str(str): + origins = {} + + def set_origin(self, origin: str): + if super().__repr__() not in self.origins: + self.origins[super().__repr__()] = origin + + def get_origin(self): + return self.origins.get(super().__repr__(), str(self)) + + def __repr__(self) -> str: + if super().__repr__() not in self.origins or self.origins[super().__repr__()] == self: + return super().__repr__() + else: + return f"{str(self)} (origin={self.origins[super().__repr__()]})" + + +class tracked_list(list): + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) + self.last_item = None + + def __iter__(self) -> Iterator: + for x in super().__iter__(): + self.last_item = x + yield x + self.last_item = None + + def __repr__(self) -> str: + if self.last_item is None: + return super().__repr__() + else: + return f"{self.__class__.__name__}(current={self.last_item})" + + +class TrackedIterableFromGenerator(Iterable): + """Utility class to create an iterable from a generator function, in order to reset the generator when needed.""" + + def __init__(self, generator, *args): + super().__init__() + self.generator = generator + self.args = args + self.last_item = None + + def __iter__(self): + for x in self.generator(*self.args): + self.last_item = x + yield x + self.last_item = None + + def __repr__(self) -> str: + if self.last_item is None: + return super().__repr__() + else: + return f"{self.__class__.__name__}(current={self.last_item})" + + def __reduce__(self): + return (self.__class__, (self.generator, *self.args)) diff --git a/src/datasets/utils/typing.py b/src/datasets/utils/typing.py new file mode 100644 index 0000000..4736d74 --- /dev/null +++ b/src/datasets/utils/typing.py @@ -0,0 +1,9 @@ +import os +from typing import TypeVar, Union + + +T = TypeVar("T") + +ListLike = Union[list[T], tuple[T, ...]] +NestedDataStructureLike = Union[T, list[T], dict[str, T]] +PathLike = Union[str, bytes, os.PathLike] diff --git a/src/datasets/utils/version.py b/src/datasets/utils/version.py new file mode 100644 index 0000000..75cf4c3 --- /dev/null +++ b/src/datasets/utils/version.py @@ -0,0 +1,106 @@ +# Copyright 2020 The HuggingFace Datasets Authors and the TensorFlow Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""Version utils.""" + +import dataclasses +import re +from dataclasses import dataclass +from functools import total_ordering +from typing import Optional, Union + + +_VERSION_REG = re.compile(r"^(?P\d+)" r"\.(?P\d+)" r"\.(?P\d+)$") + + +@total_ordering +@dataclass +class Version: + """Dataset version `MAJOR.MINOR.PATCH`. + + Args: + version_str (`str`): + The dataset version. + description (`str`): + A description of what is new in this version. + major (`str`): + minor (`str`): + patch (`str`): + + Example: + + ```py + >>> VERSION = datasets.Version("1.0.0") + ``` + """ + + version_str: str + description: Optional[str] = None + major: Optional[Union[str, int]] = None + minor: Optional[Union[str, int]] = None + patch: Optional[Union[str, int]] = None + + def __post_init__(self): + self.major, self.minor, self.patch = _str_to_version_tuple(self.version_str) + + def __repr__(self): + return f"{self.tuple[0]}.{self.tuple[1]}.{self.tuple[2]}" + + @property + def tuple(self): + return self.major, self.minor, self.patch + + def _validate_operand(self, other): + if isinstance(other, str): + return Version(other) + elif isinstance(other, Version): + return other + raise TypeError(f"{other} (type {type(other)}) cannot be compared to version.") + + def __eq__(self, other): + try: + other = self._validate_operand(other) + except (TypeError, ValueError): + return False + else: + return self.tuple == other.tuple + + def __lt__(self, other): + other = self._validate_operand(other) + return self.tuple < other.tuple + + def __hash__(self): + return hash(_version_tuple_to_str(self.tuple)) + + @classmethod + def from_dict(cls, dic): + field_names = {f.name for f in dataclasses.fields(cls)} + return cls(**{k: v for k, v in dic.items() if k in field_names}) + + def _to_yaml_string(self) -> str: + return self.version_str + + +def _str_to_version_tuple(version_str): + """Return the tuple (major, minor, patch) version extracted from the str.""" + res = _VERSION_REG.match(version_str) + if not res: + raise ValueError(f"Invalid version '{version_str}'. Format should be x.y.z with {{x,y,z}} being digits.") + return tuple(int(v) for v in [res.group("major"), res.group("minor"), res.group("patch")]) + + +def _version_tuple_to_str(version_tuple): + """Return the str version from the version tuple (major, minor, patch).""" + return ".".join(str(v) for v in version_tuple) diff --git a/templates/README.md b/templates/README.md new file mode 100644 index 0000000..a288f58 --- /dev/null +++ b/templates/README.md @@ -0,0 +1,126 @@ +--- +TODO: "Add YAML tags here. Delete these instructions and copy-paste the YAML tags obtained with the online tagging app: https://huggingface.co/spaces/huggingface/datasets-tagging" +--- + +# Dataset Card for [Dataset Name] + +## Table of Contents +- [Table of Contents](#table-of-contents) +- [Dataset Description](#dataset-description) + - [Dataset Summary](#dataset-summary) + - [Supported Tasks and Leaderboards](#supported-tasks-and-leaderboards) + - [Languages](#languages) +- [Dataset Structure](#dataset-structure) + - [Data Instances](#data-instances) + - [Data Fields](#data-fields) + - [Data Splits](#data-splits) +- [Dataset Creation](#dataset-creation) + - [Curation Rationale](#curation-rationale) + - [Source Data](#source-data) + - [Annotations](#annotations) + - [Personal and Sensitive Information](#personal-and-sensitive-information) +- [Considerations for Using the Data](#considerations-for-using-the-data) + - [Social Impact of Dataset](#social-impact-of-dataset) + - [Discussion of Biases](#discussion-of-biases) + - [Other Known Limitations](#other-known-limitations) +- [Additional Information](#additional-information) + - [Dataset Curators](#dataset-curators) + - [Licensing Information](#licensing-information) + - [Citation Information](#citation-information) + - [Contributions](#contributions) + +## Dataset Description + +- **Homepage:** +- **Repository:** +- **Paper:** +- **Leaderboard:** +- **Point of Contact:** + +### Dataset Summary + +[More Information Needed] + +### Supported Tasks and Leaderboards + +[More Information Needed] + +### Languages + +[More Information Needed] + +## Dataset Structure + +### Data Instances + +[More Information Needed] + +### Data Fields + +[More Information Needed] + +### Data Splits + +[More Information Needed] + +## Dataset Creation + +### Curation Rationale + +[More Information Needed] + +### Source Data + +#### Initial Data Collection and Normalization + +[More Information Needed] + +#### Who are the source language producers? + +[More Information Needed] + +### Annotations + +#### Annotation process + +[More Information Needed] + +#### Who are the annotators? + +[More Information Needed] + +### Personal and Sensitive Information + +[More Information Needed] + +## Considerations for Using the Data + +### Social Impact of Dataset + +[More Information Needed] + +### Discussion of Biases + +[More Information Needed] + +### Other Known Limitations + +[More Information Needed] + +## Additional Information + +### Dataset Curators + +[More Information Needed] + +### Licensing Information + +[More Information Needed] + +### Citation Information + +[More Information Needed] + +### Contributions + +Thanks to [@github-username](https://github.com/) for adding this dataset. diff --git a/templates/README_guide.md b/templates/README_guide.md new file mode 100644 index 0000000..d8e7173 --- /dev/null +++ b/templates/README_guide.md @@ -0,0 +1,200 @@ +--- +TODO: "Add YAML tags here. Delete these instructions and copy-paste the YAML tags obtained with the online tagging app: https://huggingface.co/spaces/huggingface/datasets-tagging" +YAML tags: "Find the full spec here: https://github.com/huggingface/hub-docs/blob/main/datasetcard.md?plain=1" +--- + +# Dataset Card Creation Guide + +## Table of Contents +- [Dataset Card Creation Guide](#dataset-card-creation-guide) + - [Table of Contents](#table-of-contents) + - [Dataset Description](#dataset-description) + - [Dataset Summary](#dataset-summary) + - [Supported Tasks and Leaderboards](#supported-tasks-and-leaderboards) + - [Languages](#languages) + - [Dataset Structure](#dataset-structure) + - [Data Instances](#data-instances) + - [Data Fields](#data-fields) + - [Data Splits](#data-splits) + - [Dataset Creation](#dataset-creation) + - [Curation Rationale](#curation-rationale) + - [Source Data](#source-data) + - [Initial Data Collection and Normalization](#initial-data-collection-and-normalization) + - [Who are the source language producers?](#who-are-the-source-language-producers) + - [Annotations](#annotations) + - [Annotation process](#annotation-process) + - [Who are the annotators?](#who-are-the-annotators) + - [Personal and Sensitive Information](#personal-and-sensitive-information) + - [Considerations for Using the Data](#considerations-for-using-the-data) + - [Social Impact of Dataset](#social-impact-of-dataset) + - [Discussion of Biases](#discussion-of-biases) + - [Other Known Limitations](#other-known-limitations) + - [Additional Information](#additional-information) + - [Dataset Curators](#dataset-curators) + - [Licensing Information](#licensing-information) + - [Citation Information](#citation-information) + - [Contributions](#contributions) + +## Dataset Description + +- **Homepage:** [Add homepage URL here if available (unless it's a GitHub repository)]() +- **Repository:** [If the dataset is hosted on github or has a github homepage, add URL here]() +- **Paper:** [If the dataset was introduced by a paper or there was a paper written describing the dataset, add URL here (landing page for Arxiv paper preferred)]() +- **Leaderboard:** [If the dataset supports an active leaderboard, add link here]() +- **Point of Contact:** [If known, name and email of at least one person the reader can contact for questions about the dataset.]() + +### Dataset Summary + +Briefly summarize the dataset, its intended use and the supported tasks. Give an overview of how and why the dataset was created. The summary should explicitly mention the languages present in the dataset (possibly in broad terms, e.g. *translations between several pairs of European languages*), and describe the domain, topic, or genre covered. + +### Supported Tasks and Leaderboards + +For each of the tasks tagged for this dataset, give a brief description of the tag, metrics, and suggested models (with a link to their HuggingFace implementation if available). Give a similar description of tasks that were not covered by the structured tag set (repace the `task-category-tag` with an appropriate `other:other-task-name`). + +- `task-category-tag`: The dataset can be used to train a model for [TASK NAME], which consists in [TASK DESCRIPTION]. Success on this task is typically measured by achieving a *high/low* [metric name](https://huggingface.co/metrics/metric_name). The ([model name](https://huggingface.co/model_name) or [model class](https://huggingface.co/transformers/model_doc/model_class.html)) model currently achieves the following score. *[IF A LEADERBOARD IS AVAILABLE]:* This task has an active leaderboard which can be found at [leaderboard url]() and ranks models based on [metric name](https://huggingface.co/metrics/metric_name) while also reporting [other metric name](https://huggingface.co/metrics/other_metric_name). + +### Languages + +Provide a brief overview of the languages represented in the dataset. Describe relevant details about specifics of the language such as whether it is social media text, African American English,... + +When relevant, please provide [BCP-47 codes](https://tools.ietf.org/html/bcp47), which consist of a [primary language subtag](https://tools.ietf.org/html/bcp47#section-2.2.1), with a [script subtag](https://tools.ietf.org/html/bcp47#section-2.2.3) and/or [region subtag](https://tools.ietf.org/html/bcp47#section-2.2.4) if available. + +## Dataset Structure + +### Data Instances + +Provide an JSON-formatted example and brief description of a typical instance in the dataset. If available, provide a link to further examples. + +``` +{ + 'example_field': ..., + ... +} +``` + +Provide any additional information that is not covered in the other sections about the data here. In particular describe any relationships between data points and if these relationships are made explicit. + +### Data Fields + +List and describe the fields present in the dataset. Mention their data type, and whether they are used as input or output in any of the tasks the dataset currently supports. If the data has span indices, describe their attributes, such as whether they are at the character level or word level, whether they are contiguous or not, etc. If the datasets contains example IDs, state whether they have an inherent meaning, such as a mapping to other datasets or pointing to relationships between data points. + +- `example_field`: description of `example_field` + +Note that the descriptions can be initialized with the **Show Markdown Data Fields** output of the [Datasets Tagging app](https://huggingface.co/spaces/huggingface/datasets-tagging), you will then only need to refine the generated descriptions. + +### Data Splits + +Describe and name the splits in the dataset if there are more than one. + +Describe any criteria for splitting the data, if used. If there are differences between the splits (e.g. if the training annotations are machine-generated and the dev and test ones are created by humans, or if different numbers of annotators contributed to each example), describe them here. + +Provide the sizes of each split. As appropriate, provide any descriptive statistics for the features, such as average length. For example: + +| | train | validation | test | +|-------------------------|------:|-----------:|-----:| +| Input Sentences | | | | +| Average Sentence Length | | | | + +## Dataset Creation + +### Curation Rationale + +What need motivated the creation of this dataset? What are some of the reasons underlying the major choices involved in putting it together? + +### Source Data + +This section describes the source data (e.g. news text and headlines, social media posts, translated sentences,...) + +#### Initial Data Collection and Normalization + +Describe the data collection process. Describe any criteria for data selection or filtering. List any key words or search terms used. If possible, include runtime information for the collection process. + +If data was collected from other pre-existing datasets, link to source here and to their [Hugging Face version](https://huggingface.co/datasets/dataset_name). + +If the data was modified or normalized after being collected (e.g. if the data is word-tokenized), describe the process and the tools used. + +#### Who are the source language producers? + +State whether the data was produced by humans or machine generated. Describe the people or systems who originally created the data. + +If available, include self-reported demographic or identity information for the source data creators, but avoid inferring this information. Instead state that this information is unknown. See [Larson 2017](https://www.aclweb.org/anthology/W17-1601.pdf) for using identity categories as a variables, particularly gender. + +Describe the conditions under which the data was created (for example, if the producers were crowdworkers, state what platform was used, or if the data was found, what website the data was found on). If compensation was provided, include that information here. + +Describe other people represented or mentioned in the data. Where possible, link to references for the information. + +### Annotations + +If the dataset contains annotations which are not part of the initial data collection, describe them in the following paragraphs. + +#### Annotation process + +If applicable, describe the annotation process and any tools used, or state otherwise. Describe the amount of data annotated, if not all. Describe or reference annotation guidelines provided to the annotators. If available, provide interannotator statistics. Describe any annotation validation processes. + +#### Who are the annotators? + +If annotations were collected for the source data (such as class labels or syntactic parses), state whether the annotations were produced by humans or machine generated. + +Describe the people or systems who originally created the annotations and their selection criteria if applicable. + +If available, include self-reported demographic or identity information for the annotators, but avoid inferring this information. Instead state that this information is unknown. See [Larson 2017](https://www.aclweb.org/anthology/W17-1601.pdf) for using identity categories as a variables, particularly gender. + +Describe the conditions under which the data was annotated (for example, if the annotators were crowdworkers, state what platform was used, or if the data was found, what website the data was found on). If compensation was provided, include that information here. + +### Personal and Sensitive Information + +State whether the dataset uses identity categories and, if so, how the information is used. Describe where this information comes from (i.e. self-reporting, collecting from profiles, inferring, etc.). See [Larson 2017](https://www.aclweb.org/anthology/W17-1601.pdf) for using identity categories as a variables, particularly gender. State whether the data is linked to individuals and whether those individuals can be identified in the dataset, either directly or indirectly (i.e., in combination with other data). + +State whether the dataset contains other data that might be considered sensitive (e.g., data that reveals racial or ethnic origins, sexual orientations, religious beliefs, political opinions or union memberships, or locations; financial or health data; biometric or genetic data; forms of government identification, such as social security numbers; criminal history). + +If efforts were made to anonymize the data, describe the anonymization process. + +## Considerations for Using the Data + +### Social Impact of Dataset + +Please discuss some of the ways you believe the use of this dataset will impact society. + +The statement should include both positive outlooks, such as outlining how technologies developed through its use may improve people's lives, and discuss the accompanying risks. These risks may range from making important decisions more opaque to people who are affected by the technology, to reinforcing existing harmful biases (whose specifics should be discussed in the next section), among other considerations. + +Also describe in this section if the proposed dataset contains a low-resource or under-represented language. If this is the case or if this task has any impact on underserved communities, please elaborate here. + +### Discussion of Biases + +Provide descriptions of specific biases that are likely to be reflected in the data, and state whether any steps were taken to reduce their impact. + +For Wikipedia text, see for example [Dinan et al 2020 on biases in Wikipedia (esp. Table 1)](https://huggingface.co/papers/2005.00614), or [Blodgett et al 2020](https://www.aclweb.org/anthology/2020.acl-main.485/) for a more general discussion of the topic. + +If analyses have been run quantifying these biases, please add brief summaries and links to the studies here. + +### Other Known Limitations + +If studies of the datasets have outlined other limitations of the dataset, such as annotation artifacts, please outline and cite them here. + +## Additional Information + +### Dataset Curators + +List the people involved in collecting the dataset and their affiliation(s). If funding information is known, include it here. + +### Licensing Information + +Provide the license and link to the license webpage if available. + +### Citation Information + +Provide the [BibTex](http://www.bibtex.org/)-formatted reference for the dataset. For example: +``` +@article{article_id, + author = {Author List}, + title = {Dataset Paper Title}, + journal = {Publication Venue}, + year = {2525} +} +``` + +If the dataset has a [DOI](https://www.doi.org/), please provide it here. + +### Contributions + +Thanks to [@github-username](https://github.com/) for adding this dataset. diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/_test_patching.py b/tests/_test_patching.py new file mode 100644 index 0000000..78aa45a --- /dev/null +++ b/tests/_test_patching.py @@ -0,0 +1,11 @@ +# ruff: noqa: F401 +# This is the module that test_patching.py uses to test patch_submodule() +import os +import os as renamed_os +from os import path +from os import path as renamed_path +from os.path import join +from os.path import join as renamed_join + + +open = open # we just need to have a builtin inside this module to test it properly diff --git a/tests/commands/__init__.py b/tests/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/commands/conftest.py b/tests/commands/conftest.py new file mode 100644 index 0000000..2285a2a --- /dev/null +++ b/tests/commands/conftest.py @@ -0,0 +1,9 @@ +import pytest +from huggingface_hub import snapshot_download + + +@pytest.fixture +def dataset_dir(tmp_path): + dataset_dir = tmp_path / "test_command_dataset_dir" + snapshot_download("hf-internal-testing/ner-jsonl", repo_type="dataset", local_dir=dataset_dir) + return str(dataset_dir) diff --git a/tests/commands/test_test.py b/tests/commands/test_test.py new file mode 100644 index 0000000..9c47cde --- /dev/null +++ b/tests/commands/test_test.py @@ -0,0 +1,83 @@ +import os +from collections import namedtuple + +import pytest + +from datasets import ClassLabel, Features, List, Value +from datasets.commands.test import TestCommand +from datasets.info import DatasetInfo, DatasetInfosDict + + +_TestCommandArgs = namedtuple( + "_TestCommandArgs", + [ + "dataset", + "name", + "cache_dir", + "data_dir", + "all_configs", + "save_infos", + "ignore_verifications", + "force_redownload", + "clear_cache", + "num_proc", + ], + defaults=[None, None, None, False, False, False, False, False, None], +) + + +def is_1percent_close(source, target): + return (abs(source - target) / target) < 0.01 + + +@pytest.mark.integration +def test_test_command(dataset_dir): + args = _TestCommandArgs(dataset=dataset_dir, all_configs=True, save_infos=True) + test_command = TestCommand(*args) + test_command.run() + dataset_readme_path = os.path.join(dataset_dir, "README.md") + assert os.path.exists(dataset_readme_path) + dataset_infos = DatasetInfosDict.from_directory(dataset_dir) + expected_dataset_infos = DatasetInfosDict( + { + "default": DatasetInfo( + features=Features( + { + "tokens": List(Value("string")), + "ner_tags": List( + ClassLabel(names=["O", "B-PER", "I-PER", "B-ORG", "I-ORG", "B-LOC", "I-LOC"]) + ), + "langs": List(Value("string")), + "spans": List(Value("string")), + } + ), + splits=[ + { + "name": "train", + "num_bytes": 2351563, + "num_examples": 10000, + }, + { + "name": "validation", + "num_bytes": 238418, + "num_examples": 1000, + }, + ], + download_size=3940680, + dataset_size=2589981, + ) + } + ) + assert dataset_infos.keys() == expected_dataset_infos.keys() + for key in DatasetInfo._INCLUDED_INFO_IN_YAML: + result, expected = getattr(dataset_infos["default"], key), getattr(expected_dataset_infos["default"], key) + if key == "num_bytes": + assert is_1percent_close(result, expected) + elif key == "splits": + assert list(result) == list(expected) + for split in result: + assert result[split].name == expected[split].name + assert result[split].num_examples == expected[split].num_examples + assert is_1percent_close(result[split].num_bytes, expected[split].num_bytes) + else: + result == expected diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..dd7cd0b --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,62 @@ +import pytest + +import datasets +import datasets.config + + +# Import fixture modules as plugins +pytest_plugins = ["tests.fixtures.files", "tests.fixtures.hub", "tests.fixtures.fsspec"] + + +def pytest_collection_modifyitems(config, items): + # Mark tests as "unit" by default if not marked as "integration" (or already marked as "unit") + for item in items: + if any(marker in item.keywords for marker in ["integration", "unit"]): + continue + item.add_marker(pytest.mark.unit) + + +@pytest.fixture(autouse=True) +def set_test_cache_config(tmp_path_factory, monkeypatch): + # test_hf_cache_home = tmp_path_factory.mktemp("cache") # TODO: why a cache dir per test function does not work? + test_hf_cache_home = tmp_path_factory.getbasetemp() / "cache" + test_hf_datasets_cache = test_hf_cache_home / "datasets" + monkeypatch.setattr("datasets.config.HF_DATASETS_CACHE", str(test_hf_datasets_cache)) + test_downloaded_datasets_path = test_hf_datasets_cache / "downloads" + monkeypatch.setattr("datasets.config.DOWNLOADED_DATASETS_PATH", str(test_downloaded_datasets_path)) + test_extracted_datasets_path = test_hf_datasets_cache / "downloads" / "extracted" + monkeypatch.setattr("datasets.config.EXTRACTED_DATASETS_PATH", str(test_extracted_datasets_path)) + + # used in dataset viewer, we may set it to true by default in the future + monkeypatch.setattr("datasets.config.SAVE_ORIGINAL_SHARD_LENGTHS", True) + + +@pytest.fixture(autouse=True) +def disable_implicit_token(monkeypatch): + monkeypatch.setattr("huggingface_hub.constants.HF_HUB_DISABLE_IMPLICIT_TOKEN", True) + + +@pytest.fixture(autouse=True, scope="session") +def disable_tqdm_output(): + datasets.disable_progress_bar() + + +@pytest.fixture(autouse=True) +def set_update_download_counts_to_false(monkeypatch): + # don't take tests into account when counting downloads + monkeypatch.setattr("datasets.config.HF_UPDATE_DOWNLOAD_COUNTS", False) + + +@pytest.fixture +def set_sqlalchemy_silence_uber_warning(monkeypatch): + # Required to suppress RemovedIn20Warning when feature(s) are not compatible with SQLAlchemy 2.0 + # To be removed once SQLAlchemy 2.0 supported + try: + monkeypatch.setattr("sqlalchemy.util.deprecations.SILENCE_UBER_WARNING", True) + except (ModuleNotFoundError, AttributeError): + pass + + +@pytest.fixture(autouse=True, scope="session") +def zero_time_out_for_remote_code(): + datasets.config.TIME_OUT_REMOTE_CODE = 0 diff --git a/tests/distributed_scripts/run_torch_distributed.py b/tests/distributed_scripts/run_torch_distributed.py new file mode 100644 index 0000000..4cfe247 --- /dev/null +++ b/tests/distributed_scripts/run_torch_distributed.py @@ -0,0 +1,55 @@ +import os +from argparse import ArgumentParser +from typing import List + +import torch.utils.data + +from datasets import Dataset, IterableDataset +from datasets.distributed import split_dataset_by_node + + +NUM_SHARDS = 4 +NUM_ITEMS_PER_SHARD = 3 + + +class FailedTestError(RuntimeError): + pass + + +def gen(shards: List[str]): + for shard in shards: + for i in range(NUM_ITEMS_PER_SHARD): + yield {"i": i, "shard": shard} + + +def main(): + rank = int(os.environ["RANK"]) + world_size = int(os.environ["WORLD_SIZE"]) + + parser = ArgumentParser() + parser.add_argument("--streaming", type=bool) + parser.add_argument("--local_rank", type=int) + parser.add_argument("--num_workers", type=int, default=0) + args = parser.parse_args() + streaming = args.streaming + num_workers = args.num_workers + + gen_kwargs = {"shards": [f"shard_{shard_idx}" for shard_idx in range(NUM_SHARDS)]} + ds = IterableDataset.from_generator(gen, gen_kwargs=gen_kwargs) + if not streaming: + ds = Dataset.from_list(list(ds)) + + ds = split_dataset_by_node(ds, rank=rank, world_size=world_size) + dataloader = torch.utils.data.DataLoader(ds, num_workers=num_workers) + + full_size = NUM_SHARDS * NUM_ITEMS_PER_SHARD + expected_local_size = full_size // world_size + expected_local_size += int(rank < (full_size % world_size)) + + local_size = sum(1 for _ in dataloader) + if local_size != expected_local_size: + raise FailedTestError(f"local_size {local_size} != expected_local_size {expected_local_size}") + + +if __name__ == "__main__": + main() diff --git a/tests/features/__init__.py b/tests/features/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/features/data/test_audio_16000.mp3 b/tests/features/data/test_audio_16000.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f3414e5a0e45d5b4f0c23d49251a7189641257c6 GIT binary patch literal 15336 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%0Dx=NH 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 B^8x?> literal 0 HcmV?d00001 diff --git a/tests/features/data/test_audio_44100.mp3 b/tests/features/data/test_audio_44100.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..944d3f24c8651417bd518f9d25b6f7f3e23039d3 GIT binary patch literal 40124 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%0A&ENa(%%lrtt! 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 z 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∈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 z%0AfhFQ5uMpx?*@`kPFn$#{F4w55|!vxYbj$MZ2{(kl* zx;S(pc#jtN-KQhhI-OKN`YtW02~AAI9J+-qf{yP#GY!4TDK?4m!s*nC6lO<}mh1#F z1WB5e>_V~un)+f?(ba4(WM;dP19*Fu?TwEeCY?tgb(Fiu9pUb9XSoFYuPe8L zy8@4F0lJXx$3CGXJ|kyYjsxxiaYRCw*LBgr8_qK1YCyVdA zySvxpKI|Fj65KzXMct#Eb6tkxw{wQ0xl^~_b9A>?bsRwk_KQuxCCDOCHc-u6;K}7R z+gf9c<)*_hjGN&}NGDV5na?Ac-WT~*E3_G#w$!2h`Z_(mUPr&8x%63DqSjgKq7~G1 z^#MAk@krDcQZuNxkR#!vx$=HB zNq(iqC~wtj*j6=FcByTZrD|nm0^9>*RXhBoso-^Nru@OzV_q$w)YeL$lvBo|g1$VZS(DJ6H4o=D%s0a91YTJO+X4HEo9CSjWp2o4k8!=?EGslVUo zvsfXokXFctZ~qQ13{DT)kbW5tpJ?7dtpEu`2Vx*&RS9VRG3dBazJ91sfkA%bj4%}7t z@YqnH@Q6@3Y+9>@dxkn939tp;fzR*YGuK%&taal z20_32W@ZLEe+tN!mqFx{Kp&z={5f$E;vd_w1$a4&kUc(wr0P3pS2St>UPC8BN1b8Y z6}8%SFzTu8QdAkZnb$#Q_ea&UHvqS0zdhd0IYRd7j?OZ02IRrQOdwi8?Na3Ub8>2qv!Kvtqj-bzZgZ|1*vXN$_DcOh~>m+K} zX>d0ZNHubhq$cyoTc}w}SqU_egRBV8`dO$qW3dmc0`;aCbAoAyo!()j>0{7?bjQRw z1XZgQH2v)Ca46B)Fcl^+m7%>?#kOxKQy$yD)|gkjGAi`7Ftm8WHiWBU0#gpNRcW~M z3!-x=ia(_W`mcKI736NV!uvUg>B%0&Y#D>Obr$QRpV(2f6uCl|5eFxe%3NLAksC`p zaB;LTcbeAXl4yPI4Q-951NWS^;vT}uegp6Gj1J^v+MiQt4ekz{{iC5%iTIngA|XuA zW3fMoWs|W7c*cxnpWu0pZ(m^2veTJ)Odcl5x6|kKQC}>)t8+a+Jx|>AJeAzL-Dg~! zyAF6PAD!Qv6P>M`PUj`Zct>9NQ6`~#P6DsU0=3(T+rB2a(;2M&NF+Bj1>>VJ&FF80 z!!~0k95flj6_GK$5u%`IOwhTIsa=68G)S)lHiKW?u5ChozCIk%Idlb9uP&>&D)id%OHA*?B)`t&sl9Hs(RyL}A zlo4tTbU($Bwyll+Yl5Pv_mpxVf{fQzLxX>+p3@Zds^&u;pToo$1t0r2Ogrz8BMHEj z;L)C`QQ8&ty&A73qJ|w;m#GKTh3Y0`lh+_?yB@5O)u>@}@bx`Z^(*zTDRiq1lmtbQ z2P&)OvOmj^xurUXs|rlK~jL;rL+Fe~sOuoBACzQBvX4fIe!_z&`+BGpHY zYJ`kmMdX-s<87v3^b{42Ot=nnRfB?QFt;zX&x^g;R~<(6B>z2Q_nB??EOCWA_x39Eka#VNRa(s5Qc8+phbN+E= zL*8|yt3TKVBV9K43Reer0A7YZ;1WGU&1&eW=6&dS?d|Ao>$~UO>r3VP4=jMR(6#F@ zhkfIiWVoyHG3Sub`NGU*(y?clw(K`%AttsRY$0@B?b*MW1q)*@I08wxWAL$mMX!~H z?t)wL1ZhDppqok}mFQLCLK5dX6szG#^H9uYXV@B;_(bLawt}fKpRFdh*zeG?{O}fh zCmqN~(h}*tJftT!h%6b3Nwf(2o^`+-|A29lMU2L_WTHqBrZ_3b^dp0rB_xhHO3pKn z$Q$Mx`O6687n4lxGEc}><~CA2zsMk_G@Z(9qL-KqTxND7w}f@^8e5&OMLO}b$aMYz zImf4?-}r{~6W^8I;(O8yd|#S?x99op^d3K$hWJIaM)VEZFIuGa@hJRLI+9;VZ*iGu zer`S4N3$VKbeFA8SFu%TZ?+n3$5y26v4gA!uR<2KK0cnKY&ZDiRbMA&rf)U!pf`8Gfotj&Jt<_7q&h;Bg(YKf3RCxC&ne zbi`R8F#5qL8fW%5Eu?J58QqZ-z8=04Zj346Sx65xNBZkA=8B&B5IrsQ+J~6O=4f`j znqSAnwhgtSpL$b`QM;)x6_>hGxvUI;z^LgAs?j7= zk~yFpO~(Av9=%T~)ldqel9WYdX$I!eIOtv5)V$gqb%d4-Mc#!ZPe>K9?F(RoC}ZEH z;`xc^1K2#bwc4nlmDB}VaeUooQ0HrIXf|Jv>batv)UGR=@C<`9vW7NViKw-d>uOHr zi29$rQ0*$`RpX?^%1!aLoKGw*-xl^uQ-z9B6Colt6hx2~OmV6}rBQfWM|dJy!L8!X zU?Z_4z_C*%zr3x4vq2;TN*2|n?AgF!zDW)2h%Rthu<4#K>6B=9nL z2TpY;Qo_=}&tTg?67=~e!Nq|<@OvPe&;sVLJOxAYvWRszDb_Hu@DCnabu@~HfIq{U4 z6As>L76sF@3a&;BM^b$?u1Z`3qay|0;=gbff51hFFQ9$~@cj_j%4u+KsvFpk*Fno2#_5fvbme zjcc7V%KgsS75dd?_c7N8ceJ~)XS(|n`m5pI>7E~6(No>m5&rW7-nWtBcHYb}5s>PGVeS4pW^ZGAoE3ex+KhL?*L;$W-Buf3)$p<9!^~F%b73oZ7e=ux-NsJ9&hHz|Nh)$f$QbSrN#s&UM!p_x!_T9w`MoqR zf0PEf&Ga|7i<;ae8pGeG9eI%+;EQv~d|!@6FXZ0ylexisL+%S_16ghjeM76zk=QBl z(AD2y6MCJL!IKL$HwPX!*^AFlCvp^CwSK6$2GbDz;ZV>Z61|yxr9sxY46i~fun)hu zTX@D|6Y|3~*qy<39O(nUbAqFsbHBZ>;}3i)Md7U*j{63;k!W{7IjDetA;+-8sbV^< zL};j842MbK08a?>M)&Z)&7Ty?8tRGe>Je&GeYgvLYgv%Rd!hD5$5UO)fr;!0a(9E2 z>S|Rbprlvgl|SgF{)6V5Qz@o&MztFJ&zXp+rJM3XnTa{WdK)>H60z*5u{5_f$O#!3fD~SfI1gy z*ETpJE@(^e}+yQ$UXJqq|| zvL<$yw}_fFQal6i!d$7kI7%udwwKb2MWmo$fwY(?9t6>_r%+ckf|js9cuD9S93w;p z9m1i&;$TN;?qvdJ1MLG_;AGzuxF2|kEONSF?O?rNr(n-ut6(>DRh2RE75INY#RZFl z1=9`v)GXw5_6NHPTJX8hO6ZD?&Oo|ng0xHgC}oyP%Tqy-d>~De3(N7~wLM37m02N5 zoH9k}ia9qsl=S0T4lS=f7k;zP+7wKItMnGw@%7UufIb(eAJK2>-*gt)C{(6A$X zJiIX6#bAva#!$nJv`irob-Yl(Z=r7OG(6@OBP+Darsg+exLE@P!@8N(63u*gis9Bu4b-Pb@Gexc?t_#efwY{-ngOk9H@L%(u>bpk z3p77K^|^*xwHw^oGhhsV0_`UQsD3R#YMldh{Wk6d`~t1@6L`R{Kt{g|Zu@!M_0b}i zz-MiOYavf?zarM2$9~U#+TPev$Z;8)?kvv5j#iijJpH`yJs+?gZ0LLF-Q_C?&QdFA?L*)hh{Nmub-2zMP-2FH7jpyq zD+-Oh7F!ggfEFO3b!G=)5}b!A@Djfm-A;?ccl8RJygg9J z=b|&3%Mz$Yx#8Td57m4mwuoa$ChQ0+AlcG_EP^L#7ra~th{UcSM?huk$wu&}?tnVg zm`y+`_#=}6Q)oM={0os4PJ-g4B8jcDAHbGMU}fwmeX$+hR2fSoXg zTgCMOIiWe1hAYAy!Oz6v*WM&KX)|&G3R_>21Q*&xHZ67tKk;#$2mNse+aJ>`WplI3 z;TF3CXGjQSo-SU-_slcL+t-uI8x1G^5qAksBhWEEx!SmExlX#Kfvs@W5$nwESmT&w ze+3SDYI|i|CR=B_1Fu4M+_c2qUhvocno-aoHsWj?LQ~br-lG)fEe`^jDQm@?Iscd_gIOd2gWH zLcNa6$0xbDdQa}IK9Yy2*W|(KR=Fees+#Ipxe?y>P!HpMu0g}PBTrMG$lKLq`Ied* zGhhRBLC2Me=#r*rb=5K20CZTB;L#eZu0&3Hi*`g^it4o)8^<_oy*j}!5e=@}8Sp1t zVlv90I@PSIU2TAlZGk!%w70Fu_#QA(%zbgO!Cp!TRucb`W|Bt3jvr zW8!QN&cj1-y3|>cF!?o>o5`!>>!?qulx=b?<*K|y(dE}lPo=V&8T*9CaH$Q&b|bw$ zN?#8*?r*(SCrW`G8{lAO3lBsl=4a?GSP6B|FJCj(p$}pDr6AbG`A?JY%@5ckq=5jM7$Bb0Tg_-L}rbU;fuDf*G!4a|6uam3?pkZ$TEqfqH^gTgK9|4m6A+UzB!qb2o?YQid zE9xO!Hznb|nP=~1e`?=sSM0y-Wl^yHh=9Kfb({lE84Z}RByB52b zxbu6;c^-LwBQ@9EJJuTqFT)k@TTtjSVIG|9o8-HX#9R(|!UuqD)d9|^JfH_;Viv%u zxd7VHHfAvxQ9d}Wc3>JTj!G~CF7bKb4-5pwpaofi8q^3pSC%}3i!>3`t9ay_uYxV} z4tv0#aF#n!l~RK&RhV=ly~t)V84k)GsCb#-ayZXsB%Sb8ABBo|6=}T$<^yKY|DZ*s z{{JTO6x>S@_ApzDyo4I|lWjvx^lN@L8vDW&=xEQd9rzFK`ZDAks@@+~L7y{?4kRA# zGHK7b=^(Bs@-TJa-;Aa2Ku@?zbJGvBD7AB?p-pw5N!$)vi2qKf^ZB?0XzqLYT3mNN z11ED=X-}>(y+I$58ni7u@ec9}85%de%2uHl*;e#4TZ}Gdzmdk!`~8?#CxVC@@+C4u ze5Dz`_mOXjcf7BXx3tglJO`JsfwwG3V<(YfjByWicL4$Mw6nA;+PT8n#_!MG`MPV+-wLn^$8p^qs-c%z-&QA_*!Um_`CinR6-vV zx})U_t;W{7H@uk@wHmsleuSTMs+JnO*2Q2KF-k9W7j*Ofa*R4buBKj<`>S3!28u$5 z%BKufGbap zmlPw{k_0KI^ihhD{z`uFv$RD#E|nCAN*mEUnlZ82AYVo6ZRqQNP zhIeYT#Da)D7@qVqa-8&5-Xbx|GpQwB0d^?MWkV^f%m6K_5I!?6;rLjj+x6U`*7{`h zy;nj5^mn0bdO|2g+Z0l@xKKXKeY12&SkT)c@pLh4gc=z=!&i)jVXwI&T-lr!ZetD! zw>Kw-dzh!f>#$$>Y1T9fThojY)>-3<_0fn}hEXc=2ijGlktXuWC=^L+HjlWWqdzxD zB;F9LVa6+~wsFHsZNyn$!(FYEa0{!VG09qGoUk4kA1u3RfJ?4oCwLfIeH$xcWPyKO zM!wl+RWln~op5t+Cu*L}YK9v?ZJ}qCjub;}Yih+no5+qVMGH7b6L5E<0oeDqz|GEp z+oMfEtX~p!AJli>KM#Ywi9NxdXpe!9u&$$oV*>vF3P{bBoEIG5o$cXgu)Es3lU%tx zd)&9dBdO~B=~)I3!&~o4Zw22s?=}!v(lJYXbC6L^VoEVjm@dqErZ$x93{c!NGlRgP znveSRk=Y2}xWT+_JEGked@Cq7{qo_-FKxBCh z|Iuyu-ru4dNlVlHf9~szEZ%U;i52K5@(sUsDfx{WG#i?IZa5f{;HO#$ooqaIe@mED z}r~ctfM)|C>mx<(`)c6Yy=}>5nK|Bp%oov7t>#?hs#TraHC0p zJ5OTxza%H0mHPN%^bwbp?&dPmtz163mn%X~;Q7O~rsMcTnlU;*w;Ue!N73uJi_vSj zfziV`oiE7s=8w_aTyffhOCl;ALoUGYoCZ+ zJ$;y#NgJotgfC)%b_=TdUvzZI@Lf^8oSq8qt^_T+-cb9DIv@sC~s}V~MHLPE_tT8>@!Pp+2fgJHHV|RF! z@j3k5D2n%LxAtcvo zGp~JXz*+f;d`v~?S5vVUyai{2j~rsNL1W5}39bUk4QE49QVN{y66l<2gZUdveqkEC z04?bjyN#%DTV=rhtO&M-b;vTfy_=$jrAH>_9-LjnpuJ~f*MUUU8+*vk$m6VGR>4z| z23przbZa?j12Pb`qAzVtn$Rkw5G_ko{ObSk`$q8RSD_xV5H5+wv^mMl4JM1YQzXcx zry;lt4s(A=U(}i=+(S|xeU_cuM*<*Hwc*kso4l6B!M`B#9k^oAi@DO#aojh2yEp%i zzUTVWvCz_sac{|Yx((#6h2#Qi>@GThl%OK~r?W8)Rz?^34L;YwjLbMu=b!pIFc-12 z*nkaS1CUt*UKJheYNV`xdiHtRda`&V%z)$E{h+G9aTRe@bWL}zcm8l_j>3)#j_mdp z_T0FDf;-5#Kz`O%3HMfR;ePsL&X6%~jy$JqTX~H>3*4cuzwmLhVDhLE4Ph zpXq(z`}_mX=K^Tz4YiV(ynd^@K}_m{9;O8xRjrX>DXlu-7f)0UD&w)Iss?@C3l`@y zIfHT#?&_8DHF*e9BH82&@_Q*YZfC^GMdSf+UvHL|fo7jUS)*)6r$ca2pclHLRd7Vy zR7-2c;1yj1Quhn6_cQ4}I42&VMvcN(YFYR|AEPFvjb6r+G!S~64 z_)-%7tJa{+_0xK&U9^g7CoR7^5IR;5?WR%&9bp*N^e8&H+Uf)O6)1dLl;NPm)I^Ff zlUz^nLdzDUV#*2WgWOsgC4UelsixRcT8Jwga$Ul^L79 z^ztIvg{iclJYH@fmy??#mpoS9DF2pcDQDnh-45<%Uyau@Ab)vT&jvnlif#{W(Erod z;=j`ay?7`(G&s~LbR66RJ{$usUUT^4x?-a5h=df_h1l9^k0@piJZU4VLBt?tf6R=1 zEZJCQ>BdYeWDK`TnCq=RV8}Fsw>WI1n7fQg<~XCGIT60mRYo`S6g04qal&j24XnE< zn6c(9vp3YRz38)^nrY$HDg$QqMk^bxL9c^O@f40x8MmWzgS0RR7lJn8uJm$Tj@pEK z(|>F=aci$HF2c6LMXEj^+b7t*;$r-8`@Ei<_mk`d@DhhdgeU`?(i|6cM>5e(#K0t(lXiu>YbAOd)F$j9M{otHmye_Q`K_omo#`Ct{lz&u zO@eE+8yyTsRAthRjwGqL4Cu2?(jL4I`gu!^iJr`z=PPri_>=So*Obo3&kyFJ;9Ibu z&3kA)j-zEbKe<5{ks{QMzuSB$ab75RvoNV7&!~XwyVH*e@HX!HG4`RzfqsiRXse0+ z?-kqwt8J?ZXWn@1Xy$>|xXzeli1>Fr6C_Aqn1Kf;0VK|ap;}Np_Uj$=vidD>@a7@6 zQ5!cWzN<};i0y`FI&`C6(2yLOrEFJ6D~(i_@?AM3k5}4b!=6rdD5~@Yw|*AM{iK|7 zSX7a`v&l&!kw1$S<^14sPLWdNds1U)Tqi-(b*O*j#%c>CLH(kXMz^#Xggr}}0PXk? zGB)eAr%-7Q;9g1|l9&1Lb?SCuQEW~GN` z^nzSeN-sAMYfD|w51kLb5>~=pa48rsaKc4lxgZNQ#lfgg4^XMzfrOLu-aj=vOVnxr`;@Uhw?hGV+44=QB#0U&9s5 z)W#;TJS$m@c^qC&5q(s)$YXe^KAV*z)6A#vH?*-X8kMbE#!%~?vD)$*XOXe7kORyb z>4N*`KaCRBU}L9Q0si$$@Nd;NmZ5Ju3w!NdBHT8HlDh@o;_fRc7axP(Hrn;-n_nC zzUIEvs7Fts0dEHZFJ16})d*@&Vd= zQ}UKM4)0Z2b{;hJmrNPts0Tpt`oq2_%SmJU3-yW8^|U-aOB;jJS)I;<&eR#zZUkth zSMfGPU8qHA={0T|w5D|2bG|NjhEL6n=96eHemFhI1qsIu2g$TBxkI~<@tjHu@~dbf zda0(-i@2lFpSjJ^H@HI4?ciBg>16&U?auF~MesgeekD!E@1Qn*DqY1nDdon1Y87T> zWQOXISIiN%1KeZ9(P!3%uc{0a!+r!UXNzw$v&dHhB#BYJ{ocRcTHf2p z*k^T21D?S7Mq?wpL5xS?_u*yX-XK85hq@s7w+p+ZO1O)opjK@~cQa1Qq3`;C%B2yq z!!MvEb|QV5i#?OFp&eDSDL7m#ebhwR`nFy&goTb2BO zt-K|?kgt?f>Nso=>tp}eSUC=d=Og6e?t$zJ7O6s@{C86Cpmz!?QCc>&A@+a+aTB4W zHsN1Z5L|*;@<^qmoJmO|hvZl=$k)mXm0Q>nJb_bepNzc$D4ff|G`K3dWrqkVgK%G* zCu|Xy33EX_-Yt$4(@Hg)8ki61#DW9}UDk<%gJkm<(gxFsih%0M@@ji>hEYQ31 zNWxRDXlrpC{Bq|Eky1FJV$Xhdj+z{jD|? ziOVgZ@Z|_Gcnunei&8s6J;GAx2CfrjGP2{gof^solHq7$Z#c%RW+bBjDUIy$JgW(` z^A_eC%y<*5YRL6DjSprnBem7gXkaZeCR*Q(L=ecHSeK1yRte*Uc_>`goDu$tBKB0X>?xjlUD!>|iXzy;^Ls7K9gT|oTLgVeKxo6PSbO>vcRJ)8|$qt=6Nl^Qvm z%~4s9!MW=AWUue+?MQM)98F#OonKsITx;E3an+@`M+S#;s5dJ}R?~2kW~uieNLEv@ z7igpj=;;-(2Vjx2j0fE>6S9yBs;4V;!FywLq;tirdOpa5-~beeD~*2JUvz(23AJeQId2J`>NU&?miYI5(J7xo~amgfcuhlusiD~sxs!uN_doZ2!AoyMk z1@DSu;J^APWYmdNk}Dq6aa1(!lDDjsc~XusjcKk zy~fya zv``%QpkHu7s{vdK(?O|j2URjHUYT-)a~hk$1g#EVRg#etz0Y8)vAMyTV_vixVyE{E zTGU?S4=9PHtu!Daj>QaUnae>#JQYbXJ4D)=`>d_T1LOwFnyeujM);4B$;b2&i6 z>fQxo8knI3HR`Rg#rTdiVP+^-eZfAq!M~7Y8C$BzbX)z1h5Pc0qcYnX+ArHYj=oW|95187 zj@I@G&d+w2Yq8^?tCO?6ySPhor?`fDX1i4o?wW({*3;VyHES^Z?Bl^>*a%Ya3r{QD zZW!rpjjyUX-gxhJ(D~M(qQxVl69seF4+s1`^*|7E6Q zcUJ?HnX*vGw<29wg$%)d|1t77@8HBjWucXj^gZzJavU-@x0t_hPu*et%uTi{Jnj-( zjda5e$Q#%$mZLYI2^FN@=>+(h=AawvO$X63v>#^3X>bo5rCn)P?h~!VFXnFW0{5K{ zbJzIm+<3kZE?wTmUaug1MAwpIv^^=p9VN%PobXOfMMhbq5iqL?MDOE%f%y{07vb9T zep-}&NDK2HXmNbIDe6=w>;g05efMxnX*3rmgJ}nH1msUUaUn@_i`mD%0FQ=6p4$!f z%_Go^H!)AKHFd)C*}~_;H2udb;&T>6V*I-|gKr%!@8kq?eS&Aar;oe8yE90r$8bxu z9j@`^biQ{o*x2fhN6ul6vd-c5)Q;*=m!mwkNw!S5YuypM;so^L9pK-Kf$q5-E}QG& z@`i?M3{ykLaHpy{=7^Y(hJARYQ1Q?aTzt40I*Y_ji_k0mFupZA0RhvMez6gV4? zD_>+*ZH~)}iEv^UP=Bh6;e>jF`7$-;oL}Hl?NYyBzqbb-(K)!U(&pcGPu-^qs6}U# zo}ds5xWm#(S%Cg%qg-2gfv&DK$ix9K6^4N`w;8U6=J0}TQl@}byk1E!3+VKw${nPJ z@@8o+X1gdQWi-U!{S!)l-O46gITW*F5XrbH;Z$`v7pYhk~#UZJQ|waWcipp zOr9o}l2hRV?=~ry)ImCqySR_U0rF7Esf19+r^{K@tjHc+Rwx`|e%yO_hZJ@gdSGj< zvw8&t!Myq)ZNHvHPXp3RVGyXCq1EW58tZegdFTM2RcGu$w&}5YS={D$8#;*Bmo(wQ zs7~uK<&O&w3m1Wsl@3=QriM!)YZEb!8pq5cW>u@6Iml`Nj!QOtJ07{^F2-DQtnt)* zX$*k|<&C^EH$>`KB6fBOku{hN4gC0g;|I74d(C{te6uimr(Wp2_JOOg3e1@N(Cn3P zS~Igj!ID9jX2jvDe8|j&e}8GxOBM;=avQbX%8joBb<(j$$t8fxhZ9{Gl78-r2_CGGfFYimK-*ZeQb=XHVzMgpGkQm$x0;Jr{*B%+Xqy@w z4Ttfy)e4uhMxtWbeKpZ3WJc;nU_PM=9YYUAux$&GDR5r8kT6bU_Og>P1+7QII0Kst zU)6g_KHP^G0cB_|nMM1MmFP%%(aUTmS_`S;pCGh6WEzqGn0llgI}yD0c(~l}!(Ukt z9;nqw+r0pHKL+M1C0Ir$wt)3%5g8es!SKQsVN0XRj>IM1#bh)tZRCT?>lOai{gDW| z=Tm(peM^uHUkuOMcyyv&eU)*0)57OK+-5wkmYSjR*cn|3 ztqd&>4GML`t918}f=pT2unJ=B&QP0>2%cUy{oj4P5C5M%>>wsASJR_wNe##N2JHVH z!v$Ik?&_dyNNeRo_!{jkb&~5yE98cfTUmuo+ij_ja!{(Ttdp8UwO*$1V2JmZMPS?8{dJbN$gSgr|2^Tao!|^ajE`xj5 zS!GpfD|eJ{$N?zgo1pO5Q&Xd+Wx{h!=?DkKais&cjxRCKO_o}sMs-IOoi9_&VKwAG zn8S2vR32#QVHvk>Wmz03$BN(48!eVL3)Q5#f>(MeSRk~5SwBD z_XXbc5%NC#D61^P$6i=1hl>w!sIxQR6l(-OSUXhe&8msnZxA}F5Eu%xFxwr|Z-F|o z0vBu>f{2<8cg6yk$vt{SeI)MLrUqH~Lnv#wZn!CK(oV<4#Nnt+Wx|7SS9eCZO*jph zdI4jsvB>;sSa5>ov$C7%EEbnSx5Kku)2L&DrjJg$2yQ!Gw;r0Y@JAhs#9BupHh2q` z;SNoHT!i=zZ7Ko1*jb~Lb=|0Iy*GMVca0iW9b`;{Va_zd0%#o!boExqL>w@a%wAT4 zRTp`QQ<0kJp>jhvF9|YC%gDhI)D`=F+?!}=zvcL9Z-|NF4iwv*u4>M` zxGU#ydq7J{;~L?f=z8tW?5^y&0485uOoaPANuJNRWcvo$kAt|e(iuNm6*sXKdI)ru zci!B-JD^4-FdW+)`MycWHa9}z<|%Gyk4EY(EAtQpxpT}S{JanE@sA?<6<@{W;awO@ z&O`lHiH9VkuI(f|9NiHRTik3GQV0I4KWt0v1kZz|S(@hNF49FD$Ia$aXcur-a&qJ8 zQ(6E%_>9oSE7G#uP8!8`=5F(8am{ZoKRS8}KRLQ9-yk}MU&puO{=y$M6CQ-^Tq#mc8k6F0@=<_qZ6TFF@3mz4BRo(7Ct`@F1S9#Y;*Fe_{*F2=4*5Fm7yKABIobv&A z)Iqz`;Q_6zQq)XjLDNQMwB5F?igd9>N50|pF;yhL`4W4Yh~YB&V2Ax3#O$5n5%4u% zL=MA=SKJra8Fj|L^beRHmWH;4N`fDJT0g3{(JSLhwgm0!k#N*FH_0SHgcozh9;tf(N0H)Cjz+baHj63AUm4 z(bHu|E)gHS;=|v12sq2l)S38<4N&gl$G$6>;TB7P`?DXs8_}4B#~}3=3k`86$T}r) zY4j%;dwbL%9R5wTC181tgvMAqR3|hOx6h`dCmsofy(1>XrlIP%dcG-C3Uy1u#k1MQ zHzNsD{4JQx1{!nVU8sz_!W;beKM%5cOQSdHl?IJ!DVW3evG+S`ZnZXJ_t)Ia2z~uA zSbLY?Dg9~wF|t~3jTq?d8aRzJ%%{+*E`~Sb-_8`nj+|*P;|Y@S9nD9mg~LHEj<{D|h6sRVMNd_iD37YDZQ^CPtD`t)4~(qi*T&x$m=Vk<%cFCRr*HI@Kbo zbrSE_*LDnY))~wL6ukr28U#Sf_AZG|E%Jy&IdV z@!kM#OZdH&KnG92WkEZt(=Yf5Mq}sYX14n_z}GMXd-*56dA?G}6kcXr%phc9bT%EF zpCj2+WF6G28K5~;fOejq?Tu#|u8cG6P_R>Uw?cits)7Gaw*%xr)fiI$9Fm&#)D2DP9OIMW}M{=@d0ZGx?aZGkP9?W#?)-m+b$k-E9HknJ5k z*h4K=>qB!3O9k^O^DR>yb8}kT55U!b2g6!0JTq9BuUPo)_tKk2C3v;xAQa!$lJp?D zLN+oNc}R)9M7`>u)#my39m3H@wI=+kmvq#xfh{sbDXnBfvl>S)-yYI|E*h^Eb3XIX zOSg$r;A$pthaw{)|KMN9Do&2%gauOvX2M+2DDK7OuneEWNSf<=vu~(~+aME@x+3DD zNG)+88Rk2Y1FT$fM{@nb!1F182UZ#uMoM!Y$sKKJ)Q^BiD zH;;xYp*uYc4GTAAS9vwu7lJZ0;qW|8!yO}`(4}xK_FtaR26}Rigf8LvtcP;-Is7-P zZ5#H1hoL8&fLHn(`^Cop|1&u<6c5MS$e+0Fk4T-Q`toP813G@#IZ{JhBc!=`ELX6u zuN6y6d2w<)k)Fu4CBb1Z!H08a#4Nm<&cFSQJ-?ysw)a>wnvT1eMR~3do ztgB1ZgKBT)DK&Vnjrv6W0CR7YR!Kj}`R}eaRe!1tfN9o{tY8heR&~h>w$guSzw2qC z$jI6eeI-7G(pnz8e4dSqld%xb?&Zc+rn5%H^wyZue8rf{JkQwHeA;;2To~5XRnr~I zLGvu@LDs4+);(xf9(z@$=4oyFY|pFqfG%xlLM(zpkqd)~wEo(50*bf$v^+;-@oCQsBomenZgIt@*4 z8GEnh?)2zbQ}~Kn9utOoJKzWiGTA%p=_Ks&WD;I@@}W;H z71GdNyr0uuIbTNKY+oPWU|%br!>4%%Lua`oY^UL`fpC%2VIl8nVFCTdseN0$qkU#y z51+xO(_lJ;j7&^eFMJa^p*^(`%F%kb*t-S}@mt}s_m$AeyOeb@KQqcz5KaR)zP7?3 zZjFA{%sqt(z*YV}(Nn~2_AGO?cL$(Eta1M08s^O4+J?tpgI!<2Rh)JFyz?k$<)S<$ zpP5*Uha7g^{)MicDz=eyb^L03XKlgWstN0qlm3nc^unjL?zZe8W6;9#(p=oKk(R)Y z=8BecrW@wt#)qcehC4<%7H6CZ=Q=lY;1gWadPWaM$MLMV$93x_J*HE5ze{vZG=H>T zbQ4`8xpBjMf**2Mo2UJ)4dT|2Cgi(xj^@Ota}hP9i;}>)b%tc~2~Hq)Wse+!-kC?q zPJ2vEUOOXbAGkmdR#>jCMCF3YYuUiZwlSR=1*LB>y;u+A9#T4mRZsECU(sNCs+Encc6q?WRp6X+-D7`^4gN!7e(`n5;ih*vcOufwUzEcK_di%ze}bb6(u z|J13Z=N_H%YkXCE*rDm7TY4%@q7%51JX+bz&ocwv`6vDd8Fow|IDD^|x-FnB9y%}@ z)&vOconaokSr>lg?3D>R^D40lbHr6*8Tutwa(3*FV{Cf3Eho`3bQ=Fd!|~71s_?|H z0a9lem+N5OTSqVQwP2A@+u&JJIv0Y^VEW|=)d`hGsk$AsgbKq>ewk7z_=0};48a<> z8ny+KSS9PxRzDJk)$g1+e~-OfS+^sTf& znjqJevnWYSHQ&zEcB-TBi~eJA`&{qy~g{ki;4{8xMz{r!Ej{WW|o z{KtLk{2~8>z~s35aW~>a@#_+9B@|9IIMtF=?$jq!wNE`aRk74nQr%BgIMupT15zDJ zWk{Vl^^eqVQhU?BNE1qXA?Bx7bThGeQvSrBiEq>HPrR9SM&g;Y;}SP=8=1C$V)?X<65pgrN*tAD zPug5*N~ATVd6mYMW=Wc)H2u;frWu+hRho`z{!N{bW?bq$sXwK1q%M~#W2%7(4HGWK z?})D(pAvUGu6&#|ZbqO=;D*1szpQ_f?~~8w8wwxmDUGRBy{Clb_|1-b7O^63C!xL6 z)rPt2P#UNY+t<+=aopC$rdr?8P}bY})}mVm&~Ib0#FKKKVGfxL=Aov(rYpvW#sF@W zVTQYgo9LK1Vq%OODygu|xc|OE!w6u9Sr-qkXFB}$=;t< zIK>Ug_pP9r{VxB_pOT!sHzi|=J@_v9J)F>5DVKgOp%p88a;=}1V<5|&m25q6-p{Ak9q2cVre#g%+l9b{g{=1Al*}G6$yrM0` zdsru5Kr;S_O7}TjKJt=1T9}rI8j)-G%qp>Oy(iYd<6)AQNKK(ck3nag1jl#)r}us+ z@LlCAsPN~drErbE%VEi*q(hKVZR#e~p{`O*JUeni?C7p~w2f*FI=3ci zxoKqUtew#&YRfr?c4H4$jcZ>ct%)`S#^Y4YsQsb+t4`29stx)2oLU5?S}x7WzbUS5 zA+eekH|cTxA}4}*Tv>xrAts=I*=Y=a4k_zS^nNTpR?{$ormj$|3ton=#-h;rE*kHf zIxu1SlYZYcX1nOaJI?!&Q{HAM=gWm5!g-;ckj^`uebjxru}XUD!OLso8w)e9idXcy zz4yFNg>&d%H@q(euP?iIoNp?94-dUY{|nd&C%rcRYPuiVcxU)zp|Eee@Y*|o>`isy zcd~&a@PH2XKJ|?7F7R~n{^Id@CHHaRw)+4+if^<^r-EH*`!AH#OD!IInD!u*fvndves(r}Z_WHGHX9x%2t{${LY%!coG zqhXODuOS+H#+2p|gtR3jNo&V`W!H6yYgJ?YDCfhHs1=8`=J2_n)7_hoX3{!JV^ST8 zoP^8gyYx*q$XQ8#)KS*S<=9g>mF+NP`pa9Pes`p=*&=&M&Fq8TGE-c_sqF^D7Zdxd z{Jg4)u;v+1idW-S_p^g)$!4&4E7A;*{dy%EJS-s#_v@~EP}&7KOBklVk-7*Me%n|g~4T& z7BW?>ibLZuoP@l}bGaC-=p?9~s+`C?A6x3+N=>t{zwCs6Xj* z&!jb0Yim8#KeXFKmPcw`X(Bq07d#W~do!XQ(w{?PBbc%MiPuuY5nwmmi^bC+n$D1e zOmJI6z%Ur@-Ehb&Bgoy&Hf)7`m&(|cq=UiaGtDv8GJP}UHrZiy1WkV$|22IxI&p@V zH1{&~H19FZF{`GPy!yAA2b=fOHM0R;_Db__<_nOsJ(dSFIf&*_mKv4~mh+ZJmeN+$ zGQb+KbhKWz)aDe>!g}A**Xpx&CT&s88fT5S-mqM-bb!5`Y_0;MxUOZsc>q(Qy_Sn+ zw>3BacBkc%HJ#OC>tHQo8)Pj8vCU%pXn6$%_ZzAG8n(lhr+5@5*sojDIXc)@JHFZ^ z$6$M$^9I@3zsSy>M??S3uGn(eciD8?DVvRkuB>S61MQ<7UPpP@R{NZToZCs*RCRuH z9_5@@!_m!YC*d5kzu*;i&9T9uI0`%4(kXbA4$}nJLe7PGAvP>`v~ilCH2n^hw5{Fl zSO-Npk7KuEm7|>VonyN*1Jkm~POr=6yx{Eb$l|Pjgx7T1* zZDi|i?_uj>pKlv$KWm#!>)>?zHQNaOZ`;^M+A^cdJ%+@x$+nL?_eN$7yRFq|Sykw~ z+Km@&j5U{~HROXF)(Pg%mLBGdmPzKzmRmRqva^D8w4Ac^WN%a6(%SODoY6AceBYef z+>iD?n|YdPv8lPqYVw%+8rKC8irtQWjP4=VH-lV! zeKIo#!b-gt24FXsHyqXE;LmBr7TyvDMgi!@+r=2oneTSmMw6PFat@Kq;t5S zS4(9{11tE^55m+Ng!4v*HYxq5r zcvGY@36;Ghg0rAk^^au1DPCM$g+@Fq@+6WK4SZX;I4;Yg5Sb=LdW2=BWJ8(tg~d;i zZg|yaK&`4ldS)-IJT1~tY>R4>5`Y7jLS}&uSXm3vu!5u)Q=!l6q@dU0UNv*?P2kYn!a1=s{A(n}Pdhb| z8xG%2u@qW$Z-@>(>8wgigZ(-_RwhzdG)JCC;#l!oMm|Q4!LEr%D{3Kr72AuNn3>7I zHKvunN2WHw~dL6PG4>RWJ+ry$cb!;|)& z|K|cIf7PHgw}3w1lhvySE~>tqKIce(Fu_)U8`gi!MVe*d6;LdNnpJ`Xe?YYBsEh{*0Z9UWmPq z&Vq%|HkKn+F_xDpUA9;r_BgF$UGYpUh3j$=TCq$|X=y`F!!Sce!#*0eLWUZKTE^9e zoix4$Oj~JxNNpNu`W0qEMN?kWPvcFlnj^SowkPj52BPsfvdZ~P4{2W-YbtL}M1fsm zE{Ypx7D~rSOMAMb|mzQzq92 zr@@ttHRzG!BrRMgod)MyPI?95C>(SBq{(2iI}1GC-JUHZ>;}6XLTUGXkC&Z-*IgAw zxrXPPdmp==zMNXJde_l9b&?dzUg5pBqcF#N&GS~s=E)&kaqnPvu@#a+0!-r_Xiimd zAUyPD@mBSv_SV2D@S4<1M|Lg_(s>_*j6w)9OG$5n_YZF~PDX8TNM-k4@ZJ)JcqgMm zbrzV>;aVRoOc&F!F0nEXBugGW;B|18~YfCzV)XY-VYij92DPI;a(S6-)V zln+Ci+y`Z3ykf+6bwhqjIu2y53}naBh5Yg=(koQAlYc1yOZ`{) zEe)lKs66d(Zx%og{)Q9t7`~x%k-?Hn)cKknbO`oQen?Semz)Ei=_92A^G3Han5p~= zshRu-)33RbB)yXg!cxAAZhTP5$$nz0T3lPME@B;Ct(8&RYi8A{{ZQ_yS=DFiA+-$3 z+CyADee@xyxf}WaAFmf8XM04?K?lM_b|STy7w~WS>M&f10oq{g3tq*h^cu{>Yu$>x z$!ofUyJ?m2cGpm&d`E#CQY8(JfL2r6rX|u#c0?V<=Q3-u@)YjMI{W}b=&+)>SRG9F za9>XQ^9hnphXSO;xSYhqCihUAG6{=pE@POpb1g{fKQc_>6U+Hms&I z=ddx2d9^XMxwr9+sh;taX)08|ikuf4nNve;aH9x+vaYwzgE*?#URj-R!;jehwiLG= zwLG=zkd${q%vxp}Z=YxXja^a;XIiJz)z#VG)gJY$3aWG^XL)ETU0hF``)T6Jpk;@GM;(DOLt{qocpGy7;Kl+xK&fbpz*nnFdMAun*cs96m zyT-Vku0;0(XIobnoU*qe?7)7ZKlVBtg=w@&w})|9)SlY*w`~hEi*hJ}4=t(jyv?`5R~Oj;6t;2khj3Ay;#N+?2!6omucR<}5>*w4|j?d6j;gY0fWt zZSASHTb-r-s`k{fsZF$awWgM&R@Taqz^JdjBk|fxU8>yWJdzjk$V|Dd6q0s}eWi3_ zJk(8xbeiPK*GLCa#M7i=;x0UkC)taw<<>@OB0BM;--j5=a}|z4uSj=kUPR>UPs@LZ z6P0#SNU_WRDqa8o`g_1^u_)@wIT9pu;1+L|9FmuA^X>Gd7U1UYOEnpd zWU#zPiI*GDa-LgRDYwNH_D%87YB8MkYK=Nu>#vU2o+u{GN)E0D41#B<_zxwwl0)vm zO8ia90{v#Z@?2e~Bxqxmc&(uFQGF#JQg_KK)MN4@HK6QMXDOokS*flisC~5bYIn^D z3+k?tUfZT5YWtOXT8gq&Yl)xe3Z27A_#*3T%gMlXpa&+8K3LPWPWZKZXp*)-D^5mu zHr+4Dqy;KR$LbxT3*c;?*9S&FksJP~Pl!I(x4>yN##40c)8*C_UI8A=e zVXVZS{ATQ@p;2rroW(wdXVH9yOVKy6t9*|S(RndzYzE5DX!c6oV~eBh`M%>~3DL8$ z@A}8sUHw7qjJ`B>j7;EW{Uq%5LgWR{v#yWTn~|5PqIJ|8;7@POUcNSe4`}bT<7#I0@ zY^C<0ul|OTNvnj?bxb{^Mb(u|Fl%Tx)%VOTcdMOnSd?YrSb(cmJ$0CVQJo!Ku1$_D z)Z+~eqlFB6ASR!Sc8$%CzGC7yJ^F=Y_A}Cp<)e>b{M|F;V=|uGn939}{=!+eoave= z1hrv}G0`-}c;9%-7$aM_pGNwN<_mBuw_82TTS=;h4iJm}o!wBm3m2!*B)1oeWh zs;<(m+OGPp4zBUc6#vUGr+24!cY?sa2yK5GS>{!=RLsE(F_Cp-0Ia{x?slF*c%9a{ z&wJkCOic&(FE=iEho_kE)7?#QdFGH)UMCEobNQ4f$gHmG0sW~fx#SYwgJcJ{dalA??kkKZqukGvhIKIsohqv^fnDPuPfnpH+EgdF%cVTc zJlFWi%DPkI3EhbvSJ%}B8q8bgc--rGoo5^$9EBY79sBL69Zl_1>>2E4yVt(T=CT*J zy<*}z%2wO@uk{IZ#Fmz^mXqj(PP1rg2j%CX@uabzv70fKF^lmOyYUvVVQ=!Rj*FF# zwxNCGF)51Kq#^q9jO#@*zCWq0_WBkrw?0(6Mc+wHZIQZMy$px_s{B&EOy2(m+`GbJ zXX(#KGih_AxwIhC8+Z5+=@_T6vyu0B5L%IRxz8zUU?fwxLF8y?U}RkAK?IVxcqOEZ z&BFDhd*R}e7(N4w&o7Qa0kVdV;c>4J{wJt}76uc-JA;$Mg+m5h0yQIb!WAOZn7$2V z@+QK@D;zS1Mv)gz4FM`$uuEtxBm{4$14NZ|s7f2dDxUe>%*C?d3SSYd%)CsaPs>MHsVA`10f+VgoM(ZiED(j<6$Vm&s&2GVDoSv zCWkY_{mDqSLlduscePRYb$Dzz1n<)o`M|ljJRH@1{7K~e+aAZ+AM9E#()ee_XI4@w z#7?##Z;R3BlZ_Lj%sKU)xC#pWKO{B#FntX&Umc{hRW!wqw!K-cp#4yHYsu7QejV5_Im$HzWsf!Ho>Y4pGR^As&9x=*VV z&A>$Fq+Sij!Oz&2=p;j9*37Z7+{W55i}8ANy5T=B{6G5e*d0B0?2{hA7hfROFWNJf z!nt!bRM2cpcp9+QW;GNuo}&)AGlZD(v95+Lu}X&Lv1W!X^r4ajyW?u zbNOix{BG`SnPRqCyyjWvlO~)DrbKfC^8%WiM{;%?VQmVL{h&1g&3uggg|)YRrPXfl zZry5|Y+Ym%*bTh3&9k4fw}i{*ahgzv%ivD1pc5~040D!3*-CKWd302T%(T>*3TMM? zT037j&$?vi2ioVq^8Pd0CvLhvIUl;xLQEM(j_{LfC|=SfXz80F_FaPC9wfn>&eNAY z(k3Wa$?Tje(quIXzxrySmvD&l-hCk}C&9ErDsO=GCQj((EsPf4P59*fL�OuLIuC zNxlifCRpjW;irG{^~VP~R``G~{hRNxppg+w=dbH+29s(#o={6*jJIrHkT*-<7w=ua zDva{)AR{+VVNwehIl)}Gbg8lDW^ zv}AZBcTeGmJEw5n{Q_FVBF~?=@k_XVxR*I;b9KgCyB)(^LmV=bz17Ywj+V~Hj#Thi zFOU$g?~v_h?bUGIE=E;PXIqGGqz?Nphi!%R96r&G)^^qpmKU@}WValk2gGY$V4A=+ zC19FsylU)%yL~W;!4<~O#+}Ab#)G#&*U#h98DVtc<}%17!|Wu~GV2JwRIG zgZ36j;R()K*O&`_*V5}DZ4Y!@KWD1Gs*H!UyE;(0MO#-@C9U#}rskL&&s6Cmgp!KGX4X3;B|~UT(t)R7P1Is@{~hsvYGX>N;t^a!Y(5 zmlpHLahyfk;Qjn0PL@Z~efLf(31_Z`vQi4m&&9g36qza&i@XxIg?p0$EF=CFZi@E3 zO#C-|6MofW$fc*m*5PsD%TP|SPv}l0H3^sGV8e(xR3MU_#7j2#RW?$@--5q{9|f!9 zrK%R*9jq1J5^Nn_AM6|680;F}A1oU_4*&RA@Nj4!-4gSHr9$}c=?3TS^YVG|u-r#HBG(pA%WcIAG98MtkGaTv z$pHl`HRSemN?FdA23e91NI&ISObS;^)s?5x3>b`$lr?gqD$AwR1SOmLS^kJ-ut>=R zMeB*wRM{$xQD}EmB2p=pEU8*sS+1GXI{FD3PKQEja6!1Lt5=H_*T3+*S<5wXu|A$O z&y4>Q94_*?VVvIzlKtCexE{M^C}P+~)}}WzpMtR05)5r)l?}~ecgWhDHI6jAH!U*0 zGaod~v8<%Msf@+MIpdyXn591*Hwl(&Oq33on~~;sk?#0tO+$-HCVM{SPi;xqWV83A zt31h3&UTl6m7DhMwycgp_6xMjPbVkRz?B1%@iIsPn_UNKA>HTB;o9NWoQK>$oVVOI zm+r31t8MAJQa8(p`xta)jT%&|Xt{p-;_fuh*J0u);zlV;uOW5Ha zfh)X=@Q1sXFvC4YSm53)9B`)ypWSu5MLdhVBR!|Rt34-33onO~KG?g+Q^niDWAP?= z9?+J3P;CRY(Zmy#`1efBt1`^0aKDDoL%&{+} z2dIZbwk0^O*$%+;>}tP4zjd-L0TR^>+a~%Q;$Ts=wsxi8A!_+Zw@`C)EsFw|=dKC$ z-IR$O!7Q(a!@V6R zwTkFcBk`8pNb13i$X?SN84TMwULD*t9EPOwqROm&PhjZ@1!&ZjH5&$((& zI~!{P!S5qedH==a@|p!rm%{yl@BUUVvEL=TtS-Vea0(~Ecl>7g z)Sc>d^tgzs(F7=|*>J^OR2QP5HCN}ezQm!!|1BrrKB$cnHUmxm2-l1wFwADcy{gL} z6Dr&#WwElGUcpOfMBh1qr&W)V8cpK&(wRrNzj{@zqHf`l?x7ChJ`KtjbjS1jhHm3w z%cKV7)oMotjZitLZB?u2Lug7>v^`wuI^r~q(DS{KS@I}toH|Bpr=CDbtfmK5NnfQ+ zi&o*ZxkKL;y$QK}Ew1+h`abshL-m>vXMWLIkg6UM`>daY#`eM3$8g?M*;vH9*_hwF zf&EoG2*+uS6HM{EKfpL1FMBgfMROi&W6ND@9URj!W?yw}3APfp=TSzVK>Q_!PD(9Nc?lSZSZs7J4W>qEl#H%3bnT7eBk`&J!vU(Z4-J$&U6E@|S>xDhO?}E!;+gruI(p%5})LYhX@fGzKA|cbl_q%_v?}C4ZFFtUVyb737&n{p zFga;zcwm@DZssKu!Ol2-9r%5Z!!zrkuOtIu*IQ|oQKLGm$vmI)^E~Q7BkykMC|%-G zWREz3DSl%JPmSrk8WFi5o`^gn>9GO-xK(TyDHJ&l6E8+Ld2LQWn}c;i`Geg;V#=vd zQZQ3^c(69al+-Y()`Ug|C0Z2n2ZJ=LXQVrL$Bz!7#3$|06@aWJr+>8xE z>**dIjgxT|Tp3g7N_b&tP9#0Vgi+xU;*Rhrc1*R!1LUCh;chq{eu87+Z#+kS(GaOB z=86muYexQHO1MQ_hcEsWq?qhXGe^VpyCbGT7wdxednvt#r%-r*KwK%s{$rf{NZL)} z?oZqnZk+nRD6_~){>Om2OC#t_5-X3C)5=ff9IXp`@e=G-nzP0&VjbM09%t=Zt3bQs z<3|)5Yu*cXmMZ8B3)%AFgPQp(=i*ICy)?J&S&C#Z4yYVhPghdt4zPC5}*J(X< z?5o~52FWG1l5vz&rJ>D6RPpz!r?ppVOuMe8(zmLrHcCCBRa84@ z8mr7zG`Yh{PVGGF^HZg%_CaZ+y;QPm7nB#QjK8bDDCyL{-dC-MGJ zNDgQ5)wiWPCr7M1>Uk@}azhUI$LEasjoC~dV>Q!b+Hh_fel?{tPRC6snf91goA;T! z;S0@2UhRoB8(m!sZI5j4@lxfnuebNH`y5-?UA(jJpds}$&g}G1`I?}eZ*(^0{I|fl z!1cz7CheL-JKhI(Nz|of?%XIzS!vhG?3o5B^bNG)Oi*E}!8`AdJL$CG_U7>R_fDfP z^o946x4bWxZ=Y|HFSGxi4b%vH4b%)2 zj;j)A9ak$bJg!sV_qg8!qvEy%>ckxiq>sB2$Qq{yy2jOuJ015&oH_nLT>kizaTVe> z@pfR`m$(vf!{P|P1r7yf2gU{}1R4Y^0e|3yf1m%fzXIR)GOKAbUuVDHSKe>t=gH>t z`}_EG-zDE)zL0N=@0zcYuQF|?gS=+%7@-?kpx5l|dc#q+)2p+`U6o{H7WX4`xBU3p zJCH=02^;2|U9!9E-RZB1*_^h6wky_&wk4dy+tC$hwT`!r!4YxXeA|4~w2Lm=ZpO0A zjuXjR)rh8!-q0s9!!ATuNoE?C+Tc<@qkn=eJCWb~85GdVYIE%})1)VO1XIZYd56?d z+QaKvmpa2EIW9G1Qum!ndQr$qJc)A3xfVr#mL8%yWJ2B<*2QkRQ^6yh~aw{|-TF z2ygpK^W;&|KpO5F$UCLh@DTR%3a!e_;0@Ee{_Os~!b505KgT-llzN!S;})%iwi@5T z0nXd6wQ{N0N1{?URlFVmN^beV313v)*Q zD;m+$$MQ#8#+pP&#D+zO$EKtE4~mwGrHkH*{-KwSirPYbBy-eES_6LK?@Uc!qkk8| zNB#gh%zV8Q9b7H-9`KFZM0cQ-Wz}lx3)LxFQNA`0^XQ@Mci*T*w1V1Zt-AJ|`}v18 zd$uO1f2z$`xBfzddm}ez?zdNQqo@A~k9oZIldtNo|AalWPAjh$WlayNzvCL6Lnix^ zmJwF+L-?e<>7_UWdFEDBFl>xwGIWSq4LPEpX&U$vs}ObbvATvLu@!~~vCoEq=wXUs zJ}oLS<0)f*Q`Gp5{?v}D$-6r&-xfb)(=Z% zTMp|w+c4`F+dZpbFJw!yFSTW}2kcesb8%07;ZGVzWhQ0wIA4BrY;qKGzHxMNW_K=N zhIY&OH}k^AsMAYbi)n#*>H6Wy>`sIhQ;M`s6Lxh|In_Nw7gFkIt)4i~Z_C2;; zwtBYCwk)=awty`od$FJNZ5_1^vi7nTL7%$FnO!$0m{Uv%DD0?{oD{E;Ww*u7#8yNv zk*|_s7FcFu@CF`)yRifZXueoU*v3_u)^vhtbzhyQ9_H*2Q(LP&xUz56eA+Uc4>=%r zH=skXl(LU&=qx68XP7e&6xpFbL3c}KuWC^hmpQJQV_L1uk<34UQ%&lr569hPkEpD z_-7hxqVQkR;fAjTowOI;sUA{>U|ou)S+lU^micPBC?{17tB*T^a;Tc_Z$-w!9!$dj79bVhung~iMy z7ZX?s9rVzfB5lP`xEG)AO6OoRND(c?PLUo=J=?QN78m!C)?PsJum`JeNm7Vj{8bM6 z6N^PI65fvikBs+5+}so@-=x5487$zYG?3%UmnXw zWCQD2dzF1&&cb49BXb+Wqc(HF&*M{^m*$3_@3K_cpBC_^jd zxtPmP7#{8A=yyB>CzxpJ(UjP>*b&@U)r|?XS9UbEG1fLdGF-x=8ssa>#tNgxcVS8? z!Gt-DW;Fq(UZUxOv5P4u1j!<%%qF|ZU`jUTFeTAxGs@J;Y&I9MoG{Cl@wAU;wO$~5 zcGUV9_m5(&idL1uTHRI*U%?#fJ5-j6=u@+K6#8XtRBC5>Y|!Y zacB4J;@o(_J%CkX3v`tio-{ZO3VGacMB{}Ko}!S4JJBmY75e9LAwABi>?8y;(~M;m z4&XFcEL`^tgI?TENCzFJj!+$MmxT7d&XZZF0mJVHGr&D~4CcD4c^10Mcuu%m;ISGF zwPvB`17w;@?#rIF?sxnoUs>N?^V8fRmwXh$!)(ucI4>*Rcinaxy{e&IO>nMqy>|?7 zO?Py0jdb*MZFUTFB|ApBDmW+ONtg(exEn6k+^)lpr_L6R3C@4)S)G&YmmP(1w1#cD z9an4*?6dHt7Pj5Aox-DA&br*X&GOw6HRrRmG>y5Mt z=m%R-bRIyyEsy)grTFAZN`Cn$9-cz%;D@1&_ht8QRZA+hl_7E`_6aL!G%YUW7Aupf zSta!qXMY2eZ*SMSPfW(%F%$@6AtoKCR%0bqglhr;SNrolibsA zd8nL<+g_X%+B zCchI?%ezEL8b&IpqId`|=pRx%{iwNkTUFeO`{E1)oTpM1@w=2H{w=+X+>qeJOYI`# zq+cU_q>hnJ(zr-PX-?#uIG!e-CUm*`p(UIkP1Fj4o}K*LyHMqb6dDH&bvHTaV<>tX zBF{)4dT`h0r%ACSK6jGVcwTFZLnDhhmG7sSdWu*t;%E0b1yY5;pK~PU4uzYu2VE8E z5_uE(8p%P+^a$FpA9A(Gj;`2-YsCcIuPdal;x-=dU696()6jem#qqr~2v_M0nl)BS zPf!C+;WQm5b!Er=Uvt?Lt^l_<7k|T(QvCn><{5GYIlb}-O|vwLRRwf}_cEHioP*!W z0`doiCBK+QdLEg@??116jmgI@siiU&e_m8xMqaZ9yP^lU^2U(l8IB+2CfSDm%0Rh@ zng>tRYo)Q)0KKsXNt}Fe9(LdyeGh~KK9~2tuen#`Y?R%vLENnE+vH#5ll_1CDg=J|x}Zz- z3w-zW4fy;M19klS12g?!0+;=n;$r^RapeN@;(7*-#*Gd<MQ2|;a%w);yv$8fjl!%&^@xJooD_3iOZi@ zX@BC4h|+nXqs%`h%RG+Vo#aaAZtL0zb0Ur|jS=vPztW>T!C~M`eA@oh-rqji?t!bY zk;gSJ4K*|IqMft|s8)H*4)aV?GgDU6P3CrEjqi*Ou zg+KA?Tp76&YD1ExT4XA37eL@V7&3?-Lw&^p;Va_guq3_=2gN**i@YKy;rMPM?vMN` z-iC?!CNdlD`VR3~F>MbEq*>w}STU)YR}Gi5%WrXrmL-okS`k@KvqG=w ztK>r!uR?oEb@qde)E_+mE0A35ug%A$^9L@nb@)dwi>JHn&?B+c6vK?fj&`vt>07w(Nvm` z4yq@x=f=RD6ZF5;rF_rgS}D}+kP<}W_mHV8q&-q9p*9!S;_#%_Q4?{4l+r$_FRl%V{;6Gv4ulpjK{4$gtrU9&CAl_=?q>L+pJI>MwRJJJF$9el4MU;3 z{bhO&_iBdegSnh}zU6OoX-FkkIoVaU<+C0|QOR#lXIp9CVKX_ZFgbi}zu_3;$m4W4 zC*gX3<2=Q#%jLR8zikDQuxfUGl6HO5@L*Dm3&;^f65F*7rGK z8{69b(Bg9B9q9Rs?*L13r9R$zd?cA%HPX<)T~U_kRP z4)o${&j*$T-Uhk`b_J3G*#n3C-Ta08^WgMdfz6QDdkCIrfA3DAG<^~A-W!4qx4q4K zT~LIz&>%Vp!vvoY_UwUNTH14#*86-+7T3E@yD~CMT*DbQJDH%}4!bk0V~(Sa{jlOxXzjRf-e!7bE@@g~9%1}o8e+I^ECe|p(ol4T z))<#uLnbZH)h2L3hQaKZj#r=sZ!aG)b>@dfLGC&b(`ia6-T;7 z91feR6nU35k+tFL;q$Z>M1yHVQ)xnI4IQ9U@N3F=NC8WNk7$^>p3;bfeKciE%8``X zDJw`0?@39M@+~EIN}XWcloP@6DcM68QbvXR!9Af4%;q-*mxZ1O2ceg@g)PvYro2A1 zqfg{JtPed5-VFU242O&%f4DyS);5@W?(i1qbk@k(a4VAoomX`!=p4VP(1+ACR^ZMxZ=Sz2zikiTz5RWlpRg{LBrsCftDV z`-ar+za-72*Z{IEBMmB)UkCZV%!ajwvWBCE)`rKN$5g{4L%gwp!C-tEJ8GyDt7SM8 zg){MyK^v^j&&!eh!W%p{aF>#^IqYg?qgQROD_vUb}f@ z;|#rMpTBJI8Veh@7>^oj()M)U6f{*bFEVd7m$4*So?F&gI$QHuFVnT+w-vOtg&=dl zmfbGcN1+g(uwS&hV22KMoP*6?%~_isy!lQUMoekeuAa0=Omnq#ZE?-veDxQc-Ji-c3BjLGc9K5|N!X{ERN#32_vEFRHL*6OAW8TxgCEmNf z&fc43l+XJzdJp&#z3Y5AymNge_;6675&p*B{C=NT@%j!UEg6;aAza5v z+A>~?*YS#fq=zm+9w86q)Zm2*`iv9D5xTc#kf5k0c7nE)UF=0y!@uP0Mug)diQy~Z zx1q^!KVvM@Xj zhTjnK$@Rz~XOFCAWtife;F7dC3mz6#S`ydwS%?_hzq%w@+-#F1-Wo^wt*60uE7`?3>m{;8AM5?og zRYYwstH7d`8 ziN8v1pd7<}@lCy|l+iM(o7lPK*7M`2XCJ9oq?d1ieqC=#0?DZx(X6(kYR`ahZ~^8) zQ`XPaq)P8b-$d)eKJOJX7_!7(`=eLrl|LR`0^2<;+0~tVt}km{ zcP+EN6qVw$R!T3$JrB`0==0z~&VhF|kp7#7^q*FTE!tA=M=$g+`s!y#>(D@doAlx@ zv8Jr*mmss%G^8>-qDi6)-2%^0XS13@hN`Cg#rmyBc zxEW5Hc3M0%pY||kv_3NrvbMIow!W}5w$-;@vhB5&wYzZ@b+Ki1?6M7V{A1gXLX$!w zu9EYG{daf@N1Tlvx5y$tW!CkPlab=Q=ty!sb^PkGIv2ZIIFmUw)p2KZO>lQ}&2=wy zO?K~e4S~x(#C?*#|4DMi>n`ExPLl76JH3#Lo!AslPZ;g3Xhp7sCo~W0RaW7dP+0g2 zhs2%#7%H^7uj1S`4Be`ZP?D~`$L`|73U^aszI!STE;^M-8!q)U@v5E$-txkEZ)4#t zZ$Ent!UgXd&p^6P?cTk(x*ED$2`+bL;l9ftY;4cP?jjcLls1sh#~?J00ttX1X@A*>~Hs+HTnj zTPxV+Skl_MSZdj}T9(?1Aq2 z*JEGfG}APGW5a3R%4RHRoNMS}cojQ{epw-Q4aV7$Xxi91_RH6!9k>FufWeq1_9VI? zIyoAMn#hCn)J3kIbF}ta6-`zB=<0uyl0BhjW1sd-NrNM3Gt>N{IDQ_}SGSs8!I|<= zrq)a0#SE8!uusXxNuv@DsWRvtS(Vg^N2yH8uq!^HA&Me*Q(|&$5_2W#xvRp*TPy#~ ze-6o$aaqh$y2uNZ3Y=34@HG{mvJ8FdC{(Pg%)f8TQ*esy;@{QR<_3(6)Yx zU*rekI(dgUR30IAlWT|r)=Rg}zw~?k2xmZBPeNO-1?_Jm1ct0)R`!1*L_ZC#zcN$p zN;ge6&e^p&MS0PkuF)1f3kH36v5?dpu3jsWcmq+-HjAqCQ>-ADlG?}}r4Dj;-nOC9 zrl~YaZYLd-$4d#y4QZiL1OM$yd63#3$G}>pi#k)0ap!hN-MbB+uRV>hHRO!aG8kgj z&?fEpIydsW45`IvkEjQQPgNAWRc+CaKFg`m6^}>{_L@Uuu0$-sANNWGQa5lEvxMaR%R+hEZ@mwEm!Z0>=I;Z% z8))&X%kJkcr?#rzRX87d3C(dqBtR6^=yCQ5UukzX2tA=6j}*!ZG&|5I(Lrzv#p%C! z1PQ*iXFe@Dva6rFhs)*uok;661vD=vnXZ~XQ9!Glg zypy&}j>)!cj&bxWZnjNuys}MkL~P|8*KKR1eczX1s);oGzD-&IV zFSxXpOJAY>s{N@9SIuN*>&d-PD9WQYS5YQQ-FW-EvQwI_9FUqTi=i6T=ehp|+Dbc` z*5M3DT_ZszUw?~7!mq?};frF^@Di~^xS^Oi9D$v_mOjAlkv~I?;Zn7T3=R#B)DCTn zR11Y8BSOE3&q8y=M&T3Ut?)a}YpJFE=uZZ5KCkM#^mcjW31Ut8nAlwoi~UH+_F=}= zi@im6Ijh{34%60hQ+X`P#sf}emGC-k#TywR>zjwBgSw;@JE@CsCLU5p)6KG!ZkF5l zki6PE2yA)vh9n+qGSMokHPREcmb$2R)9VG9`a6gjr>e~Aji;+ z5;UV?(;lKGPmqVGIpy@~JL#r!PWnwbB$ZH3OM>!2@+s-%V(g~cD&^#^N>r+Zn_QHO zNo)B{{UVDs2$x-^3GpJ6^tJ~xsib-y%RFtO5Q(5i2Fer@hS6hEHM(MvIjw2QHlup_xN`44c|1JvuCTWK>i`95JIp*6^ z4HD|*@xauTrptp_XLsYTPiFs^kKcD=*p2;2S&t#3JVky?4@L#9Iww@0QWcukX|1qY z6s7SX?GqJfem+ktblI4$AB^>mmNI;Zo;LK06*Wd2(?Q@}RLD%mR7c0!A3>ex#!a|d!EMrT>nnAdm-mb(*R75sFU6V7>l(9Kp32$28L~k|NP+i~(FF}R+>1*llQK-&u-Uds$vW_$h8VgfDcP@mJGvLvyr+>3C_9 zV+C-nzlr7}=X!-Rd$s5geJQ*B6WR{ao>%FBh*Of8l(ok}Z6qyxRm#ruBMseu5?Az7 zc!xTZK9leT%z=eo6pcHDdHbcvbtt}F!kr@jHV4h=w{e~_gL&L1R-b!|nOC#_cMH}62dgK}Rbwy>oX+#ye7yFT@T2&x`~&_5 zx~aVUTI}K8!=dj1q2M3*JhS2Ud?6eZIH<{Wp+6rH)Bn$8m?iZRZ-UMHNt%WAYcurt zTjEbCEIQ>9$S9AM&SAo8RouwFG3ZEmC#5Neq$lVz9w}Fn?6MEu%6(um{E2DTROsK^ z;T-rN=E2Tkq`U@wRf1Fq{V~0j;qn9pd0yoYxu_D7p36t1KJuTSm5+tKvsHSElX-#+ zEeccj}=SvasBz%SQTsj6I7iYtG^8$1HM z>Kk$fPHw}YqB+ImVzRhh><4P`OR=3)8NY9^)Au@9wswhJcVdDYx7`^ ztAmg8RV;(w8k4Z*z2XMN4sv5bV_b+`<6bD~caetpfa^_6!(BkyeIvMKORRJMW7R!@~j6;qv1ZBqazleIQKW7WX2$*&f4*P}_D7+LVg?g+5~!xsEJHhR9B2dul0p zoBBYO0ZnureTjRm za!e;z+R?;iSJO`WD{28flKO@l+BM>C}eRqS=t8S5RL%j%*+^eOWfl4|v%hnO_zMuzA}MiuSPn4*Ii2j1JG-5EU^ zZbbCqabSM3pzP*?)ccef%$x$3}2hD>r^poudPRU$Q?3RK=z7)FpCQwQ)$9}-S^aHL6e{40U z$Fx3)v+-F-U>D{>n9Sef>cZjG1g?k%nBmvOE}$-FhnE5SIq)+FVvjNnJH72VX+7cE zqsgZWT%Qy9Df}V+3{FNNWL^qDX|E5rVk=DO8-bEn8gqIR_5jbI(r@5(=ox*Dx#c}> zA=b@v=*F@kaWhwVi!)aj>~Wt8H!-R6iB*uIEGC9T9`wyiSSi-wr*KGs3rZ*;PZAHx zf~ZqEqm5yTBw|u{P^PeBydzrVZDKz8s<>6ICiTbOqF$U(G^(I7Q8g#NMs+maS~V_y zBOXN0RbzOfF39bmSB+O@$l1zUxk9|TvLb#HM1@rF(CVT)v=UllEFdgC1C3*!(pg!d zbW#@opKCo>S&jGWvHmSm{BlR^+|^2|ycV6xRptF?{@V(N)h(UJ5N zea?H(5kC%o`G)v7U83cv_zXJMEX*wHqmQB-X0r9*neQ&06GuZ?n}TP;B+Pw!OVvT^ z$&ZYX3*@3?q<;#FH^d6!N3kYm7#%P>od2_vjJ>rG71;^-JGLYzQzRovQ_XiZEd z_Ms&-PW%g%s;cdTZIey1c`%d9Bzu$9Kn1Nq{sor$JgjYf$>p{ZWMNwr?ajAs`7?IAJ)f6A>OhLwSKXU zx7x_%)?(yVYYI8fde2r8d&aevWyCvkF1(%Nt!GRvt;zhw_Mz zkrmk`j1$JAL9nuLivPj4#9hmx3+gz$oRe`jsLeG;pMw>2>};?*H-V-*5c9m}VDHDO!6!NniNuraBkl+L1>L0&akklsv&~E{z)s@6v#Yr`Y&Lg` zb@B(;Cj2tC4?l@*%MW1-@&nl*H-Npy^ZszVsM{@_G zHMzA>np+zE7v9ka;EleFMWR-GZWrz#dl08sH;0BV{?AxGemDGC$6^6)1NIF4;CjzQ zyWa`E@uEGNQ=WlsX85q^-hW>5|Y;Iwd4Z z+k_xek0GRk@<`W&UXm!Bks66Ad4pI&eu?u|4qP3du&ca=Hi&ib1rHOqNlnB(pom=q z&Ff!jEY{B3ViCC0t3!ovfJW2C*!{JJrawS#39o%~F#TG{U$LsFm06h9?T7FFE*c}= zA;;{IKguGAe_Esf2{@;IQ)I9siz>6Ap`TQ`DsPk#m{TrMQsc*!+Q^iR!TI4*{6xH% zsy$c>0Z{yUt1qZeBaI(X_tX5QxecaiN$mv9A?+PaZC!co58X}eM15o3PyGd5egg@n zO9Opd!%+R7a3*A6ykzg#XZ27G_ZT+wcoV0$m>9Jz8CPdo?BAtAL_A0$?KbhC2;HpK@wtke} z)}J!kT2Xde8R|DQu-CMise!gEYNM?!^$1N_qU{#ij&rGwq=lXZpVn41kM70C%b;7e zBYUA4`8~M}{Jv`NjJnZ}dWQH!oFeXmujeJI*s9qUgUELs8rC!05fJ+N+Qx%nm1*lu zyd-kbY`7cV(KS{dvEOR9U9vimqW*#u;27e$B^$jDR%=zTsAif1{}E8lkBqd%YaD5* zZF+0jZ%VO-Oth6Zow6J@k(LBgBXbMmGSe)BV0^4!X{-&x^9S7@#?89C#%a2MVTf*( zp_v3`yRXTstEV}yy{{gx?V@g~)vF6@AE<(w)v86BhN`goHJ%)G;*(Wd zl^Y;#B*lM6>-R7zMR_PbmD`G&WfPQ^&w^dPCY+PD2%V+Lf+RMB>&7PZ6fg3{#KGW~ z72{2!g_n?*|0#Up?hCiLLr^j130t|Q!X!@SYjJ0IGc?rP*gXD6Yz+T7){uvfkUs@S z<&Ic{+k`uJD`*JEz$pG0s{)_QBz_pT3Erqp`~vJTMsuU!#%vB9xG20^Y5ZI64`ftE zpwam-`~gq+;-IT#fq2P7p?`{<%vJcdAA<{L`maF(8vb)389Gd7VYIkbSR!U4H!KS4 zutPZ`R>thIrPvC+DrcpB*emuFo660_j&eEpl^pO-MTN7{Ct&S5_(cG{-{Xun?#Y@D{|a*QNw={T|5WPiIf`h8PX8G zkTjLglm_ywn8|M!_d$ znr{?q!^>=ld&(Z;zOuW}xR{L|)SifWN6A+62LT z=BI#rHw`;U%p1{=vze=i9940!4a-9p=l~DYES$Brb8Gnh_*rd4ANF{7Nvoi1+Y6@t z8n~?L#M*JX*kF)Z|AYr_4(6IO;Jg}-8Ng6(GJL-aW1}z|SPWkE1@uX>+|F2O{z|MT zTG1x+vDkb*3A4{K+)ng&ALl!Aci8IIL?g_K5}aWHNRU(f$CNo-QS&{`mNrwfWQ<%-az)|+>mUYXn=E;ltcHNG(%1hXs4 zP{D9g{{bC<{gF0$qniaPk5)HTI|gp`cbc}~zDCur)u+@m)bp@o>Y+BN^Q-TuuEI4^ zK;?$-ra}A|ya*zcjW(dSTmxahv9uUWf@C-YZwXC71@I#svqT8<#lS@x*dYhTY(RE;&Ol92QoCr7-n%S958hetd z!N!^KY=6*-pP;Qh6&>>xF(IpfluBi^_qAnvp+|l-D8v6izpa9=Z8!M72{@6>Lxv}U zL~AEu8At{1co8$iKg27-K(QYBOEbvnrh&xtei$-it`zj|Rh1buT}AOVUO?w;ZTwlgq{&D+nLzt| zBh&`npaD*dvp`?}fM2bJG~QM){a(U(@D!QkwO|ca!DQ_N&Q423J7%_4vA$@-3Caq> zMntFvjzhXQ3}gfY+CBDRmO7Zv6x#D1sF*Ln1^s}uumDXn9jbOQp$7E!Tx10P;=qYO ze&8ee2v_5D-5>knR$zbDK|5n1WI{Fg=Vv%I?!ZZZ0j{@8NWedWTQtZ@Y$h6J8)7Hj z4}GoUaZ;Za`va}r#be83ML~qFf^=q2XjaRhUR}bv`!ZG+4ABPM9pp1lgQM5aLvWt;gWmoTeO=u(-_&l+Ce2iB18th_llGpjy>6oZqOOD?kN%TkrGB=t zxS^2ghv7E3acBfI-8NUi3GbnKCn$O8*1eWpRvS{vQ$Q|`S_{~w5(jK%TPboC7*h^1 zPEIH5Q}4-T=th1^4W|-ltP`}K8cCO?57RSgo_ohw*zKt5tn568 zHwAA7m*RZoyyTpOUKoS(o@1kDb~JEU9TOc@9NCV!j&$cEM`LFc+2oKT?6~BZ z;^^X#?78->_NDe2Q22M_%CS#Jo_VXil4FNGk7JzuoZV%&+o#ht===DpXzBr4yatgP zvJtuiyMV(t2cFPv-cS;|{VTh5{RqM3QL zIbsTd7T*G=;g!bupvL@b&>1QkdLrZW38%bq$PVP!)zUrFYQX}%gC?ON+OirSTnUXe zM^%f}pTQ(ci@yf9%n*Miw?@zRIV849%BA6+S}o?s-U6L)f+F0)G_X9Mi!{sv&;{!7 zmAN=(J%_j}c%=-FeL{cn*w{7JhW>+nY%toKU5mcFHt0-BjV?v^aB29ME;1$1koP0< zITgDDmr%9M|8fco{7=@qRWT^8L4&HYC-ADhIEMlb3$bYqcl zI`xdL13~u#>&HD)fZGoxEg9#i3CQG}<6h&0g>WI4m!~mNECL!!efT{4Lv30Gr{`t< zCj1pw_)lnQ{mh@hb(Q~u?WTca3ppB)O#EAlkDTl?EznnNky3(nU&tV-V{ADYbG zOPApby(i_DB{Uwlm+i_ed5KaC?xtyI``imX$YF-TX}>$NG>j?p~F!xw~`CU z2jvNJ9>p!sMo#aZ@=^H*vy|uXJ04d`gNrUILonIzt^A4io$=3RI6Jiik$)JHp7W7i zU!{=npFYF7xfPzMxnPyfhl6q>sEfz2K3;}r>bzWDSqI*4Yj8kg;PNe#mLcVmEwFm?X#{RN>m zzYV*jdGN`P6oOnI;WKtn-?=52jqVjZ+)m*MH%Zt5m-;ZQM%B6V*m-S1KkXsj&V2)y zp}cU6TP!&Ed+?-u6|Q2XGGP`{S4hRvx4n2?I3XIu64GGt2IdznkRH2*CX-Y=AG#{1 z)CTRIzx1da~-ATBoj}S+CxysjN{nKQw)`E41&>R@W0WP*Jx} ze^}oI+PZ`eo4Lkka5A7C>xdK{TRmmzObjBOtn zd(Wt!whDAQd7d6jma?BCr`mnwTzinLV?T!9SDtjzn{DGL9ZsS1iI-$$;t82W_{oYy zVQL)Fhq^=jNjYr2sVcTSR0-Q9GK>@LN;ov~fi-%{+RoMrv@V_XIq?7q$dwig(bO`> z8Zt*LbIrXi7HI49O?}J+dM@@E51V=zhnOlD^TYda%NR8@G#)Wr#5$H{*o?;bue!au z1f&Jp;Yo2ya~B!Uw&)%DsBQ&v-YeA`RU1_!beWupHv<!&~HeuT!L!6L3o8(`9z)&ByI_GXNJp;wdE>;UwHy_gF37_ z#)GKvDEf*$9({zKw}YS}3}Bl?li0%1mr+CXQ1lnG1N!@k=xt0AZ!(GO4eY9}GPT%a zOkQ>cc3h*FThW%_-2H*xm?G#6{T(e_<(OeC+Sl2h%t3Y*vj-i<>)6lCGS-1^o0`~- z4Fd^gQ}p-Po#>x2H_|&MmXGB_rnx3t5!B>%+*)=xNXs*j;akcH>{ig0PjdNV*SX(f zccCj~g9iTv6fO}74}u>T)A4;{pONr5hBMb9d~f5pO0g+$HywmJWI@VkDSwMgf^%t_ zuoj-KBm8E#mD&h@@c)8^G5{wSJ^ZrIk+yq@J%9}VQU!h?KM?2IDQGkt!jDA0t^}{( zwDy#uXhOo(B>Y>~bQ#iXFnAE}&^QZl?s6~&fvKXJaiRoo`O6*tH# zX(EzCtz}lMgnzFl-xqt!AH4CFl4_$mwJU%(FM5iH%P0czocnMw=V$8W*c0f2f;wtjWu~S zh!HcTS<)cTZrXrx(^@(w4VPj_PFIs};7@shuk0}x$d~av-2uPpY_w4h!b;v%iX(ee zRGuaE#{P1-{1S5@oxB62iS6=u`4V=W3R-*mDSegi$_-@%h;3qgcznF-8WMuEidJ`5 z)lwf&O;(3gkKl){4Bp5^%~N%KZ9Zf@CZkRMgJz$uo;IMnt}UytuUo2r4yC0hT3$S0 zh7L8XGrl*Zn93U0o2DDh=I6%2=8|YoSY^s*VNFvl?aYtSxSYqTu?(=bww$nTvc#n0s7*vSy!U<^dON!go*vc0QjE-n}b}4 z*3u9efook&rBKhw*W^U(cM{Q~_0o10>)TA5jFyN7aAz$cH`*?c2hqp8345S^whS;s z57|zk|EeGH2mGP!ZN-TFwmJksjv{)KyNSi*4Prc8Ur_6bwYCq|0QyNA5r0~4TVFv( zZ)NUbl}*E}A5Al?-%YcvQPU8sVk&J7nm$^tnPylnuhNPPj+*Dgp)aPXTfL}zUVSo!y4k1|hQkCR9b zOv@`E3u;lU^51y9O@<@6m|Ou9om_DNs8{8Yq~paoV74v69%3c9YE#9*Vl|v8KEUHN z2#p5{e~UlHx96wf?(2zr82tiVY0&euP#-QL5!MGJ6(?sy2aXyS550wrHAJd*34ZMv zbQB|0uS~u>uF+fy)RQ!*SEcyL=!F=BKD!ohZC8SmyEq)&#nCKW3CY*CxU;8oZcu4b zzyWO|6opT;4gU6pxH}{t~flCloc+NwS5n9HI2(4nZg-x+_@QvEU z72Fgt$Xyka`D_ttig=2vEmr3)3U^{9gwY^uc8D$GN5vNKhhmG7hhD^UpmKhT^@UHV z7~cT%`UpFU`x}n+&uGc05G%@Egrd_BuA`gKq#W?g7R0WP!|ZVjmxr$i70HiAA*kqR zfF2`PT2CfkNpS_U<9*@8IF-UQatLi zaXdd1dE%Nvcd$P5;-vQsf19hgxAR$Q=~g@t=@W51|L-2d>-jfUXf1 z;px;L?3%i8b`^w*s7H(7doCIL&p1})4}1f7qJGB;o{6ueFjzQM;o#~7O>#VDo_}#) zz}v7x=d3NfKxUcXHwnGqlez<~KR;+zgM~HX65$eNp6_r);8&%f^OukWp`+AQT!zU` zHWErUOc~qCU%=`kKxQij|3Pc{G@S2=aRa7&+m%qf9lGO5)fd$TRTp&MJi}XUO>NC- z%~?$$Z6)-UKGvFbLy==P=%4DA>5G7|H$y)XdirxieM2eZZNqx>Sy85c(cCiIRMuP= zyQRnGS(d?;LP+i2L4QLpB4m|`k;F=PEmO#Lw&~;v+kH~8S*W^XV>I+Fr*4s7DGP{C zL#RFUC(327K@YP}pjYFhHPhaMZeq`%E%wLMQ!w@p)8nY)^g+r)XVUGF&3k39YOm+m zXkX#DWk2LNYTp1NRWAoeTO6C|qxQjcFMB__I5a52zKV{ZG4(Y)hTcbmsz>vv0n zwKOPGC(N5H1I*(s_06p<#nGv3H9s@IG)*+mHT`BTWO@Pe)KW|vnww$XIZ zGy1*i8zub<^mVl~sPy;s-F0>K=fS1Vqiv>Jqls$EX)eP9x>EZ_-9>v!ZPQN0x>QtM zR&!f*Ox+SRvA0;0dd7>O!RA!Fvr<0(w|okm*pkY2{EV#g5nAwGXyMnf+t?L5!L5jGLIQO%`W_l^X=rV~4JK%Jb|%{J zN`RUB0vgja>}<-jg^*gYLbLjgCic_V9W7+E>>wtE?aUO!Zm29fn`y*eX9i#=GzVU( z-Rv&xyxv9=Vh(6g9nfrr^CdDWWw|l2kz5Qe@QFCRea8L!8&s)gydNE$8JPa}#<}b` zFY{XHQf)zH+ari*gXoQ1?%!fVu_Tm=?O-3-v3vNhyZo@+M!G9^gbTL0^jWTo7S@82 zO35P?QA$Z8l_An2<)TzLE=qmD3Lg^J%hltzrI6B9TBEqds>(7kE)Nr9@*1&_!i!Us z5z+_cjZ`9@Dffw2l*hy^a+~-*Ngb~uZBcT?#>#z>RGxs+>lI(hHYr=qgg#}J4#+pe zK5}g_CLIMUxsuO|{aXdT4SaLm@HP>j zI~RMn32-8{|xJa!%ZGK-O_Y7CW%0IBdD+dp;^gq(G3k=Oz@9hsp#vDxTE8-wPt zHc+WbvwpD1{4C9iY$ozW4bibWn;jZ^z^;u^u`97^P`sMKO;Qty&BC!n&?~aI47>)) z$C`89;l5f9uiQm+Ex&`i)fcPFE3sL8G90RPxxB(cZkiCm%x4PURx}Ea#DyTWYQ$Se zY}b{4iFZJiuY*0}Rb?!^p-IX`$qsmqIQ!KdiYn~rlzDI{q;roLzhY-yfrsblGc#BLTLShLab-Wq(Cb7*I$$SUMO z@&a~1EvUhiLZ#4W>Bn?e`#}3=`%8OShsDv+VRW>1yg(LtwLQr(5vtKndq0QG@z$~3 z(Z^ZK8FIdJ4tF(l-G>KMat(6vu7a+Iu78}XT?d^*TpOI7TxW4boC93tT$5d$U4OzY zI>1G`in+EpA377At(_YjZ;){w=}2)Dab!45jyev5V-!AG>8R^i=xF6=>?rQ|Xn$*O zWN&Lf44z&hRQJEY%1fm-lh@&k7z_uzgji6{07c6fw9zmxCBn00f2ScL?Ncg>DGNG+&qXpoadLHpI8<5W|)ObBQk!8T&OJ&zW zmwLkXViRMFkkjAGu1BW-7w(mkT<2JS@Mt!o(KMT@k2`T6Xfh5E+lTQ%C`{=Bi?dS} zd{3>>Z?hE5SFePVm>VXdg=!NNq(tdBG$um6f-}f@sgyho=aDkfCG;q)gx_Z_*lic2 z-Z*;%;Gvu=_fitj^E(f%C}))IXmUCopMwsV9?HUa2W1M<{L|wnl&$f&ax2~_?n5IC zsTv>Gsv06o=f~$yRvLg+&*4OMMX@OxL4I0~N&FpnMNILM@iur{4-&w&cot^xIq0o9 zp%jWw0^_MQ&gX5F0!nwq0-Y&EnFx2&0C;=bC^eO`(6y-lpWa`|x$+U@Pxi?fpyRa! z|7S3gQN7V-T2*le$)=8jVCBfgC zC0!N^NlV~g>W?O)dSYd%fS3+#^EvpYqoKvS#58z`uOR=_jW3E_k_4UeGw3jvc`&T` z6s`>aZ|oy?A~qK*O(Q(v@^R%rFf0_SgH@;-&fHVDg0Vl5Rv3zNbu+FS{##}EH}Znu zWrF8Z1^>Ii{zNy12d}tac+EXVXXDY>5V+-*#a6~HV11S07_H5v!3jST%$grqh3i3c zJcK=;RX7i7O%3sr@Hd!+t&tsn0*7lIXn_aOn`4F-v>$Z9mx>J6)fgzbzv6RL{Z+rK zzp0+6$EycxtQrP=HY<@(D~kTkXS%t%75auC$fym8=)yZ=EN`r7x?|iAW*%ocjb@rZ z&}VwfTmV_!Yzu+Lnd|U=wj)F|5YIsO)nQw$|7+5NYy{M)Z|IkC6TQ*#a3ANmZX{zf zQuE1u(6tNEGpW(^Q))5RkaaXkZ^3GEhR#Rl(4}b146!qtLI>^p=yHz7bUnvsI@xiR z{%&7QZ?Lz)uFL_ZLWF8#|3*#0``h-iwB50kuH*PfcXcG#8#uD;8b^>mWnWKsvZrHe zxQn_@7o+Bas@wrOS32AfF=`Qcks42Sr^=F6>bq?NIo4Kyj1wWm z95R$Llre85!;$=^btwX%;RJsT|ft+J~vgm~d8PM);4&>~IUbABbyFWD@!mMuzuBCWOyM zE`~GviHSzmGPS`A?EnhtQl>gm(HGGZQ-*yR9SgG4 zQdWV>U5s8~op{2R!ZdLRy94(_H9V>R`7d<`PnZbyc|joq>~=p+LWi(7>40-*U2Z5& zM?0~CThM^85Dw22F(w>9I*yjMp~LH!=$1@U0lBp_O5Thet5N;|er^Y)0UGCCK@lGl z?-l=uEWZUUD<+jUt^@tRs`@9Mrpk`b#{6j@=Cyq_JJq$&P9D=1*G|(tL8tHtT?70S zJLymAw&`Etl(GUejrzJ{`cArteul1%;k|CBp`!klVUYf&;ZOZ6LkAEy3hEme3h8?o zs-m%Os6J@;Ti?Q1#IV!2(s0Rm!*CkYm~+OLpi{OsbT;hN|AV|k6a6{eFZ4|w#7w!d zZkg7P|NkiMHO+lZIka$ZMWeb^y#QQ>R8>o`@eHa_@hez=E5`?c*q@6vuPj)kL#6iM zEXU!x+lB_h3ZS}_l)h^yt{qa&~jd&5qRZNzJ)4Qq+T zqZ`mmU4dO5{fQ3ijcEK?6g5THN2APP=$QM_WYi;Cj!B3T%u7sM4lqTTL+A{;fF_}b zOlRgi{K0FO?8pRW5n43XMkX;2BNvgFP?$nYVzd)eIr;!?8U>MbXdP|Lj*c#Xj`@Ur z7%dh{V~?SCyDayZorSizE68tt;|}5kA;qdgYgoviz-vI_S_nhvZ>ZcC<@Jaca6^7>_kD8?*rjx|fR?Yk>OK+c?;G3?zcmreDTS zrnaWh=Ch`EX2wKWoaX$N{N|!)V-0~Q`q+FDY3Y5Y*O*I6<{2idWvD6L(%&@8^1$@n zQpeoHdf&XmS{^gXKhWdnH4n6I2g9>7vd0QCxYhCk3@IU{wmN!?oil$u4 zPUur>O_4Y1PCvkI6uSR0ymTifIJ^fAu@H?)lPck@NdeN%NyCsVeW zGqy9&GbWlV8AVf~@wDl=p^Ise!EWkjm~TuqJTn}^YqdLg6_kD~dbS(rH-f=eL^lAW z)g#*T8d;;&^wLZMjopf#)6Xi0`nc+)YL4ols-vpD>SO$2yjHw9c3=09z!-qP^?Yb| z+>d87EjN`{f)4v%UuPQ-7p8#_c~ZI}eTIVN!CPs$4w`!pLx+!HTGSTL?Ui`T#-uST zz7lI;Emc|7->NgJ!sIoNm4Tvwj+S)`l5(8GB+S z&N44E-#3r2G_{nnezb(44IIHvyQ%FEVJFcXL^eQ5=_5RG$y9f`3^kMPK|P?CQR((O z)Kq&NIuTErla7A&g5Z)(bLQIDIJ50Do#X9Ioo2h;d5=~*Z_p*2h3%J}C+#g=qJ5n! zZeQlQXRqdJXg};6M!$88ry};{WQP5^tv8)wyFqOu%1}LsXJi>-CTSu{lJ~7IZOxEK zzhiL|hN@)K=AY!@s3!i)eRh?rChA{F(vk_UiAdt>};{t{MV% zt5el1emVXcUfp`oj4%9OSKKYH1^dJ&c0^m@cKG2G^v;eK^6&+ObI8v%f^PM1tTuln zCLqPKk~8C6wVa(8^F;5k1woM*%YYIcp`yhi8<_RsG{zpj8o3(k92phzhx3PKg+B+m z(3s%(kSgd4P7MqXM*Y79SNdNEiu1md$W6$dksEw zwEMKXHa@$B`@VZM{^VSD@7!9sXL9G{GP&<_YkO*Wc6s)DNH6JK;T_=3^6m2;@#T7} z`n&l)_&vTMfrb81pj=>T@O3~A&J3;yWra$HkA)tEON9GI_JqYq^T-9Xu+5I@k%jma zWx#Zu2}i|$d7pWhi+_hRtsa!P_fQ3Q3Ay|>OnT42Exk;>Bo$B!VItcRBJPK z!IPpWB|*_DCg&=Hv94vywZYz5hlWm_Du28Mct4}Tu$ZH=#aFA6;wMy1<3CiJ<7w)= zs^01ws+*XErD?9K`-84E4YPm=AQ5!Y^jF(7g>YY~z$52XY5%8bb^uBK8b~Td@cbL8 z`K3OFSsJIAsi~{IrCFn8HQ%%u+EThEphz9l_Rv?oH#Nn2BwMr1TZzGzEE{84V;hS$o`0=%$@*y7xk7ZL8rwqD zL)(11J}J{X$QJe=rDH4o+F`R7buO@vbN;m7bpGau!9`|sm2~8B zr8)|@2uBH5qN9BtAt*L7rt2Ghgs<>+ztyif?ubbUKV5%!ixN2!~ESj^^$gZ|0U|DRoCE2Fh@}liE0ap^z-)ZR0PDb{d zL^fPOu7D-3AzLt-ctX@9UJx0?YeGvrC0<}gGTYjbs0iA;+j7}D%QDL9vJ|uKMekY_ z^AStLG~IH~)ZDV!L|b~9?wD1k&gMnNe@tORM^h=oE#q*oJPzoN8ANRuXl&Myh{l2dfBehqz1AOmV3P%D<_0NOj_0#oz z6)qg89UAO!7X0d45m@YV1?u^(`4#UB|7CAu{}`{upXR;hyXNWd8|*Ro(mcDoFLG;m z*XF+Qbjuy&sh*qSDVh5z*Pgp0*W(_Pd)Zwicd7fQdzgE#yRo~UJFh#Bo5^{a^Cf3n z&bORJIU=s#+`DrsxNqeox-aLv%vqYVFQ-q=p`7+PuXDQOC^;>2tnQNdZwWaC-Ikon zZbwcpceR}L?%6r-+|P3|ax-z)_jm8j-R}OCo9%XaeC|Iyy4-f2^xUbQCb>sE3v$1B zZsbzlP;PB+0nbctch5ubCXd>8)8q6#@TB>kdGhn!zH|QZKF)vLS1n-iFAQ|@X9o`WHNjv0s=@TY z`rzn*EA&0EA=D;l3?B>j3hP4W!@WaEktd-!k$T}+L%|Y&MAlwF{$VYf`n&{6sd1Zir*Uov_Il>ik z4M-poYb9Efv`IqJ*`zngJ(G8)*iw3>-bo?y%t+mwr%ayAv=4dqr_D^OmN!q{4|&(; z9hDx;8%i&g-ZEoU`lgIG=}gAZjDeZ?Gb5SrGnZwJ%lbW^H)}_}V)?%1E1K_DK25$W z`JQD>$+tPHOup_}-?Iv3t;mXJHpu#tY0kQk`66>s=F!Y9nQJo(W=_xikBe+b`o_Ey@HM#8R;P7H)23a^GdfSHJi*ipsk2gB zrxr?er@T&?l`=1-XiCYHPsxvymn8Q|uAH2k^iNX1q)|!l68(uy6FVf{NH~*FHNll| z9U59o*DvR1XGdob=X1vsXmfu!vcdJM0e0z8x+l)EFOlkQfi>b5Ie^TEwPCRBJFyp} z)o<2r*8JAXmO+*@%MNol^L;c`M~vgqhc+KO&V%~r`X9PK^mTRX(HQZsHlNm}9Rz0e z3Uz7qQS4#w$ETu&_c)jvACZetL**(XRYT+XDB-wp2CgHSBQdqB%gsP`<{Ep0)q&&G zFxn$JiP_FYM40cnkXPc)$71dC&UJcz5FcHs5vcX5T~aT;CmUXFL^u_f7XQ-k#nE-VWZ|-Vxqk z-d)~w-)nDcpWvP8bNP<=O8Xx8n)vSddi!?z#^G&_ubXd+uaED!Z=Np|cS0Y(!GF-- z*dO-K@>dLO@s9~?@^25!^|@2=4LM3o8D_!770V!Bzopuwj4; zmJOIf1p);^B?2`<^#jdA-2$CM(*q+y7Xs_?oxKm03FZxV4t5Gp2rdpU3hoWB32qE; z2#yPH2{sOI4W{D?g|-F%4s8sc3attr3M~rm56uql4UGsc4>b+;4HXEM4J8DVLivLB zP<6a`djv~`rUk2pHUuk$js;7HZU)PQo(C(0-r#zQk00WCi(hAh#X_l}lA(&BnxWRA zE};RTsi7&M1EI~KFQG@FLg9F5Ot@_LWO!)!TX=6+ANd;2h@?d-M!JBExFxb1&8_iB zNzlJmB9p0(&O}!c7rhZ}hjx!W>@b!A!?P)zYUk0{UK!0FSGlQ}&3;GIMI$JIr}#P` zTyGF|W3G`;9DtMH2QeSorH@GhS|4^GE7KNg93AfvzaP)5nxy)s%BMb{zO5dn>8i=A z^`UQcs`d|@LH}!5Xr<4C#^O_G4{c$nVf<#u!5L`2Dc6``?qxb`eg!s3BlAMbC36nC zi5sD%?;x`NNyH3H{6D}6P?%U~>q~^eacWL_(6L$9_JQ1kBV*Z5UiDMJSC4Nl!p4cvNOw!v#S8}JML&?vRil)>`{wrm7@}m?n*^^Q=#go!M z`)OD$SQ@f>B#ILGS zm6UtIlCC5*Oe&c4EOB*W z|3rJDl&~#fVM5^qW5O=iBv+#Ay>lkW3SS+~9c3Le&`Pp&16k3 zetxyoU(g1WsQLvxHg9|i^wNv)u+TV#O_2Ttfwnnxq^rUzw8rJ)719h`@+;hJq##z|Vjtus3kr-z6}}uL~6QAN4c7F8+Hy%D>t7%r_ACd~x3pU%*?@ zcf@P)4fTHWmiJ!vCV4k{b>0cyh^MLdnq@li*7+{d%m zv%s^{bKJAabK5i8bJf!jzf#Dv*pq^P%jX&3sp=W!>E&7GS?D?EIq3O}&oX#ldkT2{ zp7LIox0bhwx3hP>cY#;%zVi<8HTHe%D^3km2(%Bh39JnC3}gp} z1}wovfo8$%z^-7mAQgHYT#7q53slmpSU=mLartwkNu&caJ93`69x+4V?-pIaT)|YJ zD7;|%*k<78ePwTBp3oI(6ffFphM=A7J+B8dYXzqFwS-n6FNMW_#a+@FczyoF$+I7YG_U|e>NX5PqtJ6&-$t5x^Dj6Il zk$gtJAg_@J@HPu?9m)D+LGZdGw&k{~wm*o7&@ik>~ndeM3WDoRC5aqA7R&AZ{dPcZ*(`DyxSzF=Bpo@^>@&NMwUoixc7p zIqeT^T(ekvLF3SN*ZhU&wcs zV$p1=ojhM^B2R_GtRwmp^T3yO2VAf2qFIUw-_TO|S{#IYXG7sVx({B76f*B_OqH+j z!^M?+MYwUyVhcV8l()x%4&>Tr$S7^(#tGfIEtzCG8J=wLu@zPjMbtQ*;nY*oq(BG zai&j{2Rr3WM33&hkIYff2G&Q$qZ_X_(;5A|mGMkWiyTGc`P9f4aDg9$QzI9`{_wu= z&G54D`ta!R*l@dWt8hh}!4tx!a8Bq`=u+rpXkBPwXm+S?Xj-U7Xa>&d3qsD¬U! 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

{qo77>cgHo5I_D!9c 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

IUsej`~1$ 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 N$J)3wk5xwg{{TJ?HjV%Q literal 0 HcmV?d00001 diff --git a/tests/features/data/test_audio_48000.opus b/tests/features/data/test_audio_48000.opus new file mode 100644 index 0000000000000000000000000000000000000000..330f1bfa22a690528ad4bcbed2d52551047e4f29 GIT binary patch literal 8145 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 A00000 literal 0 HcmV?d00001 diff --git a/tests/features/data/test_image_rgb.jpg b/tests/features/data/test_image_rgb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e131e8ecdf32c3f751ab0f7b2e5f002683babda2 GIT binary patch literal 173131 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 literal 0 HcmV?d00001 diff --git a/tests/features/data/test_image_rgba.png b/tests/features/data/test_image_rgba.png new file mode 100644 index 0000000000000000000000000000000000000000..b689ea4977232d62348b8dabc3b8ae1c61424383 GIT binary patch literal 51083 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 literal 0 HcmV?d00001 diff --git a/tests/features/data/test_mesh_glb.glb b/tests/features/data/test_mesh_glb.glb new file mode 100644 index 0000000000000000000000000000000000000000..dbd83ca8fa57c718452cd6659998c28264d371c9 GIT binary patch literal 2609984 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

wP}W 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

^a>;NxB%`bw_)Q(Z}weS)QgP~FL%kWCN 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%0Da)PNwo?T*Z`r=54))zDR*YuP8-;~ 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�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π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

  • E<@<4krlIfpDZ5V}Qkk$Z&gw;yvc;!Pl2 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

  • = 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

    txMXW9u(7rxx@zTUcNW#;r`p~Y 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

    Z-2zrIgsx*zw)QSf#l`uuRGU#zMh6ga$N= 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�l7?UStQrHAity2+l`Up6xWddg6I zJFxK%4S7FJTi`aTN66Hjqde1)+$JEp_T$@CqW^plAb&z8_o+rpf>9!{6KMsr0Bq^Zml5cD;9?6(<%a-rwXaD0yspi6Lp?hZKO-0yu#5+gKt7N$E^QC77NKSZtRD*O|_W#eHKQ}_5^+_Xg z$z%m0Gq%P??SH*q|NZZO|MQ>!1g1L=P}1v+=(BqGRFVXy?>~NAF7x&J`SI)5_4DJp zT)8Y);OF1}xfM&?^5+)@+~UjfdHv+Fxa$P>Yt0<}SQ$|-m&?7jdo6xguGeK13j4f% zetv#@e$JQG2o#gQ=@z$O{o>&YU|JX6%8SZ_DiIel;w5JwV(N`B^G@y*IuVgdZf7@Y zPbNW{S#$<@FFsWBIYf#zwh5q%C%`qO0Er{n)J_i23vfih@jPk-Zv%=5zIX}!>8k`= z#T|J5{S5!S!UVH#|45XXTo6oM;fm-#T0vyE>4vggF{OWOMXn)@AiqDJkUW-QZ>T-N z8AXq4-xtV++Ri+(Y~{^>{dGrOxtjqzh60?MBH17w;CnGt6`T;%0OVo|&glCuW%AVU z0tvMNS;s$uEZ=@$-hB2GqW`a@_Iu>@Zzq^$11{l^4(X3+7v84DgLnL=x>%!+y{g@ZYsF6rutkiHzFO=<+^?#ukPyhG7)Y7 z`~H_@&1d4YU|IP@S03_dA*bbYndZx7&GVmt>E^BnugmBE`9J?3mu3F(&G%+S6={r| z!#D9#zhGrU_i!OQxf5KBVlHxoPMG#w7R9g%9wURr4>>Qte(zwdubj#qw=Yk&G9X~i z_(wh-0u|yfqyK^-adhoxPdKsw;o!IquqK>A(@~0UAx80s(%LYGF8HUQ7ld?R!K+te zS}+=kw7o5ZFwmEPAbOGb6}#o+wSyxYsY|8upc6_jweTi!hBkz(8x2YA5YcSfnTcw}`vk`9xb7Pk<@^7*kA8BCuaAIq{apE@qrfBxf- zdA9dP-Z#q|Zqr@{%TIwYuOnruPVF4xdM-loc)Orx_%QYTeB{9W3bpl zyp))-tp&2RMEX)38i=te#nLLc!fic&58@||%4*5%T!LXXPN_2{d03niF?|s(7tp`J zA_@qfm5fJUwiD7zN!Y`RL@1E9Q`jv3KHm6o0%5PGY3IfK>sUx zUW;_^|DL{o|NiUOuNeJj_XQ?u<*;k^tV8$X$B*mvnlE9>qkrf4`SG!mih7}bdQLUa z1@Zsw$CbkS>IeciZv7h@`2p513;kx-qJ?>0scHQ(_nnq-Blx(J;NA-z4!XyC`QlFB z6bTa@b(W6>k4075jP$SK3*8I-xBHx$!UqTifvtV0boTe+_OZtb5>=S-%1WQWKxab+ z`r@bx|Muk=j{kPafA@0x8B{Omdsvw}pKz|^0P|S(DNSH9{qCfdeY*&v-{pSm!rlM~ z5{{ZNMAa%rzomuJ>JU!QlW$7NLOHraWS3Z06Cl6jVyPs@*lmwW!tp)Xk9zPe z{;(PVKuAWXn_ct;J=dVh^?LpL@4u%Br2Ef*{&O#QbrFxVVeWa)$quN%~^>%;?!_K(W< zuVK(H3I%9*Z)Nh$#KWQ${VR7=<@RFM0f1=-eF68q`_hLGMJh+{QUg(?b~hG%f9DB zy$Ws&bBFhJy?$<4z(*eHZO=v4$#I0qH|-!lkjJvi?_Ps^uN3g>?BcL}8fU{t4cG+3 z;EMsRTGrSkix`&bIYGJTP%Z3zsKt^>a#=I=FPFj`gEKy0a*WjN7@tJ)x*kE01w<{ z1h|?RtIohQ`4T@aK`N5P)FzKbh>3h) zDQKUmmn=g6+&MPKzaIT-s#j~jOC?awG@(?JT~YrjtBf3h+sSBk3k{VQGj zh`cf$Tb0~Sslkj)ff@b7ZX0I|E!{SV9{bhv`NfqwEIknYIbnv9Oo1sBu%{^VPT+I@ zw~Hi#{e&X8LrK7%_`U3HK1B-9uA}szTR+MMz)IA=Eb}~XWdOiLE^cFV^7r6uA>8WY z|M>X$$3On@@$vET@v##B!%d%`pQ{+~R%-#^PUn`(AlupAZrT4>3zt7XKmYNMKbD1# zoZ!j0K;9h1TF>^uXNpDLpg7BT%iYt9JO&QBxbV+g=S&+jf_-2icFKI7)zH86$ycTQ zXnpOpVsqH01Cx?-#T#_Q{pOr2V^0vjGUOWZrPh&&6HtQm78^Gy>md&NZQI2eO z)f7Lx36#&|2~lVvqzytAo%??I^wz6C$CaO}7W${xCS*$^@B3Gyf2JiPWnL^X8XzbC zXwbh3uq$E(qVHeWMl{CT7}WB-c{tVRJt$*jDzCm=5)dPMB!pxlHN;ZC!uWuEAr4AH zhd4lR+Tv-r-&2N=LS0Xh0<=mpJ@D?2szBJ{538=$N(nkm(>;rQp|}Zz?|jYg|M>X$ z{{8z}RK2#narLY}P1E%G`MDVet9Dhiz0gHMG{AIYz9&CEK7Rc8akHw^7WZ|Hc3>T4l`yuu)wtx74#vNr5&nSRn4fL;f{F^^HEMjC- zyyuXiRW)&X`unT%g>;=kYPj>+&nX0d5aR0l?+Dy8^v+g-iAvTWzxvqag#r%9JGyrT6~m;&?1>mBb$(pKCVJ$Hxbz=`wA)F>ac$T$eR3 zXq8-;rim+$$Fl0pFVR+dciY_si`U;*@r29e^7;7*xam&+4CKBCEx?P8mMbWH$%XV? zQLOgJyqT-kP5!QS_0t6U9{~Mp!eiD9AgJ4eG7Et>a&KMm52f#zLsc=$HB# zCj59n6*abE^U1qKqI4;Q@ST~{(xn7AEMcXoKy80S=T8AO#HYc$1E{#?^FmrJzJKu? z=Ak--)tXNJDf<33g~G1n{s-+wS2^|n_puI6#q)iYhhwJyqa0X7?Q`FSvN?@Q5DoB} zT)4*s(ou-xpXMid$14&3`B;48&3u&MacBPFY67hayLTJlmRYk(U?C8Fb9+wCn%i@^ ziP}1>)d1LOMd93Zxdj2ffB*jZ`MHt;!NE;%j$Ecgcxm(eO*`~o12tQ);`8ICM^|G=tqX!_z(Zi(DA^`0@OW3z{4B}h<4*MlU)As%@Q)e3GYF& zsi+a=;QNtKpuRsY;ktl&?Z^4|#fsJQeg8?y|NQwm72(v@p~{ylmkOB2-_=nt|IWvk zArQh&<-HXPt~oq`nlF#>0T;*vA59Ky3WH0CXXYmvx`$-p&-47i$ir>3o2H2id9wjl zV_?nF0g&1VHi32A%Xhg-|E`x`uh(T+E|WK+tCOA}xFrHD%d%c|Bln-MZ~<}9bv(Y8 z)iPNl6~BJ{x+#F|n;9VhM|52vGIG~r4rpGDB`>`J{j0L-X&RG8=wIXYFZjr*d`@Ve zFa!M3Cr}e@8wORoPk#s5BC;oFrOxPtDKBJ~Y zOMoS}g51=;=^<^=h`X2#`U_(EJ(pD3LYS6zXT#$MnEm0R! z@kSRw^0pSNC&LxA0)#r?oD%Rp2jLcaCwiEE$&?)+RUAxD-1VL~G(U&&L~=Pl5r0{@ zqUT4}0XsK2aB?dL(pHnOW$I6>JXWfE>uIayu%iEukB{s1I?odj2ue8T++~`s*X85m zi0*D0iobBU@iEpfUp>!@T`7 zOwIGL`=(qC{R{dGmRF-*Hj ziUd;alE%+XIqF5_3p;ELshFKyY?}}k$U}4S9O~Oi_}+8IK>AEHta|0O$fM*8`u8Sk z+Ax4C>TO{c)q-SNr0WDw%KI;J?CJ~#v-9O)=>Nsg`Aazc>-ZcK70UOtkHufzOkn<9 z2jHFzi9>LJ0J!Yva7IL!az6H7b73Bl|KnByeqSW(q^G{60CAJA0?37aLGW70%W2xu zgtmWdcFVFX-@kuf|M=_IuVq>0%jTL#;3lDSmwEd5xRPA+_%~jl%jH5I2Eo6}W?FeiNsUi0)+FhvfNym;o`x~Uz#L!b}BKJ0J zC3mI?Xfz&Bkp`8iH54-vC{z*WnhI2bQGVSF7=48nn09yTSe}px)p;H-c%VARk%q)s z>Fq+M`WGa|lrm&`i-LN)qF^?#;D^qtgBh+(qJJP~C%~n`7AVbdF+qsVBg8Eeg9`hh zi2ji!J~~{I9XH|ckM{kSX8Rd{=rusPQVuxbe~q<%lMNoZfNq-{ZhVag*{?wVYrA}L zAv>sl>t!_^R_b=l00ZUJlkxv1fVJkOoMr}0({yLBapxNVTM2-}LOKu=+%h>XZqr6s zJNEJMvE?akdR|+C|ElVBy^EI`{3{<$7Iy{rq{E=gZ}?u@9|= z(3a=3>JqGX+zOPJd{nnyh5O&$ksx;n%w!4yTNx<5BH&|6 zk8fb?>H)q%;yFzSOys-<(I&SS4iB5C!8QoMEz3eKYm&<}VY+<#`1R`)-~XyIec@|6}nTBdbK(nym<(^#@&xS51A#q7MjYm2y)dAyA z3RKb4R8|q}Q4eYk5(X@vMn#$;v-d@83@Fab5Q)L&^7sFnwrdrYwVt0oHSL8&oxJZq zbw3ssA>=Rv3eP3m3@lt_sJpNkW1&eM1jh{Q^ahfN-f-H`o|sQR61E?pc}fc4;F#}# zPLC{~ck!;BZ2g%0lk!a>(jE3X3Ab7kYXsn)nt8J`0!H)Z?4aGHzhVE|U${8B#c|C{ za$MZ9oFN7b=Ps9NO|QpV9YMD&*URN3PNW;}kT){^yTL74Ygy}jw^H2=r>@a}tGhbK zWw~B1m-%v061VZ5J9fED(}e4?toFk?5|?{k|FW#Xn9u9=y1t#ugq2wIzT@%8`$?P< zrc`f3Onk4H_G&=mnbve{5AAhu{P*!>qXfcGh8JcB67)|BrzFzW8wp@#j}*yCDUAtK z;(nzGC*}7aEmow_KLfi~JT0)-YJL(}K|6i;Ro6oF{tG+d{h!4;zcg1UrO89V7l3#g z)t@QcIypRf^jTV2C~?(`ZjFaz@~G?1=P=I~-m;`_;tA88>l2U_Odz2nTrO)mkE7%DbNN_4rfG7H*JZh2a+8~Y z3DX33=K|gJu~ZqB8DB*+Do_{$vL3CUKwRMbG|eo!N;d#2%3+OVzVsZCaJn1-?R{b1 z5S^}g*Xa$*OrE+K^i%zCEC!FNiw6MN^#~E4X($ViteurV1?vkqrVNRr!qyG607NMK zz|2dbQo7^*{P`~wa^eE1xyN#1vA<1eA`;qgX<~6P1O0QJX(Y;XC1TJr`d15n3Fk)~ zL8)TlOwxbe_n-E8o$32WM@O5GNu~%`JsaxQ83G91fq4O7!9#EE6AEJ8i5Nn%M8FH? z(9Z($PPwK1?6tyNKU5q454RcsZhQ}Px9R|Ty6Ja0L$*$@Z9CvzqkK~;yOFhFg1gcU zrUL?Q#FvfKBbKX2o<9!#FKd|w>2}2i9CYI+=N9KCI8GC`5Q%e+SHOLnr~N^2 zD0@N{EC#h}n_S%5$Yq-7rnLv(+$CK^c<1^&?)5C7f2jP*G&=cpn-R^h%UO9vLn}_X zSfF{xy1eu9uceaNekB~G&tAa>fU!gu>6e)BXw_@_R=E6|Q?|6|AC#em_Y<&yW1`3Jt@fRWO z)bD}*bFqTZ2thhkwQW=DC3D$*gMA-02G0l+L`flFhQmF$1B5f(4` zXYn?=75>eh{@5B}*h~j*348uewWGY}{~S#M-oQT=tRQzHmz$~5{Vf5QCQQKPa`S87 z@c**7i(3{4cb(=7hAqQ|i{r8id){u48*$mK5V6!hX?unJ%ziak+GOvIlKs9C0TVXV` zZ^vMXqik2^{hDp#Y__IKUjIsUGbHjAlnkDELeI>Z-pM>h7+dM(Xc#o_k`$!|O^#2W z6QiK!fed|UYQoSdv#lYk9_FSZOPg0Ii4N+VKq)b-C<<1O{xeuVM`|msrhL_}?Ea@d zFR0yBGu~9la%A9K5X~|7fas$uYUSp=3`$ZU{rTZ}DFz|o$3()<5|#hnJP*&G!#q2Vr8IL0Nvm=_6-rXf>^!wkb z40qN6@f}9@$?&Vr@L~0~Q`1_t_Z_*~N(BT|L4XpD zGuR+9)j~J&iNt-~$6xWE>ZnegIjy`rBI=^C>XET@05cb2zfW|AWMH@~Vvkx*k%Y1^ zQiQPE>2bfRt}H;tsl@tr-+uy^LvK{bg+@yBuS|NhB>umKr~mhkM?9dc0IBL79t#HG z7O%*g$MWuggmnK;FTvmc$LzK+c)dw?SIA?*ZYk8epp- za8Kl#{1jC&vy&Ce*}rBwo=5pw$mMs?&Ig+I7!A)x-us^I%sHDJTQ*r$E;|(7)0Foe z&R)J<=b9>mZ|Xt4Ik4UW{Z$dIV}87a&(y${Q>h>Kd4H~Kw9-~+&)I*RPNr*fN8cGStFD}&wr(wEf{mQDqE-MiL zWk{h|E?i`~(*y_f+5h9AIn##!7;@|O*6MQa1(L9_@ILMPFR1}&LJg5o5dLFHQUKi& z{6iKX?t-VcT42Z9hhWb^q1msq1s;ym3ip75z zt~U}|BI&whHl&favlnV>p$3i#e|q{|gsES4Pru_O(iBFzIp@C4rTkKPnm@P3pg9DrpLT+k7G~=|F#1Aw11{$mk7i+fpb4 z9P@+*86`aAgUs-%aos)1=U#=2oz=vc|FgQfaoB~qdr($sv&|5>7o|>XN8sSxGGV%< zE-k#J>YKkPxDoz1=N3$uZaF~r%=!aU?iv#zm&HwV4$IX|mku@nm*o!n>5V~963xvr z3%REuh$LI+_M@ywLw>ElEkb8+kM6FI{9MujI)ooJ1|#x{mz2 z>?^lcQ(M6|M0?Xzw|6@9w+xO7`iHhehGrK>t117VzKNC3={Nmn;3#O>G%FM5iYG_; z{emM!TxgQCh)6>uT*5qrXJJ5CcH~fj+T$N-hyFS;9HsBS0{yGlftXMTc3SkGdDw!# zzY~%^50IC<{$qURPst`~%G}Qc7d({!2^vUsz%F%(m;HZmhcYShaE}yt9OVSygZ&wS z&k|lz0R3xGGi!H%5{Wf#97a*~DgZ8=aH9vBrfE$F0;U^nP{|Tl4HvkTJ#z*9Zklea zIk(hyL=$@pVlV5(3m4~ByP+a$eCK}fp+CLojb{VwL796}mzOHay?~4rtBXl4Dcv^) zmMsaoRgKm?fJf4Om9v$$%~cQHS>6}Wce|&-e{2@{lEp(iL4TvNZz@4XlUX|$`ez0( z2Y+kdT1LUkl!1W4_r3Z*9kkRy#b<8^1kC*;>V-*#zbv{Fa+Ew-OCaOqNd3&rOQe2j zgx^Z7Wm_yB$b0l#eE-RgB@2I36$Q}TT|?j5LWIz|oj$|nJOr`H zaU?m#mfz!679gM69|qdZ<#mCZ4ei%jG^jP zaI5sa``S0Q)7wi!*gU1*SC4Vog-(WrT7eP7mjtomElPK=OOj^0w9xL|88m>ub=e8zUs8k_P z@B1$o{uTy-8h?Nm{j1&ortJR#9~R4cVQzLk%tg;(9Z1UnSQoJ=w;~x=MusnweN5n>K9t1?m@9217yu`&1VS(SPgN=hG>a znVkYEWIV$6pG5zV>|v`gutmBn!y452TY!#jzmF$9pxd@$VRudKPyi z2)dgDbHp%uPl)$uhSoA&hsAMHKikguncg!uKf5P1b}Lc7mnz_{C%HY?UMqD-)S3>% zg1f@i9jdR&Uw2;1H6q|PW`KM8_}|pq4Gx;UAmHut*dCW%f)>$OCa>C6#0*O%>Wy&gH>@x?b}nlb{a$-8lb-} zp(vYTUX`R|hW^^SFe2@&g8oGvz1**KK-OEC&+pfy_{S+vl(4HD8fo0F$QHxE;uuI9 z16nPBRI-rD;X(acj-5q1(9hx8eY>WlMv)-i?c>&I>+8CqwT(oiF?44i*fa&0nC!6CK(PjqXYI@->zgP_8Np%A^HPQ5&ErN5>20?Z zpi=p-zCs|!&Iz4q0mG)9S#D{%Jk*+rx>f&3>jBSJi2M5<5~pWE87w1Pz9kEJj?uUv zaos8AkU3~K6n1dF1q0j!EDLif;x{mT7l;*u0K4OVb;r{!D+`d@{&G)7y4A?u?sx%W z`sw6H=eT`f1^xGOfIZCzyvrhQo_pWvNxwq+#?+tS<7eu>cR)&EQz!gOLq1S?MzWf? zx)Ix>7Wx}(Y4sQ0ZU#Wd^Cv6yQoS*A&<1YGxv6HMsb!{5FSAhzLbJ>9gl} z5lbess3pWEtxh(c4ISP{#|NMa8~P+aepq0S6Kq-j9^?$NgRt@La7RkBJHq@!IAPW0 zr6YKg>s>wdYf28~6vtcnFE{B~M7S?7JRID#RvWAgp|@O~TYLk-MwJ3?={Pj}NPxGw z1RKGT4-`1c9*{TTfZOvB%%?4HZvA70Muh&4U^HEclXX2Xe&i;)E|ga#WV5eg7bzG6 z6=r}XwukmjtG5HdRhJH1(tdKzX=sN66%}nJ;a-i(1k|lI7x-3*g+(s;>JSae@GHjm z2aujp>5^>~9>oTv{Qe>bD0_h&XzX~MH~?~1rAwgWDiEJqA9OWh1jbcN`_7;+k5fhJ zx}<+Sm1kD&w| z0Bu#kGws7I(qO$Z{?+JQP#rG8WBoI#Mcg zWJt(<1v!pBT&JVlFL)n-*;k)+F+b1U|GyUlZ2WFwh>%PqR4}nDV|STXIOp}q1uV_H z)%6~@=8*j=Z{EtiF8FW)H*0052MvFv`aLr>--*O$DrE+sBu)c%Uyvi5+>lIyIvwAt zq#$&Es_rAxLKWI8=f}i^Q+7O}-n?nj_YKW}Vrxw zA^iv>fy9TGo(r8tcyUMkH(LXK$Q3)s!)9*Wl7&jp-^2Lfc7s^jcCQj%^ZR)ZJj5>l z19z$VbHWq`&Y1ze`x?2{y39~&(uXo%6k3a;q--vw89?bA@rNoi0AqL9YTS>SlhFXX z?SyxpPZ2OYW)FSeeOEx!z;+!m=AN?jjxo|X0vF11n zTNTvo0^U#_oX~6T|Ek8dwzR1);SL-f-IQ<^G2zLGuo>2Jw0W$mR%a(@t69r9m1 zC=Y1|6;OkCS|4cNCyBAJ=GlKA5G2pQir)9}RCMt4m+FR#j{hPxP@cZC+-ym9Ao(cJ z?K3L$|5{Gz(Y~&;Z}9X3&JJfH5|G*uJAIk3fKW8b`*$AM&%D$AcohSFLXulGd2csh zl15@<|4>F?2DS(=1M8(~i z`*0go3)-N+k+aCGO-2dM#m>Gs^)i)G6lN|Vt;LpP{7jsQk{i-Ax3g!m+#*e-cXhk3 zuKHQXh91gK0J!{4sUPix9T zEjv!|iUCzHhagp6FGmTK@c{@TzG34C#XTr5-vi-KfO$M_eY(32z_w#=#sK1+7i{=< zO*z`XCwBzz>4f31(TaNq@7YFPS#iuFF=e@?k)kV~4xhUeQ(h1X5H)dP5>?6p2%0Sc zWO&{Ti~mmAw3|=CrQ05!2nO_RCVlFmgWxyhOg&f9o<`A>5tG|0xs+)H7s5c5GzQdul7pY~Chg zOdy{c1Zl7|CBhX_z`eZ792ioYniEHj8I zaNd)JPA3b0dF-3>tc5v%{s|kvIbh5AcP>`l3hI%Q6gGY@;=sh_q$hnLVBW+5c31pH z`sr63BUxy0HxZ`5U+??GL^gnp5s#$@j_c?o%`X}Ki&&LsEF0MN3CP%?3{UG)gD66J z7)pfYg;kl^(--u|f2Ot#CBuCi^zU1lAbx8rQgke*DF%x9;V{?jHKb$R`IJ$z2M#ty z%ECdix)BLXoeXX=x9A~l21C;Pt1e=nGc_WKO*=G4T+%{u3rl5=$`UZ;2q9}K=#z`` zQ37NwO|Wk6RoAb-g9*RMkxu?O;`j`kXQCW=1?KC0?QEf23Xq@bvyiOS@T50nB6ureQrHMFPq93$jR|U0RV_bi%S|14PG?%%j1OMWkC;T&xihK zed-WXwpTkC)PLmw8M3`sL;uJh4?};Bf0ST-@`XxuOQB+btSwM70}?}264f@U0%PbF zSHJVNDV^<_o7!Z}LqcxlZo_JC0#X~RC|6gE11JIoVnUG;{qNm|R3VW5LlOGJte@~u zh|i&ZuH>?y>$9p(!{X+XE$lEwe`Vf8Nap$EZh(V=RGdoWZbD$ku*IHWm`2000k}Da{u_$j z%YuC;5)ZUIyW84#+i$v8DXFh?o(95C4}GE@N?+r)MUYm{Vako{sTE`Z3DezVDmSR) zMxyk~2s6Gzi7={c8DmVqPX<$_&ABWuNYBB1aXa-n6Vg$lG zne=e9vM%bOzbG%j6wuGtA*5*yki+!!U8{&)e<;~#bc!>Sh2k`Ak|qE>*g08gerP@f ztl3YBcIP&`PxwfWXxw zGykX&f98&kVSpl0Kzs-GbLi>cc5go~$Q{gpLs-FE4B*`sNQqq?ma9PGDQze*DH__; z*b$Z?A_}jkIVzKEdnip~xD2zKI!KcILl8BtMe%6ZUi5{wJz@f0BtTIpoTm+~d}L_% zot6Y4m@i@x`S$Yqqx(}pW#j;g?_&e>w|n%dR6GOB{V6k$s&B+XX4CqSO(9V!H}8rT+7L9C*wk>Wz# zjO~u;pY(W#849>v2huXt!iOxNBc^vz4ZzOr$%G9shm{9Dna`1-pU!LXxcLWhheQZp zMs2Xa zA^mh>{#9D7f(|GszPa=*axbde`fAyJz3hDW-_h1MEE}GPWrHF0o)G&(%+bG`(Ul<9 zY>WdGR{^po92h z!3oJ=LRuo=C=-_YVQ+Ijhyb`K9mo#_cuCj@Hk!Rq_TD8Xyfm>wJd5@~1RoX4)Q;XV z+C4dv77eX;KDFfugt0YdgThECc>1j|fjA{hfg`EtVInoCuScf`>ecqA&~p~QU7C17 zCojGR87sf0sj5?@Rnw0$2vI$*1_$7Xnl+nJNcxG?HYN6%@?eWy*Rl3{B*f6(#uDRlL^7% z&glOuy8r3kM|pf8Y8@SI2_da0dCs2ybF@H`?*H}7`9J^~75=(76mYD?3|QL{e_N8S z+ywia%Ly|HO0nqjLNcGp0;-?_^+a64tVa3lg;UK=|NJ-4D#aCziaj+b-F+b8MaUT{ zaAR3OdwKVbZyH(eT>*ZNO!a|@9MVvj3)8rv!HiLT=5>lf3h1vK?VC9vkd!l9s}Q9- zLa?=E@J2+FIh9Jm5qPsSuj zO9BTo^QbuxB>nqhzJU#}UONY-Lr6p#R0SN(fDLH{0fB^V;1c#gK15(O2C9J-Dhz`V zS3!8+%(k2h3k-D)jLY~Jp?201(8mNkGoU1|sg4PB7;U(YudI%YLhoS`6$XsZAJ)DN zEX-w5Ke;iyUP=_CD#ilMvk2%7$eIKOl%HdUfeb8JG~moxKn^AIP>i!uxuiS93Mv5^ z3$utO-#nFfonrPn|2vHIS0En>H5t8-*IhYH$fPB#IY0BlG&4ji9#UxNsT}=!31J#BW$-92*8vzDJ-;7I-uydjLoKvTO_} z(JP#utz2|cMSe1b`yN%_1~ZAnvuq!U&Sp_O@|FPA+mn?wC|_=FefH6+!07WXEU7+p zQjEN994x6yRXtCGX~q+!gVd2G#RydDhe5!$`cg~br(*{oc@|K}O-iDgD18$JtCLP6 zd%z^OQsVK@I?wC(R^y_i*41xt08`T|Nsa*m6@rFSzv#eGLVta^@W3>otf>&=5`#8H zvu^sC0Gb1u8zFzkq1_f;?onQSF;b9B!H*N}6+AymE})>^AWj5I*82vvzSvTLf{g!| z@FxfbI3#@e8&CgkK?v9`aM>mOK@>I%HWInyGWc@IvI<8j)z-E8SB%~RdM4~?$T!7T zjGSjs9TQN&R=pYUGH}1;qXLa@6{Z+>Gs&h3`j=om%Xiaw>@=kXdA%*vKTBo?3O_N! zm4tnx)1VhB+#oCrDhel;-ZgVOu6CYx&b)UrIi@pB8#_447avdFw~AR;)WP?kpMlYq zsnMxuh5lBaP}#e0ejPYUm=5!oJ+7hm@kG8>&|p)5ej2JnQye8Qh&ErRd7 z_hrI-nuLP`C#BdGB<50oHbk;B5UiHL}(Y-hSGc0BmqfR^1#waTD%qM+;ck&7Xtj2MD<7bfVsY)XA< zH`Z6h)IonGF=z(;>#T)+yO$I5Xn0X@HPfepSFPQ899G+MMw&vGdq6EXsuSTV!uL#> zueLv#Qs4lbdy}7nvOv-Xm}B?93%LJ%MPASS?~@I=v`}VftR(ifjJp>lOCV8@n=uSD zT0*&!v|Kt+pNU-fwYv)dig*Pf3=*|_Rxu_ZE)|s-kO;r&a~#{Dzxeq_Wosr7Z@#A) z`b%faMVY2VSpB!KPcn~4THg=)XXrIm&yw@{r?`WJ{g4X0UP}8(JRzl>Q33Ih*@HyC zQErr4bN69fUsBkzaTkHH78#j2N$F*|T4r7yV<`&4x_Srw19|k(_3WPC>!)@9ze#_( zjFQDLNQ;X_#G^@dC|^dvC4|6^DgI(8;1~@E;UvSYgh`>>0AFUvaw0+@%3oDh|1*% z2q+aj>QA58kZ11gh|#(4LgtI-cC{gmb@ zu0a18VxkQChqP^?VFq@uoGFNbbc6oB(7iNkdhFt$o|8w)Fo6SY_%FdQlPh@Q(|=i%0P>9qr083)&RJe z`ZE&;h-AN*;A3H)p#>0UQkWeiW_Cp1Y*vkQlfl3mB2T2&6NR#2}{l}#JP^2hIPb=!D4vKG( zrg`2_b5&0ADSR)QT@UQM-qmv;{nQ$s(27l?N{3`f3fcR3AI*?U&job&dnyYkQTTgo zXXEmj^U}o0IDk(QdO%e0k-x_;E@xvGEdfRp24$7m-mfS7-Z{qtX?jSr*WWBDSmrjZT&=zMf|^L2Qo5wgTje14zvW%C zeJy#|*Ju>=frDv;koz3y*|SQ2Q-^7pT(ON>BUacV|j*xpoI5{*o^d)i zN~}S3{PgI$3h@t`^gj$n*f{ zukK+3`_P$XyK3(~Q>2HPr=}6G5LLck)c%@y@9J$b8+IaVI%V|&L1e!nB(!iRuNj#aruQ89g5QJTm97%rF##lF4`aIC)$=st^PfM5wA zqxMx)5?~gXKKHWatIg!nr%`PNxYPK87)BskSb(aF3m*ddJ7xJRykG-#i2FnTE)<_x z=zn5jPb#e+4bMJ|*fb*~mk~>Y@W^H;+_DMZ3wh~Aa#L=#cy&uDd>7iVcxf%u)Q7b9 zU8hK(iW^i!T~KI2TXTY5GwlRu@x0mpG-?t*7#m3ywW%}9*ga_y=uj2)-6^FKB{nzb zxYhtjiT+9buUPymko%2&|51r2a+2ec?r+KxfPINz=)Cc7!-q}p0F<(|u-72`3$;A> z8GJ!0>pLHWs7dcZTRUAre^=;l;3QGTM$p{z=Y;-ki9IYQCbcB?DBcm|ol-Xg1X-whnqXn_(JF z~qo{LWvd6~NN9p2`p8lYV?Kz2Nno)JV0bBZzS4lTB z|I}swL$%~9oD1gn)!jE_cPX}`)i&RM*RDJQ<|9RF!z991TM1h3O-q}HvxK}JMm4_k z;Tjj}{>JG*YBK=tAO;38gP)=$umvO~OMuTbTVjv9_rFw_2O8wYvdJO+ZwccotQZ6= zUM%i?RP*jbWz=c-g2W%ApaV?rHM_&3cE+GbU<%bNLr)L=HFZ1B2K~=s>?!}6siQ4X z7_o0QHN*|bIfLTYA#Pw?eUv`JW1;`yAA_Jj&8wc>`(RA|u?#C3C*MhK!uRn$MAH2n zU@1ueXxg;?W5wZfd;?$SHcSVK^uL0Xk7Ho~;J8ZNxHMmT_#akF0MGQ+Q_z`s<}F3j zIZ76$QwbcGc%LK`%VxeHc{(AdB{+hiKMB`*IR5)_`Ik~2dKdV(4< zK&0%fPV7O&%gyX!fyq6H1Olp^w4bUsYx-8Zvnl6BLG#OUcbk@QNi8@Ld8nFFbrJ-x zWn8e=wbY%={@o~oZ9_H&P|j7*a|}hH12{t|aK25KsR}r%2+wg{u#3t51E&9o`2PU! z!omQAT3*ST;8aY2vdfAbH|O!7CG*5aLi{IE1m&3z*t1j!94*(UEa7bj{YL2DjQdZ7 z{-_@9k`MY3__!VZX z8vU!*8mrfZQ~UnYMj~ov1yKFMn$Z96bKnbNnpYZVO(}4i?MJRr_RpV_#lAlL^3yW{ zZlAyrd%#q;7SferIZMDI9Oiib?BuJg$9_e?($|23i%n$)Xhu_S1~`9aDs*)iccmTl z4~6?|%S>&6{=HIt+U2^Mp+C-m{ykE69+1vUJ;^p=n#?>ZW_dH{ zFQ3O6-2km2P5Y{Mwn#!_3ZH_&Cr|vJi>Fm&|0lVCy6eDnb^oIRjr981x8o~?r#9#Q zS9GAYhcNPnQ-{eUDc@|_Ze1y`^7;JKhb@>f?2M}mQTfT}|9w2)Az~Iy^1Wg8nM#2nP(O1LY_KOkqfn zO5&%$*-|zGq*CjFZ#M;?;r*|{ZYcbS=bPI4F45(L9tsr#Rw*%P-3no#sgN3EdE6vW zYjga=>{C?C+80Un=>q-H*3S{pzjHZn8jT%&?W)9{3bM|MWG80EqH8=PE(m6~l~}bZ zy)C^)i_1tgM-#?`W^*%ch{(Lbr0*ZPw~zAt&om|W0ZmGvEo5;gGyiDM$Xwgb{KMu4 zJIl`+q{U~DeG!LOI1fdY-zbJ)EiXr|R&2c)U@0f< zi2mzeI?6i&n)=C+yNB(|#gYwoeuY4yR+x>CT12xnt^B$GwB7TElezrQf&LwohR=ci zs;r(uPJj1uUTqz-{jD7=4MQn2?X-(dE5mDq-RuYbYkVPSGL)24V(b?k zo!S`+^W6hu2k-R%6Gq3BfFu|O0W!}g7X@a+oM=ss8l-Ii;WjRnEz@cS*ui4gb@o-( zgfbt<)?O6mi8As>R0tH)1QX=5G>lI#ClL~er_)Qbg8r&!LLu4T_H&d5+S?Q3{YbH;38NyE4?|eCDQqpi;^9(^-6(P*!K7XBWe zrCUyaT}D&sS3Ci z)20jc^Em$KIyEa-2h990`F}QFtN{=bd-OJd zOPL+6Xa;nN28>=@br_!~6b?MBG9k^upRx=J(VK^|2AvG|IWQHW_WL@H)u$Hv*CzUR zfc~S@g$sQqfPv7zF>AjP`ZM@J2mNi44bhNp^YoXqeL8vib%2%T9e`#LF<5LM*wMep z8iaHQpm{;Y?0;nia|>{IjPJkt?2bL-*sGow=_Am=4Utg+;%C!!GNyuFfUk>_X|DKpOej0A7KzFI`gfITKa{Zt<5=@&ps*Loox ztCHRLN1L{Zy|xuqdrN=w$$sW@qyP8u(uaU{)!d^+v%$rbpph(q1QqABKbF#|N%yKcuWl@joQb1KEQP1BsDMpTS7lim4mDl~(gXbA|cL1IUa6Uh)0 zkSm7U;eNsA)EDm8!I9_j_pAHUsz@3%a2oWlrRf~u*DwA$EU76Q^g?d;MMLF=d2NaY zOlPP{TY?JvNBko9j7E0QGzSc{KTyqzjP7sV*j6b9^w^HaK>zbFMpK+z?b4^E!TuTl z7SAmeKwizy0~fmX83JZ1x)RmdW<LWbBy5Az0v3c#DtHKDIl|Ez_z>#(E!`L zsFP*PIPqI;fEFPzsBKNn(-lmG_)$%|yt|Ziu^d3O50Ezl^sGSJ0rgC^UhSLdU#%1QJ`F;?1&%_Nx8BI`NfWO}W{ri?6za;c$OMJub^}i(@wVG{O8q=D3fF^&BEGJyQOVr4U zv9IxeXt~ATUs@?By>67|HY#R|ZXWh^`49exbLi>qm$LnQ=}SFO>{Xm6X>NX*d^6X@ zC<7;xKC{i!L*9;~13+pj0S;@2u`!V&`JBV*1tAU)T;_CT!GSz*!3>a#JM(5h3C|ms za?N*x4JO1OxXzRB=Y+(qRL|}n_)MZ#>4D0Y0Q--{%Yc3b2(yB!)1dzVwtnc}AR79Q zb4zvQ=T*KnW~v7UXb*daifxo=t?8|T{;b04>bGetw&_nW+Rfjehw`Q#qGq2#?e>TP zv*+!ke;*Bau?$8xcPX5J>}3NZX7^~ zT!Kf=EoqvO<+_s&ci)^>Wd{~0zig3GDEdAY3X46%((1Pu$spbz?wdgN%lZ4wZ2f(U zk2RIY9iYFKpfmbIq7>Nd^*5ySutI(M?t4bX%SFT{)V@ai-Q-c8e&KfP5BmLsRFTm=^0fWwd-?8j zFduLzCITf3g6BkXzbmQy#xOlnV~xSO#067n2B;~FTadKf7oZZqhzpA`eg&-KhN5&@ zk3|b#W{YKT$Sk4HnK6Nv1pPVyt%Rh{2K^h^`iH6upHI-Kc{>*9e*o4NuRjx@T{RAa zjhy^mco-!<*3-{Zp?~eJrS3z!@4pL|t9h`V3;I9cMyG)8-|s*H`7ry(3Xw0#!b#cy z8w#3TUW+&aOgT=WWGEn0%83RuAb^-qktICI#5gfjP)}D1wYNaSs8eFR+LMDMv!Nm; zkm1jR!2;+3^qKyYHbRhB`LhB?00pkKCdt!^?kPZh8q)pT1K`qPpSMwe8j6}TZ-k$7Y?1X%_E8P zZim6G;q(q+O!GK(DZP*PVL?Ty8sFrpnSam4xI+@h=iymwZ#b#QT8Z|waFB&OmsqCl z>l+CiH5Ipi>T33(({Kn_r?fVR&~kx1v{VmQ|2^oA_${D6al5DT{kN5K)~9LpaQLC& z{VLEu&n`lQbFXJS=%4)g_i@%d))Rrt9+QWb_ld+GnKjy(iHo3S;4t{@X&Tx0=*f~j-MV6{b_EYvdp)^6l^~q&7Esy97or= ze!_C<1I5mF$&b7C>9%5M`Z;RC(7Ml+Jwzq084c^WcoC zx$?oP{NOP`vX!NHH;xcaAMTn9JA3`Z-)QVH8y-0JCbMCnNb4gFe_834(3RAjZYmVh zWc9amWj7E%;eY|Mq(Ax4e>6Hn@}Ptl&cShgsN4Up-P`{6!A^r0vPdjtYG(nSN4`4L z;u*>QDD${{v>9kyQqO*U( z_~|+r2}pcqk+sEfqzZi*v!G8LAU&Aumkwm60X2SbPR{aA-@Q5GU(e$AHGKbPfB11q zORyG4(qx4}zSh1W4R`@VQ*zB+=I~(%KXfN}e>m)STc!X4z&gq4MqG ztS@l7W23zOhm)*1(bD;v?Eivqz9Rd-)8KI68>R%vLmW<3`S13pIawSKCIUr_{+WW{ zIFlnSyP!!2(p3fM-e}+Lss8ms0f`P)10$QDIo$|@x1#P^#A+>$lo>$tn7lCb??kYJ zN1f9*@4p|@A38oWG}}uvm>z7>q~;qNqBsL0^-k~Y#0zlImD6ZzrkV<{<=-F?Wbmdy8He+A>kHY|4|%;18YXn zetE4C#Mj`#DO)R#&AsHHx2w1dd(F{e1fcjVK@dP}u;c7O@zOIgU7NiA>PMzAwZB+I zVCcrk?0+f9K=m#A`x^3${QkdVVc%?~%&c^iBy^IK9{QvWP*V1#(^dwTVPzH^V>b^H z`xJZb1kdVAq3xo^U<35&K(yQiFZ?zRgM)4_c6i!PMIkb}^}nr0xo$HK7PC7Xg|z(a!<-OK#_110*4PX zNT{VMK)>LSHf15uOz>6FKg-4dRNi!0zjDR&t<)uOWiy~JJ5b&B+%eUsk3vlk=zp@x zuO@Ku{J#H@xQ1=!7~4#nFJuF(j;DtCAUY;b&9?7={vXttN+Uhy?a8_Dbv!~Y$pv)M zz^CR>4<70|zM5LEzi?`n*NU1I8vj|B{m)|mjSQMJkH(0FXYtfpM6`m_XA!j{UDTT| z2+qX;Hk?OM)3>!Mp!KU9b(XlRY}QWhC$|Nwm3@t7K)2a!Y`C&2;3>2Gt{MM7?jet09~y-I@vvo>YX}22jVJNC z{~pf&cZj29757TM$hh+7LKSZbzNZ5S3LC%~s{-;`0i%F8m_hv+@A&H(24*L}%?#+y z4%EFW;LCvi+*wr_|N7ekeV*kReE*}rUgJS<34)gcM-Pt!xIQYg&As7)$J4gCpGEF} z@&~7mIt8|2%0>X<>@o>4u-%f&hHT zebtTgAw7Y?r%)BF#7R%|c2vKQ#~rMgu2g`6j8^X!1ekM{gnWNP9Khv50rgb@#&nSy zn`@*=@DQg>>(-bZxB>zvQ2tgj>%D$J7FkjpuVJ^c!Q*<1*~=14<-{Eg-o zs$LL#nCD*u@kiZO?DeDgf6!_9oX_rWZ}S}}cpoZ&-muS9z&2Pc*x*0s1c(LG{VDsBfMFXVsjgf&wOdzQSFwmJ# zoLBgv?r=NDIaxnATGAkymH)}I|7jQn_FA5~%pZuPk2#2*Py&{6_p9OnQsTb3Dqu^) zqy~km(Y*yscl&Mxesm1dsjooqCz{Ll5So6RtY*NYpnswpU7&wkYSUAs{hSWFEAOHl z=dMrKSOS5jEd^~oWRHTIDsTn6JkleMN>GY3C%ta|qtoKWlPq-`M0>{y-p4_dovkxU zkB1;pai-wT=wROD)3ovcnuhlU zOIDxW3^*V34-~+vgZ{?n>c#e>M9k>Xb2QsP?UKFqyqNwHX#5%thDN$fo7ywDTctxcjeSvJ+wD$@cM5* zi;4awMPBdkXJr3}J?9Z4^SsSRm-io_>seIzvcv&m$R30Bj2S=y>ghuPrcV)vnFIqp z>xN(iyWFb1EsPt7^FQY=2>nMqS6?FSR`lNum5#d$d&E?z$Nm^w-P;Q{u~Q?@TPIZK zu0h?&r$+!_>C%w=voGpnf5#AB|KJ0sjb`)lf1Q(86gfu|Hb4|&g^;@+)A&Hh<}ZW- zYKPi@^Ls}L1_4v?3(Nk^Yx4UIh`mbOZQ}^iDtf`yC?-BX=ofw-;`OhSAh3GVVSDOx zeE*s{=KACx)wwFfTzXP=n$sL&15~#9Q0SjcMjs6<_&A|4)2)k=y;`k+RD>aHFQo>c zClY9noB+fiVU%pd>)c2O6C>OBWYdeVDog z2^%1G*xLw#GNFJ#NxQ2IqRJ#Ng6vZ>?}t?y6q>9v%%p@d;~MBYdanrm2RYBsFXO-S zvoyClumVA8%;3D?>8G&U-G%>}K2Mx8o!Qd<1I|R}Z7_3n-Cy3v`*`H0!5-(7a1kO2xrtonK{}OQl1r=xyc{L{-to)f~LEGAKsbT)f{IOH^KdVMbHEPvzr4(^| zg)Nby0gZ|QT#4O3hUQ7qMkpEmt2lzhFDP8CUPBo_qv)3D3bH$y2hq^uOvzw3&S&40 z2>d%h|0+)_x<(i}r2VL0mL?s4Ec+0A*96AB_o{xflgKJN2_m1B_S}8_Bw|rK-4FgEl-6CX?|B33LqN+KjW38DFe`Q0S$dSRR8bEvxoUV*O27bJqI&A z(J}w%-T(cv|F!gD)DLU*G%#v_#Q}u5n8s5V2S}C$KhO*i!Czf@sN%!M6O92)uc*JE zuVeFI0Q#SK=4gQ}ecI2sa|R^;bc;e%md~Qo+w7PQ^h7z^gQ0B#ckOC%CWH<98CNEh--8m<|AU#1{n zk}9+#)JtTCcQpx~%@}ZboZnpApf3&{!4Wjh40svP{{&wD!jE;;2#>OLs@^gB`4Z( z4EC9?)ZC(A26CL)~W#2 zn4B05crnml=k;&tNpr@3=d>SvUF#|3rgmhnZ-ljEuJx@MGPgVP?4;bb=-K3nCJ3L% z++p}#>-$Yf&j#k@?oxkD3=M;8LcXAT^?*_kAe)^3f|)2ZPCms2Eu%nv(Zm4epZe^7 zZ#Jp_`iz!BCJ|^C0!xCVoDJaQP=Exv1YZ9Rg#krK)G2_4&6ug0UiE1I^u!@me4rsy z|5Wy&x)R}6f&NujnaZG*ZoG$O-*g(!UcUc=+rH1k_iV7J4`62*dSbdwb#gB1o9FPA z+jSQ*pnqc(dY|4_aaO(E^Y7zp90koUMGycfvArV=XeJII;c}UBNU92OGJR>LFrdi{ zkUr$S;sc$G0fS+Hlqov0Xhv1y%<{FSXaIH1^)drq67)a6*T1fx<4S%{Qf}(eZFG2# zmhtJH&pbF3(AZMzGq6YVj~`a^6HsI0R^2tD*ULgl4G(Elx1c~e;m^>^m-79y?iq5P z(G$G>hkMmA|78A{9}`vfzhPLhpO!|Ia;une8fFuHD zS{B3%o_fUx1{eb+Anpx4&fB%R-AZlRGB&&4`qSo z66h*n_GrisO@r=9%>W%L!dVNYzI}{(cI%33>_{aE!7~{2@8f-(dlX^<86y5;M*S?o zBPMY<%iYPO?<+Hcv}Qn7an=Uq1;6q$8w29=A{y#b?oI^;7rpz9(E#es7tDY!5Bdis z{1kqyBF(gc08?TBI=zMGf*K=i0QdB5(m3=y`IVeHDSA!;o;=$QjZssE3HJ#dLYtIdnG46HV(JFuo(u<1;2{;MHyh-C$yLM^IHTfTwvEgWl|0E%<%3 zfTZl-XAx3U#Il+=K*p|cMvfq-p$XCf&|by>84fsL~L3Zcy%-+Ch8w)iEt^q+MaRB`YL~V9eX?P}`ua13rARBy-r#K4k zK5h(X(2`)l^(Sx{-G7VX*Xj8G}Y8IXuH#dwcHR zN7c+{$ze+SUkXjFO29c#E?u8FJ0Ax?$p*-z0|}Q|eZx(bKwnQY(r$=z_KgFjX(yF~ zz`#%rP2v?iG#bzX`q46E%^#+wLb@}({&l?_YMh|6;U}Ejl(Bbj3|^yb(lJ- zwsX}0PHLz3-4(Cx>F{Zi2#D&eG|{ae{i#q1(BKr?FXb6;-gI_5bA1ao(9|VrnSU~( zzj=xtG1?&gzk1l&_L5B5J61bEZfDM2EEEKn(|gdQ>Sav_s)2^IU+XdtEd8PKJBhL} zFl2Y}O#+_D(|@AVB;Tt>=+Ej7wL|}w>reOk+o*o}$sqSt@aV?w6l6_ZAC+1@A1CIEz_) zAg2Sha?U8+{sv=UT=scj3}Cn8&j8BkWBpf01Jb$&o#H>e%2HvyqQPI@{%P#y^|$)V z2Sa}&kt_37S5M#nAc%riq+az9<5JxVnzUzk=XB$!{-J4g|Ff>oY~xJR-bIK2BpKUS zsDjylqEuzX;V_+#o0IL-KJB%FdNx7>>wi8=g2Tp1P4d&F#3MWW< zDdPZ!^52YDST-FfqZ(Fk36zY1hs6XU#{vcvx#~@VCNp5X72QX-7%C#8M$q=E(7!rr z0oNTrba$_JJS|H#h;dI^v~U`3Iurx4uT=7@98GiB76D-00OQfG1x2Sr^CU;Ke%_w@ z_t6=`cWeYXysF3Qv%V8j93Tk_r8q#QB*2sov|nvW;a7Q!pE)KVLCH=+W_mL~Ws7Ib zHeE-p(SWA6tZ?SP7U=H`{ac>J2>mOGJ~8--dg48pc?DRXvmUe`>k4r61LC(Zw>uh zMq>>0@96&<@$8*7O)DRkJ!VW9I}ge?ItiOU0S+EnB*O8g>@yDO%k=7fypPVPUd*3Q zRs+vP9IvqfB%NTXEZEErl&2+)aeJ*XKCFH`g+N!(k6xqN{+a8P>hq+~zwXSclH%SFLQ8nlVCv8y@K8D56fnKX-<%cweI72L zCpy?PKf2r>BOeasUz0%q;-y}7Qwl$|XK=u5t5z=_#QGoo%N+S(uLXCO4WK@APDnU0 zXIo_A01}mHCLPELg25TM1_jVe7z5M}P=zI6a7L%v8JNv4L6rRDBn8yv5s>+YO0~5<(dIesIA+Q{*2BxfH4%1Hv?$eG2l${cjW}3E-?X?cd+(a{&ba7;a+Xv^~7j^ z3(VKj!=N1;^-k|$8|Z&|uYX;iE6`>IbJ19@A#GOJ0P%sYI7&{nM&Chun*q-SYqW$s znx+JLe){C487`nwB>?frsZ&j^&9)QSY0C8U_sf6n?f%!&51AQ)CyZpLp~9;KgQjq|1h<0tB=L~81zu+vzDvZ5sYR$ zo^XE1$yq zqsx8I879Q`n0H(h;+1^xmA7MhSJ@lRZ~-aCfo$@*@;v^2)kQ;?f6|xP zn16~tQTYxYWF0AV!Di(pRu=y}XS}v5Ky3!-)N>2&jSi)#u51j@89PU1IHWq3@5BFoKW~r*%JlgZiA5x?%V5xfzw?sM2FCh&@x{U?F` zcIc1(BVc-7jCsZ}<<6-(-QiI9l)?bUtVG$ztFVT?G&xXr>yQJZJ*B(w_DO}kZy7G2 zB=MCvDd>3~O?Da2d*j(3IJo_;hAfRgw)p-v?*9he-^^v~HeU61g!S+9jk~j$`CWwF zCHl@{RY1nGtBD4vhPO6B2;(KIQXhTRxW`8u1IA}jw8Odzf%cBHTjS?v_P-4DcMbG5 zIPrOh36@!VlgL>(hwAhM_*_o1KT*v2nT`i!_77!)(oDYww@Y6x+ejwoR5hFT@x=}_ zCnfOop3R1P!%(oB2TXm;0A(3*c5A@-F@ai@VjEapZgP>- zBz&L9*uNX3eEF_v+Yl<4O5m>3sjff3!3Iu!aP}Rkk&;K$Q$?s$Ad*J!) z%gp`kBB7hQ!>oL4^H0U9fbM31kZrGm%TY{VoF!0>3BVv2Xz^vi+BhIn4@C==JACEeq1ynU9ys+hQP+R zeipE2gC82L>@=jbSr|ytLAAE-}F6%J^F5xrsp{y;x9hfh0D?hg99Jl*4=|AXO$ zK}c&DXQSod=uxEXyDe>kXd5tHe@4BomiyV;sH0b^uKl)Di%&7rfS0MJ#5MsvpgriT6fbTc3m5Xe~qB``|e zuj2zOuNE*5Pp6oGWD>lg{~P+p>$k5pU>_MiiRTdAQFi{(wRd25 zQwXPC)@L{|;w}y07PKu%?XQ|xC?2$0nt)!>lleZr+<{u9Fyl2_jqY5H@1W8M?r#Pp zECH+LE~+enmO24#kpNXs(Jc83{Vf&ko8t`f;8$=QL22I)f+?rK{mM_+(}Vu60sYb8 zRcX+G%5uW^xsh6D!=esN-gMT?))sH^Ln8pH2CR2!c%s~;3L>DJesnSTpsxgQS!IB_ zk189lPhP>ACD{LTJAZ#w%NeIRi^{=WeE+q~KjE+JH$E1;kCF={lM6JLFD_->;Ur#u(6B0vb=bsZIcXS6Q>5#zhADRtxl!=zUZR&jbBiJdwXO^snMOA17W` zH%c&Ku`?W<$bST%Bga|Q3ptet598+<-T=w zKO9ikT2Vx!B^t0p85a8Bd~>CTC7|rv?VoDny*4$dyqmGPW}t9sU!gH|OhEN0aUhu0 zgE1cNe{Im;<>}BcCNBj2&6lwCWw&fNDi8C6`e(D1vL*q82mqeA&o%eKsIxmiP@W4Y ztOPJJ0@)(Z?D>)nzl>w+H(tO2kDUiiH2VH)Xn)$6f9gs!sz(yFC|$e|z79YhBcnGKt=-49lFqLW{| zck259lR&;DyK>iHz;F$Eb=-Dr4Gj@R(=8tdP`%!^>0Ul@bT+^GVs>Ba_P9rd@4rs* zx18V4?vLDKgi&JZR~w&m_z^7)%AUwR$PBQi2I*r06-C2!+(D|;Am$CNF2;cVjdbu~ zj9?H_yf5~8fU`XP)d05zXtaRcXZH8ImV}@EKUhhj-ZBDc7_`HPvG&pj9vrz^PBz2h zCqlb+-&%J#A`pAXSxvLBIp!o!oX*&O&hE@F_ny+NvM|>r}f~vdh{&XWs2~I^x zPr!X~(%d-nj+@~b?^`*8}0;KmYuMks} zlu1o4ky+IQPt}P}R%FwwPJop^Q+vAlq=pB2M3PVRemlV0Q?mTcx9U+Fh_goKjn}#v z6M8>x;^)vIZ|K!A4q&SUFvbD)TZw?bl(nw+VMo8Iyz+kRR8iu9Y+xzJxUY%5_>Ne4 z>+`+8$o3@B=SaRzzpmLb&lNw6$hPm?zR(2HcA8i0I% z^w9vJz@)c#Upjp(oe&3Y8~xj7<~=&ayDqe-_Wch{{jb*{R!!dHs`3^WzG zw%PL;-gE=+Ve5;B&qCwp-0>yj4DaI{ljeQAkN5FDe%Iq%0|2cAlpK7EGg>`z9Cc|{ z&x2%zJ|{&34mYE+HL+9bz`;pb@4{ujh1b91Q@;ZCJHyy$8;2}igCXx%_u zz2i}L<606^Tv_;`O`kFH%3W(}`ISBCSgAN!-(NRJfN zrM;c7r-n;SR2@$|FP3RPtPdZq9KH_?U$<_rBkv7nS*km|I~$~fN7gU-(mB(r?5SBZ z-v>!`0wBUC01+B8b7qe!O3nJ+L~RpP+Jb5a#|mLJR#xPC%IS9QZYt2xhoy6joL~%c zzF`h%ZfP5i$AfSWKi&3T1B`nA%}kz3y+xi@y*QD3V#x zG@e=_cNZxO;LgfEUjt+lOq8rvjuZ1L8N4+G?|2oz`Fq}74?3i2c}`)y^*$k%%$}$4 z44^9suj!9vbIENVzJ||OUpBvLHS>QKx(JX)V%nOqT0`cU3)oi6w{sr=ic$ht0L@xx zI+a+s$HQfq9W%z}Utf^@xDcct;>mj#ZS5yw{xw_AG_D-%I&he`IQVpRiAS;C1wha( z*|$dxLJw;wVsC^+%UwsYHt!7sQVpa9P5O33J@Z>r zt1n$V{;mT)t~2%t*SeBBH{jeGZ&MRk380>#B8_fGJz*~yBEa2=%8J@aKBEz%5}57B z9qmz7WVQBMNs%ID-$yNIUOSwlvkkHFmqcj%Hq3RcAea`ythiQW&pD0_Tp)w&;ID5} zFIfkB(r$BJ-{pMg$?2B(ztpko4~fk@9j8zze`faFoQeS6aNgJ&VR|cGqt=b02-X2l z+iH$2MQ6aKFNUsB@rQ*|@sJS&mX?%)q|a4u_82OErnO zmx6$9ES_^3WCw%D>~Y+3>bB+$a35Dz?P+%x`9Hy{pCvAdC4Q$3taOEOwIz6~J1)Xb z1X2baQ?o6TM0h_LDipj*UlJ99D7Mmy#=k(kZL;>3`!IF?*U@1!B&8V}?ckb%eMgVI zPYh<4&47e!((sHJgNl-V$qqF-%$~?-DI-0ue1R1*m=0&Z`NNOy<-~1=4_&7sVKLl0 z?QXDN>*eb}Tspi>!B{UU9L|BaNhBhCpvkmyQ~c;tblwuY)qe5QrhElduLwK9aMZoe zP`hR%N}Y-{$b?tqz54Tq)4<;SB>c1j*=wb44pKgBocCxu?3*t~Zw4YzjS*$lr9|UinXyyWNBPQz z_x3#)NNU*gaKUMQ|j!zS0>i z!sD}VM@*4zo zs-GkUJ?F&2^b0-I^f?Jre3XWreA>OJ+1W!iV2s3x&pjxS8U7L5o~KRL_JHo_Pg!V) zPCxSHDHbxOT>3O?t?x1VQ~SxiMa_N1Zc_2_%fZ7mff?ODnsx!Mxc-fWa#`KeYTs!Z z-YHPA9JS+`X7!#2peiK~{@drq7r~1!dKwFSu5FH86Xbuco7|1JA0pLUn3%|dosX>! zc5A^~oX!cI?~_{cOHC8b(9|ro+FkI+6aIme@R@<$UDOnjbL>>A@WW4|Wo9VY3h=+w zZNsNunssuV4sf1Joo2IO#h(7TGK<>{^PAmy*C!0}Wq&Ys#VPx&x7O_qmMkO6=P2;B zre6SHE`oYQk(#IF3f*t;5sALB+McDdZ%K&rYt_4m^YcdjZ*N0YgB$*Y=#4bb;*y23 z!tmpP2KEui>a-4TkXDjtmoiza>Ekl3AheT+T)~5xcdsPe&d|>O4D~_80@0`E&}T-( zWcsGmS*;0Qzw7M)-jg#I;`}C3a)l`-hP@$7bA=UgP$Hd&aKkmDz$4dflHr|W6l6hc z+rC;&i5403njfwqpHb;N7@iL1Q*AN8{c*Oy&bx^|!#UL}GI|J79;ncYSeyT8&#G5- zWL}%z|JIBS3RX%SP7K#9JIK!$gn84Ra(nwmaJtmLZqC{iPM~2>)A_=Ge6j$kHEZ^6YVz z_Ff4y8z@%s9{Sk5<6q7-&Q~`w3WG~*TSw}fm!!8-oLIZ>wV+K~tspd-KCu(GQRa-i z*8b5B6V$orwJA~CGlq^bhK77sh5ooU*q(~%law+Yx$Y?7+IeB?w$rzO8v%wKST z!X-6|%0Z9mDu1E*>2))SlrB^91?=)Y4o`1H3>@pbCk>LO z!+ImPd`V9A)@(`+iA*|7_Li{ez?11Bd(f~_IiBEnJnMqOZPn0%0zxDlbN*4FbM4vx zaG`Pj@1ZgXFl5Z;@$>z6AHWY5wzj@M+5(!QRHZCcie(fzkL6rfT6D0KN%9%TdRK8h z`-)kpJda!hg{GxrTS#YgEV=#;T#O$!h%29VY?02?{mgBc{+`R+2o;W6*X-VBq-N*# zhg!hTgy`2c?-QMs0gqcI#=rCEs_i4Em(eVVSkspU`Lmv$vsfp`?@CAWdjOrHbLYI0 z$8HpM{Q?Ts;rYws*iWPRp z*m40tN=MYRu-TuFIP{&h;^PySgJHMCzmNQi*b$W!vmIi~2^jyj9=gB(;=-!3!=)OC zdfLQ|7Ym*V+SzMG$}n<%PX$Vu!b|so>n~Gr)IsQQTdKPIyDsA@1xIIkoIOp)moQ?A zR(WtfvuktukHwYyEw6XS=^m)47b6I9!jixmvm6F&=mS)J1u2-*5|$&OWtDqwKDdp! zkQpD|Yv~!AJ`XX8&kQ>1$g+O~p$1WE6THaEIe59!%{21&Jk;)W(3W|J4Vrw!d5-@0ULPQf?6ZN zB+CuUg>25Qo(&<*Lo-D}|D_Kz?onJDtl@9_cLArq9?3YaEGq&5n7*goWwdV#qa00q zbodiHUw|F`RGzpNV7~3?<0BEPk*>#8Cph9G70|jiXkI@w`>K`_p|{TfK+Mw@jL z&$4~olIkKo>{i?*uLqnOz&@oSSK`lm0VPe&lYVL{?k{N;3#5I=Sw53d#XiG2Eqh?* zeN!ulYH(vjcT3IE*g~m0*&jc{G7i?6vY3y0hFN#!eagh0d0rKJ%@ZH`TYj;wD0?{UBTEX{8O0>uRGa8Gj)bi;I)t@8_c;a4D z9B?S_1^tzq60{@>pFO%-Y{i~-#&x0=-?)Lm^+oun&nn^;@KYgqBSy^&o!*$L9ie#D zdAIBjOmxyxug-g^3cYVNs%ps*dCI5Sb%4@&K&WHyQ z2dnMo_t-^0<8F_|W}l|TPp;LU$f`QW#7gz>m~Er(B@r-6%KDiT-Hekh3cX*}Us6Sc zsl1+_90sDx&cF96xJ%YM{*cklWW{#c{*HKWFlIp@XkVGJAa{Le=Wtlgq{9tHQc4Ozq+ zdeXV$qc9YFrG7EobJ3^H7b|V}mtrebze2PpngqL`Dda1PbCP2}D#vk^zelV!teuzJ zp<;MJyJLpuiwAdqM!(=kB7eItNi5Y#xCyIUu5-=EC0|K@?cEjN1FXM-^`HfDx?HYb zLRy*bCT!3|VzdvI9pPAaR`(-+nXAq}^Q-fK?YmI)4@M8tq|5^2J}Hd13A8#e>AsF? zeHNT7c9Jns0R2=y`_z6k=jSa|RZR~*{270G`P-Kl5p#GR(>Dht9ak%;_D7ECnjm0_ zeWD>YjID%1e~)e(d0fl@>*zc}_VI;@2}3jDWg*H>j>Iw-c^IEtmJBC*mi56Zm&sg>Nn-8WM~ z5mQ~1v&%$)Jwqb9tD=dHfmh3{3jq}LJ=GqRfJLQ^@#2s-bQL@3#Jns$nsq?iIf4ZkCjZ+`2c4>J%-mBVp&m4#P6*H?G6nW|@-An&>zmIv!FaTm7fazV?Met-@VP|bVyQz5$AvmS1 z#%yEWT}!-zVx>#HHv=IypJtaMF%dc{8zPiKb@ru-5*fwl3mQTKnF3KRC(`gwRW`v2nHBd$cUEzyb0YjuO5fFQHVja#-pFA2i{(T5@ZpDE z|0r8<)&PKEjiS&yi7i0&O(R1i;hTz&Rk_VRqTL?y1JwRxDYMKgl%FUPmmjQyT{U3j zI#p#yuC|KVb_AT&3s)dx8AAoAp0C2^J|&uIS>80V*7u;9_$`)akyX0!{)xtkoHLsh zdx!J)0C@6__O{^5Av_7TaF#g)yMyL~y_A4$#&p6G}oDI^!w zcn8RmhW&b?DNN81{?NlQmrKeVJ?bg4t(T|Mj_&^_el z5mlODQ}Kxfqq>WqEbzS9A7=SYrgR1ATT@R$`j8dM(+Z5q!i;1A7-nQWVGnIc-@RI zcgvI-G#~K9g#CG3ATD%0e=+xt&|TG!Jy2(98#lweFTY9@*p)#{_>ze>^ZMoR5A4F&NwLdG4^#gyt(D z9HO9~YU&-X$IWQ=V=jf>e=y1q;;#jJ18w;}hzK+l>ZkUn0k|T%wYNPce~d^h)9(bj zc;B(K;NJ*xip<_ov@LV)$9?k6|vp~s6$&j>+cGIQ0~Ge%AQ}-UF^O3;ikHI{fc9wKpvu9LAjUNq1)@_Wh$WveXOX*z9qv^*Hn)abIlY9dY~$F|EHUv5BP+ z+THvG8NzRtVAbc`?;3eqJnzTgoAtLZ+f4p#ZVEXA1yIJ^tKIz7FOQf@n%E>A+Y7Oq zXYR~v-yl6z3$mP2z%*Ilo@_}uot`CG4Z|s=T5(fbZSH?Xz;0(vZZyUWGIrc?t$5LO zB$#zPt&RslSX$c=*nf3a^-ApWSr3@;#--)GdWzo}s$cg6_G#lb`;uOW_WezyZ=WFa zx^&xJb!0uH+5da@zFp>KcNPMV|{anP><`fABbdcBLAdLxSIt$tOXDF@V>;E z-phwPJQFa&_bmhZp`F(eKCt)=|M^2XA!~fM_ZNlcZ^y!@k^S~N>?HZvKpB@pEYaAC z2Re9HnPO)2nayX~x${;3LY&ztpp%Bs{u*Wk9aHx(=je@=f6YS0L}MkqD|B`m=n;kS zCnx6Io(*~E(SARrZ_1>CdQ#);{WK=01~cKwZE2UjBr}0~vs_A4@`LDFCp0A`EQdoB zOjh$~87DR~!`Bz)PH=pOrF+$1P;$~0P5jqk^kTy!KjmD;1OA>PHg}*YS8X$|wxV;+ z&c=#7${$ESq~)`HGxE(Yo#&@fS2n6R?V;AL-2ykcr2Or9CK#$HbG|HNz13$y@jHxl zfOu#DB3M_-pOXidx_IGgHVI*@sJZFvCx#d6z|{Mj>E8xV3D*wYU+P|(ArY8adk=gj?1L9Tzdt}QYGLV>fwjx+hTlZ@Bed6L1 zekLkQ=F?=HzFh!P8cgO# z1YZ+aabPHm%`Z9ZbZoZe`l$bQot>+6Q=H88zk8=j?oS|@7McFu(j}b zNi_If7h4-e$57#ZgruGG=u~pt3H?i)R#lu_+c_aZ{ZNBtVkvlM?1{Dynw!dM zvw7#``M)y#Q{dc!^Q%{!d!vl2ce=~>qqC76>{Sxdb80u7?gKOaomG z#K&al*{(eTh?iATzRphJ;?M1~QqtA{9oOG_kZ!gMyrc79NY~=+vemF3cW1546C620 zz>motZ7+@vGZZUhWY#W1bct^l4Bm16=+k;+LaA>CdJzuXPHempw!;*O_^62m{KMhH zE8GDUbXIeN%beQWp@qQLU*xLT4~`$_)Ue|qir+0)2<_{b^z*mKYZq%ixE=w=&rS1( z>w0hA2z&t6Z%~%5Gw4`~F2ubL;vivxg`r*s20F zzLvO9t+c*hgBc8q7fti^)AGKR1d*F+;4NG|F%coP4E>|k>=$N<&iv!+^yx?Mk43{J z9&&#W^GTco zXAVdF4ZO|rwDb-N@Bbq{uFWLqNB7~rU2nQxkUV>gor-zh6pW}^a?j^^qxkZytd6U< z@X`lBV*S6TlO8q zdoDBa133fO?1ugJ6v+wJbY+f!$BX&r-c>O3?$k_+bFJ)16*nTWeD;H4&tX}a`s;5Z zpwKx<8~I>n*V6Fk%-~(}(&eTJX1i~C zy$Dy~-jThZt=zXP*zlWT1HF$3w)BJ-SEYXxX2~yAdk})*< zq$KzB(OA(v#Y5?R;i)+?&$BPF3O8wt6Rh%p#jxYAoLDl2$f7ZW>|^#GBd%sj>s-NL z-6Ke|FRYk@#P{f~tK<;c35{~@@{4%JN(GcK3xj#R4aa$kSiqwOW2@kOjs<7kFS|9f zKGB{XJIv4M$EY(+!_MySxdJLbauRytaeQz*=1<0}FB}`-Z4|D#OP<9SggV^Lr?f+| zZ?{+j3QxZ$!h$9Ze;Plb^v^dQkL_E`C40$+@(E`;&J|7$B|^|-y@F*~KZQ7e6w!Y^ zAD^nETo!vlswy7B>;&*HuolYaaEOQ3Ug`IPsH*^nGOAFNEYDO zym=RwZ~>n;T)e}eu$tWhsGwL%v9GdE&Gn*Gk8UyI^=(P};9k{0+o5SoHSbG6>Xr4+ zqKX<|iOYGzE?`GT-De2hBGZNGs8HEOJZ0T}0>6?Nb=Ev4~%{NQ$tvh@cktQ_Ui@g_#ew#9t4Xi;ArvBonmYnKOerDZ!W?EiC zxyNd+-rg7lPGr)zY1*RhJw{|aHHO{24>SfC1IeX(fB)Oj;iPWFGj%t=LS#>lw(s|r zfZsZZsiyf@1v(N%>a}M!H-h<5!nqhr1K!pGoRY0%5sCaK(Q59C2k`5EEZ={A%sbh< zXi3OviSIzSe%>Py8aQQd7MSLq>gxkwC=s1?Axg(67rtOYU>Rm1VII0IBk zno26tUtp!oYQM{r1w%Ot#p~<>pHW;L9JkQ#K)#9CBR7Lfi`eno007xb|5 z_Yj7{xD;9}$aYGZ!L{q!DszFmO?TpFcLT0ne?Oo?OW_sQ-74Bb*O?tzmp7kulzc-k zB4iNX+7QltUH->W_q&pdA}0=;c|C&S@68%K+!uR^BYM7I>{wpod&lT zf7~oB{jLSkW!H4ULAnC?PxPY7j(fWA`bC(-Nhm5txrsvc)sU> z%&m1W5F%4}C#wb=uO1zu2cJ8=Bd4s3+6nf5WafmVawkXV$>&VKTJ*0(VqF19r)p+e zQ4@mSnyPLbtqagkP3ry4`3*R+6)G3f5w<lhGY4b0XFsbE;8Oq445>zsY(N&V% z&_dVJ1LKd}>-$yWbE*rN;2d}^8hAQ`BwRZ!n`>VV+`^cBK3#~)LfeTij;*mMFw|L! z-6v^V;2aH7LKUMf%!aK~4U16%oEG6>X>d#S0jj@RbPy9pj-JSOAf+f3TzI_B6J&5gb&`L`7rmCJcF9T0*H1|oPG9pvUV zJU_*u1?tm^5`fu0ft2>#>^i8-{vk-*KpkHm^y}7r3eh+dkg()tsGQk=l~ocDlp2;0M5$zGASuk0;PPCVZYu-HZhL!Q_E0wjZPRUoX z5td!0-%&HL+~e`=JOKWyhD+2f@hkC#V-+Iw{KTg9ID4ci5tG$jYd=RWB&b(f^n@?C ztL+EDY=yI4Uw$bPFjT?m$5x_`U$XGXhAhd9bS35EHeryVF}VC5xUW4)h-RE3Cr0AJ z3gUK9&v(o&;&cJ!M{za&*Cwhz(lCm%QG19>3Ax zKS-E&tr2vaay>`o3Uf97*I~QABOr&`p2h8U-6r40Sm7g0D!Onsk3|NzQ2is8%FBOI z!g+i|%7B@f*W3Fb;z8J$56z|W1hp<4j$c1R;W0$@g^5=G2_Q4#cQ$MKuX( zZUq;vM?&8eto=LnedhMouIshk#UP6V#Entq>$rC6&V9MR^C2pPO-*JY2kvL4&W^Co zIIsXd?{W!Q(gZ!b=O)J20y_=)I}NBTfwlR-ZhzD59r_j69Z97%Lq9TKh9qJ)EwFvb z{Y{Rwd83HAB?PS^io5MuL4e*2K`nvQr%kfsfQEQ27S`>vk4vxSa}PmNd~_*HPlTmDVI zEt_nsV7hzwO|A0f*n+n+GA!>08ewKfnlM}nd$2qL%Z@KXfK+vZzv>` zFlJ8Z`I=2!5opPAc<~83v~J2^$>%cMI4qxU5YW(}_n4(+tR<%H$!Hcd;n)DAu7UR% z@$s?5UL`dpifk=7D|60G+3DvyL&7$We|%0Fm>@$Sdn7$%YbDo2QJ=6p@1_#kR@y!K z3oUK50opnlwBGmHtr|BZKdd!B&f?oes9Q!(Zen?F`HJ3$x! zHCD@&S;^s8EDFB{V>FZ4A9Mp1Sgw{9>6tV7LZLrIBc{)o!6Zbfp|xuC=uEziNiIVF zv!|nRcT2jal!AWRz41~IsQ~WPV-5JCshIu0g0}4yrIh})Nebl6UcegsP88U;DfU_Z zsB~!3ccO&X`*%7nBdrd&m295-1!_IH-gRZzAQur-3ljQBuPHzc3nO`3-{Ky3ilTV) z>gu|J;_BM-V=?Mw>K2_&6 z-~pMknbciwL?{S=>Xi%OXt&=buQ6AE{xYt`i9dF?aC@vPa*$UU3ac%h5jYJG8 zuNx`gcx~}!Hoo+or71p{>p;pi=94Dz(@?I~{oOr&5EsXxZy}y$m@}u_0~3&wI^Ogw z@iiMOtco+{C*a`fd*5C5qMaVCdkR>p1S}8>JhNr|3HWdr+pio3QP^GdD-Y8l$3>{c zJ7*t#Y+#M2S?T<8YteLMV9!}H`fz*=)1ZiSYLLA(wcFMPWdq5+v;>qR31ZjBmcVt{+^i78(YWEFyj<8ZHwp5nMgV++oHPb{eL zYqaq1FH3gcAl2zLlml!SRML}^CaSIV8#!^QL-r!u_Vi1^=bSPj`|^?`_|kYlR44 zc}&{z_!92AsW0?v16@j(2VHfedz8pPX59%s{JrzfXGQtxkQ9`jwKf~=_$O8uR~z`? z)Tgfpr>XQ$&sQdt|MMQqU_oi5lw~zJFGae)N4k#w;U%G~7XC)ley0E#C7`)Ht&6^oR zBb<@NMRh+|1)K?5wFvZWFX$=pig0`u6u+147fycc5|9bGilJ4+7_?B2Rrm|AZM%qI zvn*EBJ0W3ub!_LQ83~~6A1ay;AUAiqS#d7RV;0UY)qPo}k`U)0Bf1E~J1gK!ct-9;K=g z3b{9?e@kc|RI<73;N7v`^~U@+ejFyO@F3wd#&Gq0((h037B03jWhspxo|vs*<`X={ zJ@Er>&p9W2k3ZR=eZ5h`h%=3`zkd6)TnHHbO(%g#6pi!9G_JY^A#Vxr<8#zg17KYl zF5&6=YgVvyf|<(glSdrAMd$u^2OlG&SmXS5G)*l`BkpeS6{7?_+DrYwh`?k$`XXDT z0upUgm$Yp}dE~a`LG>2^Y0;)%pq#E=)bGDf@*3;@y!jkW=}f>>0Fq>d<}`x#a}$g4 z>((E^v1+-ee};I=89{s3qt58?+~AK5Eq(FNYtA&=W4JTVv?p+sV{-0Ba}*NoIFV%) z;@@-H9u`gJDaY;OMwm&!QR z!?Cv($2|5;8eRRJAjJ-202&Dnc{~gEb<(97Eg8G5dx&7SoWB)`&pq|u1>`V>mo!Mf zPMpW|Ucv-eciE$bHu)mdUt>8HF>Pm8@cX;i4rw=Sv+tJU%&u8>2irdp_6tHtYsm?ZFiQL&!4 zCGG++Z_`VtMJ)+-zW=U90WVC+{(+PT{H-6V&oS~!vc`YzslQ)gqQ+87=)9!#sWuvi znnXQJf!>f!T{0__agT8YHmm|_f$mw`uH8PZOm8nE7i|~s9#gnp=hGM+N-|Oz1(H@x zWg8yiyi0e$2ukngu@mE0)bNtTUk^PPYsgEWJh^W?dECXRW*fycZYl#7PY>~fx9eeM zf#MET<)9j&t$#<`w1|w)T%G%AGuTnR2N+S8Z9^LeFE(GAh5feliKAsEA`DkG^pSRU0oS0|Y;oH2YbXFFDach^ z3X3Ek&!KYJ4UOeXM7rjz_Gu~RqVn#tDd}rpV2UK{J3bJ#L7zv{7XVK#7$DBY|teTILJ55wpLREfEK|;fOBt&d)6W zi?(XKwZuJL5@dB?B7OqPShN592HTxseK_v%2NeE?zvWY|;T$uHFYMJmY}Mp_VWvho zQv}i>*l!h|5xmP$+!UD5dDq}|4I|+~)I>_#Q7bSQ9Po{(=uZ$-!z^a?*{!34`$HJAOlslw! zA1aql#MbX?U~b8m4+D?Yk*$nGIwZf^Augj1gH>=-74zL(zF7$yw|&vV&JUGl%K6U1 zLe2(55ws%5JbyC3fTr2xip9GxGy#hwRU?0@@wB$RvGLmYXfct^QE}wNZ%^LIW6i>UAW$>+VOGK5;H6N(FCZ5a!XtuWb0LzX&imi~!ER$; zIoVL$MpXiHVvkI9wkg6qH1-lLl8NuenN-{vzH7Ffs(d8n`6#h%c-*ROwlkkr1Ki=j zeX8ovj6FG~cNc$7kdZ=F@#yxXG!~T;^q>@)Vl9=jtxhH+BCPX{V^;) z;`@V~2fucfB^z%oXsK`zWx$We>z9$=t$11mw&o}7s@p8C#N=UHgem)Sw%qYG;$WQq zr?h~#5q`As!uI5aJb1b0@9{;f|hwr9$*n;i+*@mKy~VVqy7RA7YAATusrRu zqxIsUGDAZqG};UMk~|wNUaZ{xIS$)+6afx zB}x#iv-f{~^nJM3?NE)Mw;j`30bS*Pe@w2AkrukMuiyBp@Poxib4y^RGY@tki}T8C z6#9G*2GoD2z4R7kGc^Q!`mw%j&-F?>?B7<7w)aFnoXerYezXWOKBhc5S(LE9MXldT zRO=!8NV?wi4c2JFe2=!nVtp&A7l%~}Td>_TD(CUd1LtYpyMp^|di=zF(Yt?WoSe}8 zgqoFGBnf3+YmHt{=Zq39VpcNR`b?WVS_=!NXU=U_{t$+Ted<`ASC&>|zjS$mcd=35 zqDr8dpbH^j7`?knPH2^mwAa?UXdVAifv#7qw;rFSH~UJ*L1DYk+})s@1&e(L;n8e1 zLmsnx<)qBB!!apE{*ruHJ)^C>+0zd#P|Pt<9_HZ)SkwgkI!y*a6Mn>CR<*xO+)^Jw zY#LC) zR6^P0%k>Ny-`H}e&ILCM!8GEp49qN`R<_mWMr?~uT`yYbw+UN?_*a~LV8j)&1>#_`gVucV|Mjjs zgy1dn=puqf@)l$wV_0?zw#aJ!IQcH2Wg5-AhmYg$sB-(D@3$p^kG)hTg&EgD4|>Kf zIeB(zH%WLVfeddSy#C-(LCT@xRM2~Jk*Jg_HvG0~lKodr=Q4JON;&M+I7^`3Vzjc* zgW()syQuLtYi%-@@&^khV(=`t#C?EzZ$D2r9e(w^AS;KobZennP4b_>1pNxYD=WW$ ztn*Oo)2IzW1NV2DZQ+=|Q&3h9FJZrV4}d;%UA&ErC1Q&Zb>|TBdNF)f*!1M3@Y6c3 z5l}-rHqDJ%zza()ZT(}AhS5RvLEbV=ATnnW+J^&P?R`3`63=$tO6eCi%XCBNIaCtK ztua$;%0xvt5SAP$Y4(9hf8btf#V9kWMzXeYK7PH)hA$@_b(*(Z9mvF#gsm8~p_-vX zplM1Ye16eNX-aF&>|hgs+rHFza0i1|p})JR%pZkv7>zK5j9D)c$IVi&ES*jv7GlX# z+okeDWoXb{^3`=}T;0TfOi+L4lxhkku)JQ_+ht<;Zk}xMSchzyJDHe7({1=e!N-R+ zm?wmON$)3>qFs;JBOGwe`rmz&@CBwt&BO0*z+rxh>B zSixjp{a71Isb@|5 z^TW!vRf0;I(t{uo?p;2Arw+_16Q+FqfL z%xC+)z5GouRsyQgefRH_!)2cr#<=I|La<6dIxce?=4Isn`se3&7(0nht6OYbxlo*s zRu-gTo%ibB9kE1y=JOQ1z4K&NYQi$xJQS)fAVn%Y1x#JS?5p4-c9ZBSkn3!$1mFGO zzafdxx3v2D_xT0b2`aoT$>5(BZtvckC3BYWQ6xso_v~>Oo9?#x0=CVx=8zn<<*us8 zIWyGeKN7m=hx&H)+_ykraa;EjhexB4N#&#?zi0(zPVL0BN7Hev+0Z6IobmLgr?QOX z#R&>u7=bCaoB6o;xwTYr%ZNkP|3LnauOCOZ&I>X5Z$)Z>MK=pww`L~z){=$0CU3aM zu^tq`Ij6=IiNgDN3{XCvM7>_^X_%!*$Yu$k@&L?!N1}wD_$iJe?9d>8yP)Q&iJZ*q-%yO?^VbC=efyW!T zC$lxlNXY{(N=A7yABrv`*BN@g&4}Uq7FHfg1io|4W0sk*p^tn-5G0OOj7Fs=?ujj^ zI3+r>(&Fq)v-5g=(IJBec$V2*Hy8jpeTdT2#!N}7UTn6>Ue5c#0-is9;t2RvUFJsX zJ~n_;KY!ey8~TqysW_cgik9^J9hk-SEC0>QOc?h{xx z37`3HL5>OegG&!$^n(ckA2zE%bc0?QZ{hOGt;*&Un)JUvA;<^_ z+c`OUp`sb04sKT=ws`QPUoqtKjRS*G8k5}%rMIobPYr0OE5T{$Pp;Ig6S{QZ`ABv$7wAm&#Cf8FfZn{{^ChmVAz-QnB4uB`u^1SI=F;ID@|U9K zASHrn_beB#5bfsB9GPd>3u?G>eN=k?qk4cz=$CxCOk2@pRW?0zE=cr7a=Hpu>h3Zr>%5c;TM8yGs z>NHAIH5_V7Kgao4bk~;alH850G(VjI{9rysQ3kkMt~4+pjnXaDavbKzyXcUJgK0Sr zX#v^u>1LsZ3}CWy%8~v~mfQDQ<40IQzemDa`AJWrDfSl=Stb?!SQ^>>po(M);c6r$ zOtKZDiZFTFsqwP8m3TXWUlX#Hey1Ycy>F!sXL{jAbX#S$b6l5n zbCDP>oA?8~AoIPCu|Le&tflF9`E|t&@M{kGHW(TryKcgy01ZyyjVWO%(BtK)goTGY zr?2Q*sDDDg1@;qNFaCweZXd`K2;Wc9T^J@*zIjJ^KqNYtX%HuF1CeL{G%f zpOf_pFeUfc8yOCw``D?-E9UmNQ9KFX75F7Vu}ivbpIYOAoo3WL9v`WrLv(x-!K<4; zSO(wxs!QqM3ap2gg?#DV#FFaoth810sAFs|f-Up&;lK$Ob%ivJcY3X5j~6|I8+oe_ zf1~o~R8Nc+rY;W~oYBf|F;Zhn1GlYXTQ4oA1wXyHCb^?ci)$JUhTJQi10!@{)+D*Y zAT%m}&!rP8dm)n;foWZ7NN#-C-vc+MAWbv|v89mQlk>45L2vSrf0Vta>FuQXKpnfT zTft6$YSmcT?E_*CV{*^Bt4I|oj9w>wAgJgWtrc!p=&F@o#f;fO2rbn3^FH8*Bpm1C zuve@^zI?o@%tFcX=1TgvrhT8%vHiWZWwmC%oz!G;%~ug@6f1=w*OqL$kVzmPcr3@{ z)ltjJR=BPrmGnY9pP$OgW#xP3^4@fIM_Azq_2TM%LUz_Oc8;fACcHNY%2C6oj4(b0 zLW7Ii_=>KuheMShO?}3%v@p|*XOW80bZ;@#oe+OxVyE{HGdx&%DqRYa7>_1wj6umx zu(6D@xz<`HjseHVFJjrcX`R6KQG}#yh~xMo+^7X85Z)i&JkA9+bOsv;fJqlLA|Fyk za@zKF6Y#EES~25r&aDEyaAtjH`g>fWhcg`!WL|}94pHO%Prnfn`1TejQr@4BQ-%#J zQ>AMwlk?v%h?6Bbjgj!dEnrz^^Qsi{8kIW!O(UlqZ2I)8*Ch}V6Ge7}XFcV0#WiR? z>Xi3m{FSyURJ`xYWoy!EqcjR%m1S2Uyz!I!PjL2=>s*}@y<3LIOHsDtc{;=Ahd2wb zr6}n#X*xYu`9SxA%Zpf|C@tu)!claj#C-KXAIzEF|9M}%>M&sK$*W_ zW>7WqslwZ@rg0?TnHH1XG^M$2NE`a!1O2QonTzt5Eq{MUhemYe2FbBi8L+Xj3n62xB=3t_c5aCoV8nzp4<-3CdC$|W9PVr~3 z;$;MXgggNNSa7Yg{*;5%c^01n!IMa&2~Y-nGirds*J$VtRQZLk#@jm>K-OM$pfCk| zmB1ObDg%Q|5t{Gi|M<|}4$wb%wE1J!Qv>{7De-|^N)4cf5sE7-e<(0Y51{mSbfA9- zAbth(M_H_h_Ji0^5g1KT7Xr9Jz@a-t==EzI2OeA|5W@uoCLl!l@2Ino{Vddgi!&g(E%c;zNiDBk0j|>pGp%6Lb1{Jo5>*L8=$}Qtjd^}-St|&~LpJd&g!}*P zo@a&9h4aR+DMnvl_8^DqMOX~s$#gN`U;vX6#_+lAd?bo^a6m+h3xR$B*?oh@_vwEt z0~B?Iig5X9mmUuvBO7%<!E)b)hq0o-m{B3)g$It9fE%2uNw#bkr-F&KeLu)8-25zoJ+pE_Q3!&9Io^e8$kXX zc(5!5Dg?1kBEI0kjkXE=m~;&ylMEV$3uKw068GM5;h-Nm;Dt#LJ2eq#o9C^K2d$9I z^Amy2Hv49<KMAu*JLHHB7=0reaTCf;Ia{W9Qf~V8r#{`~rPeaan)RZN9QoT?7RIqo#DgJW&*TLhR8?D|Y9NtFQvpwMrpx`eg|{|4*iimjR1N*_ zNH!|fMkFJwA7?k{A2-@=vr5Ed$G#yHRRhFad#f5?eEx{y8E=wmK&4)hPZdfX6$4sO zeJ&2bq>}$+a6pCIPr@fhqljXM~v7r$P@z)d3$-5-uMIwXCBMc24Ya&tv0|e6*BtdC;XvsFj2l7 zW#=M~sxO%qFc_!OO?J=h+RoDT}x(xaxsn#|uM$v%qMT z6qQD%d?wdkQUmIU@d0K)bJPUdnSD9!UpBO&#B198yL zmzJdgb)tC*hK#Wk0k2+?P`?f<9ELdJ9>Yh=We6L~gmZ@OS;RfXS&CSj&z!@{jTw`3 z0fHY_0QhND?K%F-3nbVl8I$HjLU}bng2c&>Oi1Yl*_8Cv>1sUV;e?@9+)u35L?U*^ zI;=nC9C#{UNHzjGqls>Uq`C+R`Ev*q)8#^}3O5OlakT~qCNy2@Qa~{gXIuxUfz)!mIGw1zpBKG+#S)ljz1gM z7RVT$k;YzGF)jR@X^xu5^8KFz1$nww;NAmXb^8P5$$#S_XF`PG0U0#_OiV~c1yGd^ zkTqOM#>b<^gTLYLw-^`=el(K0V6V=xw7K^bAZ(?xO(P#%E@n^x#G9c%-R|nMp?~yv zbg2P7TzjAAec24?pOQjwuqm*cief;%p9rv%xcx*!R1y4_%!5ci2IR*8|NHa?84ls@ zh8S|t57!^s2Hd>y3WT}hf_+ozEECShizZAo>F5K<@zV)5{iAlVtDHEH7Y3QYxW8hLem;U%~Xv*w4Hg@XN0sb4do`&dudx~JGkga=CGvQ702Bh0(+ zxlQuw0p&M<_06jA??k3L+ZY4u{dpJ`MAU$e|Ezdr%TjQXyw6{f284#eD{(?czJF?gV!CcWGOnGfptdgb zU$20d66l|5s2G(or}*U_HDEN?UeYUA;h026@%p>>{m9h<0!)$ewOgHc65rFI8oc zd+D`@9MI36#BCe$K$SaMOHN{?B551V-vvp~FcOnN+_cW&Ofp{GU+`#n8!+GYQqQii z`pK*jY)IUJxl8lZ?ODP{mjk$4F(b_FpM;b0N2ip-CPK>tZueaQ6O zvS#RCdkh(KhYf$P8c;9;gpmclN)ToWBG(0r+{gg~MIF zn-z^G`V)fmvVr=L{$mhZ0Ld^SzWxE=c0-e${fWbgj#Ysm!Vw8THe}_G^|U8>59dEU zO~8v2fSWtWBn*R;84y(iGEPCB8sKpMUMKZBK)gOcS_dFWCE#>r03*)*-%sy18Y8m| zm{$XrKZpCT1A^r&pHu~5+k&2d4*J&~Gp>SfkCT!fpWUej^c>z_owre`=pP%2N(7Lp z@B(TH(4>00hVialW4zy9(FIhr%SDZURuph214htyco< zv?!TeaM=Lwm(e>;mzO3zVwQ0gMLQxaV>Z$oHo+}!>ZHOXaNnd8a&ZgFCSow0q@o^_ zbm6{N*)#dcmRlX z06D7uO))?Y(O*&wHIDn&$o7*hG}aCMsr+jf^dIi(BeuUr#3VG0c@p$*;<8JDFe$WN|O^^nZ@WImLX2l7k zSFKxi_+t{l;r=;@A-7sE-0VH48Sp89`gZei&4#lFcwR$vaJ^v${ZJf;{p8sOhqDlj zn|RdG2Z;InxPJW(*NjN$uon?=W>_+AE#YIG5#BWd^B9Ml6mqNsoCs-4+4=^UPl*~D zl6e=GNc?x?zu*a9e=wDXm_QLS`aDmL^(z1z+t$*h61a4JP$nQK7|gQ$ASnMwLH3@k z830~ZILF+3@xdi$BwwcqK|F$VJ(W5@c%`uZKe&u>D1`MsVB{VUCY3Ie^!^S)m(s13lKIW{SWUxEFr-H1}oKN+7fl5d37_RK*zxJdMgO14K#75PzjQ17T3P@*9TB#Vj|lcc35aDA0?+@0ph7Uq zAmrx@3Osxa^R+lD`tmShz|SIj1_y%zZ=$f2m>V{2g6aWIot#4nozmVgg1UAfgBDqOF-#eAlG30Lk5M*CZBIVq5{NCJeK_a5y zqdG)P1#f03fOzNM2^|2@pa_W$K%3<61I)3XUSuj#Vb;3ebaDS3Za-uM^$B{eJ`?&^ zyZX>%06jIgj~L3!4VxbCc4Gt~!V;+6T0a==W`I}?7#|ftF7wrA57fh)yn0ZD{`2rX z?P}5t{gEg)W`n#y4x(o4HMyBIuaZXOn+;qau*{!0bn8DesKBfHTPz0#*QoH60qzAs zrwstV{H=A1?=s33ynwNrD~6{}fpqa%mtK@GFAYpi&Z02Rcv*%`C?JsV`IDC(NQnul z_W)JQm-j?&O$P5T@1#=aB>z}2_a93JdPNJw{Pn%eKiAdBH9%d;A2CKBUhy(vpm5Ab z-#wlw5D3hMteN3O2tc3%q-=(BxM7VjFS?+Ln~xmX7736sIftwI4b3wK+I1a{H5P(Am=J4}L zn8VYVpRk55E|ynUB{~8L?BPq#Q1#^oa4H7Y*;a39;wn>cI%%A+<`50&sBs259GN0s zK!964!1=eY3Aon{^Z^xu)`v z>Ir^z8X{HxMmi9@)9r^kw2oQP4mGYmq{yAi9cI?d=-)Q-g6F+4Div^@sxHgq;UWHc zCEt@p5*5&BPV|^k_1}a7tu93TabS&V^pCU%;0~ZjJjDh5!2u3$||d z?kf`xuDmEXY=)B=#p%GqQ{c1zB$iX<<3Yp&e-D&@l`}fi^74fGylRrYG!3U#0Gx!L z{QtRN;{6>L?gzXgVw~eQevM(T+}LR$ST}w^>x&MPwPS@incTv<{&eo?*2;WYK z6(fUrXD*_QF@r>QpvwmEbb!z}@j{<{B#=zk&rKJ{=E_tCKz$^D%(l44(x8^#GZ^tD z^#5r~%Go)oN|QqXr}OB)E8d`b8H%cq8sFbWdanTeRUZ%PhN_);cxcreK|BymSEDEz zC+Cnzh)!B5QVBdV#j*ft^e=JyDG>i*%EIKYXfrDOr~ofQAT0akdBDSoG)QR$C-rR^ z!U7pOpgcI`${jGS3_^^dJ){S)3`LFyzvtdVhrDq1cCfzSspZ)%vq5#U4?xG|m~F|) zE9%=(?{I3H)&#t?Lg)15I}j7(DG=n^1BKCmUlw>hgUO` z+M)?)aR0T4a=hly!bw;B+5`Q^x%yNq6?LDk(X78){_*;%CsVx*tAJYo(>GM-jUO~f zqlnr7JQt7*_EYGHAIAr!{3A&wKI16_@mU#<|AYwLwnwZgzYMD}OOQ@(s%A49{igfdTz%5FhuUgMPoTj<<%mM&={~wN53ekJl@~jT89Rkqy*0#TKG}pmz%7Tc4nrC=`i};iK?KT2T!7ebut_*|)^Q7WY{`W` zAxVTvLI#4D(0rr86C@(CiG%*=DsT6Px7tH*Uw@wT3FMk~^w9^-VD~>}`u?$8K!4#Y zG7Khm#Dp+ePo)_UhDZvs1M~))x&ypzLlWCjJ%c9{d#a*WKSlnw^r!B8&s?p%rkKtNf_-EjOb?znHB52%kh>ZCcT+S=1z!~DJ z#uEeIzPb{7U)kV4$%V=ka`)s|Wrmow^Il}@o(5z7oHB@APjf1BzbX3>k>E{&*vq@< z#bMorwTTQfy!_T#;*AK0sYV~;l_4%xC&8%{wD=^W&y(G7X)zU_%~EyWx`HBdrIWvfB(gLmBQ?W62Phf5R7H9 zv7t)vKJq=R%W;SzPDEFtA?uVd<26%RxG+AU$sy>sETiZ-c8`|Fl^c}U0oof;X7L56GlZ1xPfeoH7@RUa^$Lo2rbrp>Fa4oT%lC~fzRD1_f^tTIkqu_f{miQ8* zLSR90^bd0LO_3wi7{X_7fKG1Y1kl&+vzJw1%=KvSyXXYixPabC!h8JZf##1S`5807 z^YwRw0g`!v5J_yx&^$nK9l!|-PUi#luN4GLBgfObBgonSib2C2Wq)gi(P6~MF?kVN zzFOdTeW-!y$=^argimX_{S<*RNpH`ip??+Kd<*oK(Ao;1R`^UqwgfYy0unY#SN@;i zSMCKgj^?i@xPbPUvqKWBmb>aAN6rO3)AB_@MU7 z{_?_G={U@UkR4ZjfcM3<K1GnS1U)UTH9M1Y({YMi$m}df~MNaQFkAzCJjeg*fO( zYz>iE;Y1aM!(Kw@f`x!Cf46^$r{<5Po4hbzSh+T{dtH@*;21U(V|fejbKCM2pc2!M z)L=4wW=#&8`qso;ag3`89GPw3ngD_S{mttiYxrkOhOIZLAYIq+a2WT?d*{lLnRMOp zaQO+cV+I2SEPleYIIkb~@{i~Mx;guIG(ab`5GnvdELi0hQdSjOgNa)r5F`-1)8n7Y z3s_#NWisSEh4m-#1w>hZ0(3lyaW?{{zcMPIxc=p+<+K@qsw)bPaoD&9GE!^|WW4|7 zP(F^ZQ>S=WLGJWux=#u8PqF?*=^&%m=9i3U`pE-NCIw0Phc?=e{MR|IxL?!GIWLyBLUN&q z0z@o5&gUJ=bfF_f>>;rnf`C)>t(d(B4q+E^@Q4Ksv%{EsP|VCYN%u&oZlE?41ANJI z_UC71bO5A{jkvW{@YjzfC5l%DsE-5yEn!MfpEw|YHu-d4Dndg6jyI^x$j0!EM z|L!b98~XQ-zYY3}dQf7grDlNQuQH87WCJ9wM(N0js!?f*01&`>o&eEd811g^kLI;Nbgjyasd+enWTp<213C^59 zJeI&o0d#r_y#rV+bK_w@eG>YxBu6~Qs276il?i*hc6fgK37`$5-by>qZ46E}zu} z%BIWM5MosR+r*){5jgG(pnUQYX(Iu7-~DhTTa1VebItAREp{_&#<|OU_eHKdq z#PxwAH#~S9fGc>KEvEI*XHMPtchz>75w&liP|>lZa;iA+`sI zr`WoXHN~8QOrR&66$=c=W9}U(fQ`q?4eFN(3qX0qHHZ$S#MJ@fQ3Pp&gkm;8w(!8G z(+E}HsBm7_aGC;T>+IU0K1m@v#hw@{rv7ANi*+yfSJDc+=~~zJA#Sg_Zu)-RU*_u{$;s+sWIyu{ zlMzf7c1N65V*hqe2jEr%O(gzDrZ*EfK_$WZ70Me@{zB|qJ|1qN;w=meYcDAXt1omV zv}V+}|H_1$67;X-^FxWh4his`;_4#@>mylz>fD+2jJwnf(96Rk(I~Dz%@~!?D3Xne z7zfto1tfPAmiHiX9FqJae~Q@>lLSGIb%=l z5k&F%2dn3BswKt>WGiB9w++aI%dbDpp4v*IJeyA)#>pJ-v-mdm*dp=8u`KSE_&%h_ z>nHl`I60S24F^|Ve_r?ZQd(dfuX?x2?_Z?wuVXxem094M#PdM=Bd6>@DqNUx{6UVO zFfWjaLhQWRFiB<0E+2Yd?`f^wVir8355}flMSoqReseF9i``fGr|Iuo?U# zaDskKBWx9P25KEtYshbx+CW*rEI|K{hyJRYh{R{;W+;jwULE3Hxn!8uuYK-7(0cQs zMhO`w6VxK_RG_d7vgh;tx0wN{V@@~wBs>c9-WUc!636qR!j{=F*05|U#SWNAvs5u^J8>j&%B(OQ~?F87kPB_3jDj*s^5OcyQ z1ng#YfCxoj<=me>V3YdeTDY*U9v>qe*ed%|dysK9d)kFnkDsCx91-Ps{gb>_FED2(4T8$1+h3{p9E)eq)e4ISE6p~xi3Tn`Q#{0j` zDqw$v6{HYFkO1`Z<%rc4J|lfClNbD|VU|_twd|H2Wbhdk;E=?jYtZGyk5f80tB*N+ zKQkdb6~Zqc7T)?RD=1D3dqyLiGqfyb;1iJGXaxpHY%};|@H;Tty7m=PuepRfybnwf zbK^<*JqO8&AmRJ1kKrQJEF~UaFF&a_KpUxp=6!1-e~15aa^e9Hr#y(9RQl)A@mS%L zr;pZcW?6thDK)_TIz%u!Pvjr`JD%_dhZJB)6bT?P6};o!nBcQMfENgjAUwV7Xp~OK z&lWE%_v<&1A*K$pdR0ESYd$^Mi6uO zwuluS3pIf=d#DZc0lvsy4_smJ966An^G(7%iNPT9LR~3Al5?zXP1KzxSBSXyBFTo^ zUUiyfZv$`cf3eZptldHRhn+$5FesNJN>&B$vpN4_=_;?NfFL1e%!5Br18`A4UTgpm zsRj`B%a6nBs1%TZ>2U`klScC;-=3r+kPta{VCAhFw1I_J6DyyDdhK2xBe?&}A@w1@ za!i`?{I88+XoLQD1^A9JU8sG&ZL?@(+@)%Op5sk7;2xYENIpbL4G;0}lUj%{WSo75 z{+HlyIamk!kiCCQQo#rid>A4e%?M;;)=t#G;F(pfO!;K2Jra77f&IYox0ipIJLt`? zUxf&8;xmAy`}AFdxGRwh*1@>{Q(n0CruB?2$Sbw6>_0)JFkE>;5gg-{DvQ3_-ebFJ z1BakL<I9pt<4`FQ zAinn)w08;zL%e%akpNMf;hE*eWR5M#IlP*$p$^KUSdRw88012JsbXFvH)!(c{|BId zJ?l@s+ma?ef6%A$RXF||UrJferYQqN`HzMCgUJ0+68NiWD#*-$Y$qs76KO%igizSG zG%o0G&6S*oICIZD!tDVuErYpNB<)cT_;jkV2k&aV%s;WLL1$PnOvJ~A)3jjtiD2x3 zC=t~MtfLb~^onCexKof}PC*|k7e@#&(r+yn%K!6n#YjNEt$ZI^lkf}@IbM2Gu{QT5 zWrd+5Ppahrju`_divCNS*LM*x(6|6! zDS^IO{}Q)d5f#AS>KMhiCkAnIcA&)N9Wx-EE-=hrF3<>lXGY&cnN-2Yi~CEmG$8ezOLSf`yp$9T?w%j+1+klXw$POe%DmsIe&N+^H4l=v<1A) zMKUmdEX}{=T7fZMUVqDAdIfxo32;Lr507d56{Fuh#UNjKAo5TtAd23LM;00VHWojR z{$osh>HrDxZ$l8z1AO5`poU?=6u1?6F~K;)dBKoh0R4@342vS5gYqXBdtfGb?n6fy z?k7p;3Db`(Lx^P-Ix-Vo1%^K>;pzimHZ91#r`(W8)fwQ4M8Rx4S0y-?6k&>cieTp} zVQw147yS6ME`8h2hX&+TW-gOdp4CkY%a9r7W&ghJ zpBojBV)r@Bjk5blv-_u0e-Oy)u=3Wa{N;E7MXCK5yhg+ZFlDd(NVfiH0)K7;$ZG(L z-`q6v_#bJM#<8y)d=h6Kr6N#n$S))|Vmi71su%;3&#=jC@Q%9 zM9qWXNPGO9Pazc+Y_0?~AYR=zSOM!ga-6I`&zWxFa*F1F^#<=m{+8^J^Ru|AalSY&~zK#24Guz?9dzWKmCcHkNbCYI4Cj0#{` zeU3>Jd1gSA-M4|SKLY6QvD&T^(PcxtckEy25tOF+{nEcNm!UJ^@26g{JaV_>I20dS zkR8-x(Bl^kjkQ8XpzAWoI*&A{3Wf@QTgU^c)KuPy1`61}k7LaGE zlmXn)(7){#kB0s;S^sg=cy~~2JKH`*oj^+jLegXDird4am<1GdfU4?ZQRg4;yOja` z#!1a1G7k_RXUq(Ugt5j_f+h_K!}5C?=Av^#Xzofxfr{c4!}1D*S+`2=Ctna5vLD#| zb}u1z)>$9mDz0?Y5wk2Z5}6`m=F|tk^#SAR13ZZN#65JRD1GC8iaHm$i+?RRO9|?D z3VF|l4D?45gT~?kLdTobm*TuSMY(@UaQUH)U?WCCP7PqYixS3(%_|AUfxl(@2=S?X zw!^WB$j(zKq}Z*7zuEp-ZMo|Q}&(!?*>Pn zfx&*C8Sx;;+ix;|N_$lyrGCF^QHL2g+u-5T7TzFm3es}>nIGU=!TJv=^hUk2=x6=g z7;ZV9Cr-N4*rtvYe4Vx<|*a#gkw}&Oe9?4ld3{`N(>e0KE59UZAXF zQg{HHI2>hwm9H|13I-|Y@1zPnsq~|N&wU6dseE7{dtBHau0dz0v2pbQ9xjZJzc&jP zhD+xg7uKI@1J5Hwe89%dBLqK@D8(FyPDYvW<-!o&oD0y={$iQ+O#s$C${*>su`@tx zidp%&(~E=cgL5gY6Ab_F2y^}<@&bkLRY$+_KG%$cfWz+NIG&7~*C?t6m~@D+MT(d| zixA^oR7MK%Lq6VP_e~7qvrM89BO##!IO9niX;O|rkVXQSbZVf4-I^2uije?l$OTl@ z!%VVY!2qbNFr4)Bq3WU6MyMuF(BuBgR!Xzm&*Px~5FLhecJ{s8fRMkZ5(}aPl!1{P`u7dNAkf#@^1Q7~93)xY05b|9A^G8z570Sc_Jp~a9NE`_k z&3Ob3!;2gsIIa$7dEmoJVAHorec+&Dk1*mW5O-q+99JLX2nZikXG33q`0ieCx&Nc* zuo#&sy8ZBH!e*bcKZ(rt39p|-j5pKnKV&ff8*Bfb$nx(EI@9>+ymk>M;&e_#5`?01kaz5td~FD z=}0MMBv6j6FR=SLlE3<$Oz9s)>cr;uyA*&9s~`#oNroAz!<%Ii_n!r_jbQz;X+23i zTs60)!6{0|=i!N;Hq8J2hM?h29UxT>jJ!Ek4h|*`-1FyD!}>av01e!K%B_eEEQ$WZ zh+&__PXrm;gdxPO2)O2ix5zeDR2U`b@4E(>Yn;Smc{#Nl=mYPBE2!!Rq>pDORgui^#!o%)NIaF8(}+qdkvA8TvC5#XFK%B4z*U5XHlVy_f+LH4?m=dzdWT zamc9~5Cjc7^%Gc?0HVZ}vk6$A4g5XNiVKh~dWRcs>wtBN;3XbnS5NPKN=z6rOUjm?862qx&xU+!cF9igu~+~ zs{?rGSrq0QI^;AU^=_R&9f3ckQ9Y^ssy8gey;G4tuS(!qtuS=v{7GD>H){=bL;ri3 z@^51O71D90{qG@^2E=%{!gwHA?E;i~7N`@MVNrQJWC(Cz5_k4*7u5W!@7Rx;2 zHX;V*UKBR47ZUNB&g~5XeEF#%hKF`}(s?K3CoASkF9FCfxivhe;NG~<%}88 z2r4TsJPZ0$=hnQJ^&er5mjL$=cc6-@#2QZaQnQ3^tW2z9LgZC~yz@`Mt_EI}?f8LlJ=W z4Uh9kbHYX*D~Uv5T!To<@j;EV?#@{NSk1_+Y{IflXExrFT7FK;Axg$v`}{O(o4 za9BSrzP%&@i3h*U=Kt}azhCQ@VtoHe!zbPw5xyUZE9RxVL{=Y94KU0MIPvvm%rHc2 zTu$9GFdDk(aIGK+z{TYb#GQP|L_PkKMgkKkSpTAUfCzjqgL_bz9;k_{e_|c3XSG)) zaor?9^Z?X`z+W1~{nuPbY-v1*Dc6GjtIcIn9-iRKoHGN^?hZtER10nk`6VYAM)njH zkN*;9pZHHy(EkbNAOF{yJVJ5uK5|$t<$qQ;$T%1AboOzX!b=9~h5Q=h7T!9be>jUv zA2@R|)>o_KP z2N^pF5AUM>H8I89&=kU>;caI|Ub#Iq?9o4E@pkKitdTu(u@zhK=YI@te6(Yb4E#2s#O36 z=om zs}4s(Z&M&Xbnz2Q zf3m*#QJ0=f9p7g3Uycoc5Be{sAm0W6D-%}I2awVS92)=~(4PZ(a|Qmw#e7bVe^zFg z4A1-n&xzkMxPN;1c!kFNcmR7{(aAT@J)kaXI)LC59K%rJX(my^n?IAeKjiEkplp41 z-xCB7H4g%)?I2-xWH{PL#at7>ZgylO&kxV2W3p;MtX!9gmGnwO|LczyFosgT{tmC< z71QNM26iAbCjfJp8417qct#+SgzyGB0P`L4q5?ukAb%u5BA?_ju{eaNl)!5P=ZXG| z?|!bvFa;XX^wgrHd9*11&&L1|Vf~W#zYrpmX(V_>{p)i7DT6{Iy!aW=ze87AjrFgs zX`o#PS64*PX65JW0JFe<9mH=v1~C;OZ5tqENC5F3Qe7#a|77Gqq&Ts6b(>Hs!rB4{ z?G593;GE&PL2PjtI&2Q=9d4Mx`#2}emodr~pX8y${3T8gKdi+Y$z}OL$)DUhhD?~RlM)PlJb8bD>5m8Lnk;jVbUZ*% zCpc~@xNbZ~@t8c9FALPodjaiM{9eE6fp#P0l9(3qWc)p@L^AGQSfp5BW@P?2rJma2>1YizF zk{IGdKeb;Es{3I$4N4{C6Yc(`%)(aD;9AZhbSgJW6$O;r!x!9My=^$^wyh@g4* z8g5153$;6Zzm4?iB^NTEG(Qf4JhRY%2?e~;@Vg&gLF}v^@KFiK0B}cs0D5z!?LPs% z<<3H9R56S6HFV}4g%b*F<8d8P<{kl2Vol)o6Z7WxHepzDtKi4aVX>ovum`N*!B1ZJ zZ!+gk!oS}nlnUopDr*I)uLd$qKM(m0Qs|tcjD_I>#?X-?h~QTmHYo>slZ5ZCP=I%C zAYpiJ9=PYS{UBDlI012Ud4a?@c?5&MRe^kaH4^PvzoMZ<#41#Z#ZDU5eQb8}zJ>LKRH*|o5Ej+4VY8VG7>jGV7KnYKqQs$qeGSG?sW88ei z;U{?&01>MxV>WPa9~&I};k!$r!`@(sWykm6xILghj|w4pNoCu6N~a{qI+A;7Q!f(=kq34H(lcSUZZguhTU(l?%cD9X5}J25ezEpB*}A^{o^zg9o< z4G)Tw-Bf$>s|vkIWCfw?e|6Eaa#^t^SSeY>8im2sp#Sxu|2WqFUg$r8bXUsKqsEx8 zrUOh?LLmHODP^b7V37Y&tRB?-XO_7yqkmz-&;aziYXzIIb~r4v30nwWRKQ_Ocv6G4 z@zg`+gzrIbUbrwBV=dm;$euLtyNd9U#sB=rnfTwBi{QV+0dfO~&+y-Kd3Y&eINtxK z+l&wH697F-pcw}HrVIn_ou4!e650A~5MS$51x^6;Nag7SbI+=!Mc(0#f)V^2$wXu> zLklS-fmr5Qmyb6*JU3mJ*9+uza&Sg{{Y6awmEAvv^6PbgT)?goR_)E5h*X*e`p?k;@>K#dgGgq~zhgY3 z>jcMhAQDT)C$<$(dw>SGH%3V9qo^JT>jrSRo>w7ixqnH*&{QNbImaM15s#`rU46pf z0m}|P)eh^P7~%DgB4S?YVzA0w>{{Tg|L6D^^uO}`pI1jRuRjj=CMOJl7Z6}>gh`)% zYvTU&#$ic4$eZ-$PZxU{xhNBB11x0q^#clpvvDGQm&``boA-~=mikhLbtYS z4&?p?z?8lM`ft{MqDnBFG@q{n+^q^ojRy%jFWCt|T4yLE1&V-gNUVq=_Yb$b>Y(Ak z2H=T_;5uMH2Kqg!{$TW-D1smj=%-H`^hrS=ZxZ^`Cs9rk`p1HXz2e6>m(mF-_ALZI z9GScQ*xWlX^!VrCDVc#MZy4~{fUIKRq{s|MCCT}dsMMR(3KB1MBtng2DuJ(=;PA|1 z`oQ&b5|r~Qzh2tVu+~)=72vu9)n)a8pQ1F`bBzt)2@Y;B0JtMis_a)$8Ia@Qo_O3A z3E<~70&)}pYC2Ws{ZE6Of5b^YWiiB~xPMdG=PZb<7w7Oy)?b(B?yMFJDPF#Y@*O&W zlTwMU3rXw%H2jpv#uGWD1n!L~^Y?}PIf?u~wY+{0_aCDFeBeQt?I)&AoX#&vkN8M3n-KcDtpBGraImVUbJ10z`1%Kk83vBG&xw#uO@Q1= z0_P$nU^)WB;HX9B^V}9jnwm3Z81NwA)VC>-r#}SZCZ!c1(PvN@AX1WyVj^BpIl(_G zVG^AChIl-{iME6EpqI-~U;{+qyZI#Wp)mEQFn|ALAuyaRv;j#i3R3icp@49-_ew^8`}pf2oLBTxqjclleY3RKuNrE_(; z|IPXjWBv1MzMu|}sUh$^IzT>2QQicov=2~osE?SVC_HnatoMJ>`3G6#?Op{!j4pxi z=yUjqqJMGJfgcYLaQScog+u$qnyC8_LcM}ca1Zdv0p#3=&OQ-|9N^wfh+_KF-N+n~ ztzJQ~v+9#58&AS8Fe#^lScxi_R~4WtK3<>ur_K5g zWc{go-?bO>h4L|pY@&wMI(mo>K&8Z~+Cl(&P6=~*rVfZ%3vjFKqFW!x*a@k!!CCx` zXx`Ge`%~#KI>iLn@dIu`n`qf!L<|hX1BH)%Y`{Lk9nt5HR|Zd94nn6y5S)9t4;^_t zFBctRT7fyti8B&_{o@4pXTBrL(e2S2P!sH%Fbte`9SidfRRwMsc;7g9iG6HtBoxR8 zsoK5awK!Nx`uAr6oUQyjvJfqPm5;ZM`3v?fkrT8^eypz#5YHfE|7eyS=r3NDD^hKs z#PRz!fT>K@8RhsR$EP`dKhoDZ-g76);^)or&uXu>nBwqADnYy3oPR2ngqhs`Na$Z1 zS^i_Je>Lwe)&YcN!l?A85EW*d6n^~xf`@a|ZFUR`p2m=}{ zI58;GL!nod%F0C2_UQm4A`mERkiguV??+!iD3}sRSPmhVpJw!Z*Z-4g4h;!w-c?9H zH1)}#pWxN?qH$@uYRrRtMF6>tLHsU8ZejAes%Ah0-^UyXP-(*<(XK0+%o^=Rr~U;mH##K z`HKR2=hEV+0Hi*ByqXFHzG`%tzMqS7kNo#r{m&4%*E`IGcgYXTWl`g2tpIx#ZecED z=UeX7Th8EMSo%9=de*l##?YU^;fw^!ypMQqzHabIiy!7Qbx4UI_P}_B&zKJ21Ou3) zMiB-UyA}fI69Ey6MhKBQe7z_I>Jb$I!dQaPgfImy0F?+wg{iFim9oLFR3fQg8AzRj zxikyLsB6d@i3ldM=dZ@;_z`Ww7SM?#?09_Sm{I z5_4yse!vCmP7#5k?7kap8iU=4!e1Ddyf+S@KbdB5!1;Cs;T*pUVdG9djNJ4U14$UM z&*dYU0tf=o?-~-|*c}ODgG@Y;e;8P7jia&HgyxV_McjW_E=FXdt0~LtM2vQU+e``; z6SsY0LA^-#lj7sgw4{I6XcM7!h-5wXJZCQ89&`BNu0Dn{$1%|31px4>6rW357KZ!o z{0&B}84<8ZV!0POC6tW8&T@HqQ0%jaRNI2nyh zS_jDR^p_0~h4}0a`hf=~ei-PAukf#y*8y0-dZrq2XH|h2T0t6^7ch4ADW`1bQKbD! zAxWx+>2wS97kK+5VDbvke*w_HDC;k{jP4wJIQtQO)?aay4iFiM#31Q0ImoB+2#r9z z8No+GPODD0Y_a{cp$XT22N@$4ZQz1q?ze;3g>eGq6B(F`@3%37Bmk@kU5p$LB1v2_ z!@*HZkF0tSRSXQn{odu^3J#H9uYQm;VDiBa*|N$R!ywEzg@o8dF0PG2`Q-Z}}$_TG}1&oGgxb+46v^ijy7?-m?yq`{X-(1`$tOJN$Cv*Q8 zlOfujD6AaM#RB_Tz`nJSx4DH^&Rc6(+P3Nw~oX+vWU zQIvSWCmHwmuUU>im3A}q+7I9D$Ql@we!6_$i@J@_{SFh9C<-)&r$x&f(dVljxOGC-#9*DZ$-d; zN0Jls!vT6&n&9+^0n-5-$R308rr@vdz~>^(AJi;6pFpAnM309MR8jN|rN{1TT|N}l z$o=PnfGawR5&zyxrvdsGixNo64`-l1iQ%|RTd0Tr+1p+V`n|I%%9&NcxXLGI9P6LG z;|kD!gbvUXXxnl{qDeY{#_KPd9YXyQx}t$UV0f(m#YZ}r*hFZ4KQI8sWu+Z%{`~H8 zdjRlVfJ}h?U3Vbo+%OWrVcU^#5DIX=i^ze%Eyph^?0M$+7rLf_w6l<`>;RHcx$PW( zq=s6=p^J4GdK^g$Ftf~<8t}%|E29E>gOut23<#0p; zavwwZJsalm;tz(ovmXioUAdLWp^!lbeq~kGGUc=kuMy_ghPaULmFeG20A>E1m4Bz2 zbv*A4i0I7EV_ei8d0o<_U3h{6;dBOy=l`MX-*ZGh1Zse1V4RW4hWzBDo(=#vLzHXS z7zBBrxQKKlat+UoM*@&3R1&6^?@j{*>9Yswxc`p<;N$fQkN<*a3QdOo*$n?xOnfKw z&!rL)W^w9q@)-dA#}WSu(7*rkO5FTHIzR_puRzS=#GthnOs^FnNz>FJ8u%_b6sgew zpB+Aw0mL*9mxGUh-QfRIl>sgQ?;XqmuIKviTo(>N=Rc7X2 zq6k8_A0XqPk7#b9Febs#UJ@mWnLU8CE0GBm07UCXC#uec0k0u@Z4&_9spi{cHbnM6 zM4E$B=zt7Q#u_FI0ngS-eja@jtia_+6To`^FD`eXM;?O0 z`0pdE05R`>elz~uj~d6ySDXfUm-vj_tJ!--0+=f#06`9Zs<#0mrO3iUzG+tw$z3q|L(u=vfc}fA!kc>kzufib3UKCZ zS6pG*4Qn9q31GjCqF*aWW^Ov4V*D?_|0as(hH=xz%YE-ZFqBp!i_DAFsR*1$zG;3N zwm&4GaD&J-k~XygoV|U{AW~ximoePQMGkzM8A97Y=XPntZ>U68Dv-<{g3uXR4S;z` zP@o~Y?AV6t(yLg!TP)&Vzji7YPD_Y%&)Z#gbsbUWgr8?+L$WAN$ViSpWPaGNGe$8D z0rf{GiXmApO=86qvwF%3n$-L?<1t?wfEnk0-`U%tZAC{wK6cVW8 zoKUyky2Ve!_x((EbI&o+4dVh;Bs2#eWAVAH0j91#$`okX{+B?7(*NM8cnF++)64fI z@l+7JX*{~q<6o1AkP8yt2HQ5Yzqg}Z=LrA%(&%%|_`ekU@+S1pCkYqj1h1=~B^I9* zTknDX7w^cIem$Rr{`WxCPeT8<4IS=a#_etRG$!na=KxzknQu9gpKGGv!PB_v{m(bh zmL`P9^mL7C^>|TOmKu~>`c2bEGCy9dik+Bn7FX!w&*i zKbl@1Tht<`3$oB573N{pajsATcm_Ma5aqGXR0VXGlQUj-f>o6>BjgmE#uXbH}Ox>8GqXQmtFwKJ^m0c`t&=6 z#H$Bv7$74ECDeSJMM94siaLS*H+-?-lE@G} zc0vIFN7EN?NQyEYcOWyzM82gtBvDyr5}%#BZKk|@1?7=;@h^n|t1X>6_=*A)%`Rs( zCzoZznhvxs8`@225}7?Q0QH@Ijwhjh_g<&#Vyzsw*C(8LAQaTA^fh9hg@x1s0jAC0 zGnP)vVjJ`vql_XHDLiEZMl?LE`ZP%9N<7ff2*w>@UG2Cv(!o_ijRVFkl&3dQy~I4=pN< zSLz4Ok^O$(UUsGgTU&l}vs=HU{oGFs_z3iW0>t--Kr@{F5c+4Q;DEVaOiD;lgQM)2NU^|2QAe&>xbF3yO``P0@cx z;i>}-T|AT-e@2W&Ce*0GuzE6wP5o3k-_n;BMZ~axB7>+05@-yaIURXdB9(}StL!j$ z@Y4!GXA*33c$WQs^>Qprf>1oHK{=P#-P|KTr30;}4bC_7@=jqOxQ14paj)LpvyZ@( z-|t5RDyG`RcrhOiI2R+>=rJ(ikVN>}I6G(r9(H`Mc{pR?if6p_`^P+lgY+UrYAe*w zHRPx+U}}j#LWC}>4EneBn!dQ%kmp|a`-3vr2#Y0oi3CfZaE9loI?LqZXL|WRCN9_{ zd2@v@^G5abC0t=|ihMsn|2KSW?hGTY(LW~--}Kx0JJA3C1-F>oJB22tJ<0@{a6bWB$}ecQwJJ4Q9fVJj$ zDkQLU^=ZFfJ9n*n`P{hdFkR2n=Kque7LuCrnhq0%!<{a-*MyROsB!zRkcPt~_ z9iUx4q0<8n*+8EL@GN?I`hiC0ZTKL4gy56W z8ufn6D%IK)dH)gdg;3D(a3ISP`67yyA7)`i7QnILKikm@%QV^A2%*{YYnPwvmO z$anv~g-^Kg_r*(i{brX_g6~W8&!{%$U9diZ{txv78_<8-+h@Vb+BXb+*7fHPfd0SG z?|;4j{^t`69?t>5H~9kLvTwfJ(W90=pE{z>dY``{9>A>)(&H|sGC^Ph>GGhoSDl^m zNbjL-W=jB|)~Y{Bfm6P|CJV({0$F|HI3)1&%&H+M#Q& z9?y)o3!_s2Ynj4SfSV=$Ue5v6kzsZ!+7p6h+3DBmzcD%Z(tp!h8C~`A1L(he)z5YM zZ`KN&ckXv;iA4Zezh1uAC9^!d3U5%C)0KeP3m6)i77{{`Lu7V-agLH{ez z|3RkjJ97+fo`ENGfIU6HGYoxi4sclmypI2~jkuhR+yeCRvpmr#-+9+te*b>|G`Hvu z@nP;e)@zbREfCxP;^{zUkB*QdwjUoG`JT|<{dSxlcWpKblT45n8}n%ZJa!M88Hux2 z2*i;BR;qvn=--0!8*Tp72~-y4giMti&KQ)=(_T#UGy@VhYt*`Iki2Y|_VTe?Hpncg zH_~_-uYI)nQyPyLCwooB)^z#7B%<2`6F+!bI?&+Js}6BhY##AVN*8%$5Y2Zlo1c zH6sG)L}VQr&_7fi$bQT;Vrj=cB9OCfRhnZz3AlXKdOq+|g~Ae{&hh7>;XZriH#h5# zv~fP+=&wmWZ-@T3C_TRc{pZ{MWzhe^j^2>z`?>4tCuSD*a`>5ifUV=@#IJJoao!w% z*6#;bFU89c|DC=6?NS**3UJ&q3r1J6*i2v7Eh|}OaA+{YK>SIk-2P#@_!DZ7L)%EK z_w`HiX#kKVh$W?hFA0!5t7i+vmI^jHZCjW-d3@facaaXxg2@zA%s@ZYxst4|us=Ae zOD+<77-j-SKF({fzEd`kz7$!P4O*>>HtI559h+1Ys{$>&9er+B6=W)5H3`tYXQnNG zIC(%Z#kpSZVy7SNc+LyB(zt&XJK9zD{Gv!ZrUhe{HM+D*%F~GkOC&1U>9j~Sb(FJHN`F$Jh z=ZV;NcZ{%Z`Ts8TzgLj_66k-W-~SByf6m?i6@Bt2e1SeR2f(EJ{*dv{pGye-Fz06# z4WO0BdClW;Hy0HGJl($sAq}jL*8A_uKaKJm;epM@=lDa{1F)@Gg@kT9i(&i99sqt)8ctP=PQdQ{7m%6t`=&?ydvLU_WN@vZ#BZcZLgeF zB-J9v(Lquk!1X)L?<#_RlV9sGyDk_Kxc{hZNT@-Jvf*fRAc$_^X*{Gk?FQfXGD*|- z51XAjqItKu+Q5c^y0i5>uFZjl>xuSjFXX5X>^%DlQmY8zLnnYH41j3|wC+AC=*k1J z{QgcSG>}>iDH7+OWrD9{Ec}>{o0bjLa{Ak0pJD(LfvjoL3kq_OQCVhAMMULBM6mAh#0cm1Lr^* zk8lhbumj~?&YDH)^q_yL<<(mvk!r;E3S|KLOknK1tUC9m`(9);!8s`y5c>Bsoxrqg zV16W_Y@pR;CM29d<3VujF#=yZqa0CCC8KamX#G093u-_?n*23QFJLP?#4+HTiq}M; zHOC&fw5o>nwP(NS5b5NB;iA({4->B>xX@zPdIv{Uxt8sUl^Ga(f7)>(3=N{WC!G0D zS{O*^_p7R)y6>n@5T@Vas*8WAANYs*`w!7Sud0GcZa@nHd)oWwoi6et=`i;j|91tx zckO+CANv1E(En!W|FXOPoe!i(t@w#Kz-?^*sLQ@L2jH(K1EfXK&kKQzU#If;jB>`{*r-e`d3ZNSn7FM9Y=qh$Q#K$!lCV7-l%@c5G#+AbvJH&~Ny|1-?%Eisqz0g=Ug*4gnN%^RJ$(F-S{L7U z(`}9z8Y>A-ZCn-QNBQ}5d!O1n1)RxJ0kA4T1GEWOV~3F=;nO?`*s zp_2qWx!+inTAhHX!3bdz3@W`b|Kg7eN1!k_(7&FS1jL(l1opgsUTTAGFuSOSXV5jk)q5s{mu-62>7aD+j(0_8CH=#d8vOvAJcl!C3 zz5NB~&*#@5d5sEh&jD_h4A18Pyj>(ry6;z7+*dx=9U@S?f61l%cUv5M>GUr<)yy-3~)UaywDoq@P)Z&cnqPN`v%O zu^-P%W?EVdxNE0xvomK1Wdk^wGe}Z+B+e>^#sdf0&s^Ni99Bn950~gbmOOtywOuK6 zcU7p*r3V40DEXB39$JNS(a>K0ZX`#`)JLBfv36;%D+a`tAKuX)K#L7f+h~)VD%OX` znfGUwJ|dv%a9W4C*Zaqz_d&?;3X*2#^d+GP@qBQ`N z#MH@_1op#1vXY<_Tdp`@8EXKm#?{Sj=fjis{s;QcY(3*BKwv_P0dM7*wEwj$Xf`g; z6eFb^fTUUi=Zxga72lgj>dkK&{325q|CzH8MLVS41^v0&eqyf~uSc^@=+;js1G70p zTq~DlgE!1^s4miY5{N$*Tz04ZdH+}DED>5K&$CWe-Z+4&|I1J#3>8Fc?Teh!-m{S} zt=V4`X5e_c-WmrLFh#TZ3~^naBae7W8&L=bsKA*ZnUJqz1~9ll3*&#WE}!;n4qU9; z8ivwi^M<1)+e?1iZ?B(<3VZT1SiXs<*ByNZ!3SMZn9nr3s1um`(&=}FJ4ub&&QcwzGJr$PUJqw7D#pNYf%J9BwAVD#FJXWYqN zB;lBNPdxct?;`@O7xx#-ip`4UGPaq>W(Z*d(0u}R!`^qH4LFsAac-SMZSz_JytQN@ zN6Oa}|6t0AM%jQ@0vNfcN#Jsge~e%+6yH=^54mpOrdwWw;dYK(!ED<&mTuDtNM##*$dCc(+~3~I?^BU> zqRu&h4l^Fv#$s7aHp*9<@Hmv8di#j));E>%(#8LHugu#=WrM*GnGE?yYXD$BCZ`?x zI0U#>0=W6e+%AgTE+jsKtGEL#mmTY8qkwOR{x4O-`O#mdlwA)H_)=oP-h}191pPnf zwLhgH{Ts$T4-fZke*AYmaNb%x+}-Z6Wci&$pbwV;KmT7h`I+j2l@j3O`KU(*mE1wD z2>OEoC=5DHgaMJ(?|3_d>eKe1Cj%arLtL_0C(jgna87K1$o8>sp*=&379o@qV2Su< ze-8RFZ0X+s`VZ-4xq8)gpjg^uSNADgOtCmC12(P~;QCIqLpQqW@js+?cUas*HP}H8 zO|G_AxVC2V_?fA|0qT33n#Do2*biyGBK#OXODbA?FHnkNA8B?wqz@9LllYbF!2idDBLI}JbzvhNB5 zmVbW)#NX}ZzldQ1CFdde$6oc{cU8j^*P!JdHr#%88ULG!0e7H3H+$0D*yYEdKdrmj zr@=C>tATe;4BqYY!~Jjn*X95l0bx^~z$gY&vk5>QY4x2qt$ ze2^EfcbGol%i;Zx41>CPf+{SGCy#b%oZ4e>f_|u$eHh@(K>tNTFv2t-T=gX~??WM7;`)Z`HEIp? zWj#HZ>l0j$UnY({y$!58_Yeb!#o}|%m(#Q#(ln>rT7hEEiE}%ph1$;W$Cd{a0nhl| zlkDeIKt0&2LEeMqQicuAktL8VTka&N(XR3s752Sp!GPG!&fff}0Tx`KQPeRV9SlLR zA>6}DlTCVqvi+&dM@I}l17{tptW$Yu4RnM2^SK_+TR_)_ZU4PO;tr?$+bl8tNtF0PZ!IelzsHlg^O9ecXHbdphJVSFi8y(tiy4Kko5ADJI@`-tf*H@edM# z*2`~f`n>0a;7!}RR&fI;1Kkw3mcJ_ldgQ29mue$X{VpR&7k(yyV5lE)yxy`nJ+8I~ z&6L5}G@uz>mJnu)i4s6n7sY9dlY_B=Xc{3dG5vz5laY4d7+hX)5kP!i};Nxy-Ja6%4a2?-mS;)F}=49M}$JvWR8&oAv29xZ0Z5fYhGOOF)c_ z0Cq3hVAR?W4W_%;p0^_W9A!Wi!qHAJS~;SPJI(R{9tNpmEcOuwI8_ZU>LH!hIs|Lt z=`B-j4dA&z;*-Jt?!GZ)nn;1Cn0?RQ=Pum;xoN;o#MgDl z{~r7QQp)R8yWc5PdT;OlmfO#x#DIHf`vvHq?f7Nre@$fKM}CuUz~e9U{@=~`e;N8G z;Pv(#0CyY9ayBqku^naKd!OL1GgLL`Ts< zG%~KB1zzu4ikW7dGXN}ee|LKDnTp!mcSZ{!ZWRN`$B5pMnLPezbM-r^*-t$?puJgv-m#ycrhZt3J1wQ8}d z=KVnVFtNPO%*XnBiUdKh&1Q!6?2o@gC+$s@05KV$hT6jq97Lu9fVmPN{_VHlDGzp( z1}{)K7ATYx7`%czycP{F5bt+0MTqg$HfPIglKj)|5CFuWQKH3(4 z=eD_@D1K2Ho8!eGmT8Vf+RWNIT;FJ+40|El*@wU|t?<3k;~cNMiY~ z^8t#8Y5!+UYe%UMd0raeI)V_O@&Tf^rdQcw*0Yz~EfjgrK1>6;eU4!h72o@JzM|cI z$eRvDtUm$$6G9H;YD6%bGvv;m5D8h%-DoxT`y(hvfbu1Q<8TFo$S4Nl9Zl0?3i2fr z;SN?N(qV+Ye(dqX^~OVGazf`K<)D%mK~>H?GKvA+^B$+J*zv*Hh(@0b_>ZIxnvF7K z3KazeyBMR4WZVI-nYrck%eh)p+S(6aLwwa_pz394cTOr10$OX`x8W_yKl8z0c~Fj{ zwP5@ooF~V|pFsJXlQW!&k{9;ltW*EZE7&rV^WI7b-VPA>xtqrc) z@0-1U?zsl}544}~wbu^+ThRZh;P~xupKk}pFH91C2Kv88U_E?z=5v6z8iPIy2)pvN zzuTez1tJh^!`;|_zOg2l)kv3FzacGnc3X*h-`>$TLjaf|z=_Fp&aUDPEf9Z@4Iny% zB4fb!9yF{Aryd2MA*2%gc_Qvt1ptuoizZG%Ds~{t6F`zAfZ$##J3`y}1OWR}0xDup zM?b}7^dgva(W?~18r+ru${8U0w0}P{2AviR=9BiNvP6DA#eJHjU{LgN4C72c#9;p* zTKgWDP6yfjbTxH2uD9wDY+jsBpl1*F=C&s6BP-%L%5|!-mFB@yy0_0ck%Q1J2uG1X z>jBV{H(NX42pnrau-a%pZO)+0ilB)08iH#}Rys!@;|)s3;aLlUjg@E57_&g%IRcry zFfIHI6d(zeh)F_lz5hupz_k+KrV-Wq=|G>TBKQ!%xJxxF8~81E4MacC`+tS@^BDK9 zkuhI@n6H!~Z-)CH_)&fk`oDY>f5E2c*BJlXM4+EM^4S~kUo-X*Nhm`a^kd=qlNSa^ z*g-J+f|v+^j`(4_%O~)jObOg5U|{s<48Z<@Z1}pNgNac znIn*1u^h9XlgHf;ZzdX1DKvKtOyp??j{ehE5YiQfDoNyM+)l`bkW zp|C46jG{mzX{18{6ssI?!ezOn`_m);TLlAD`0=G~Se!Ij7mX!}8TMU#1-=a(DC^&Q zno#jzy-W&>S-}u#LJ~iz2IV#cSI4~*wz#9rFv2PL` zpa6OT#GCC7ime2S;%e`M`>TXtDm#b-mxjPio0QPsuNi|=Jxah8^A26MJT`-8G zv0wRw0m_oDE3=v0!lI5@PFi>XB%0Z;CxopACv_V^w1-9daa|B?aFG=uK(i^gvrlj2#`agwF&5-`R~1cid>@Eee#cS0lE$s zxNO^BiiXK+K)eI}S3Uc^UhdTS@^!9p;U?PX79-!W^sQa0k?OkwK_@u=_?4mta zM{?6?wbXsqJE6Y;xYA>u)M!paQq@*R-(Dwc>+vA0NMKfG$d&tMGK^fl3bO#O;vdIk zV&x|c4Ja3TB(<5_43Z3d+goFF5umk!i^yQBmopz1klN03|AMp*VGwLo4#4QdDq!krn&uSOymg*5?cqTcVh%L&g$mD}ZT(KlKipr3l~87I-hR zO7Qm5Gju;O;0iPOKfiN3A?7g4Vf|iVyHWwk&|w~FwoUFQr$de1Q-1+Bd26upM(F?Y zAmARz;YWYnpNIZ$IAp%QCwzoA&xeBGyK3OYk#Cq|-mWYbP&?@Hni&p~yKfNHsW=`i zpN;lCVOZ~``C~tEOMR=zxc|jc5(1n<@Aso5`CmuZKB8Vv({F~Gup0#b9CXTcalQ7& zGD0~K^&r?3E5Zc8A9LU46S9 zccMsPG;sl7J)lj?kQ@jlV1p!c|Ed1PM6Bz^&Gz;-}Ge_ca$t zthfN$iYNF8$%F`mxtIUU`~TdM6AeIfiA`}gf-~wvg#P1Gf_K=1@*aHRs@a{PdiK-) zy(lusCElIq0EAs}p+%rvKe$c>ehu`8W4**@n_tZ%8j^h8^`Fmngu6e>4?_P}82{6` z(_8%bFP(6BWeT)keB8nM_g(h$_hEqM$+1n&gF!fHf>#()1BRFzP3wfdRV1S4)b!lv zIK5V6Vm%pG37Th&k2Bm5WkiS&BRXn{GSW#AwWOBPqe=q6dUR?jZNtqd8m4QAKOTpJ z@}0e-Unm8|HQI}U^`l!qy7K+ygG5vuWJf3W7Z`qjQM{(Mf9TByJ;@abV;l5s{2XID z4S-6_Y6b;@_4cB9M9S8t!1Ch{cgqY$1NSa?&ZbVwl}E3ZW%*i$*OpmxExvDQu0BYp zM+XEfBJy**;YvgERonQqGZQ8S=WycgQtK@@-gx{YQc*`ySPBHKVlQH}ChHaRl z|G9go+KhTt`PLW4qOG2W1TR|naeMBah=(D;52gXW7Ltt(pX2@yWqa{+KVY|OKKWt4 zy@clP(fcxP%cJf;w~Rqw8Y^5n0=<$fc6EfaG9Z2Fx@Yg7bq#nLE#MgR)2Iv`^w+7M z;|3r1Hh*`$Se0Vu1Lcqg+Ph0pK>_{k`wS$Cf*p`meEI`!p6Fi_{ey|;FwN9>UBJ&d6N5+#7`$3ydcEVn08`~_0Fd;upd2ON9WnZz;tt0>Y{;YkHCjFDbX zMwY(;?x2hY_LpV{VK6$*j`8az;wbHw-O({KLw>{Xq+Fxg5vhr+!*X}HNI8ZeteFg^LtRfmg zg&l90=v+1AsnH}yhDANu%MfL|4`DrjS5+x!Yo|ONDuwg4M%UVzNJr2??||6pVj~uX zMXVookpbmvPaBB(U72C@lc!|X_@Mp0^!WFp5t^kkXZ)+eKy0ebog08|J$HncKK8<_xqnY@!x{=Z}YFkEm6Yr zuK)Ue_g?6Kqv+c7oYUVMv5aL$<|I_FJhSvDgrU;2oK#y##$mVV<(@t||wVm}hKN z1f+a5ivL%u2O#EqIY`$9)*+@GZDko{fSluz<0~qyUURboGk>6?B#DwHBk%ghbq2Bw zH6E`;zFqCNc ztL^8jeGye)rgI_$*$Ro{hW@24dG>TFYf;}RKwpr`Qw{>9AE@e#Rh4wcGY~*A{S|2@ zjs5E1A7H(gC{=t{LR!k1mP#XXC>;wZWb{U3P|pkU9{(+rOzQ!A@a=E&sd>vn+q;kV?GQkI#Ovk} zL5Ppi$tK&(y;se>K;0mT6*)({1j2P9LseUB2&Gu(QC)$o{wXeTQ#JnO6!NkU{lkr^ zWdDX2bT+_^(OR~$R}_t>5$*X;EM8jwKJa!LFGw@;lQO{2hl(p9nqr{O6N~~lwEt5D zaH<1FPd1Po?mN{1p+I~ieifC(TpAU}ae)p}39Wiq8~QuQjtt6cDpKt0&&0kns9h$D z80IB(|3~c2Cq$#z(U0Z?%R3s7Oz?Ea{oIE-bj|ao38oq>@GtApe-;Kjv9$yG)Z}#; z7yH587j$;baVRjAp^(A;k`poOQ8SctZqTn!sW?Tt{T!aQNY#@50ahu(Bf)^Zs&VUo zxBF}>3$!b=#nxlVAho`nFl`Y|oH|VnV3+t9-F3_3-w-*O4GnZ|gBpf#gWjJw_ve~{ zN4@`_ofq7K`?DvwpzhCJ7tp_me3P$r{UT_vhkW$>Ga>A&6A5|hMYOTkiP#5nyH(;?`VZMHr?dd_hnU?k3 zU~(-NPAe03f{G2DRZZ&-?!oNk1D&Ya;w{lG3uv?(8o> z*C=MkHRuTr;;X>vI{Jwo(56~~K>?bL6)t7LoC^-}Cb~Kx!zANgzkdM-Z@@%8qm*z1 zQ2sRT=f}nDcyUO;S5L<8(DBA$6 z=x=U0?H0~%)`7!k5a#Y{y)Qb0Ss#s>1F)<6%&k%7C^@RpWh}7O0(1my-1kk4t_+8q zi2gfO#yllsdSGM&#lmaD@WCPfjijK+9U8I$&Er?QDrF$@sR5{rNkSA4q}HNlo{&YJ z`G&ni^V5W23FfMBTT;om8E7ygzIF-y7ncZR)w3_lRutAH_l78+*%V??D)c*eadHI? zqy1CnE5lj!(8Y#`19%{DUexTb($zjOVgYo97ghDHrJ`S|JP=W?_NTcMYcF!p#L5t< zC)Gz<0M;Q(5J9B~S~jujTmS|qw$Ix_gLSV#9fpPbZSli7Qs@(&uC!*bY;wY1k%ZEt zF#R|l!37a0T6tDy`Y9%{*x>js1@6ITw7Fb!(vHa7=E0Q;d(eF92lac?fGxx`Z;o%x z0cJ*`kpi@?6}Tv6xFVKtquqW9{dab9U4T7vkGacFd1OoaTdn<%_>QjQl(zxp!?(TZ zS@dRh{whstx}(Pl!Mv08`!pN)$@Q}9bK(d;wi1w3gR7c<5~k$Z2g48{+N}$zl@Lrz zA~6HCGG$}IAz9>S#=ZzfpX*{k;mAho_X)V7y6k#TfCl=zFn zOfUASUIzI0lIRB-=K$8~)RKsDlh7Dlyztj|Xgf>*G=75b=eO7^8*rn}vBmM>3BY;H_NM{Q6lo_2d`(^&6AazY~ zWDo&U36w`O5;*m{;8~w=q>mj@!Bxq5>M3YGb0AO;3!p9lFdwJ2z=uK5v6PL?=-Dv6 zYpyGnWCm1E*#I&xpqa_NVh=G+H>>T-oVA=H>T{T~nzc(yu}7&;)iST-S%~`aH$` z-0#~zrH*jxp^riTw~h)vX14#*_3+Z$@*St_;Zfj+6N2TV@xV64^4a%@ZIJ;Z&*$vF z=UgDyQ5)La>}x@*FsQVfZuT9W@|?b|6Lxhb09@MFbO6xX+REEUk^6xJfW|;B4e<|F zkF+-bfd0cZ2!qFuFd~2e=-ZcK0D39iy$1)r?`U2N4BAr|a{xUV(9uzI-%ltT&7^*4 zJfd+zY@!*hzp4i79`3``1zi@b9eaxVds$1wA364v0Bg#Ph%6ZS7pom6Q-y8C+D?HH zB?`s^)BcmTL>J|-G~AYgJfNrxyjkC%BV($7-!AQ?h0at%1KoQTMem{Y5x(ki}M@p z8N=|hW}RNFHO(VsxY%d)3nW2U^FT;#&JJVtwQoTGt(z{03ywn_u7D zb}s$3B`A3F*6O6dv>%_g->lN0wCtxJQV~C|>n&akpf6vR)35M%?@~}p0;0}GThI(2 zu-3YkkvDuAin5F%93F$%)1ImZ^@Nu}+zkvIHyHx%0 zF~?88bo%Lezh!=TLLU%;@RrYSqk`UYx_YlJ#rG1^dBs}SS$8~%^?(%zw;L5(QctKC zf@4OiMi57hRfLb3RCx3I1svei?f(HCVL9{RGubUmlBQY zUAS+%#!uU>I+!^)97S=&LI}Gin5WxMv@0k?J;xJSjyOlO)?wyfQ+HPmc}d_h+Es>@ zDq}nS3~U?&*2fVZ3MW$_xqH}J32+Qa`ZT~^C4+^9bo`gXd8lZL@|PN<%f&uzF zpfAR{rz9pqgT7zV+yI{wY}LJL3L$Y0pj81b2_bq1^$xKN_S8@gsQ(H)^iQ?IX`FEU zXIW!?Qy*kIkM^&3Z&pZtOTN`#cAI4v*L&G5Eof}p)u&U&pMX`bW>vu`A5>uvOXJaM zPFQR`FmN;eI^R8O2J16dm6=cN0dthvS_<0Rr&pQI3bPQzs1b6@|0X^jo~WVg4-9>C zj}<#6Ar<2YJ7#BhJ0*1`FfsFSkD!I8sg64m!^SZbRZ4)~rZLiC8QE=WGBC`Z5XeZg z?!FTW&-nc_f$!z4z!e_XCB$ZJv4$m_0;Y|yBERt!H7Ecj^`_sP&kk0N|Bdv3yk>aR z@1Nm*%3@32hLSg*-hb795c&sU!7o7nKU4c$hl9OE5d7n_jAZZOINwza1RcJcMWbT~>~r&yDK%HjA~c~bm!s#j@~jgyF9jijMF{~j=R z2y^55Xt@4*wen4O6Vp3Z9A!in351`T8vX=7 zxU}AgkbTYO`R8T=ThK9!{JkC#WI)To`|rzs|Aj30F7)Rma9?(LCp&!Flz%tq|1aVG zZSC-{LH~Enb6)e|krxtzasR{5CK5aS`?noRSeS_ye(;%>ACS}l0&99L%1uusB?7T2 z@I*xm3zLa?)XW(%K&VnQj|i6qjd%x{Dd)sBj4e(*1GyApKJx@hWAc>NM7Nq?#r`*) zdmk3oy+oDdw-`aN@&MJxyMbQznf{$)=mS^w^Zg)6|`(-(N%$+6}X)wtpQ}= z+;ZCT4icbc_MZac)=p>p9kNP6+X>ISj?sG``vEFz*8s5d&Bh^?lPQF14EdAQ*SQXe zO)nNb{Wy!6Rw$`nxG1apw!YyE5}5V-JNj2lo-=ISDg=fi*;;(I?#8JEh!cY@1%_C= zwtBFt&W#eaKm_YqcYh@j-mndoS>*3JVhnkJ)%&3SL#Vo%3AFaVL;p4jc%lxTl>yv= z`wW5(uieL()**VT(49HJf@J@$<~rZ9$gDq{G69kw?d*R;4-7F;t?K~n23{3lUC9l(cJPI?$S};u z1L4P`|B2NPEy5eeP}BjG9Q6T7lNhQJ7;ShLrmKMI@Yrbsfg;)+2t_*xSxIpL9OBnQ zfKgY#AAn{2qnJ2huOBeSX{kYmsgGf-)b$LJ9VFH}Xf&yp5nWw8Kpp67Eks4_oT0{u z-&b@4gYB0?Vdc9Q*UU`dLLsp2_QSHhuBHcXVWI*0w&XBmefyry>8O93tp>oL^O45^ z8;NbGQk<8|Q3Lcof??4J0I6hA3&LsisU3<8EHV*1LWauND#2+&FsA7StF@0g zn}8dMZ|{Q3FZTOCSIEq|t}pNZA6GQ+0ykeUIv%|xeHZdQ9|AA+{D1SryJ@bsXL*D1b$NfQCaJ-gW0Sq=_;54|$EU>K;i zgW%Fy_=fhw)}B|BgiaH()F4k8>c&1$31UTT{P3s&(9?xW$PXUW9biJ`H{_qby|jsh zdSv1RTH5!LHv5N9dXNW{fr-y=uyuydU!4xLvU-CKb9I?<{1gYA#rVPWUu6kQk7uiJ zL4L2?VfLH-%(^1jTJpQjUKB5-s)eXD^{UT3utYntp8fhPv03z-+S$&)X_O%y@vEE4 zy5&!0&`A~Rdy@VS+CBv!YhwY`and?9=zO*V+d5o6Plaw(XQLQF16o)ZqHS^Sm>!*e$f4}$tayr;2k^vGV@WMpmN0k6Cd=Zq;w{yfEn%TP56`9Gyr(ZTX;V|66Qm(Wn`Uw-8Or0FCt{`VW0v$6A3M2%H;~VApe! za4@#_ssQ-xFi7c10@mWQ?aj&wEXBWIFn=1Y9~$v{pl^-;4`(6U`_IgOU_me}^2e5E zzvuBQM2z;UD-b(A@N_I>XxbBhLM$}WK0S9K`*e1PCrd+IwRmw1bW0+7T$jp1X2dA! z60Z7dvVhM_BzoaggQqE*x<%GzS*<d;t9cHQ4qine88~HEf2nW!9W!ZGJ zz5GxQBt}fV#)G){uyY6iiyxe*>5I+p^olmG3@$RtughKz4 zXo5>`?HASZSHWHdGLI03%M{b*o&_Skv~bo&qEd=s7(T^rhNvH~1wfyK6ot{DnKqHi z@0cp>0Q#5MztB>=g!`z?Xud93qnjjO!X*CcFFD+t?&gMY$=$z^4UEZjjw|C(xYxp5 zLH*v&e(Ef0`4Tfm8&@UAPrbG;w^Hym@ON$X2DM7HA4wHLDxsk*4eoplxu<^eD{T=A% z&!2~nGyeBFWdB4mz)C0ZvJwE>HNeiug^MTkxH;04?OntuZd=4mGEwOyfd+q%`(RZ) zg`-Dx+^lLtnN@LW(X6^P4N0qwMa&J7&JCk1Pa{l^*mbYF;XQ_6|GD!4&Fd z|6U1j!uldO9}Eb-7Y2?LRC;YttQf$$h#t^C3IJ@m5-k5Ej0nVZ{k2=@ICIvB>6pEY z7nTMnkMFA(OBfCDi|XGOeXluYAT%KWv@+kKr$+7XBC%RXv_0j8yAUwFpm4QhP_B!I z%YsDL@KggC?eN(j=?GF0qDURstXuvRfqZqALU)Y8Nm{5Fm{_kEr0}b`eyNr}d8UXQ zPV~L6-(!XkJbKW6YWu0whHXpZ^S3ZCrTH#r-B=HQA>nA`Ln?(;xA_~hED{Js`|8uU z7l_FRI4u8Zy^=Po^pdU3MuYH|R1~8sj^7mtKhWPx73VL+(7Vx;ERIlsNr(Qu z;C?R(csE<%DKO$Yfaj*|<=P#nUoYRUpntakms}vpgvoAJP)!Q~VWjaYVEPDTehQMe zN520O=>NM#_C2irx#aoagRLh` z0@e<7Kl&#(c_ ztwIrOL-jUrCPKv|2_Su3ckz>GurM5O(0_y>WQ9SuUg@w{BiB+y9Mle!oc*7}_Mc7bs9r9sY4N^+;(&=kSfz&#R zPwQjaJdnB`pe;CkKa|n7@1{V`&u1{%Y<{A+0N_si>BjtRS235@C;^VY>u9FfNUzbX zp|W%8Aqfk0!H@w&weCAQ_iHoIADayDT`!?;mgx`$PTT+VFP}^XzD4e#|Jj!5K!A4A zme=JsPkl=nd$8f$zy4ml8&yumg=-Ds0{=x2(mY<^;J2Cop#@;HEbs6i&XRG;a zJXdbs2q?GI#hC9D8`nSMIcL6ex&uR2d+2MY6e(|AT(o&6MQQ?clZuhK%##{)oSO=tp z1vC<;uf2eFi-y%}evU!3b_&Xn_Nx6qr~da7^}WFKX>dTg7tR|042f?{GT_!xQZx(3 z#6IB#yhwTe+9&9iv-OjPNw-lL;OQa!wRyuL=K?f>Oy#FR4SV4az<%IDFYVzMw46N_lh#g#v z57;!pddlJSzS>JPJ~hYss=cpHZ^+*fc5${E@^#Glo2dD5?H5ZQO5500})SyzO z3JCV;P^sq}fTbr2pY8Y}h7CWg_Ydyj0n6L3r8Kvk(LYze7T6#Kt#_hx`J{#TVu(N< z?yGlmF0R_QM-LDV!jEUmST5F>omN9MVzUHA*M05b?DtFtp8oUK|I>4-^j2%c!DIxS z%!&&33BYAXe+&I*l7IyzVA>H}x$a;R8N6OXf9(rhLfgn`;;NtvpY7QwY}rHpY8{52ZA(q~=}wf$STP3vVi^2OGw11Z z1B2a*5(I1XACdj}?2-{ANqWH8Od1U->-QVMXg5ffByZ|oM7Bo{16^MR5X8ZbzXCx+UxOdM}=x?*tq|+ar3y^7c`2AN~ zfStQi{eF$Z0I9T2JXY^3*HU1Zq0K@ryz|F1JpODC%=%wf_fp!lg#DDN6jo|k@HZ2` zAYV7cG9c~!FN}k(1{Ro;h8a8x5Woej0eHGA%ueqoqIIvZ5#RkbzgZ9bA<^^eiOvBL z|AtQBeJ|t#+o3y~U&VAV>-xu~pc)06I`y9Vddl#`hT6oq%jSUHbiFv?^_T!OS+IAu zhVj~~jp^G>|N5OzBP!>@F(|ovXSVZvh?W&*sp=D%Z_@t%(o)o-t$TvBH=_S;2Q*0z zUJHdg1?cNQ^g#h^OiPEn0WJgBO*zctx;@`&1})OnZsib*sKi(+5(f0^AC+l&Uy1d- z9>9C#gqM`%-RSkAU^2Tyz~%GKlB}M`L@~_7tHU&vB})Sc&{+q1bW!P7ZxHmhJ@R+~ zcJ2NE`W#N6>e?T!K1C=eA?N7y7eO7Dy%cGTAf7+P+C;b*wwLWZbOwA)63X>QWm{+t z-Ef6Xk3J}mT`b!)2xbYk6A%5%XVUez1%pof)vo;7@4t0kXtU2Xf*g*Y(!BrMcT^Qi zld;UW!qD&P%Ku__pD!ybX^FDe{GX*+Q0&)#FMxZzc`thZ7q+3M;z4?jm@kWvX~E=R znzts)fE(`iou9{PeGdBX?UC^Nc-5oFp=Q&EnXlgJuI|1 zTYMJd!QqcLS;B0T(*G3k0A>oVVm{j)mz^2Uc5Am}*`Mv^*y;jVZIM~Td+eMjx!{2QT@O&2h}L)Li**8p@(Z&00PquloD|fb zJ&v|Wh$hhN|1%&UvHNshMxoyiF90Y;Wx=BKyQx`_vKyk6>Xv2u1Tz#YtDynreVH90 zz>BLHW^2OQ_@9YVovZy*tT=w=aO(I!F7qo^GUVwQN;%7bURUcs*bPH548G0)+JoNH z_(G?TXPf5nON3I7GN1r2d)BB1ZeDwr0mloUxo5M0lOa>}sLIi47s?h#sLHH|TB)pDYsRh3EJQaYjs(wFV znjnZ}h9q{+P5=N-fri5%k0HtH)F8Yl`R$CI2|2-a{d+N)hWj$!Z8H$wH~1DV(SN28 zn4$l9PyjZ~K-4He4++;z4Q2+RhHnVDE(7u(*E&w?1|a6nBK~H?{)t-S9l2tElkxv4 zBGAr0Uv~t0hUWPw6l^ZNpCkY#8R6N{@~dxKTIlyU!=Nl zYZ-+BTwSKb1Jdj!d6>*lC7GznxCu6HWkyMh0SEWRA^OSy8s zmPQ0DBdYI9r3m*cR4BEL*bWPzZt2+#e?;V~dH9@&zoJ3}EVXg;8;$2o?-G#$l4uLa znR`IR4s6YvS&(~BM zvK*<#9qwJk78unGaT8syH37ofy6O?-<_f;!E}Qu0MhEkEH+q01_?NLNNHc?v|GqhC z+si!Ri&w$|p+WN-ia>jcVfj=-U81UAG9yhy@obLtc-Fzd(&Qk)did9|iLmaJ& z1e#N7VFPUcTWD$S+KfvpeLGxf(DU#Ss*RLVD~>%^At1FjS`kkKZ-l>u6e;!WkDs)D zWu-sxZNt;0@ALThWLL^om5NYd)M5}X!|kgXHQm3jRBYi%S@Xh2vmL{;%E7v%nWY$l z5Qo9BrWH{cwL#G%k92}_rBx&%?V>h@Bz4-xH`T(d>%Z$4WWSq7SJqqh^9(0-(S=0l zuO|asA}i*mK*t~730G(4_?hYX(%ye>2{0=R{FpJp{X3}2WJ}N&18KM+vpMJIQ~~>a zng4!0z<*|^PY&ZT5$L@={SPJw@adN@RS?0z3--`S4U-Yxg_H?lK*hc`2oGsZzG6h5 z=u_+x?j^0$-{pnF{D;J=4wT<)f^f)!(Oia5#H|H~wzxEFomK;M zKcnEL3Kh;p+v#NQ+_$Adxf;O6qE{HOt_2C24&>6uw4;C5QyK8o-GQ|Cf0u6ej!Ct@ zhyFq8D+HeV)SFl&ytKPF;FKE#e$^BM6H?IBVI$es0P5fQ-Fj}?!?g`rhW?ofdskh5 z%==@h8o*J27(&_aeZ`B?bN?HE(znL$EB>KkfG+^|XN>s8uXMT4R7t%aMXYsjbUh zngX_Tzu@!l*1~S+AG%pSyt|^Uw;p83$O5DHr!rdGwo?S{qvb@k{(BHqXt*DVLyUd& zp=O4FwTpMf771MeET-Qt%F_HSIoOV&COY`A+8o3u*7n4|IzD??8WM3uCZVFvG>bNOo)j1Ya^f=$&qJf?nHXyXVgr z?i~NbAb>ydCb#kXUv~sr)Bw-kp3hG*r&CCT(IQNH3oZInf|pS5?pi*0Ash` zIr_b*D5CcOEe=L=CBh*TE@LL(Ts{*uu!u?qKvClh4gLF2LXoVXpLGelz$K8k2@L7U zZbs~By}IAa=cIk((}HomYWI&htG(Hg)!e|CvwlP1(%3=BbREFN%WHm(^WkkUO8z2v zh&2Fh7TBcL>)6rX^^fYkg#dJSU=b+=m1FeR`8Ed~Xn6Sxa0G>vW^CW9h3-1sqkK6c zMrz|0iY2-Xt_^MVQl%SaidwZQJzJuah3I^K#5x6uNJVWHoSKjW9q-kY$517cX8+S> zGq?QU)3mi-=`3Mo+&dk9EU0TYgTVf{>;K}CV%COWX1i|?|2z@wdpaOUTYC8&eVa10 z3;hw6RUem0J=-%M4jGe^^M$*WpfBfay#$w@_Wb|ySl~}H{;&3f`ycf+N1z0_`hR6^@Qe>B>s!}JHu_dJngy`<2A^=N~ zuYywe{e?>YpD%nB`Cld4557_;{3<6sef%7XzsViv|NBe6zHrFXs~Ap59|SGL$9=ac z`sak%daEBZEi;%~!0d!fY!Z1gy$Wzr}LJc(48{ z2iXtR1jJ4`qW6DP8dN*$>^p$c7^E!!Ig&?ko#Jj6|FW!jTal2%p*b{00%BXNklcKieOMVZdWRgRy@M!()GpM+0+gj4%&N z6eUrwkx22;B%A&2>U!Tt-pq`MvzI^Obxu4oBlF&>>LzbU&B~h@8F3;qBFas#D7!#kE;*-)mw`I08#ue%hw>w7XZrF@Lsd}5}+Wc`QOU?GZIt< z9RZRg0cE~jr%+Ww6`CnX&3CQLUqgV%K&*vC7RHE3Wb?nR5n~O+7>E&wH3AVBBY?H} zdm<3YPnZ}}of|O%K=M-~lD`zwdu|3TQk(=i$wvBqnDAxwD-bJw(M=Z)dg~pt$O%`F zEjAgfEGHZKNyp#(ak%bhU7M+?mk zj+rDWT>0D_S;%B$qUi+jD29n6vAbijkDfP^OXp>@wQ!$t-YSuv4?7z1OA z=cPh|AxqCOmq#l8XM+0g@`hq?9WtDb^0@=WDWD>sPKtF@^D!s^Lh|<&`Lx1fUh)3j z^!1?c11!cxB{Z1R>h-FzdGj3!Aqg$!&U{^f$k#*ly?P({>ta4FUqb;!eJ;?kPVwb( z|JCbq&SrVe%6p^y+`Asj?fJh^&wJtbnyaV^>F4?|YgSU!#-V~Ra2+G)? z{0MNxRpmcNrMNy#vEw8|CV&}57?Ctq7)2J5Q>YO}%ZxIP5m7;s_Ua?Dvp-|9NZeSJ za`C(wIj7OH*UW`i-sZjYyAnO|s9d;q$xi;{8`%vd`1qr8{^B_kzx?sG-@5G< zqe$fWr$-YJfTV~(k`(DE79=U$(Hx02FsVZpM4W-crL%@r2d`#(iqA%dwW%eE9__?}sur_U0y$>PsjhW>)J|IHZoF{q0oWDeklS zabNFWy!)}*tJM4L8mBjnuzVl>F-zlobbj90SL5@pb5TA6f-wc-3-?n`d zB2%a;n7KR<%7dX|E*1eTOc4;NHTfi-4?3UG=s*YzKru!rfT#n-mM4$J+Vw?8HlhjP zs?#7V03WwTko`N8q2NNW0r1)aaLOq&0Q8BH2h0qd^!k6;fWO85G~V$3l+H^*!rzqr z*va|-P`Oo2;^07t|Cv4y#K&Wzvt zxIOpe6}zicUZ9M|Be4Vl5gP$oPEsYQ%j!~)05k)yJzh zHkcRn0VWZ0H8nZG`f`IA1aaA#sdI1h9h0DFp=H_qd!_(%iU{;mSpvzjNTS_dj7SK61`XzW7!5 z#%Dev@BQb0%&&g>L*~7=_IY&evK{YCm>w><@-i;IaZ|n-#aO(2L-wZ= zJoVBI94r#+4v#V4oyrq0UB^BISUBEGiA%rtHF5H-Gpe z@}a|H9ACbGN#daQ4%JP^0#fu(zKL({&$tAHk%gow)EIFhl*}Ppq)42DI)xIT5eNyw z)WnJiOhH(wYEEuJK%pOSv;xBc)3`S9TQ{` zR@d`+9b=Qs6LP`oIcX#Xd6XYZF=qH0nj8`7B`=H773aM^UMWr#z4HK%ZWc7= zD)AtLl-ujHA={#OXp0JLXQBJJ<^gi-Ln-TUf)M*YtJ{E0tr>_|e|uNVAFXVAnhE|osO zXDizAz<==n9Ub!~Phq1Q?{K z=p*HZ{GQS=2Ni)cMp)feb>$2zN_=s-qxd+ue-xr`?|;! z8f0slOb^=xOR3PBjuAa~Ejs_9_u5Aud(`agO(lwBvEzs~j*LW6p`=1MSD5OVD*h}; z)|sIa{a4>N5-0$I;rMDaPXSO8&CQH>nax(sBRB?G_6;-r-s>_euUdoY?)AOTgU|d- zKRvRWASvy2wNewH;Cg)Z9D~e%^Y2m#P?HD#IrG;ERRG?&*#Pf7K%Z=9Hap+zQx*EZ zahq{tQ!L|WPT0Z71VD-eO)=3Mp%Ks;!)Q9fLTIIylDM7?@?k%qeIMj4^ravP|J@PQHm1NRlBld8Qq)g-snC zSYpXMrXc}qU~=U_em1=80!AQ_6{rHsjF|w4EDQj#7RKai2r7lU6OOGxRE)_+hW5fP zb}sBy(zM?l~OPL=p%z-tunUmC!xP8DGAlW#U zNELLB>Qr2sAx#`I6gZ3kB2y7EMHY?X{m6|cmv@P*e$bNxXIg2}vK}Md%x?B!2kBOG zi4W|(`%&xriNXERL4x(?@xpzE$=P;hSpYV(-9hHkQ^9#@pLLF25#e26#zcV)3qH5uc38{ja;gKp+8mE3Dcsjz%kIqeBN;eJ>eMZ6yTZL3q$4{JeEFP%}~LyM;ky=m)K2ef<~%QNn?s zF|gw(&)zQ*5*GHU%ecHd*4?kZqPKtXGxnn|zK*y4^c&grzw(*!b6@^8Z-4U*e)TVX zYIN33`Y>?j>Tx15TjUl={(ObmPkYxjbk0Ze$%`mMkKPdMu1U-=xBjurpPQHNd{NT zW(v;J&zzR>VDZ6bkY=w`DR~u!lx0D!q*;G_+ya#WBoY6L^uA&WNNvzgQL`>tQUWF? z3aLs@RnyN>vpEk*t^cXB-{PGnhDv}U3t4CXyXM03JFM=jJTqUb0Yn63u_ci@iw|#I zN)>NP^^g`%q2Q$;$;P-ng4wvvDnzAgRP z{tmd@p+u_3AzkBWk}Pe}XO9XL9raOwMChyg@5=I{OK`9PUr1-@EkO`d$ti2_ub!;X z<*9_czQ4$ZsLRU$GDo^1`;lhUMFIYo3Ed)rTc&VnMolufB!$Z|Dg=lkm~jj{$)Mv1 zHXTzlCnP1xA4ej2**^h@=Fe*yrHCzpLKZWMh)5Usmo0+%Q^U!!;l;n|%d(ab;GnGX z{kn5y%SR4R4xAqV@IMuTXA}O1r}Nk?S`8j%$UCaDSP34PuTMUOq_yF!8j5#idaai^8HvN5CgFQ z)Ytizzg;t0Yo@*WPpBWaY8S4ToM*1$*Dm4P23jZjAiN@Cd|=Na{`63DK#EHx&+W=g z7TI+vME5lSuQKue{=Mva2Vk$)kpkcqqw~OfQ~rfTKJ6>F84*H1GZKk3~=aU!Qk> z^6Cw_p)^^l@!dr6`v3dKxRW_aRpR4+`2XO|Q9L$LjN~_epKrt#c6TE7&tKw;afGOp zS4_v46t6jo3SgZRX%PvIW7y*F^0F3d>q}1wZIvrD|JI;dWp!SLJ)n_+AH%9Sj*;y;b04jAShOd{h^F3NoUCf*hS#v_cTBaY(;(aspt z>4=lviNsG`!R6y6(+fK?imXnJ2tWU&^sOf@$=-#%2zL%~=#2qep(X-3Tysna~eo;qZUB~w+&oWfZP1I@23Q1drYBV%2f`Pk4f|4&+aOR3JTY_+9Lsq<0-)^YZ9Of411%f zKzI$HtCb7oR{0nYRT0ezu`V}2AeYb2bA!fZV>`_%++dXk@b}+a^BT=p9W#t~xb<_V zI93MMU=5-`x~8oTx&I2N-YP*j2@oGl2Mpaw_qlw>FVb^bIskw7xtG;=paZxEv7oGj zK+?H?X^ySA{iqYtORqzS^bAS{MfG)2r{^|=!11eyB1$=9F842L{Y#m@)4Zg=eC-rW zQn>k&*=)}2IDwlln9UYUW(#D;OQws2+0ijG0Nk5OJQ+!}Ge$I>NVGdabbiN-k||@S zCeGz@A`xL|^XpX&V2YZd>Lvq(5|rh%>qqV)@JSx>5Awg>FF zH>EN>6^V?<`CS>!=1l#Stbr_3xY>-^ZffmdiH0kq2i&~1`n3Wm_d)z*9aBRMA?daCm-!ONt@0%|l&EuI^EMI(sH&wxLjQGw0_KiRy1DiQ8 z&6pX3Xm^}v;FaWfgmD=Nmn4aQtj*VC>zVRSFP!UB(zB~(Ju(nTr9>^`D#TH^jVuEJ zWaT!FmssAR9H1)U5f&|?ZXp+UrZ~Sh#WapMnT{A89LwF^ zDW;LZc($NBw<8!u7@gbU4wd%KAs5C-_Si+)y}8fh7hiREj+f@>II;UX6O0b$n8z0J zWP~V5k;MgplQ}2>$$h9uRWfx*A}f__*BY4oeqb)55`pIBK$_*{tt_9l`7^Jovu8;T zpeWxd;$xRN7;$h}{$BZ*(JnK~04~-#GImU@^t`U}{d>aK>U%6C{ayy29U1(_Bb0)6 z)}Kw~Km!Y#QV}M>yj~}`Jr#g=3?gMooV3#Eeh{B$^-2>2>CUSA^04-nTI`CH8F#;i zqm|z8NW*uL3mZW4?(wtW0y<6I3vn$peyqUo@`(c*dmx8U#7>INz1f+AI!(5x{ z8>(M)AT3Uy(dxbj+MOq;yHR8fNW_sSV^|2RDAXES7KmQ~+L|d9krwwRvc&~@DkCk!Gmo2dKl_7|_x`&-KK{T5-)Ao|7Ap$= z#E*`iMOFlzd4^0s`=fYH49vgxQ{(4<<2M&yN;Bx?3o`xO?<(o5Oxqhlr?c{Y0V z@*|i`N3g0Ak7F8`93T*4Vh|=0DM7E)H3Br!5(2FDA`%byciH{PfI5}|u?%b6jMm;d z`&SwPQeA0Cn5gMC&+fL8nU&Hjq+JVBL#PcFa*^ja(a zav(vdhUEt>`TwA<0L|Kbv{}izJRmP=SEVIs)#=CzCm(xOp1imxJFnj0y+8e?zF`gG zryq+iUb{42-Z+rA0qE@`dF}IG$^8_@V{n-QZ{8xUp)m%rwRswa1Y-*u1c?O*=>_>X zTi7Oa*-1LL&8ej+wJ*0dPms=*NC5EWzT7n;^2!aorUa}&qR1L+V3QP?7)Wfzj$&i2 zL1YAG6iF0Ch(;0PoiXA^&&l4wF&6tXGrzElot=q{9zDl%vjvh1JKTHrnz{7WZSG$> zk39mMFPWX2Vs{jC{MA?a`g^b9+Rj9xi{~V|eg}8=rr13<_?RXSR6h$!eB@(A_E+?0$giBH+Nro)VkQ^_ubSh2>O*3R9 zD5mgdXw*`(CONCQs41B7@^#JED9BM$!gk|H{5`J&vNiw=J{JjrabZc(#QP;)FX{w} z?MN^t>C~~)8?3bQj{v#}2J~g}Jp)3pWg1$Q7x+_cmnmhroj|m}ppKy>WH>FLF57*t zPiL@pJny0e|Df1YdP)O`HG2FN+wL?Gl$H`dOk*?^2mR?Ff7@Ng{#6%%e(8U6f3iI! zX=W3e%7F3#t_rxk)}Jm1|C%{ynlZ2Cci=LmJDM|{&GS}NH}3NI&0FsH?hzKtgqbUX zgsPoL$(njek!1$ANOPy_x9?*9+6_H=|C9E@`=68xS00h+-VS4h5hD~8v1$wXPTilX zcol=K2+-9nPNKcsHzpTKn%-r&UhpSXOj6JMG`Tuf9W8 zkv7Ciyu4Nku!acW5G6o^`5dSOXb7KJ`3f=QtGG&;AZxt`q(y)YBQ{P7{H6UXO3!gr zxU>22ZFsDh!W3*glIY@j89)7)-Fy44&R@NuM;7fBm=jJ_8GJ3jY3A(zjl_$)h)Jxfubx?+J7M(eq|ZDzZuL z2cWhn(-l~wtem5Kg%#;HWXb8+Zci3=-U5Df8|VQ%TU%l1`oB@uKLk7ZyrK1OgG_ck zmS#R*+pT4Ee$V=hD!}8RyAv9nm-}O6B zDjRKnyNHaI`@c^H_&ypHaZ#E37v^Gl+${!@IcSzSOEAi^Y)UdF#W^)DanZq>cje}- zBkYgHa@!i=KlxpL3j*00V_cH^tO_>r%Wo7l{2F+IiTi9hNes|Q78uFR5A*t=JS!hZ z7?qF1Lb1Z}2qP4d`9%UpB15e@As}UjT?-RLQy6K&sc2642!8h~pfQzy9E_3NNZP`r z8M3dxju*!Eh<{rE+>U=1TsM{y)JvOr`pI-KM9!mh-x-o*94_%>b{#fZ}k*=&L3(HslbZv9mY z%i`H7EAz->aUwvLZ?#8>T%xyI(V71ysM-Bb0+Z|l?gcblEdLw+=!mSTZh*4FnY&NoWkhvtAh z`9(5dw+&FgoyOq)C>I9))*WSAD}(_hLaNd%jex7XM`;8SMIzG?qDRlmB(laXl1SgW zlN{eY+wAoe=W)R(6fMnRK4yTP)gf_4gy|n zLRC`1rh|X|T`-UchSFQ5Z~s_>6(L8Fb>mCtWpeXCmy0Dc5->(w6vc^qSB0(}4WAxY~xM(fpwVSy8$T?it8R_mLySy+@%|RRq4vw+BcfjNQ84lwp zAFF1_sz%rK^6OxXYJ%Dr6?N;q%0#dvJR48x(1)+gT3)U<;jY9raEloxGGkcvaMT#x}ok8Oo>Hj(>Bxyfuy#RxCuV+Qo zatR7R9W}4*FTlTpW)93UGR@#}A^>_cXL|d9ip{)_LvDu7dz_&>;uf9v;em5uw7z;#N175BWX;S$y<0a_W^ zEtLQR2hdTo-!AGevw(xoOMMIqm0$anolokL85A^jCEoA4K=M;zA&Z3WXu;GEy072X z`OaA4y{W``-K$t@iVQDJ*KxCMK2>MRr6XY3AkHWtdhu`LCuGAqyKz-85czk2e`*!8 z23hzjB=yYl5W3wr3f@~6U*O2UQVCFROTG4x^lS7zRY>hBUXG2OPUP_4M@Sk3o&oeE z2+F{ZK!UEp?RJ0A+~h#&@ltYWzeehGXR%Dj@3|@$KJmij(&zpl`rRm&g*Bq3nJ;sS zMMy@|5hCV5qWZm5hYCH;mhVW?00F@TPZA%*EgZ0s@ zS$AKJO9>n=kPrZ8IKED~O#*-RlDuScpA_R1Y7LAvFq09+=cZ=*-p6qDy;pJ7QB<}52hYRuNmQLTRrxdX@|yw168uybO~4`c%a-T&@U%g-yisz?f|kDB6O8UNPjtj zS%V##e1NPkRPrhb-G=-71Ip=K*IZMWF{mWP zzrc7xm_AS)AlvWZ-39zl>q)is^&-Q5e{MSFp(MbDN`QVz!DfTsTnVrpT$gpE#ui&$ z2mDukrPF0LBm`K8)BM z7csbF2o)6hDE6LjzjHtv{I|{9f>ZBD)X<7>XqmX9W%CaY<9lj=kThV>!Y@<;C^cx+ zS5}3n*NMjm;gu|!4U@mh{l8W!1jIpgZJ|~(&@Ve_5Gb`oLBiU90-4JR6fru=oQ|AR z>oPZqEMg^=#@NNq&h*~l(!To7{!lbiI8(KeWYolXddjM_v*m0VOfam7eF8yD2jNgO zu{U0TZ(EQ3f;a%dG(&ppK$5ra;Pw~3g0JKOt&tBugD0Q8>fX0EO&`1Z2+n`yRr{hc zN|YXfDB)CGfd2}&n-b525Hu(OU_)#u?UDfLF%R?~^0mZW0s>#yBeSobhvGL7=uqW{ z;M*$&C|WuALJZH}0AWL#lC-G1CiK*h_et`HfZ)Vg*@%ul z>8%`kr|MY3_)NMa07K0G`g;s^3J6NoXVeAmWwo%hv$dVnt?_!Fdj5p2p2M$J{}Nfz z>d!ecb!3`RGY2jb>i&$$;T*~B16{oImOHq9o5vs!MG)t}d&f-9@5t!+_e76;`oq!V z<4EkeT^aqz_r}+j3Ec;uwio~J-%DRUUTXG7U(4S9{ja3g?;UZuJCV2`5A^&FMvtDu zWE{g-TW9*pA_ohk!t|bBb zOC{FcLTec0UM6uB%jZW*W!v`g6nEd(A zjGp^n{+a#CAALQ$aehZ)D!5o8d--j56vZ$_)}ND!TF}sUvXM6Gmy$kjDLH#B)VrSm&`mmbmgKmQ)?ef>4uoiEi|0~%uzulCrK4+>#UK8W#pqc%nLp_9MgBCrO~ zjh^>)I9S^eic}3=$~K32J+8Dsd6>|yo&BXp2`?Qr{rxz#{&Hu1eY3m)9hqbQ%YF?& z7ocnGr_0i2ojG4;K|@1b&_$RGRTgX=w#znOJi#c|CO%Ig9`7;&TqVEn`o8Ik6{S~! zAc3)GM<}>HoD4kxR!d4(fPeqHTy>0vTTs<7xX3(|#wx0Sy1dn2s$`l%lMI?U>LNjQ zaLncPJ3RjOTY7l&9*@iKEapsirxO2-zcl&Kzw@Kx=RWa)=!#4cOC%Nu)W-{ty1?;>!>swql-s%`!mOWOqh+yd!75TH18`{G5$_m2$NWFsMfb99=iK-M3}{<;8sL9OHBo1~V5vHm)VxOC@U8+{*1|*)%y?wtQ3U(Qt{FuZ z1`c`};9msL3~Htl|3^PR{m3_7Kf0G?&@!F0KjZSPTY9`R5<4Ejy3D9na|OMOlfd|q zq-htIu6iWUb3W0I-?kgux0C}zB;%#LT^kWzSrVYlz`Y2T)pyYMCH-M3fCPAe4PrnM z`s}deF7j4k>gxScn~wZm=D(=~AOlIizYZ$z00uSu^kn~n4w-_d3d~IiRV~0Mb+kYJ zebM)P>kYa4+U?1gcPCL+NcW8@A$j_t%JQ3cyZ!Xpa<-f%Sx~nRt(H-YcrwE1c){!o zUy(0eIxl;UG$KaDNT!5PbtDqFriehrhyV(xNM4iApk$$ZE(b36wVuB!I}J1NWwxGm z1~pLb7m10ob3ju(-)yhvV_x{K{Jx`qO$IQSue+r7J!AknWb_`Xk+&_BaFqu5u1Y1k z%mD_yUI9ked_=Sfjng;T-WJHOg|qhu=(ME&(jV(d!xNyZX1lj*o@Zgi&{(^*e_65r zZlK;nK6u9e(TaXjt8JzF-jTLmsQ~&?84eY7OvQgxWf_prDKu4Tnu;cwYMMcpDco$% z^!7fN-+s#--rDC}0GW=(?u;e+?8oEx{QM7%pZWC1;GW(h1szt-}7vA`N_*>FOFfxaUOt19QN&<3*ROfz|mNssuQ70%fS=zo$lPmD#9tvB~8(X&?qH!847?d!xrz%+3gr zwPK?s18!mimE2!)I&(j);kOEC<5?z9^Rwnzr?^sb#Q@%c7H{LFvd2U~;6bB@NT z#_C+G1fnRO8Doxq^9%Aji^MJ`BN$cMlJXHbIj?-SoGsstq<|})`4fxr{tOEvB2naH zZ?hyBDH%EE#zsJ6L@6vwVpUiNAc5>Zl<~8Hdng^i7?qJgB~@V6y2n=z_)>lJq{z!7 z@Blk%)j&{cAWiwd$5T|61s(+;jgo+X1MoT=h_n>}IGJPq`YyLUFn>U?J+}_cTTTY2 zb&;M}0U(`Ok^6aHt>Z1ajr*Eu{BGaAE_1>j`XFL*do#Zz!8_YG?AYlGtxx%NMx^SCYUzJI{~!5lkJ;S!S} zEZ93o2_PE@7uL8R4!s~`*oD+rq7`%~k)|zV(cL+3UnMe%VaFrb-KoUj>3MbdftnEr z=1l+c4~?Gr_~+s)fAWp==H66dRWQk@Z`{_|m5VY>64AxdIH%Ou!9-R}WFRVlwZ(JY zR4tr3QVty;y#q;mWhC1a8Fi`wh$=f)`30~G(3hncTA%5L0bUF6=UH|ELWzC#nTBNo zK^MJdo4uk2As`H@G3LQ?E$455e=W=eTkp50gcebOyeotl&_Wm|%Pd+XE*izgSsUMr zZFDRmj-*LaFfxprO##l9v*m0#IT>J0j#2&U8xc_vSprCmF-ro*W!ZRS9=1WLjMgF0DMEd28j?T+Uxb|QZ5#lpu+^vpO!pA z!EXy#wc3+L`#nEFyedgA?Ce(11)B#$-c8&6H3Z2aXTl9N?kA!s-r*JivO*Q#XxXr7 zcYx-5MBSdgo3ZFo=CAQ4Xe6auY5nqzXr+Z=<3wPE3}IDxEK<}L`sRP7+)yh;0JX^U zI0cgodc0sZTQEB~;_|hddi3Tkos}txID+}s>$-oO((OesZi&o###CC|z_KC;ElC1B zX7c`LqKl7TwYx9Bn%yG`V!{hltPwG`aQZJ>4A$URTIrv@E*opD;D?#&p9rXS$ys=! z9R?ZH`%MPC0|CE0Ai%!`nYmsUz;)~n2WHk!K?#5r{rQGw;42wbkAd47B|yhvbSeRa z#AXc?8{;_*$-k^7$wb-{LRC8^fy1)EppySvYha8q0-mnpM)QHJ3XLL|-}tq?&;E`7 z=I~#9^_A?-bR-b~9?qD)c}r&(&zZ4Payo_`#W2$`B1RBnMM~#F5s3BTDX^msqW3^n ziY7yUi51!ZRq;^pT1vaU#%k=2@Ya}xb-vj!5-W`cfkrm~AaEtDNC8D48K&1oAk6&x zF8=kl=(qp%WB=08+%YdFq0*+A%8z`QA3mBp^RNGmUpc=wxnoQ;&-Y71=4KE@Kz;`N z&z7_0A%r|4k_mvL`TV`kWxLiGC&tjQ?#k(9=|R9q*yk>22k0l?n~8j)Zhz3s@Heyl z4f3Ex^oj&wLnYirvr7Ti%m14l0sK!Z#X$!;ADroclY^ijjX#} z;;C^_r$-cQWxhVhGE1a2NLdB#R<t!p%*Jd4C3US| zty9#({7)5hN=-BBJV7>JFui@Ci&t;x;WC9QG?N@fVqd-C4!`^@cMBu2o!mvw;G9;q zl|Ug!WkNRwZ?4~4n?Vad-&C(Q)UDh7d3F4( zYyShlURB>Q?*>p#<$fm~R5kd;`&!rZH(CS+WAar1!FlnnOlx7^{{*h>jkCuNXX#Fw zLGR3>H(t3l`8Vfwcdi=~&D8_`XUo}gw!AYIlGZslAt6bc?qp7FV2;Z|P~>+iA?hZ9 z^*ZcqY099>N&7L`WpWxmYQlXs9?jx!mqVST1f7rTj-;71N~@Y^!9Vq(u4TE8<ma7e4** z_$i$;HI24ZBK-k+WOLBo{K4V~=CR9W_rk6jU)VLHy&V}%#}bWWv7-nkvK9ExgXjFe zJfJSS1HcPF1JHkR?<^nB4+8qqTaDho#>okbPW&(O?j-}HosJFvZ$m<63noX(46bbS zSeu|gNO`O<~IQPinc9-6dtmcVV1@q zrSL7upI^l@%$BW93qrtJ7-K~iOS-)&V(|XA!88U2GfjTxlcV=Md(B=rULY-=r&y+N zFTLpwZr-6Hi8BM=@*^N!}K)Rse_%+X9xsXBk1tD$fl+GTrpQB3iBC zXAMJT&3~(|Jz0ldPeKHAk^%2N;D3Lm8|^P{dAelSI5s^V*$@o&a1f`d1h_AXf(EU# z&e3tm0c~m!DW`PM^*vXiV*hysBM@sK#)`34j5YZ)P7DxPF%N?H7Xg?-uUFX8`&Z*r6o6irfM+gP)x3gSrpzJ(`}AdfB9iPt%geLg)y z)Uq22I+Bj8TL*UHmi&dV155|6JJiVtiQG<{$FQWK7m@Z=iU~SZU}VQYL(sJje|N9R zHRYQgX}ww6pKFML`}Z`zFZ}_wNxF2s$8HGK&jB<(EX{FO?Nem4`*ZJ zGrV{23?PuCXf;(+0D`bNaDF$_5zHJl$>5d=v!glFTl>0LBy{4*HIo$j{U3<0{LqKu ztMIb_ry*4p-$Y9wqZl^Mv;U?Dlwl>W1u&)zsJ*BV@r; z0J54=*m!u-^le(--kN&-Y6 zZi(!BzAt|AmwtTozT5Y7QJPW#z+1Q7?5*2+d~nRwHsl%jKU>b0cQy%-gMPIE_9mrEli$z-w-TpaV&MS%*Fe9j zyZ3hCyQ2g?Bpyg%W6Ba=4S-c(w*{cZKQ=azHM{r^Hq-%4CBlj6nD8|RkO7So!j*(T z^Ecv}5pYd-!(p7l_GjSq>483D$Iig5ak0w~rl3a=(DIa*;j!w<&lAG_00e%FK zKm2G-AQ(z^JxydGKZGMx9hfPYIB1eWmkC^w!X+8p;W3hXM_l@cpbGBoApRfz&hC#* zcFmZYyDI~yD^;}?GG8)N%>(1ej#2)5^I)1_1sC0(pnX0|wz( z*_sTHAtYN@Swri;Q)E6)EknL7@NWXu6CTM{zlUu0yc{UO?>jN8W$rTk>2{hF@DM^` z1wSAgC;?>SQ!49TdNu7n67yOE746naRBeKCruvyC)`+=w$?QfpCy2NC?YCKsf#874 zzxi{MkNm=qjGjGSuqp*eGU%JPbapUfnq<^012YG8jwDx1MLzKNh!DU2U+Q}xG)n9; z=Lxg_UD*?Qb1J>aw37cT>!g>T9rMI=<@OY1X1>V8vzDATCHEy@uO$6N(3ukng_K{t zT7It#fM6iqFF!BU0Q8j$Ugp0d4$8SX&5(^EL@&GtPk!J@JoT~XT1jCuz6&z7_0UA2e^opU3S*2jkIWhr3gEdWG-;Z!%PImw+L?UWs_D2-03ZlQLh6oTs=vuHwc7ghTxG>w!aO@b zW)7M;AaQg_3b#z4^Ch!I!fd{zJ33~1`%o8223H=DE!zKm&$H2`XWkQCWUdT2^>CB~ zkhjA!Z`{I?@kfCn;TaXn))m%fs ze@KRPox8%X1cj{L6ov4`zhd&|YgH0p?Ss?bRFR=T)Il#_wR`{RukL$k1d{(6z?X*p3T^oUl*e5HcqodRebi+K2rKv0BMh3Y{z%O~_dE(JzkmYx zYv$laF`~;CaB*j>=byYRkACUf^3DJ4U&z0_eiygn2vOc>;%qrv&X#v0{s%x+9Tx;Z zXSO&1|4l`4m*6Vlm z7pN}`S=B0_CGwOL43Yr>z`%`yY+chWGQbN^nx;o+#-aW(6hTZWRb=L zDFOeLC{Z>hUSyM%H#r$A%mHOkpTbjPjfQP!_=%9y@B|pdp!A6mn$okbtHCQff+?mN zQ@24izJaN+BB=upj+j0u3czPSjDhGelMg>>ANiq=#E;)S)MaFArP^C}^!UwNIy*RK znk3NFQMGcas{^=ZVnxs@vGI9BR+9fFJ0lIIJ`7B&>{OTQKZ=_AGN_f%jlZc3$g}Rg z!@lR0z5@cDO5@xCsRmDUc?~6oOl5< zmv?R08DlbvFnZ=1F5fydH~;bH@r9!~=Hn6KI6}m;T>sf}w!GUHI_Jh-aapMzD%#Vr zMe*hT!y8$$qkh)TB zMFqmTZU9_|>-vDXtln<_PF9RUx(J|mC%M%LwpVrq@Urn;=77D*e`y1|9ykA%4-tB~ zf$bQWsH@Q;+08OEig{SI(HPRT(R&!=83QuQz%+wPGUy_qJDM|{&6(ah;PUmG?r53N zmG%ABz#PoD_-j8q`QXp}^!S7BfD3ExUx-SAqZsx*SM9kpql+UL=R|7~ghJM?2F7bY zqIKtJQciqH3RbXkgApqSKtHZ$$p*BK@9mkv4Q|3Mujk?2xn*-aCfl6%?ziRCo>my7 z$(DgXy9CW~20qcHHtOMN92dK;-63D`0W+YkM?$C6k8+4Kz7Ddj>P2BcZz|~>%A=Xi{g|?ZQkdd;<6`nUdk`U{8m5X zgB9!M&tXP_Lh6S3>ZpZ zoG+Um(VA9x4}}rH>Nw0#!pN}i`s9FLs%_}2|)8zq3;$MLK`5o?+tN*^(DvihBY zB?moiY06-!_D?O^zKD1h0bv2WsDjfm>@!c8^A8LB8-ZjCrZ0RrzV^3%ar)84f@wJt zBar&gF1l0d7eHvgV_HT_!E@@wT60IJ{SPeP+WFR38{ z$sF|j4yK=c0q@_L$msAG$KQAZuNS0wYz1beFT>e#wwx{RJ_dla&bet3{zIykee_jO zol0|thIrCdSKsB>&r)3=fe^VCUv;O_n;q`_#5{l=VzTGGP7LD_{aDdXucI9wdlCf1 zfNlh>GJvjsyD}3U4*yN@;E?Av``_&CSMYA02R14B9AfMgB+zAdf&`Rnv$}sc8zGFX8SU>GH;1 zovYR$Uj#@}=wJD<@%w)Cd*W-HGrgbLfB!se?hOv57wOSTaM%h6Y2 z=T0TGoB-$#0YC$YfQ@kdgChb?_2%EGl%fZy-ap{KnKoU9_kff>;JtF3zWe2nho+qD zy!Ubf!`oJ_bxoAP#7KY5#m2vUf98K(wSWwAo^1#m7-Y8dweB5o=`v3Z@_?7f!r)Nn zKl#!4iJ$z$=;>vO!0+YFJ9_-qZ9SeXke0@FWmj4y;0kGbK?wMnZ96+d{`k?fMFvdWpV~l?46h`xp4?t$iGjU}O;iAz^T~ zoGoX|cMkqnRjaBasTBD_cF#6J`7j0m&CYgx0g+nm6vFcH8KUKe6kkFn!7C{!p7Twq zeITLl2LA0XeH;do8zM4)hud_^TU#2y7Ss#J!EO^lqT8&WeMH4j;Czx2fei(zTg6yI zx>jLbR{&Xk{H-9)tN)k&>!lS+%FvVEb7lB{n&7TucQ43>RI&cAb`pjcupl4-yk5hN ztB-m1KlcGxX4Kh2(_8yo9L$(hnU_5K&z&)%U;CAvPnwBD4^mc00`ml!C%N!jYK2B# z5*R*+tO1JRs|5tIE-fot)_$yD9fn<0!^i;HXfOj(@(+t7IH`xiX>lD7DC57;<3vvP z`FkQI0B{Npgr}(R=sT*7NPx{u7;A*uGZI-hOIN83mSvTd$sCNwPCt~06WrOA@&EXD z&;7)cm(6aH!c|=XQs}F1yTkn>CW}lCidn2Nej%i$) z1c_f^Ql_7@QFBRlJ5!4n%zAGAXk^)`2wL#@hJhM5^;fviq!ufD-w)lN`BBQQ^0;+3EKL4NZ54#t1@b@}?eBOHOC$o=!LQgi^A zmIi>u6Oz&fmZ2dYTfo<^yKkY@;=AIRhF5r@3%vFw!`ooJ?IX|)r-`mQyZ)AVeM$Jv zzuAY)xOzOjxNe}SLi2cKMTISCfo)oZItOAKrCQOJ^wZdS9vD_|CIylrv|n?7en;~Yo+rWC;?W1 zW7)imfOKAzLy6sCzw4TDo`3}C-^nW5ht?~fJgw@y%9_T$?j-fIo&+!*AxaWtkcTJM z5rMb_?&4Lm`>Q`Y`Oxu#S@mcZ;9$n&wHt1B<1QC>51Gv7n#~h+nXB5&R+4(vAT1?5 zfmi7ZkSqSBp17s$;x`IKU6DV5%`hFQzgDUmCcxw_sE8(5z_U~u#U9B)+)wd5d z==TVEQY&z;ReM48)+-dMMkuB@!t*_oYZ#gJI zs924Y#d)Yq{{|S5tpw7ZS=Gu7ouZ4p^f92l4M*3EiQ5_SZGYm{Z1S{O!j893$J|dI z%F(qZg_EkUWRovS%e0-n+gUxT_HHF)y;s}-L+X~LX*#&k*%7Ryls5$b!INA135U|@ z-mIFi{M1O2B6CVkrxKG7PmN;?1Pi8r^WUC)BvbIe{ojxOcpSrOP7=$@*WJP1RN}l1 zs}arX+NA95XC$ABj1dUQoE#BKyJl5#=qv(OW=WNqla?fJ?Z;o7c7kP4=(V|0zm1e9 zr-v6!raUP{!)gP;>jHf~8qtNNNP{bsa=kTe+sEUP-{S z%VvJX$(QE8E3EaTVUgI_SNL^SN{-&)Y~m#AZ%V-WedsxMB8!{6?QVT_?Wi!Q!#zn4 zc?o>P9$ex4aOL^>1CUc|ZZ8j{Y2Zdb(n&M^z3m}4{OZ;UhGDhuy%)lOqV$s}0c6wX z^g1N~h9=?H|K4l%->(AbR03=x`|n8wbhHI59hpViWG_8(q;iRO4myruA3Y}%DEKfZ z{Q`Yc4CHV9()6Preb!#OcgUqRd3Ju8z64c&^Ns*0e;mfAXEa>CVzDqo=*bQK09SLU+Z=9 zRKC~ZPXqq|Qa%5Gnh?la@+#=^|5O1=Vc<84VL$o|pL@?0T>U?P+x+(Dza(Ft#2Cd9 zqLNTJ!$oJy+45b&0FW)CR1s0Ba(pc}`aUy|&^Ms3_nnvh_smkoL$%UTZ51Z+*^%{c zj$?(PUSAzIdSvWe&-ZtB^kSnVqM<(M>HpO!Fj$pa7^3J8+S+!N4Pc;|!+;J*^_bU~ z2zGtvv`K|#cqJVnA-dZGuN~*gYSF5pW=Dh}?OjQCJSpprvF`#g=rOTiOUFo7Mn--s zp&I=AEsRh|6SWLL%BlcVlFU3fOH$};j_l?=T^t@G^#KDFFaq<#ABnEv;kXKmDmhy) zMaK`%?)s0Q4P>7#zvTz;Fo=MSy0C9u9v~+o0yZTG?*DnYKP==%jt*OnL$)@FJY6q? z;f$${)&z*F{-(iG4b$l)>5Z@=jd-oC^6y(3L#bEfkp-6BD@OjWb2aLd;^+g@qwx#pQG zYce0j_f={`Y=mAq^c8S^tG?1a+ZBI1-xHwG3eaoaSAuT_S^h!`P#PV=GXV_w``Sd% z^Xp;J6HuIkyLJheKK&uQ@Xa^PYyaq9nSc5EE!-Z(ho^-`)cJ&SXh>>QQ$p0R|!+w;F{g&zl+Ij;Gmu^0G)(`XY}fKe`y|f z(}eIe@oa~rpPh2f6~9prX|Rc!=@a7X#cIKY7x=pRP40O_*dG*+#3L83nao3Tqb$zzq^OJxN(=q&eh|z26D7u z`YS&(dEpm+bo?A=56Jny@jw{GVxM{3oFl-(h_qen?=^Dpx@vKN*PV1l?5pGaEu6)B z_B?=8kW(fC?tcRRB+7v`nco%ug_{jcHa;0agUM5DOSm1Ww1pA?r=$cpG2tK^3}Lmh zWm~I^)_Fe>`1c#h`m0LY6N1vqqWb`~`s3aamk#fY#Ttk%nf<`W)yQiv)Dpi zPG31z*MTiPqeWJd&9cI^ZVea`2xUvZ%4nBbk{S72>`Dayz4t={-)bOv2cEp=pO6;H zD9b3*k-PNxMO^y)m*vZU@hV;!MTkZbqBG!swwx{By^E^aG)>QmmPlUBD~Wk*7vRoioR0sm&Uz1eoJi3b>X6t>;{g2^L19(Eiv zTTH?U+X14ZEyId>`~4)pOYY)-Z~VV8g{VS;SJSg=QdAZtEvg7$&9 zv%6AM`Zl~ZzU{9GZLC?l7Hd1}U$t7&+V)S2QURxR_N8nSNX?y^m#MnhoVoM=F%v(? zbqWfBU-m!w9)dmN+0EYN% zB`94<1PpIPw;g}+zzBj3f!xM`^n`izQwRP7!Le+nQr`}kZvfOcPy)zFlmHtau?!ad z58l6EjeLd(oa?;VjoxMB8`-gRrS)d5mg3!*Tzq-=p3Y(Feoqf`F$Urex%}kE;wOIY zheyxc-q(e-`5fjHeEp_7x_+C-2Q#Keb4}+9WJyAoW@M(MtBT-J71E;-HC74#!T``? zc3VG%c)h5l=%i2vl;vlItG@_CPu)@rSE}kNd46CW5CV9hnse2w-!ESmy$-6rhsrwt zRdwho+7kNvgp!8p;v`vIjZAX&-+W8H_R8D1d2WiS@~qbXY&l!Ln->vL=iF3PM^%Pc zgd#>;o@Q*v&upuqJAr3Q9UxxI)MjhIF8M%11<<7wkoDeFoo;C>w%_TOCFt-gWT;38 zdHXdGdM%V|eT982{}3ttN<+Xdgv$YrgLvml0yr!tTj|TRs@|U=#PgFtQmI3F;#0r0 zyjixeip^M+XNrb|yRECMNnaI(k18Q`W%NV;1d%$|Fir=+As= z^z;vYAi9EMrp7!R%vcf}C6_2(Ka#?*p=yC7ehE$C2f%@iw1hqPk#x6H>1aDt&u)v4TNf19Zl==&Z|%e)6;4{Y z3u)8Cg8s?8_YGM^s7jl)@4G(PPwh&lnoyb(t@xScfxr3sjvL<7UCMzN2`33@lOCm+ zo%pHk=FUi9cOp^Yyi9qRMgTquAOKS8-}~j=PaGUE`K>=nUfrEatO_O>^p&^W;qFvo zBL)CR)`*NpFivyhKnm*$Rxg8Jye`ifec-Pi$nOg}OQ2u)1(q3nk-{oR2?6sd(zhUx zFet2ug34w()Uf*P1IvQCT8*H^v@0OgQ|r|%KI;xY6cL!nz>FeJcjELt^MvV*gPlJ+ zn*aaoy=kmv*?ArIt$ohDZ>XWG=WaH;$!<1Du}MlCnk|kXWl6C$Tk=3tvL$(nAX$iI zCz6c>0fHnpU?c{d1V&)wkAWCL0z{D<19BWl@DNL}Y)i6Y8ImPYB*kWTSJ(8$JDs!l z%8xVLz4zJs4ENnv^{VS^@^w|cd+(X=IeV>deQU|-{*LTw%a3Oq;~2+-iT_1}d7fV; znbd6nfEI}H&HpQ>+3J2(C5g}?S1ohCnkfyo)v_dEE0a39Dz?ac-7cKbHyN}^fNK68 zLx7>b2223yb&C03eS~Wb1P7wK1bp0Y&$9Kic8b#UUT{qQf~JMia?CpbF}ix&Hw4(d z`sTNAC8KM@0t|oK=WJ(X%YzARi}%a{5n&GM)Fvg(3LM3n>vhA9=x!?slMT(SXCv>J zR>`8yFBW4t4BMH*rO}WsL=5%`hjS<=3mGnRR;Y;6`>>)MxssaJQ zG83KW>xmF;;0*^KxGftU`hSTO3#0Pl<_p-)y}kX_h%#V!7XUVscK1>A-=)_7;mg^4 zftyMFx3ypAs|3Kd&siV#1|7Nkm(Jlrk>+z(?PJPs%I1Rq;x%XW23B86T;>1s!1Tp;zEbm@iA)Sf@IQ`mjH9^2 zX|1OYa8S@n1zKXoMfr{1V+q&Ttw)b#sahNLIX(d8%4`)tGpNjZ^m(_xx>)DQ>=}^1 zH#eW|x`OV4VWywmhv96q_C6K;pp2c3{qKdi&Jr8AIV!nJlvmsD5yT$uGz)RUB{H9* z{W&l`jcl2=y7BZq)Xu8+T>$oXpqN`&#zb{rqH+Jdb}cU30aluNzM`JZnID{()y)Gg zY>8o_1SfN5AABKw^!caM6+1L(fS5D9Td%skH}0&us! zXb7WH3=NGfJ|8y(cs6QI8(gKMwf z%`IWGOTN<>aFdn_=U}z^VM5leL|uz=2uAwkpe_4{b$LeV`}m$$WbQ?HF0Ut_MJvDu zUPvGPmXA%JJ3Qf1CF_UZ%|kQ)%JuyC#sOzXr)ITSQs+5o^xCV2bf;vVv@vLz0K2FH zCpp0G2_-=|_5u~qcb%sxw#&cN(SU37sLJfmxDr^qpVd??b|tZ3^%+=ZgtdjXN)k!Z zRMIqoy1J(yzr2$@_0Rro`b)q1#pyp^W|AdfVn)gTIL0xK_NOyNz(Pk=hxUa*Fdgh5 z(qbY<7jKA71XQ5iA_bfkdR2LcK(N8PFrc*ci~|`EJjcMkxSj=TT|Y}g!*?a1o7mGh zMsDu{8QjDeMC)bu?-<>50Qkmv>jL|mv>5b#ZR=PkEIB~0MWEk$TiO6@A_@KpLI`7q z>Pe_c{m|^PwK+EJlR{}50n+}{cD0EJo3T&Z<+#*)>55EkYnpnXRwb4e>k2OSqT zTebaM6RE!38S9+X{@((+B}N42zdgQ8uoTp6|K3LR+u=`jsgZbBZVUq#f-P)D?>h|c z!ahm+(cZ#|=&g(2h*^&4`fb1#T0x+TfPD`~*S>fy0mI0LmN(k13RSKv;J{P`)PFWF zTdO6&b}<4(9=eR3M2V6M1_~8KB&Yc={>-J13x$9G7nfhUvX6<@#iQxFj z_culL-tKF4CX7~JtP!b+3%mcnwy5!v159o7XPNXW5Q!3*q%wKsJ@V3>W6A%~uk8H4 zKzf=ePNcg(b{yjv#{)J^s^kneGP1e(_*V=hl>GjfZ8bAnC z*+3X@D*nxA_Quu}>w@U z8~9!HL^fJ5dbDL+$ZNW1;fRqcxg-4#C<54=)VC%GmUFjiJ_dMKd&qo9T3QZzLIJ3@ z1LRXb)nC^$5H~ZjlKg8U%yZ!?7ro4=7a8?zDf(p2>~wDOlNqx&56t|H+dOq9*s92N z{{H`9=e;kyFMU$4B*#6h{#UIF;UJOb8MS4jKs>U$;n@e*;Vn>>jTRuWNx8dO@2*X+ zHu5|}zee@eDk*w(B*?(M9m)grtN8noj%VNv&`0Xuv(i6c$I<3hGC&D{Gb#bPA~0iH z-CqfS=yC6Rog&E8pf8CNJT89g7uwFP{T&S~(t8$^>I(b4h@LyzHWR)hkx~L}gf|Y& zToO^dK+q5nm|VS!R&;Gk{CwX=oo~g`t6+|ArDp&r{$K=CTFG2m<7pMPPGd)fe(|cgVJdSaU z)WAQP_r$x$Ov%| z{WDOU^Bw#csXGLE=i9vW`r=mqVA8(vH!AvU_vZ`lS8Qd0Mc7FIu_S^aJG-qmg5iyq z&GXlHZWwF2?=)*e#85CW*9olx{qR!jP~G+a^@Uaf{x!i?$rVl6S6N08Y0aw7pR0^| zwW6LcnIF%Y9nHA9b;QM2uIuB|Idj|iZ@Civ%;W0vAAEWGtelvoQvF*L&Wk3}hP7G~ zVP?ne`A1!~cZ|6DI7>oW!q+VTfGvD6qAyxR00t}((l739FxWktf!+}NfZo7=3%8~o zTno-4GZ7oHg*e+?24}b&HhJ^LmWe%04zTI#0TKXbJyBR2^!bK0aC;qVqawtN0^Q}) zP-HrhWPcYE(PD7HXnu-Fe$3_b&n6H5==bh^umZysXg`^A_390Mdh3vjgA*=~XIvf6 zna`J^mn)iOCd`d6*QC)cPLK=)H`8?sq}8WdoAp&2Q^`)Mt~r(jfg1^E_xF?5IS|Vy zz<85fvzEEip5=0_HjvVLKxH|TZ+x%$&}%o&-8+yJ!w|MnNcN=meqVo84W-?p?#1RgZ2$~lU07XFjjduFY|{nRwm+*4!fS<> z-G=26yx~JEt#N=+Vj_0f8Ni-wArk_Teyw13Wj=?>7@N~@j(PQJ#LR^FtAko#W zdqX9VGv~JfAV3-*f*k7EWm`vS+I4y=J!Cn-aU6>6iAqh16-G-YH^Nm;t@ENsaj~R6 zIN{>>l-a8{%<*eC&56A=#t1L(VfsJ(#mk?4>Tz|&WTNkt^MAEbhE=vxO``!;GGLwl zRC+&)HCZH^R`*e54IAg1gv4zBYbW*LU!Vb4tCCI)SdS$|MweuG5YvZqxqI~X5Zo5< z=`FC>2DR7YBVFg9Z#qCDs3Ndn^ym@kd#zbLF|DZ-T@7oHc=CqV4uIBX6%M$p8{ccd zFTEo|WJgJ47V4>5mWBw^_>7`w!WHOaqO5q)-6jD)2mDdxTL&f?@ zYQ)qn74RDcoEax5V%GhhMFRkf_gBE*G?E19noQO4f`t;GUM6huUCA$)wMTMk3JC6E( zyR!$h*Q|Bvg3lsin+|tw8?lxVxR8cPE6bK*0If>*x(y&8cPBm4oEAAuIL7h*I@~UW zU_V5YV6JHd1Y60`j2bA9X^}wIM0{Q!fFEywSbqgtwy)ny&1Qy<<#HS5)jcal2yFv4 zQV>8ea2vguf93EG?;s!o5!zG<=$M%HtFSXfaoJ(T^^AmuB3g^&nkLJ|ta6%FMl)YZ zc67?s^#e2e%5{CRT#2rBLMc(lb7r6W(Bzqqe{}k+$?q}vFDHFjPW|OK^s%NG6Nof~ zea7G#tGc(?%F`C@nfV5n9ecKG~YMF9Gx*PYn`a64*&zUO6Q;NRB8tb2#cs=W`;T(28NJ?~&x4j+v!!Mw<-#}WxzprCq!0^w%m#m3B_#HuQ zY6Ft8T8X}B3_!Ix3IbVh^@VTU{kjjod-BAa2b`rz@oY0j_?7GC_-i*fJ2)|`;~BHX z%H&xtI?sh#(`X~c&@(w6@lDb#aiWFS3*T{?aL zX1$>5xm5iMCHYzs&=5#sw3&SL#q1+5ye+--PyWC3mv$%I9l`%N#xaf_w^(Lb_7KTr z?Nknf+OITbaTau%4@%9Y#hcc1-VXul&`k_v5We^u+Uj0~md|@eZqfZ=^EpnoY7OG+ z>Iv0i`_QU$XiF_X57Wjz&*_W&uwhR*Fb6<_5J;zuE!HGRD9yT3#=~Kiq!H;H26;Up zjT&%8vEC}z7qHebR+Ea#10c`IEEm1ZM9-GgN2g}>#%(=2IN`Da_z)3o#OzHa`L0h- zU$C`1_wr&85n1J8-u1TRp;FQhi?(dAk7z*i#s$!59dC{6isXSiD&;}q>3%qR%S1qr zrhsltKM3ca#Ss9~62EW`z#p*~i1Pvd9zivz2ft6OVPk*M(NG^d{(S*H91|3DUj3W6 z_zyWYLx~9QoFn|Li)y@_Lce8>kk*E86ulOF<+}MP1Yj%su5?d2217oiu*IUCM)27x?pxPH~H;jF0bE~nbzxLq?BN`VE&gs zzyFbM`S|pmX2w;bYNL>QcekU+G!>PmqS6$qlnt?QRalOV!N&6Tl6(VedcQynd^sdQ z>kkH@X>@td4+Uv`WHB3_qd^2g+Z(Xmmitcrpih(dd59Wtwt$nnqy)GNGnfG{qaPR0 zC$4bd2DF0zh|f&(9)!>>!@E4$(kRILgTYryU>3~3?xpm}|LVsse`Y5|qIJ=p1&Ex? zxO(-bIXOI$<>`X?d?9+V5|d>##*|?ycC24TXq%$EZmd3hTE?*SXPtC2mg!7KGx>YJ{VK2T z?#S5lKaO#Xqc1pvF-BRlU7||kQz01I-a#FT%?rF-rJ)2{3K{#5I8J+x=^wlnMau^O z4W_{Z#35kc2fsHs4WDqQuKYdTw00k4y<9MjV`RJ+bTLA~9ewY}BLAzju)d zK7oWrQ72R^Zj1Yis(Mu)y2Pfks>z9Sg;|pwV??x}WEy(D6n#2pesFA7w+=bKabOnn zCAE#1GcD%wJ|^G!shtRkKQv>v}^WTcfwX6Pi`a6)ZGZ>-&I-lPZLQV ze+XA!d9VJ+FZ`PRoqzNzlb_$;L6Rntj+Os$jAI=A=fX_#Jik=kY9K-Yh3^$nkpQJV ziN%}-%JCLj?5yoM68+byn24KW4TkE}7sk3TQzjT?Io^@7vyBbccW< z-Q8WILsD8mI+X4ljFgm;ZloLO4y7BUV}jD%&EEa~?^ig_Ip?|WEBp62lZ3tjgQZ?m z3py0Y)%9--Cf{*j9eui3EUj100)r8vPDi#SWt@)+(X30(T6i1PiXL=0e2~#FVE3^IT3ne)%;3O?yg>QEo zDr0xVr0Or9#PZ(jkB2OG#XdJA0^E7hyb=&@cYzWND89&~I&s=nj8g;C356qYCKW(F zrq_>z&D~B822m@3t{8zQEz{EtNH>9-A*=MXf=0N_56vCT*&RQCva3Lsk_j-{op(== zhZ5kypa=8by*o%Pj$G!S42t+GP%B<{WE3Iy_ZR2DrwiNevk9?NkxbW=579q_5G{L$ zE#vz$`(y#Go6SGr(%!-oz*t6*DlzR2{XCTCG0T znmm}Z0k9X#0f^X^3lwHOlSEtv>^L&Z*GTH`m1|EfXQ|-qQVo1L*)RRIYA?&5<(U~q z&|ijlzPe&>0|0i0`jj}D9{lCOGX>~>KY#i)+y)*(otI3g-ACnSg)1I!IyT|SovF)W zYGB;hegR%R$e!Vg6MXiBHu91=E>#iq4E4I6048Gz&}hifZemaz@B){%#2vGe6Di%0 zY3(N8PN3kbp}bDFlYSHRx~AHAn^-MPsV+JD!x=;SimC30S3a|DK?%kRs=8ly_4Uld z<9XwLU6LC5!_A-5&u^tt_1}$Me`+Iy97bYk#ib5o@##nx_LCK;(%;kNtwMz4taKH~ zNCE*C-CjS(aWz_v+0}BlEew$Ss|Sd8p!}jt?rO=0KW;z9l;;LVIK>Kdp-y{JH(hsH z?JuLvDrwy_jp;~<>6Ypced|U}VWBoy=u~}0ZXlkAi7ZPOQN$d%k~exK_K_#=VH?J4 z`fU1A|L{eh%RB@DQG?+ByAIVtM}Ctvgkpx^BT2gog+y93IE$gy4G%spF;6tytG3__ zkpUh1$a?)^a%{zxQGAeku&gl!mm-G`6W1;Cd!Svv0g3m?L6Pm>Fd^+#{)p73$Oyhh zycJ3U2Rh!#;E!jfj!`Rz8cJ6@#9*JVq%vfV={OJ}M@>vXb?bMxR2dUBg;?&z{;DUw zDJ(qb!263;MH^R_{^Fkj%!xm>4FgYYOHMP5wK_yicMVNJVTuGZxktLo<|_r4JMYE7 z0765PZ#+eEc7qUYTK#f{Cv>aBe$7< zy#($XbGHJVC!yi53hF;7$k7V`=&;I6yjf@-pCNw@Ic7$QL>}pFCb}llWIE*OzkBay zh!bLC8&Y)Ok0$qZcf8w6dkR;hEwi>vUqrR0PglKRbik_JFXEMoVD$i*cHspQ^n2AW z{rcZd+>Our+Al<&*`|*7wwnG}RTMAldcp0xd9<1K#o!sZ^Ma(>Ct8C~nY(!lT$2s| z&Q70Y9`FbmSgiP;$Pw#g{W-VZiSj1^GwRowKxg%(9<{=gC_%J0%~;Z2t3DmbyQo z+Cb`vjx4uPV5d64<(==Ta_bw9b4!zQZhB7^*>S9qo)H1HTvAl1A*WwGG30QGeWTS< z9cNL90L*R53-1>??cBW#GTU9}-95-1dO`6D@TSG+1T#NW!zpS0+_s~!!wHTKZ-HQd zs-iN$!z=F=HH91>xTJ{#&6nWd~DJOd8H84pGspPp`y zAZHC!nVrvj9*&$?k)5uqGkmOfy(QWW5u_>cu5=ZT0BT$n(x`qw@!|5)~ z^AKu~*y?rDWSwc00Z*|G;`vdtv&i{^GV3jl@~fAZnw<#APNgM?KtNeIqlEYQ>fKYs zvTmzzp?)QOX>J!qZlecDB0kDrjK|$>s zygDNI*wS{(4USS(OYWl>QkdL;b_i!lbwo&{6<=mAfD3!tX{M;D8~yCFsBUfKg4c7ZV9_Bv|TPF7RjSn^g^SQtIT}7`vPr=t-m~LvzOm+?z zpfSAs1FEG;$WcK~xg^gp-;aQeB7Qkk>bf<9U_!fY1|4N_+1!tv!tp@((IQ`5x(H03 z8q|#PgjO)=kMT6+%vHB}F1h;n;IEw>E-dzFE^}uz$3*hmIVGV9WB8#t+$M}gCPVCe zLKZ2}K8;6>F=>q}AxVK5Yvko$%Sq?$$d~y*r(ZgY>NVk}fwFmPqFWXjT3mdHJ+*7J ztf5mAV5g?72WOK4mw$g!c?BK75wfK?WM|hKcQu@08rzfR8F)LV;|Ij7cM?e0T5mcx ztH$Rhk>*oo@LinS3CHVUK7FaKJ$|bEshz4R#Pzk75Op=>Lq-4jN%xjpe3dKKrOMQR2 ztu-F9PxG=KN+FnbtI4whF$K4d>YOm7*@Q^V_?Z-27~0m{g>)G+D2h zzHws>C09BsX3OT^@Uv`z=C_4BBJyvC=1)AK*8HaCY{eG1u6jz4eL$Q5m6p0{v>t$m z9SZ0D{;^6fkF!-&oF@j+t#Qw5`c8p}K{$iw@n>Fc_nCf>8Qj|NJzJBLY^$d3gkasP zRu|2P?|yvelNMrsE~M%lI{%!>93KN@do*$IBYm)+!2-R5-GESjOajtwz6V$nGJGP< zUGPs(-V%cYpD$q5mcZrwxuYOEv;?D#l`3H^Uk@U4S=~{+?>A1U0g^#rToi- z?E78F7Y~;8{5SI(b;YgRQc875qRT}wlQlwlbI=N5wWd*p(j7rmlYX+i4(*YveJ8+L zJ&dOj@LTGfU7El7@qO}xTI_UGd(qFA(x0>1%=O=avyy_JYw>ay2fRO)z)b`{V=Lc5 z5N4T|E-ZaPJ?m?6R`&6%lp=5TH>im@pOGV`Ua6t!(J8zFP=ht`MiFD+w zz^z3sG*3P`jOi~4uct-1buhU9Rb8w1;eV1!I197jh{%|)x9V*|Rktl+dOqC}Ty&W~ z4*pP;-Xc}cNkUVslYyB)d(Q^zfnO|2q=|Qq%jwH0ILQU>&OagA4)~c`zK(DC*!-|o z$gwY&#L~@LINW_ZCeA`U#plC05qbWguKStd+;(c*Y(Y0rPnWW%9xVNvK80VaaO1v6 z{2r3m&-AjvMGyb;ApLN#@hwf^f4s4!{jH`CKT|+9IRnO9!ku&CZV z(!|xm2uXnPIbme~yb_8SD0)?ra&LrbQ${r6t9j9d^J^+@1@uPcr`4PKzZ}P_c04SQ z%4-glxV?bbQ1mY^HIuPw1GLX?B~lwU>eGMbp`E{3`YAe^Pju!GE-K%`x<_F9>NZ&B z!SqRo&tkg?Nr_?+t(-5vzD6aTx3bI)Zfadt4mwba=$Q{)8cnMrbB1T^B_U$YQu~tdL626u9*g%{|cE7fuR;@DUuDMv2}ZIOR2u%0~)8Z`H2l^=TTVns!muZA=I zfo0GHxkZxZ4}8kT@dW4W%Uo7yhwi!a+m!Cdxt<(ZQ47k`azZe-5(YGP7ZT})EYZ@k ziArX0wF<)UPGh*!;Rfh9|_hD z-&`iEF|T}scf?@-0*F%CX;FmEC6p!eG|m>T0gLj)`5KIC<)tJ1la9U<@^Lsm8T6`=-C56n3+F zsfp(>)(YLvC!C_D2JHMvt5PDU4mbRG{j5EennZ=5@dCeG3gKBf<@L!$i6VfY_#P?9 z!RAo%yB%6ZW$C(6Irz@$u6HAW>{TbB%q%3H0gV3QnFugBA>>Fl%OeJ~yBGrgHCip; z*kQEl(}Qn0H$49Y1v0znP}7m$L>{Zf#lRouOq|?fPs())yOB(b8Owvb2nJ zUG?uchAEp9qF*&Cyr5>d35%ShnR(w>p(?iKVc{^aH0JM=ATb7j7?JzF*vCZums8Wt zp2ua=Z$bBax@{E`2LEH_TqRr70qc;X`C+2~vx?k)Tjaky9nt zyEJbk*;Q?s{m11N)k}w6lq@{;OGa(Kb2|AFo3;BYe!>YJaL$oQ691JCJaJBsr*v%3 z1z$4u?K_`Tb?c^xU>&IEm~SVrkf3D8;Mvfp&IwqD4aXemIecS~h`wzVRT$@zLRu2k zfO0w4HiB3m+Y$PSu@r5SzI~Y=@!j4Rzv2U?HqaP|Abqycs@hr_l2tcafr>^fLyVs+ z9syqZEXer$3P^vjTSv`PIxoc{58kLF{h?$7HltQe(U;d5wz|j+-2>q+15_IVt>uIO zh%>aF!O;kV8w#>xfQnD3!;Y8BQjjT3@mf8O9=dg2nBL%M2M+D4*@WN;wNAos0=|D3 zeBoqN#$>o%E_(u8r0jX1?dRR4=6LV6%@s0MrtIlEr_cSz`k#eWE{7mcvk^~oFQeg$ zYHp~Hm#dP)CfR-B!oQi{QwmzV#*MQ3f${S>+ z!Z^vtX~pUyA^$~})Z>fzq}3%1L46QRuJ`g9Yrp6FipjiZw@fkC`!bx2T?;+K&Fp~o zZ%==Qs}O)p$YMakF2B?jMF&^c-R!^efRWCMcH`*`S~m{y4A+#35b6S)-0Itc;N_pH z8cL_+doz*JQDrQDQgLZJ*Uki~8(A>$ODnAWIbU{Bo?4m!SMen<&a< z^BriY3{pgQ?PASUpdAXmhzk|f8AIIFd)d0&bP=uKV?G>Ku)59oMr*kS1A#zM++ks3 zKyefl%SP(%xZ@NaCDnXeAjV|OXkAtCKE&vY&H230#7G}YgSDRA%4hAVdFqLuSXD$p zho|1qWJ5#;2_JKkd?7AN-6LGh5GTDTsry*V_bNV6LGt>fMZ-Jr#8mx7D>c~-?o#$2 zK6KIp1Pp2ci1S4&J`>`-6|L}j=nlleSHlxt%!?}d$OHJDwSnY?oe#sM3KMnG{+UUf z@HO`iEQ~#Mb%&+1w~YMWvYPVnXwy~^>zA+eU4sHBcQK&(-0WJg5sOXPVCHmuap{Qy z-;5Z_cmw*y0ct~$Y}q;mO$Z2mOlj-47=QRuvUk3yph|Gf6b_nA;{41p-pD=nX@_m+ z3zPA>=nicQDa4h{gwIRiZvi{rQ^roDE2e`>+<*uvd7S ztHJ5S>O9ZOww`J2KWYgJ*c{C_L_IA2Ex9G7IQOKw>-^WU?Ua?-)`|2#8mX(E+v z!4hW0(FUkqLO1j(7f^%3KUt<=gJlbNEMf^TiG?9|ZZ}o$r-OEPlkz0R2hJz0 zVjus*h+Mz6D8K*qUIbtwK@rP?@mJn@MTwH*EDbR3=;rsBHg7reNCG=F>iGvZJj!(8hmw{XH$B?~cgz9g{!iDOe5*vDr@gTo4dos#uIB3(CV?`Qh z!TG2a+C#!gjoLef{&7aP@TQqcwmUeo5y|1l=B_k$Ckoq(Z1DY=EEFhYv{~Xd`!=D`;1B~iH1mHy!@*@lFBwqmb3tRg|Exwr<<+5EUE7TaOsBQ z?we(arc9ae2+n+DIEo|-hOVf3CC&43Nmf%nQo(~CmXq76W?4Xtab8@f*ZmhRQrIEXaCcXp-zCy`wL4m}bkuidw zMnxEq)~sW2?z=vqevq8|+vKiKd6n%U-EK+$22btgaxBC7%c-!sprx8M?OoaasW>+YrM= zK`uU5$_V&!Zg~m}%DxW_Gaou|cy&Kv7<_VV5gKmxr`kyHJ(7o?eV9|{@sq}_B*>ref57>2g66RRJm66|=U4#GOQSbj@_hCu4^~pO(@_AVZZ`;h9Rh#eT`9H*`mE4#mKbhXJUZtM2Or}AO^u~u9IXJeb z=_WT8sEC=9Dbg9@-_W~Z$6-)ewYJO1AprEF)4|iejT@0|)$bkA~WshtH)I8Z{ zg>^gn%hm^7VWXfG+@p@Td(|lWC1FEI_yBWPA8fKz#85rnxC=jMHws|N5?#`G^w9vs zr+Id()e<@8;tFTYl^o^V=*B(IzsF76y(ga~R!~x~cT0)N<&dMwbwOC|74!c+EB1Wa zU7urlZ=wS~jWJh!o`C8{)cPkrlmY0E+#(X*^xB4h=#w>?Z$du4`L*aWrvFn3Dha)) zqV^}Jhh+o@kx}Oc4Nz5IU-b1-A(Jm!VlDNv^pku8ETu2+le$MXoKW~lx=e?Tn+?ko zaH7j+JK(=#!IwDMOGNRM!Yu|RX~7exjyvxXy-VZs#xq!S*H-mKCixbe(WK1~t zjDvl|CB?k?Md;e(K1evz_4^1Wv0uSo6Ux_`?g1vJF4u^d;G|w z&zL2v5_^1zAX6Dl2e5fy%ZH@-K^bK@f@9LL2+$s#Or8Xw&|TvTE%V`>5w#z#NjBydJWQ!p(8(dl#_|Br&VV6bT`G^~m>-0l}AO}3x4E1v~o z{-m&G2*?*XEKpJ|B<*_HzHIiX`CPz5i&?0?`+#7^nD z)^cYmmrg%28|c-L3McivNf;ML3N-lvrR*)~pf(jemCI{-xAM9oASQlURt+V%$1`Iu zNZ*L<*K`OlP9fdrZ4cNV@K0FKk{f_prwV$7;#^ z`Xy#_wp&eo_Y(IZb_T2biWW%yGX-Ge*e1!vn;&YoS953ieclndZ!7}k%#qy;OC?e` zqw$j%IA{l3;+RlKvMSU9Yi95Cb49qF#Ops553;xTVX5|0t(t6D(<&0(C<;lDyiCS{ zhiu8-Ps^uk5cqzG;dZu|DK~uf@BtxG8sE>cY!J`jlgfG5Z7^fij=)ih_TD>3e-8QZ zd+5#1MDtqD$t@R-H;z2%V8?HM9slHczP#tNjTieCrXEG!zW*m<*FrzlzyFNU`%Q?4 zp}**ksABWW?tGhsrP!h>*Gor*bI*c)N{j9fX(E1U2Xy2|6@ZfMd{=!)s!}JJOY~&JRjfAH2QsCHBbuzzFxs}p>0Myke5xWhslO}Il=!vu$XmRQNMhFRP-FLo} z8gGbf^=D|Z^o?XM=e;zqr@bugdVT!IqOVMQtLxPG9*M02AK#pA0VC1=moDn$)8D(khcqyNU-6G!c89kD zbmSrlF8{(>Zm+3)Y#$IApvEZ*qTXL8E?^K5vAYZM|MW(>-WI8&ZkC8>xO{!j4W?OT_Q zSE;K8KsU$MePtc81y_4Zy0|oV@+n?4go)#>`E4Z=&YqagY7q5#)vRPQ|e6*(nMUudpW))11#lE%>zPE4#~ zz_p3k?|L+&7^S0buZ6|8nLPeEi-c>Ji}E1Q1{v&hnkUvt!S|(os-?2zoCJS$?oSg1 zcetDwO=N-;Ks+BtO@(xeDpvQa`^z0_umP;c;y2xMDX~2L*i?djfV46oC#LPGZUw%H z0C7h)M2bO(o#5r9@_vTA<@)LDcNNLI1NQGT?KjBOiy0l8!;7BRJ<;Act=W-4Bd){1D50iTiI@V7fFTR4F&c90wFYtt{*a30Mq*p+Jbf zSUcL0QV)`|#7OIjgfl+?r1BIv=59nx)ses|N1us_Z$>n2-Rdkv4Q@|#qxOpD0F!f; zIp;it_j+eFVD-8QIcE=-;ld#k@pSIwHInqn5Vd8Ke?XGZ_nHl-S(%*Ts>lt z>{4S^&!B}E)`_0mYUp28%u4U?W*EH(pjV}ddVGY`>JGyXF?yL^0;wI0Ks%#?A68N` z1yoT1Su&)&vSS$O(Z3Zz341xH_74PsEw5yR?gL=~*;BWEt#C!3b>YhiYploFc4$q7 z#408Dh5`8H+DR&|n|`F7a_M3n%QSmJ*L*1uB$R^A*Kx(Q`1Sb0dc~oJar z!U_0+LUs8MWCo8~J&DHODXCk`%Ozc^INV! z^HVyd{FB4-nE7{B+oF8j=J8qgJU-sY`11eAS%BPf>Xh9}KjkM|Spn+yV5~pbEJ#J~ zjK1PrK263D$z|!7Ys!MlBI7nX_>KFxnXwDs&2kpZH!>rC_ze_PIv{cJU<389?oqAX zF<{Dhb8p~GH%UaoktP%Ek~3*=Uk)EJkl*UaBi#)a9rB{!2W{1KNuig9LlJ4VA*oO( z^!2q^o=Q#N*w~yco<^&x#Kpr7O_~ty_?F#ZfS{0HJ?n?Rjhx$cdO;td4z(Nr)fpt} zc6y+lQuWB+3?A4OP3Kh#xmeFjWzSEp)6-!OkLUj#oAbGpM`p<-D`r9wFFmu|jF5wF zQB`Rq>>X8=@SMysZCnDNqkF-S;neF^@hW9_mn@t8M|^qi+%^o9e*kD-==iBA{n&IxPM++Y4qBLS%gtM z#M(Lx>Gp}U`%4M5mDvv-eMfeKM+ixI$B8~%K4E)2=;`sMXLE%?K!EMwvFYJ-T518v zxWJInZfvUe+rW!{nH9>4E8wz;B$&n;T-k@kurLmDx+7J?fC~J5|M3( zTKEpsM+*|poo zJMJY3$)6ChLKY-!GYH9gOMIKpGl^}b!|@Xy`VZr)m?`?j?rZYW(}Z9VEK+Amg9Iw| zNtT5l>64>DMVTwbsC$}7)D@s!n`&63K7`n@!Aw^LIk<8F2lTuNM2@@mxV|!4 zC1{_uyuj*#^%MX;Kg74z)ShvwxQg~>zXUz{`1>|~4bF$_suP;ohRAJ%qehAHKNoP5 z27msS76cbPJt|82I{&|!gVdZ}nYXeY8Dkb&KMJ6mcRD>q4=56A4m4pn3q$FaHZ{WY zKfUWxA`M#2lU5y84}HPqX6tHcrTSjiM?3gMi(AiaIykD)8TB}ytrxF@%+fLt^y~YX z+;@*h?aG)LVk^KaH4zq`Z!77;(_V0)vDp8FLE_0raYi->PcHk>f7VXK%5-g#mn{ju zY8Yt>7|u?VZeGqi$rTy zmW&=rmIuWDg}uW$eY-ANWqu7e0o)x^$x8_hG$+$YFx)_juKOCpQYDi}zMVWdClGzt zK=){T3%aSy`$okvn7M)S`=%svIgi>SsP0stY6Pg#i_QH8nR&)@mPhjX13K}Evs;UO zncO$YtqXFPlZ(hqLj={=E|@Jl0czgixh z;o{=8<{tKXF0C;dPXB9)Va1k%QyN)e!Gi)QWB$!v{@+J1%V#WNErvT=hG#Bf0DlHa zgR$0BS`tE5uR%JFr#^mhz3P{`&F^&`lo1tpo^iF}9ptx*VyF~o`VJnW%<1KwC{uuh zD`zFcNueGem#Ya%oY!Ok@6xX!m8)5pp%Xv_1E~*)pp?H9@!20%#qLUNqoKErn4LZB z`@qn|2NDOY>97nM)WRIA<-5T>j*c>+S%5hLEkVi|COUAG<2*FwvR(IylI<<2wyn&(0NS(tdP zYxxQj>>KYz4Ac|jYSEbzg`Yrch5xJlYw}@jmUMsc;hQXu8ac^Jt)4^@#CLgt_KE31N_Y`V%%Lh7dAdCdACO{d)mHanaAO4I_Fs}mHBpH+Ot{R7zfVE_cc;F z+P04^3hPotOMM_R55|X4-KNJy_*1clkBC&C;#?#2^Bs|!3V(*ap{ zYqA0i{Ces{C+9GJkErS)25(ix{r?f3F@sU8O_}PY-bxjO67&%|fknEGcSGEQ7kmey zbx}A$of~s`;APmm;X_jaMbnQmTU}UjAdZOnCx{Sc?l+p|97<>2bgbokqdzB-O%aSH zj(&xI%kj})1q$)3yN$gN)M72QO`dcnZrR~3s!VDAa%Yj}XWyY^^|1NG+(yzcE)zuG5T1KP_0` zJ02tcwqAKZ#wP-71qQrXlQ{qv-H42!kYOXhxcR?hfx?GQ zS18j#Ckd6Wu36atrw~sun3+8h1Gjt4$NRmj<(|uA{T|xpYIn{I?b zE6$572brIefMli=pmpk}AaT*ZdS*}}Z>a-7$Zh_%D!pYb_wx33PWcGHCy?iL&Dvg| zxiTP^yhS~h)VCKg#&axi4sj5j67WJ=fochKtfD>~5Qx6IvvpWJeFi#c)0{2%e>Oi0 z^i>7$C|$psYWlPutc;h}$KzoWcTcc{?X&x)NrXqI*jrBpz@S-?ee&8oRhvt%5Mit| z>2b7S!m{x?%3J6k^G|;&m1=~KZnJ$Jvg2`1e9RZ71J3QjU=qwPLAA^TYA&qFRWJ1gT3jFz-lV z2<4d4PJK{$HRYJX42(N#>8Zf$d&)!~SNi`)ZD+=;oHSs?n~|tPZyuYW6Ai$#?nnJ` z#kzL&`1e_Aea8#!{(HPcp6)STCl%p2-rnKCA_{!zLTk8g@LBM(M-2ziilSmpK9)e) zb#AmtH=VmfO3NKWFtUk92fCVR&b|{RP*Vy$eeMxN`DXKjh+SUvAlIe_5^`vDmsKXw;4($3_hL~W z6nT3Ew`z-;%c>h^81Zo1%IGMMUnQkAmf(663jCXk|n-blyHpO!pZ>mDxj%1O20(*=fINLjs1Il#ROwFyrlw558Ac!57-`r7jfv#`VDzuh zp<|1wZ;TKGo6Cqh&gw%+6ZV zw>GJLwj_7}K1GT=+n@=ehs-qglTWiw?{~wJ@xfJ<`2tS$q4<%-#MBC?LtG)P7Bs2R z__TLhDS>&fJYw$ZDk#v&Ciy4K{|t;R5i;g;nk{MzTKSo@`sUko&AX122Oas}O5V-f zs^$utkR>w?T%Jxw88WEo6v~zN3+doH!CYRfVG&9f2irP951|JX2}kwb5)(|dM`PVQ zg^Fv4i#7Hy5_U8?WAaG(dlga;l%7^K&YZT0kc1wrTh7Gh_{Ki&&Az!G45QAxU9S|o zPOJSCH5l>}?M;vOIOdn36A>2i#Bph-N*^i_T!&q?qxlBUjI2iVY$JglMV=gqv;jT` z(1)+djYYsKTg*{1==5ZVp9X&bQuPOX2aO8CR#x2rRcTFRZ<#QV+BU9PSOdd#7MhKu z>HAfCEfsDf-pA>feak#Jve;>2OXRufo~WdWQtl$5#_iajO1sU7ko$RAIdFqgD+K_e z48?Vso6u^y-Tupo51cuMo!~vtZ*Q^-l}iJp0;z;ap;YVBYQumldgK6^e8qQOS9hLA z(o8hdoAUUUr6GqH$-so>IJd>c2NOKqmmJTkmKoQlS~80mN3S3Im7`L$x5WH+BE6R5u=t{jM)0XLT?Dw1TEu3lN<) z#)Ks1vpt=!$@CI_I|P#5Vw*3EJ=9Yid?Q10(Er4hq!zrY75r)%$@Cfej(`tYEF-_j zD*DOlTBk%fZm-^Mk;P6`x}qD09S|>9! zr2Ou<5BX^0&#}7n?lpe=5%$+CdgTFHv z)JAgopLKLIzU!N$wff@g5od`}?befX5J!Ra+ZVS)5X6Io8 zTaj;7jO>05neS$^E`}Jl_J-&Smyv%BGLVsAw2_h+33 z`1~@6&M&u-yA|5sK>?tcKsWMwf9(1susXY;P7ApkWBVgQ^?G_d{7*XjEJ>y)sRUn% zb2;r}+F@+~#m4nhvRJ&72S$hfEf0%0aGH7}Wzo}WNa_JK20EPO{cmrMD!ud4oob89 z_e5F!Wu*46P-6sehRHzkERy&|bSxx>zxv}BlMjnlg@JFA8wL`wA-w|=XXHEtUGh@`%yfw53h3U~s`>K!|6h`@o!u}Ad9Q8pR zl|a2{KEk(Lw&yU|cEnc@TOb;yb8(C+wm2e^TM}z?! z15=#zcx0d0kzuc$^<+LJdGZLpKF?p~zH8A2RKQuCWwdyQ%aj1{pXeYYgISbfP=|KW z0WeFT4t#bn8T>Zz9LM+X^3ZmD7Mh#5+V#9f=aje#Qirx`X?d9(265Pm{Z!c`#z0h> zM>zYyJ&yv`E}LQCc6*zzFJ4UEqyC)`B1q^=euO8TFtC{*RiRd!#K# z+(7%2lat5y0WZRUWc#jUvL+im&xn<6Gycaf=04}Sqr`-`vyHZEYrcKWQpx;tY`O}t&Oo`_;5|%ob8DXb z;g@E5ers-$oQt^S4FyaXva9i2{v1D&B(fKy2Fs+=3Ry1P8&W0G+E7L_6lVP~{JF@{ z>b+KOz7bg!rUE<6F%h8aI>`jAA~hy78xE(GhdHc?pS~e*q0)rxbzC`~;kUjMqm)Qn z2ei$*mJ)mk_2LD$|3XD4LZZlvL$WtbT6$kxTdVu4M;3rMyxaELg(1nKYVXVVjIb3) z)Wh71Ya;aAev9>Yde);6gh=A=T{5DUb4EjLUQBt!b`nd^mSA_LY4E$T#bhoBtn_}l ztK8SFK1sJCLG``ztOtaPOU3k1Rs)7S$V+p+D$U$Kpz;HD$J>1+R$Fs*Ep{IVgE*d^ zNVVU=G@#m%5%PmV2PZPMW zXv)&F_vPuSEW!6s1*{X7RormtVgeTTf%GUvWY(kU-&JEWI5PfIzWVkKY_jNMHhBPJ ziuWr0(_iMLAp0p}`tx5|9=2c?i=@S66&!q@WeYy=2}~?(DCOSzJuF_~Ag>v?rct@D zc@W+JdhrQM=41kKMDZsQW425EaTjNsS8$o+8E=ZI73~Oq;-A3Lk_383dq%`M|Te8nHA}9BYOdV%JE>?@(HBk4QmDtBK z2MgP9^E)ySFQ=ge6H7F0c+&Kj-@*D88U)da7CoB!6a3oD4L`|h122sCu~_`qdn9P! z*fRYdHRjQ?-B|PG;y;?{NzMEMZKwfiFySW_gCW($VuLr)%x~UUM(_1lGd|qu=q;Y6 z80B*hR9@@ z16(c%7iJ77W9!l|ad#YguLuF~#tSV7RpjY!l``=7a0P&vLgh=a7oWi`)dPE-tg4yg zKNgZUGuT*#ejGuKTe@PcIhQiI8in(|c`Sa%kISHE-k|HAr@XYDe4J!9|ITbyWq?+B zNG4R%}bLt>AjkgJ5*9EeN(8C_#?gC9RbB z92t}E{>N9!)~G1eR#Mm*rE1X?+riot*|zOKFU;@Wkw-ui5f$E>Ephx^;P(6XwDVZd zpNZoGd#Y=3Jg@rlQ4hTpa3jHIwT97OZ?iMEt7RLQaYX2q<<^C{FHaxWPCB}GSG`R~ zZN~|(p(b?r1ROTb(N?_DTVw9~rASLmydbja@u!Hq9swvQ5^5jD`V}%$!f%N=6^_0{ zh9q=xW92Wkx>VF~L?KSSjC3}28AAs6aU31`QjWAK7yT7^`LFPItp;ah7IeqV30nCZ zy!vBIlgC-QWTF#b#L!Aj3)|Uq^C=E{r?NvY%+5M=TVU3%uFUOdOfBg0Yld}(xXU&C zhhDKd$$^h;5_@SmecFxA4?by8EvVbnr|`#eaZ?m2UcG`Rt$9y{{JRb$kO~GNLsCh| z2q<9HvO^L61j~dydz*gXpzJB}qU`D)iL?Jrh-|0TuD)Bt-On&>$zm}SjNJF! zd>_JBZS$zG@Kb8KB|dC36vjNx=diK(Maj-e3eD{gYf?S|xhV+*e`)J8ZrMSF4&Q7N zF>7&jE>ba6ywn$=9-T-X2TIR8P9CjFN^|?d3l{es7-4p>qZSlhqpB0-|@D zq;d}bkEO3*i-LW=-i4)G8YD%!Q9728PU%i*B&A{Lk`ko5q`SL86zT5nZWh>md4B)* zBi#2~Q)lL!xo)Z-N3*6$Y(otsvNY9E__UpqXFZT?*A$8hCdZp-^xqfeGY7u-pg)sn z6;tGmW+0NW0VBAUjO=YXM_rP&v`PYBeFBmooH_}S*lhgUL2LFaGU!ApZ;C)RVXGAt ziK!g!ULKZM7&L@b-&H7o2$@7yEdj;@WPg@u022uS8nB7o5mx;y(fji5kHO#>43)o$ za*H41%tW(rBn z3;Wn(@9x#t9}1JwAhc1lH53VwS67<`jnEM$(SfUMtkJjI`$@HPU>iFQkf-9R=fLpl zQo|#Zg7fZU7Xe*a>1yvd4^brSb{0P#r-&WQ>0nSc%ZvYzCmg_0oS(k1$FkQ3N&M zBW!*fE{7@M#!(COww)Uz+*9fl0yD#du?)z6e3J+HsMC1@(2S7+E9iW7J3V2M;S6=n zh_@48KFTG@rbm311I{GY<>L^ZoRod8nk$|?(_|L!We3SHZd_xXh6Bi(rui@?m z*+;d6#d7%F9+b{Irm086l>fI0ereyL2;!Gduo#iJ;t0!(R}9%IOV9ZIrZTkwLkUZ~ z%-+N)oA98CTILQsmqiIWP(^fez}Z%B)@!W!ha!t(yjSmv!4)p!fppOQQ&maCfAu3c z?vuqQG@z$nV4&Xt&0E0ITbj+1HxfXE5^#2co=wRVfhxXc0-%&`p4}Y!3S3Y^4j*q! z@qVv?4s#x3S5qjxWlwi8_85!cLlHEYsShZjfQ>audKJ-p_SzdIYZD7W)@Vn}uo@MO z`W!^8H-O&zJ4t~~upxvtH-@|iKx<;|6nhQ4Se32Q?e};=AM+3r4DcTY2BSRSQM2>5 zg>7i^hvOnpoJ%h+3*EQBVlR!<)V?`qbO;mTst?CR)kQt!P@!LbvBeQSlHy1kh*7lr zfgABZ-Nw?)EmG|^4->o+qP%gBM*{-%Zf3)GHgP%`{C1}N%c#2Y-KRjWys#p z7mfz$FPdLW1E$i6ap^u`1kf@1B28@pvlKs}kg)bKx?I&-T^8nzv<&PLAm5>B(3U?J{Og-C;E3r&QquVhxai?E>dgVnhhA2cQg?f_HM6f^*FS z9R?)q)07lNYtBXw?(9Kh%^^eQ^;S?3BN}ff-JZ5Bs;dCofsf11lKvWQ(~NCl338=p zDoG`72~h|k?do*%RVAzc!FX{a?_PHk`Z<2Z`A@SAaBA-G;g-J=*t!@#E($iMgU)2zC=uzsMtWi`_xWiWRNN$3%~oV$gpt@BDV#F5!UW z;zo3W?H7NqQskP(lNA=SIYwoS2gj+2)-PArUv4sA1?6Zu%V1|*?hnX9lF01;_PV7A zm}_v)X=sBCrcX|(f1v1Cer2Rjb2`UAS6KJ=6n=TJOZnoFE}uZ3PygDhMD|3GM7=>= zeGjbgC4Y@oMFa1sk&!NnRil}I1Jp$eXXyfYOMe%wS|BZUK0Y~Cu^TUCh`8E7?!AB2 zYQ%p~l1i(6Z}Pvwih{0m>VpU{SMFDs#!zac8gqCco@U}I9b0I*V|-ojO2lP}@DrY) zitgqtX4@5TaU25ZG?Em_A#h^uuNz*6LXQS4s;WnmNkliTeLR|> zxm*OAv(%ip@m0jV6|A(FF?Cdt0*&n7t(1Rn++uv)UMRa6q(+qh`S>jOKm}gr#9&G< zSvk<_Js&Y>s%X_aOdNH)06Zr@IqxBGt_`2%9iVis>&2ia@4{q;ws~SIJ`W#Ml80Oh zD~O}^%*ayy{G}~~y*M)(389P>&ISN_2wd*3QU>tf)?T=0uIpqFLfYmca~#JjM0O`_ zw6cH%2OUZJ;(^ZUjl+euziYJu0S@1}hc+#?10ucchWJH(K&7_3>2~cjKZAGx+~wT; z$N1L^C?UlRxS>B80|aiEib4(bEpIM|gPxL!4L|^bJHc?NUsd?Up%o{E8JjUm!BDv7<50m1)#5?IH)3(lRgP~K@LI*n1jzFPC6u1yU z@iDE><^3GxyGqsJY4coE6M&{9T2O#Qxd{k4j9VvuLaz+ZBrkkp>DQUz`qV#Sj*I8u z;+vUJJD0;87<3FH$H(PE!^od=$OVlT;|El1e4GGKK4lPp*uUdv(1x#2IIAv4SE%A2 z@xMO`ezPoKA;hyLI;r&Nm&5JQ6|A*0rb)miTGY8B+v~)*ob+nD`tGAGp_2O!PZyZW zHm1lLBkbxQ{AY7A%zOlssLtJT1C(9S&2ynkFMngvMMW;EwmXgj0L4Ih)p;0+6^f1{ zZ?#Wn-J-|b0ZADGZiP-7Ixg-W=lCOfj}$7Gl#9c=*kmG-TUz8XaURb1IYtWNtM)w( zoyEsn*=g?7rKK!j%lU0?B>>(8qZF25-g=^6ENYm^`Ox0n8eZ_^6%OQS>yW|Nt-8}K zFeQvj+7;L2|63}HF^X5ZVA56)-r6I8^~pqB=|gC-t8M+9WFS|Ol|vx<0@9m?iUXdj zg*qh)2D51AAn)n8x}`bj(o(~?@{gW5qKhig2k40Nk>otti|e214nI|K{e@whxr5)! z`e|NIBBAnJT}CrD&4+da(Rz0Hjx{(}JH~lG$qJ;zsRB#vM!j|r%KqkveU>r>1op{U z_b?XT(54TH2Ja%F%_ozvad01f`nk|oCg?h@=5e%ut}O~P^6PH%#3HMPY$r_~Bq{h( z&;&`!h-*;Smd*36;%Yj|icM6hdt_`GeEbAy+KIF9sS}Upk*!9DseDk**k~3V)6YH~ zo?^$~lx94wOn9FEbhp*XU*(vB zF`>Oq-&(sbi^pTXK6mFRWgAh*-fS?v{myps7Ldwu{iSPVM3%oE)IkaAb^rRZpUG1u zKRZ`b`-9~|EAcm4%vlWO3lsUaz5x<_sA35stdTZ_nSO$?@w?zc=O2yvZ6fnE?8}~J zpS9t`NtB1(^*zJMq+OQd%I5d}+sz0K?;~{8(I#thI9z!Dy#=`Rn*R7XNJ$bA0;K!E z*;(^Uj2zD?tL=n620V~iB6j{kf^{ZlgN&1dre)MgGOW^BxQ|CY(T@T+kU&n?ks;Lb z?bF3~w_b919FbsqI7dI445U{|8}$;9tGb_O4-{3FbTHVPPWb4oM{QzuL+ncrlS0j5elnbEo@8a#d%|P^=7A65b zsy=Ehja_dBw5uJnA5S^#&-}JEJzA;6-Ks#G#(RH#Tk+-8uwECxoLC^^0>mX{4|^W} z?s${kgm}$XbTx(=x2<+PzX>aHUjHsVb^X0iIYz6u;6>X^2Pm07f39@7S3l(3%rql`N93mEeY zXj%q6CxG^Od7NH`kB;QP({|5S+cv}CJA8MrlTzYD1+ibItTU3Nyx34ob%LKxW3HID z)I94x1#|btsIc82eO)0iwBHV?1PzVI5CLoKdM3&t$w#KKH*2!0Hw-DM++2!+fnecr zI8da|I&kuAF5V4{NZ@#G`z=c6I`ndR7D|R6!uV~e-|Wj+TMPP`u{yBk0&bsxV^od0T3Yw8nZ1y zcK(LI@@qCfyjxj2hx;pe@%H}ycIK~mRbp7V0$3a zCGLs= zE(`GrohGuNS}NL232BmA>N+4TnoeHq9OO*;HHw z6c%h=j?ownBi)ec*`G1`x=7!e1Le!#T#wb*3x$g~yY)!m{Y_B=~3eL4FTK_!sg3BB*W-Ktq$zO~ikI-Ro-xV@?0OOvX=K=8a)jRk1)@Y}TU0apYYtDOWSUGMe!DKl*G zNsl~n(d;Spm_v1nD^q!M>J^G@wiaZwTdJ2S;H0*9hfgr!Mj#*`+`cYylf{@K9C=b9_@#ysbbe!bSca^rK>24IwcSx5x~LshGYZh?3&?6I<|rM)+H_ z47P)H9vC;^*zUw9sUe?M=lo@ugv@aj8PmZVpp^3`ZR>7q>f6W3FLtF}jfcxZRguwv z z^ni#f9@;-WxPf?BSO(oz(&Y*-$7%#?9q#5&YvL{UXDa?ARGu54*mG7aD(Ovh{qtqjYLYWYCylYWQ0qmKcbNzlyt z4$eQ9*n0Z@(R{?{YZ?>G>7M>V&3)PnH&rA9tr*cv&B6v;M0{{& zuvUr0T1sI>so0GFc>eX2pM8pU%zl&%cZI zr{*T>mBv7$ormX)Yo$sTcLpTx<74<)*Gt$Xc6SvM6-y{;S<+_B<$ddW15;cyAIcw= z00=I|>%3(YBDX|YZoVa19`m>7b&utmFmeE>Ekr7?%)*Z;OouC;bkGT-v)}GzpEZ-z zbD0K=xZ8A^T2f;3@B4KbPimW??_O(5* zpydVPXXpW^z65jtXC)YGw!nlDavxEw0V5V>_Pyh87;WB|L+1k~|J-J@+wHTcDsH7P31 zG91Euk`1k+t4^1m9Yp;#jWt2m+fpt&nN~-kg)FW=TYd~h9r`A#LR?mlmGr~!t*e7b z6F+)Bdqo-$5c8mOz4KFdH_*ZaY#z^y`y~V5(=-`@m6#-1?pn>oEw{P2e{D4A-zRxo_hx{T-9W63|*T!z5jqKTb=vb?~hItGK!q zpz$77Z$tB&ejO~A)JgNESOYz%Kb?#Wv6tN)wsU+pNNiNEA1s=zQk4d13u|Uee z1e}uaq>kG|V+S9%0LuO|lC1P-fUWKj`bU5>`?&BC@+~8~gZqlWj(b2wB_vcDn*r9q zKFcfdSP2pgIt?t$Q>ZP(+=Jwm9=c}>*cwzwHKXM5uB>h~%!yy7JF1h1faPZ3VWxIGVuU#U&jmT7fQemvn}sF%M>oPyb4zQ3m# zTb|`Gb`>fh;Z-NtxvQd&)C})G6CZ8hn6X{@tBbRwUr8e*++!EPI9YMmI3-NKhN)Tp zu}*!nTK%@7{ZoMX$(Ap$S-;k!9Sd%`_GK87H5Z8T<=W$TKAiHl<(aRbokpnQ&az49 zq)yvjP+g0+ccffPbip5wY+q7LuDp?1OC@7=EkoI7VDHl1Fm-Gv$DSDIP%m#GiHB>C z3eZwf!N-`7!+opQ!~0~smD=G(Lwbk6hZ@4)*5}U=q=r-xTF*}S;;Pq#VBr8P#Shp^ zfD{qFUXEh{c}{)j@Y0|c-K7eZ#rZTvB!Z`^2%Y9^d`BR+eB0;t)zYMglR5@i03cxv z5wcRgJ24xtdO2QSZmVl2=J3B*^)zt|>5O5sXCTtzcf`;7pG8jM<)^&rb;m4co!`{| zVP5)&+}}zj;EI0U{W72u)0(%@~&;=l|h%i{>NcUREV09w^n3>2^0L)&=HmN7hS_fCO1@^_^ zPkVB=01L+my4o5w)XQo#wX0_qgRE$!yjh>XuB4x~NoX6*h#DJ(e!`QYs1ufvb1mlW zI=}@K9us)nrb9oKSITfQlW5O!%{D!(YPHje;$CguwKw+Lx06TLKWXv|P2PtOxdpUn zisyc}!wwEj!;Aut5B$5NN{Dxl<1A{LDfc<-9GBY0zE#X2QdO*Z!~Lu{#i}=xkZsyE zl2}dqnlMT#Uwy=-wsKMWsQr?Zm+3-BNhCY%D?$l zbKMVg4&NQ$ip%y&tHy*LxMG7|!5nU5Z2E+W8HK@|7j;~dw}`Q+x}nL2a^nN@^uLr) z5?mk05G$rhiW)A@SRbx?lUZ(LZTFEyAjrYiH*(Kw%R5f^cOFZ&$1l`Es6_Yx~42uZIu7mI-7H?2QWx3EN0fJqU_(D<=A_0{L|n%6Md^v0?0?O;{nKn3K8bS zrKYO5zu{`?;K_0&@&_Q>Qv8hi8ECZ`5>hrLK#i&B;#T<@!Z=8~+-;s7mJrU?*Yum_ zn|FqMs0M=Pzi#afVY~0y2fW&5@2_|W*-$E8y8rH=y)oXOJ9>`UggKEx>kmI@x;fI| z$;>B(x67&P_RVAyyyQK8bfZrrwHZAFH1^k47(EkEfqzTq!YF9U5jMKB$f>v4Hrjv* zQiPGaM6(P@4N7g~tsg3(jRA>-INMv$TT|xc)ATlRa&hK zNwf0ZR)_}>xiUigA~b{=8s)jEGqGRe))H5|v4jD?MD*S%ZIN&S%%Sz`7A9jA@7NrN zO}-WL4jhVDEH)XAp<}w?{4x)gk(RuNR;xdau?; zLDD_;8z3o-2#f}ILN4V!K}hj!ySO3df^+*8fFf{eBbJ2;;KR4Q$LS>g;Weh?@XY|I{bO~bB;|PDT1)mMd&D+Y!B>17Ry@UUaNay|Yit(}E4ID=C z5ShAe$oxuRLQ<&8_gWKm9OEaxWY0EN>&z*2HdrnnupSv5 zuJFf&hI&BaA>YTjPrg1n5`-2~T6;GsHhx@6{r4m*DJ-0;Bo_6ahMLjn;z`Pn95@2{ z-b0(J0f%5MTh&`288RKtUt zSA`ixa~p*=V1TS!flFnHOSb?Q#o#FoHUw)cqc*n@vJ@D1LE;;03xd@BqJvhO! zJ0hZ>GKKNI^9FveW|kjS7eaT_jiYu?z?Ije4ZSgitF&PxM1QtB`g7Ye(B&TyRr+Kf*85BLAdveA^ZYb89n=f`?bk*+DQL9>S(OX53^U-rfJ0=PH5 zG)LQG!{bqjypU<+3avqZq0-qnX>{^{Xieq~LoPN&?N|YDm1II1WBn-c?2UKF3Z)B# zc=3vEzwxmYN(GS@mYgM5k>aXG5Z<~u0|WEc1$-hLNl;E@IOQac^${QVl(d-sRF_uY zj7K@3mCGruO4KAA94z>>46@byA)p>APx7RWSN>yf`}rWtu~XAYdM&AQtU;G@qN!0N z*l~QV*gpfG6D3QSO641K;&Kn!VLPu{&XC`$zE#XD*476<_6m`Ve`}R@J2|Jv^$mE; zAixMWJ14>-1??hvsYu%xcy;q_<#opSA7u9?k1c<(kOkV5b*Iiv43~cnhY({_2HG@AJ;}Y;Vr`q6=kfxZCUNWvF?1 z-AWv;(PGaYqx36(+qL-r9Eo5=#ugEq5Kk{5vJ81BLjK=Y^%f3 zkAwNLU_u4(D*@mQsDum1+!tt_$A3(artUD2PKJ3wRTgOiAUgr9{o4%T>2@A|SRQa21Wu(~B(~Iu;_8-=r zKkk8gpoADMHPq?v)=sF2kXu7sBGSq#^9dZh0iv@TG9NpIH>8MR^gKSlf9Q?K zoQ=}YCyn^)edQQ3OTj6u5TU(M_5Rff2Z(0?L1`P*no~`IisU_$Kspct1N&3#^mr8F zTM#-*p2Zl5)EW@3XhKbhtk_O0dz>4{b@@_Eyj7j^J!f@o%|OtvBYb#mQK;#gK~uJ` znz2&F(OGw4v4Ppd_{@91{Rv85Ah;NCz+bM z73R43-;i0b)Tw!ut#axyE*9l{!~RMmQPV(;XFs=Ju&r5(vuy@ik()V-AqW=jCmYZ% zy7VCy!Ka=UL=8xHGP!$t2(gh@HDM*;l+LRRt0_GSd9KI6+%Ww27l-?YSgPcHpuhbu ztOkvvbxcesF&?gzfh;%?ZK^}_d+1oEj>j}=U0zc4j0K62@n zD3Gu;@?%@WD@{;23yyJozT;q^*ZU6@IFo!zDi9p7*s;-Y^d61P(%JIVOCIGjjiQ$a zI`IAUJ1{z3kEQC5=F?dcdLhd*e;_Q0=~e zC253;_tLvLdW6lF#lLMruJ3fw=CR#b@1`LlyXfls+s(BSzg8!Wi^$X?7PPjW`D#NZ zK5W66s*IZ+KRQk%`}EB_S=T!`wn7}=Yvqu|n-RNALOTeZO?$o)BG!p7YQl91P#7}> zk!%Wm&G{uT0WXxaqbw*o2V5=Qk{-l9sJ=8D|DaNb-(g(CdQkx?FWIY6qF^?Gi+Dhm zXO5yZMXpMqbbCHTJA0h8H=tQnLTpvWYx&N{qw143B*5J)W7}ujD*pF2W{O?H*x(0n z;M~onP!Av{tQy7h-(oEC3~NH?cm$kO<*}P~=LqXz?z0b#r_S&fJY0lG^H|tq@fO2> zA6nN%*E{mA&gq#!`QJUA~ke#V2s1Dg-G8 zh8U>RHrvhg6{pBD%tw!ys;hw~2)U%a?U`@^2xbIhQ{^PP_6Q?-h;`=dX;y9@qKV%* z&o{XZFKu2q`uaQS+ng;M965BH+k3kEMRszC#HADfdgs{P`vJhcivJ=Y_VxqQSTB}L zL`)z}t{7|;DiXIw)qTHT{kz)tq;qdFg`@2_Al;u%`TDLTR-jdl=GJX!hu5-wB^+#& zVhJo?&S0Gxjv@!sTo2xbYl{<#n?`<^(jix(x)cfzFqlS4sn8 z7sAU#@6j+7%i$$YH*7mMDc$PZJ&1@UvuN$1lswLmY1_ATESzPL2+3xZn!`j;`9DcJ z6Tw*0&gq_(W`W^6UVpvs!qE~YsD;}`MI&}#iFLkahD1=j=)9@vj@#~cmCOwqjx^e? z?#_%)`t_oIPzU1BIpsM6RXQlsd~9Fz`wea%uta7bnn=278<(>pzE1`>Ahi~5L&yyJ z{6oCVS)L_;apUtbP*anb!D%QyIP@Tli+*J-28APQ-KZO0(h704x;T1TH>GTGiqXz2 zJHz7o43CB-OA6y!zcK*;f;9xI8qU}XC zpD%{2vvhB&1$f(Zu5qYq(ByQj&z{z>W0FXT)$~V0i%;V%3mV8o2z7E#v6x8Wj zcDC}R`Bqj;hYx{U%IOlTxv}H7Q%!0RLO2B|K%(-OgtE9Q{Xu0JjH%JMu?h>ULPMY# z9x(LI==1&ZDUgBAoy{a*+(j)Kh&VB8+Eex_G00^-%1^eEyz=xfVS=yfFHqOLmTA11 zBkYMzEBwff8C36oF8J4Vp$-EInD^ualM^f6dmTFolW0HIYdtbde)wUUclo&*iU=^n zXcm&H>xzcuS$(<1O-nVC`a)7J;yfUApM#0af+*dIOV3I0E<_y_z`z{%L$8+EO zC2Oh68F$t0DX;`h>woC$n)HZRFTeQJKIO1Eavx{x}-VU zgxbbl$VBw?Dr3C_`nTpT#D8kGm!AF1WB>#x%3}W9A(}!X=mz~bw-c~8Kt{~lw0iKn z>}GRgE_s1x4_7-~FPSl9aZ%EKYN7lpbcY(e3RBSsA-voHZu1J6>X@3O${bofKSkiG z*C4bd7AxaCCO@CXx*@Mr2F9Y~KJ^Om$hzC49Dw4j=B}$VlaB~WpDGO!odW`i!nK2_ zlx8~Ryai;J(Dd0g*-URJ^fs8e(e%{Z*F|b6dGM~k0lW@G%)on%1RS+PK^@2ds7lbV3;ku2+ zB2Ns)U|F7G5}MENA(m*O>hkO}foZM*{1duyg!yU80g0KL4f!eLQy{=M#cXNs%y&I zMYtWU!K-oIIOmTjVg+I^Q1Xr&V|dV$)jr49ERipT_ie+^sN zW)PGK|I7wbuiZUmZs#HqH6?;RBZEcG9qkLN@N>VM=z}Ewe#d-&ZlayLZl0?<=);bw zW3<7Tt5zJ_2xdY7UKM8RF~jFI;m6cq5w-mfY3ha+pN0{Ei8{dPAYfKNk3Mx^H5FjJ zFx<0TXg+cREF)UUV{!TfKqXtAeL1xaast*{m9&yK1p&QrbERaqj7xWjQ9miIu3u~X zN`Y#x8An)Sf4mioE0g#Gzbt*IhhMEb8d2T2ZH~&-KXldiLVtWYWVlOa=M~Ps} z{8s{F&tP#m1!Op=OnHH%ryX9^DhQ_l*rg$08vaxY$WjxFd>~z?(T4JEuqS^*yEd=1 zLUp&PgP7U*&g6!D1xB^+!R7_UOT_b(tLNrk6EN4(cwZdZvig9udYHbPVN>66z+FCW;kkM`NB|ejsISVuHMNzR4gV5ka+ryK8m+HL_U5@Q#@dbu;zIzlNhJP zAZwk_fs7q~MCXWSVk0?XuiThMk~`v0%z3^_yuVR+a{rnHM@e2(1F&fWT=iBkY_4*a zrT4xPr;m-6DW-w+Zg>ibnsAG^HZpYpa@8`fA2{XSE?ax>9d^2Kp&={^UoY7@-Na<< z^-W25?u{;T#^RHTUe{&6UU{kK+sVRO-v9eL|E=Fa?I&@@1xNRw_Wm4iSye;n(@?9<4Sj9c5E5vz1 zQJ~^JFIcPNc(hN%A~ewkdr9jgb$~SoS8|_ly=t4%hlyZ&b@R+^VtICZeEBgz@kdpI ztVqMxAU5$;R-7Y(yzO9TehA5EB1Tdu2 zuZAOvzel0F3*dE6*&LrccN)d2bG(GnPvqBABY1<01;b2Loy$$GO<2%A6#qLCf@RKJ ze?C4%DW8ErB_Jk`WVR0ai;*_=d1_$Sg<-?6hy|;fhK=NkS@LoPdhd${T_Z})lkg7- zhQjKxS#BXEztG{KqTg9ob&q&UtLBhZyU|?e!Isy<^3IX(Rd<&$ckKP=EKPwkQ|6?F z8{(o_1hL#8Yt+U?16siJ8vLefoCIlbC#ddRGp|8+88vUFrvxiH+FPxrzAnGl$-2MV z*R?@`m;*DBX5ELEpG_Rzs3J`1d$B_9;!oo0cG>n783A9P|6M%h!_Zrt{~T6}p>Z*% zXrYfR5QJ>W-xq-(;6uhxy*jY>&(Jb%kmIv0*i?sG-|k4YpA%3WqpP0^4AE#IN z-cyu+lcv)`9g>GIr&j%X8Tl&UbzHsibV?bG-rEUcM>jcotc6m8*Tg;}yB=!yeb($Q zxEa$6DmKJ{wS){2yQhboxd#GECI_uFeYaPAZ@4-^`wqgaV_k%uNd@E>ODmQE;NmWC zZjfOjm^T`$!nc} z(+hp24eDvAv{UZQ0fR0cobdD;u%D#go;_WMieW$T)^=^!HyMWKSLWJN1)K{eCX$BY zDrI&2EF#S(0boxZM`rSy`e$^uOg>`g_+gD-Tk52X9%P>@b4cqs>2)4X@wYRA` zxzIdsYa`zjNk9nl&==m8uCafwj_r6n(8+wFh~Sic@fG;+hH0D8d_gc&5XDMSuZZfs z>>G^bI9$9m2b;gVFOUE9T6|(R4*pTt8?X1>U4E>1Uhp{dpw!*$tM;c<2^qqIL2)jG zAU8snlkk`M2Rr!RZn-Wqx2H{Q>ARsHjnj?uoM*6)i?czqK^3UP0}AO&t&7v@s8v7`guJ#QyX%- zM@p-jfa16jYIM`HZW%38Q@P)nVd?Bc0T_N^&iP{`#)xgm2oHA<3nY-N@r-=kTpzmi zzmE-4O}=iNrP4j za?>DszYfpI7^g6tD=3aj9rRc;*FyF~4g?n9CdB+YB1qSnu(%KUX47aSpOQR8{4=oy zB->h3qEko2&hD1xougHOppX#|)kggyo2<+NML0SfOa@fsk2K%knCTG4zyJKB$7PA* zeKp}HV1U#65sn<^)L=B)H}~ERuX`oPh{Qwhh&%n?Q+B#I^I?vzU8R|K`tUWI1Y8^; zGK}JVPKa@6g)M2W>O|naCrY=_l-tZC;xs-ppv@lU_WI2J*iwZwt@-KmT&=5<7p;-X zR;9usTci>doD<9$g@=M*t_W?z%?~)k<~j;RMFhS!h-yI=6Eak#UEw8&(p=J!p%gc@ zCKM}sly^kl5y%)i3kySIjMBbP#@I}~VJJ`a#x7kT`OPFspjyy^ptYEkRNs$=$WU8m z>wKK`@$Gft>N6S9D4g4O>5hgykH*i<1=^+kiBc{*<>ScTbKqp~hiT(P*I-6}#XMmz zH&Y?>U^RPzXto45y1&!FriK)od7!yHbNM|UVuScT=1^o)2}3( zTvQ7J<;`RwyiR9B4~L)+t&L8Rno6t*{&Br;L5wr0Tn%o4YTIi5n#*8-MnPv?Ut&_R zE!)@$Yb#&k_qKHbvM#G_hH;zE6V4|AFTsXS%rR6_w*Pc-oZ(iU3Z*bNyEy=mB8Mg} zW3=%$4srB(63bFa`FMXV_=qJKbqJl@ zREB*&CU$M;v|9a4^}?9jacxxZ0!`IDk>RA3#~TT)zLHNTs=Po?`M$p!U{r)v!2Z0? za80V;qe)fCT3i(ng2fjYRTWS?S^?wjIP(8Wr31idbmv|d2rHT}85CReQiLL%bM+fgT! zQ2Bk{>x*4VJ6}^xC*M?v>@o-)Y_NCo+8`K8;>iFP_3=suT% zUo!<_x5<|m+Pv}ghqY_#cn0D@l#uXjzeidQgXMv}7Y3)R)%(pgF>hoQ1|p~=Rd2K3 zE|RE<^?A5x1(g@gTe(8@@@>h|9O9x5&gK71|Zc4YfldhHud?CH=XcFzJyWFR*U%$yce1U!MT)_eQj4W)8+yawj@ocb`Ea^efwVHMadbk=BWjpRE4yMW{%H=a%i4u%P!~ zx;$zXHr?kUba8Y#<&8V(^qVKlJ#{Yu(@%JqoA*ZE{_9C^V>E@Nd7~)~7d5rdIlQ$@ zDUN<>y4T(#yoSI-#MU(4=7iM0mlXp!g4TnFz|C ze3%+vI1ww+g99)y;Tzx2(m4FhTfUja1mlPjylp>k(bdz7H>n+`#g}Sg51$0WP#sL@bPv)dO}I#IeJpVb)it|(C%^u;5PvqO+;Icl zO`ZQbBray=>8qrjLR?ENov=zHt-G7_T3REI?fjHZlfiMkUMSJB{%xia#V6{m_r^pz za=hfyJ+*N5{&h%(jLa<`k0~P?Etgg^*H_7Annz_bE*QD)m$T;M8onHtHHi3%_ajJV zii9R=^Lf2EJ_EY%4evLy|KnL0!$`!u&#*c!FYhl!AWzjB94})j7e!Q$jAEYa&Tkhf z%3jW4Wbmuv?lKiI7i25{4awJweEZIu-OqTwS382qj%OzOkY{peBDD+z+Tn9s4e9oW ztN4qF!4`{e4rf0ZLJo{5;m_)4`oQq}m(!dLV_)bOuQQx3vhKT{+D=EG2c!F{^_QsU z5%qPlA+fvKop2Qju1OC6Kd{Y|oYhH`*mJ)N88M=ceGk|NugjyxEcI7qjbao(!`9l} zlOmSo;VnChg?>tl3>^fhM9hBZ6pf zJqs-tbtE$dx9?2ivxGiHDWPQbE@8!(bCPOvLhyv02g@*h-J<~SoMV;xSe{XZV(g-$ zAq0gmLo2_DLuDc$Y1?w!x9xr$dBS+l%3)Xye&|@x<^SmYbX)m+BLkhImE>_ec@SO} zGj`^@ny<{#UcN0o>3@>Y>mDW|-~H1m%MthG)M$iaxp2;X#1d1>Uf(ua={#3f>+Dvz zslcJ>n0ojyXy5P9+>2gu~Qy#j~2e4H^ZwW!d3lu z{1#5x>QA_;-hN@W>L1)i2WNjAN4fEp2Y`z}3jkmQv+V>j=tDx$<%q^BjV7>lYdzvg zwhc$PHj9_5;!Br(mB!Oe?@px$OI7++JiW#JG=iYHR_E^Vx9{X8JmZgIEx1pO|8+!^r-434n-PR3;{Ef5K`{H=IY4FddL*XB6Y`WNz0=N=?1=w8L6 zrajK55ST!@q22Y}q6;12A)W9j(bM4c7CZK9;zfVDNuySADmVXY4XsP}!tTTWRt{sT zOdi3BZfGFy2S27_#{|zDiCop%OjgFS7GHDX1@zx$-yol~pKTrQLHlf+XrIR#dkL-VmWJqzKDQ!NzCur`_YlV4=Kd={u)L(>tJQmByh_W%_;BJ?S}!TE#B_!VY`nI zVAhoqg?~LaB?&E!4QXt+r`Z0n&?n;bMrQ3BhjMpq@3GkR_A^Gc(GWS67YWYGW84*D zO4a5N{37uoPV|W&8`_%V1i5_|_xnYq`{&AYyBHIE(<*1i3cjB+l|xG+=3;!6jnjdT zDp6h_454MH{0_9hPc!N9%BU~vDUh$g=6j7OK8!l zxpV&2fO@+RgSHF~j`<>N>3X?$9ES4zeLTlQTlA$UYn5ETe|KEO#<nU~fU}laz z41VX@Ufu3_A9!lG40*Xa`xEo8bGF#1K|4o`7>DocS$2!BNHT{ozHwXYN4?xwW#L;h z-hAm$=>ktYx}?cl7Cz6=8E`Zy`%S+C*XF-U!>{)eJkj}1 zu6a~vtZblyfi#MD^w^mA<_7?|%xy;J=q&TCpIW_iek;})NwCW}3N-~1M=F4-+(KuL zVdQ}#04&mrXiF`5YlR4~Uhej=S4RXm3~#>Q-C0EfkfFIFMyK68Vgquqo7{XkGy%C< z8cAfH>Xk=ckxj-AUlDca0RS&ndf1DkgkAs>Z=xqes1Ir-2mq+OZDR#l8RvA1c5J^B z@47qhdg%zS+%b@7L-0@uE&jW>{a(0^)eR>%CFI96z zV)z&t{4E20dMM@WN;;XruIP>E#q2LOhL`Pv82be5a1poxEZuThwP;T+-g0@A1ZB)- z>AOJ;sMcN)uE++9|0 zR46t#1~IN|xA^5*6HKE$fA$P=B~*l}F*}eci8nmDn0)&F^J`oO!&=7BbC);5Tl$E4 zi*6Pbe_HaNZny*CIUK3rjOA`vLreuVqo=fS?uBPkbG=2o{9 zfR$OSRe!k94s0Ek?+5LEafbbdL*WOGu&nMf$Z4e2Xo|6q`9RJ?i0{Gq3(FHZv%D%k_v^{>+YIu`v)YhAI)`-w&Doa#c4Vb<5*+u6ftWniQi!fb50QQ{acL|AZ&B(@waFCqvGWN*Zwb;{6C z#7NQ$jSWO4aj-TM{xcAzzzKoCh*F?&l4=i7pagXo!#Sspq|3$=btNUdZ08{$hA^aN zF@C|U$yrW5Qwh~)s0{$<(1cR9S>{dy0H7^_On1eWYWQsg0F?D=wV%kgCeYP<%1=s5 zMoTTpukXJtS!@FUqzOnA=bk2_+6n+jEs>W7qk)ygxefrxZ3Y0O0|1aa1OSMa^Li|# zqV8R12DB7rJb<7I0OXfOq};C%Qm_Hi?Kc1bsWLz*9(W)gV?nYVO6|N@GO5yIc=pRC&b+$l3qm9i)bK_E7x@UnV0RwPkbOatM0b+0=;Dy z1>h{4h!%>jsn$}p($kjf>-g-gEpgX_00Q=zaOpnX|2QiWF#X1E>1epmExZNq(1QhY zbblY#gFmbNg8|&fEyM};QjO(PN2be3)CXP#9F1UiN3cg$xp3IER;-0H>sa~af3KhZ zxqq1y`~fiuZDzA85ubQ25Dx1rYG2B6?#6R5ed9a_!o}5y`1D zPBl=cVUk$0H*_XRTwv7&S(C9Ep$h}il>udG(a7RLv|)@Ht}nB<5Ru%@}{M@T{;}h>UXMf`h z@pJFKS5ANHg1fT2=eRr&zHmO->P0kA;O4dt2MY{`u{tBEIN#0?!$F_@QG#J0Fi}8> z9g==Tu~~sC3JFzpBIz(YO5l1COc;n7Bi0BQCvcg*05Wxcnv`>;dCQ71q@?a&HrKT% zl>G$|(&h^KE`2^-&Za>M&K1lc$p-%HzSUfZ%YO_DaL-TVy_l=aegMfR!cwx`3gr#0 zF^oJQK)a_=P6q(6CSW@a08mLPmAF*^pjMS1zr7g%fNI+cYWt}(0i-S2uUF<<&S4S& zP^sMe0DxaTo&o@X_qj?!f4czyj$r__0RZLoCL1x+Bmf{wnj5cqtwxQ?K5Oks7zY5b z3TSw7oaFnS002n2@1h7_0RS=pj};JrC6M7?JMX&*G8IE@G2>D#dm<}78JVDv)`aS) z&B$3v@Z4qHdhirif&jX{%>GB;W6re7bj}d~4C9n(+KY{J&WgoghSmt0=@-^U++p zgmc@Gom+!h${kEg^PLeWVCw_Ws9I>7sNuARyqp3+>S6&@+N_$BoBvqB7|7znoL!X% z4)HbI_|j9m!%4}~IN zetV@Fec9*KGw@@Lu#t=Z!MF9xcj4K>7D9en)e~~Hw5!a;=iT1 zV6}gMWkynSAJF0|Fw;UzsRGRG1~TnnrBJL0Vi@d2VIYeOPE;Y*sSHOhw22L4>w?6p zxpKqe%0>d!(UL0rD+30-P;_w%;BtXHq~7o@FfcnKjKTnBI6@Kx z5Nlxv3+N{a5)sJqBBD`@*j&kio58225;A`%=$ItT2zxs6Ym7N{ldvw4@pMND;F)ELI>a+1) z;-vrT#bo#QzQ}KG@9E&PU)4Vh4VFIhWqo340nzRdH$X59z%M_KudWUly>uaYp&v37 z5qo1>b!8BUQzTJ9x4KL?hoLb&>|Dwu^> z0QxDYr`Dzn8fN7-L4^^UKUJAFh(g4}$dpC3-LH+PV^u>Wa~EON4^Ev&CM*;FoP$%) zGPLe{S92gOupU1q%#MqSiBPgmc<;6d-0PHz{+RJI)2!b(p_)%$S8b|G!_C{?%&t-U zwBKuUqj5p5*!8{`T{=ic*7)QfULI zAx30Fj3Grcq!8`VQ3BVG#AJe0DGF-g3Z>uqQbd4p0(*VK?HyfXzjAA6p}aEQaHWh^ zbQaoj7jZzxR6aX5eIUf~JM6%DoAcnwh>n)Puih?;nZGCDp9NRfH&S_ws4Xo8b^WU9@ zs?H>digg8z8AilK5j6^Ed%a-veIE?YUb$&rj{@?Zqk8<@RXM-C%e}o3hJ!xCKYIzU zMgfAv!j59Kfj~e=V&R0Pio8>(NvkYOENliGq?X8DFFV;Rgj5ppX#vT$!iqO=c=Nuh z0vT0YicB-BOxrApO&qLAt4tj95v7%IL;$$HgvBcx*nH?doZcI8^t~U@$N%J6ec=P| zz&oFMi7$Tqefs#Pp5Pz<_;=es_q$)>mw)2BlOOz-zlT4(|5*I4&0+NVVl+CHSSDY8 zIoW*YJ!a|LWp{IR;MQNh=&m~lgrVr=>vjZHS_c;x$nFU7@*<;+E!|n{vu7Qw5g-Ui zXW@*HVp3vcAQV-)FqFJvu97x;SYt?4I1xgGRsknzFsdY6R_;_0Izk*-nsc(=a@CTt zY1f>hO+62<;8&XvJT$N#!DUdA)-%BBbK_Yi*L{#?BK2O!itI_terp1B6-I)Td6u+P z`#YHhEtPTBD%`ET{DRURm@O55wh1S8FaR)q{Z7UJXVnZiNCp54s(wX4u`cviarddU zy2BSDZ7IgozSmL~CqI3TXV+(yeDT@>(zmnRyORNs|D7`kD#uPVLHM z9Hd!Ug7B>9&|)!{!ONOi3>50DBH&^l!RC&O10!OjES;rvyg3iR&)Y)-IdN15YLRIi zH4RmjEgGz~3J-IO#&TjBJ8~B#c^y*_WrGdSQZsF-kj|Jk9{3H>ZQ93!+%xYC@_6Tv z2p#WXs58U>wFFlufKa#j)L6Gj$;Hfz%%j!9vV|2eao1xEBiU|a$;NBrXpY%Otc4po z)y3Z2WhK8RiG|(V#vXuZu}^dAs4PT5T7dH=Ssyi>LiU4=`y(e_IZekq0_v(&`^u2% z{i3CpYokD)SN79%r)A97j*3*{xym-i`n_B^MmDO*g}7m!{rdN_mMv+SMX)z7mF#i< zdD7ZuGb%v~NXW80nioBVY8WJ>QdI+^MieUQ)S#z^ggB?hS{FFy%-+zN?Hvusxc@Ky z9WJd6WI+Uo6WqAxcyPoBaB^Li76W6y>k)ImP-SN%TYDqf+1SP=$>jJtm#*I6&4oUq ztzGO4`nqs!lbZy1VolecJ;(E5puye?LHBVbl(S0j*Noc6+J@2fEo zYtzI%^O+Z?Dd1qFc#k$+pVmP|s^Xu4N#n>PD;V6|#tsQYA%euhtqyc$d6E6lz#LoA zm1C>AesxoBoIUC8d+8!BuP@nSUw@S^J$lAI^2O)){5wu0k6S0ZH#gn-x1E)fUw(G9 z@#hhwT_&fi^et8t@!WW*x%l&8=?Cj|)Mj&B8e(SYlGYVni z1m^~Q5fT_B$|Ea*5`Zy86iOn5I>pXC$H^qYo=dNrS__+lTJ2K({&8{`Ei$PAIEKw)$;wV)E^9q3Y`8EyiEhqod!mlamCcYz!Y!KdMY{-6u4jg ziI!da$bXiARA&7#Z803T`LO{8J8oSzKG&#B)S4+Xku%lULMf2L-uthbs{cpJ?5{0z z(OPxKR?XtERq2NTO+E>FeeU$D+BxmM;Ly7|M%CI}mFC$QQJBcJT)n@E)I=+vFg2ay z9n0hC0(iZI-#@Y(cp%ZOt5O4NU4ty4RBxXt!ZYMUcZ6Gm8EbHPzP%Zh?W)@Ekzh!yv{4%^FH&weu!_r z_d(wC>SbO&vaIW`UBQ*h8@zU670Xv{Vr#KadE*8)kFUw%@iko=jSwGQ)zypFc^wL# zT*u0#>)3ecUYvgMA}*gjiDNgmu(z~`-k*I-U%t7+?NjSmzrLlr{fK5Ea!Y^=xA!zr zg)a8o^6rSc$5-94moMUtAN!bo?1``A`9Y8J>SedNzKq2%a7$-T@%Z+x#+R=r@pIQz zA3PPD{_Q75*RE{n!tS2ir0~d}JgFCqVD(F1*KaK?Allr)`6J8h-`v(=5WpyS)zF#1 zFxlC2YK(Ackyu@VDBw;Wp$UvQP3iPh)kM;!)+8+<(NPQFN15J->Ogf4Dgl(4UIqk^ zG)_qi?4FE7QP*JETuv5AbfHy{y`J6ck`LsiV@46hwq}?*0aIgb4$>KC9`z=f&dz$B zM7y6&jJbjtYRL>B%j@e;b<{Cvh#$&PXAhw|v-_!%@)=X0TMW{=sQg6be&dvfP)oQ6d3_;Y+|^!geVJaPzNr3E^&=!SWF&`oQ2hCj$?oTtrc(B(i}Uc!atT7 zFjI;$eVu;aa)1Y<;>UfzdG}#aPMu>nI>)91d368Rt`(e^cs+G|u094t^2EW|jQZ+H z8mBu6vSUtS*JMR6w)JRvO%?!q5zWE^!XjKg%*lU%;Fa?@_nEKlUA%Z@81*8t_Z^p| z^=0;Z5sXNuPim2(sCG0}*XQTjeNgnt=b1ViA1#aOV~AI=*m^LBtTvaH$=Hm{lgnre3*;bRHfwsNLyF3c$4*}yGDO(XqUt%#Ap zr15SqN(D(mx*;TXN17M`L}C~LjS#&^ z6b=|H3PZzqeHBn(=gdh1kXxsZ1F9Tl49`)zJ_-W46k=A{Ro2q3Qc<+2IESKrBzKj_ z>GOHtxn>0+O=HP|bn3j)g?eMZdVQ*1j6r2n%R{}vTPp*xwhZo*rz_phG}h7Qq6apK z@25|{boi*`e@ZCFLfiE&gIeNoi;3$&R99|kdphx}oHH;1@{cN-%to)RsL1UI6yi6HgQ^7)DG`fhSfJi8z;XaeTL82eM38|1 z*>;qhI~c96azPzjFQU2Um<*6AuWHFjnlBXK*cul`iCR@REcw!$@YDk<4gg zV_HTOMNp(kA_*8YAjk$sBuD@R8_iyTZgh85b?sHRZf+6bpB`fKSTizj-sm= zZ)RjIT275bCOLDuT(ypG7uyW zp^77vq6XTg%3`IEAUkH8sozQS_euXDNV);pgu$JxJD3m)1te4VxzwasAaSm@oeKO{ z>M-+!4J$ldD?mWez9)=Dw8X+#L?zaQP!LhEwJNZp^JSP|Z6PX*C0s|ue3glx3INd$ z=2!~=4dCu^1f|5hcP$btm@9&@#l5V~^Ua^&eNRJw_ifzQ8v4zjgg^8QR2ac}23nDf zERMAj#xcYgLL?TQf=5OZAKr}DMknP2DwV7!5YMJmiiiQ=@>s>jV$mqxXSy%=kyB`YX9PrU3k6-y1*btN|&!#in8 zES9V`)56?(YOk44zz)E)InEPj(CQbmB%y>fP#sWLx7)jU(@qih{$k*Li3@HOJ8q#E zC_R>qe1svt8`o}^=HA>HxO<=4=Lxf~K)L(4upI7_eb1{Y`Y(eArI0<_#8hc04qe1u z`mn@xDddQSB~n1mC4gC`%v#9dgyv|fJR2fTJ(n5y)M7>GDJ_xMA@nb9m)208P#(-> zeK>(nZU|nO>&Y;mP^F8*R$>K6lXHM8IMd1oKzDY(Ner{2T%@NZ%w8>A`Yhm z`TNog2O2BjKh)arF>_!K2q0OEnH$9nNPfG5Bo&kG80j&rX zArW;_Q7$TD3kbag2%tzM593&oW#fYtDLICur6rl4v?By1%w7<|N~Z!(Hi_^wAXrCO z`G!Uj%JX1S-nLFf{sf5-p?&tEJ~*D+2oy74%6c}YnT_aQxu`~OeGuO_8W;!kE*`4j z!<+WO?fWtZfWPySzUXV1%SSqR`=j{o=bu*7pWKl9FFm7b zIJxz}u8-$7I-D@LbdKXxa{(l=T4Oy5$aN@o86u1=5yyzbhyuVyA;NWxbrd1af_JT< zQsK!=q)JqAv&B)QDlF`>x_^iIPq)6C&8y}b!;Ot|nVSiBesEL$f7f!X`8{r0V6X+N zK$X)|iX7YrwuznAq)$LLzFsPSuT=7|12bs^0rnoSKjKvM4oO>SFkOIKTEQ*OrY|_K ztBU_;F|*%`J*ui1pAH0~1<`QqRU5&NjW<-C>LiP_J(`6yOx4~m>z#QSfI}USV!+5~ z|E^-G`#Ct}5=Fo$q!kg85bN46kw5w%zVo@K)S)rZ7<_qi@WmKtCW2Ph_n@j)OHOQ( z&sWX@kp)8DOg1a+%C&cFTaH!O02}pg+QTKD=|jBR-utCcdB%g!o<6&4{n!rqcCro$ z$yPwbHjI#7OoFXQ8d5E3k#^*RWs&lxK)zFFp#B`NzW%GIAeTk|Se8^eH={ogr=07w zYwNHON^wJT-B&U#+v-kAz({#NE@Is21+#7N z?|vof>KjGjf*ZThB|5mzM;hQ*l9k6hGiWX(K!wNz5mJ}*eC@_+b|-%`^Jz}BI4l4f z1FcDhG2$r7Mg3?65_s^mPM9ZwC&6-!IE)0dF-ONI5icI9sfh6ILs`Cbg%=~s@Jlc0 zr~dChi{AP5FYD*8-m)k273b$>%D0w_FMJN?V$mlb-jtIEa~}WfD|~6b;;k!}?8*HT zEPnQ7eE$9kZ$Ezp(XEH^$5D(mln!Sz9Nt@SX=#o>en4~Uq1+Ab@aXzo+>0%v2Mf71 z4KNx7)QX7j9^0h|eW>Qt7v`CK;J!<`RATivwIJ*`0hLM!QcHNUb{EP$;c-<^ab%bMghE%KcLcWI#6OIwnqO9Y@UE?63W$W{Tv#(2Hv40Kw&#Elo| z2*OFH`LE%jop4gsvr94*0r_IN5)0+&D2Ew-?Fipl@=ujEhu z%ilctejHox%2Rs$@^kv|XhwfBqVWxsF`!PvyUaqzoinA72eTq|={#xZ*O^d0i_E^8 z)Tg8KS7ztCadahvpD_gBWH@tW!S+=f(cmc1ru1K-bU9T5sVhtwC4j)@z=g&UU>UM`S|ES`A;3;;P=06|N3Y~ zGadUYP~ZIG3wY+6-?JYWUoYOjimS^QGtvJ2|L-lntrg6JIp#MWP~AJhV(i1a_fQtb zP>Vp`xhn4@Vtj@q_|`}ARu&MCJgouX^}msulBny`Xew(Vo}vEW2CiwH=q7x4gEv$2 z2YN=+Xv5pbz(4<*e5e%Y8LdgsC}^V-*MY?f>pLfMU6GuPF;W!ed&<8s#^hjvQ5eGp zM#k@6#hurllc$!UsKY6}`4V9mtCP1s!qwP{h|sRq5*tlfg$NgGL}Fo?I3d_5hP4(k z6%_?mDP+n3MX@%fRRom+fA%%=w1g55+5d(KK_yl{Crb%O0Wv2=Hu*oX z9Rxt8Db7saOj=On6f0~60qU#D#>BCl5)9avtzLU+LC+$cvkUTh27}X?g95VgCdo!m z0d^eg>A?Z^+F?U?tN{UCLYX@R{%FkjqvB)i2LBcMr+X~(mBh1AHp~w#yD&yW-F+ZS zrQpB#jGjGrNlgwW^aGDdE6_7gI(LFD`CsMv5xc`f;kW=KR)B7JYKw9KBx!q6lJ&aH zDC6Zhzna}I54{BoAj|ZZ`iA2ukcj*i)p+$&Nz3}{)_~2>p37(uDHBq*czV0QfaWr@ z;xVc6bfn3MNiyhw1+G#t9%RWNJOdZf^@~=}S^ zOE2=JKm2q1&b^b!{-^&a_~pNRE4uZszAJD1d%voF`UmgfCvSbIuYdW~(WN)u$NR7U zkRL2oSbz7&yf+)uKUrh`*Y6?nH1s+~{QV!v8{>ybqmc=ThNFm2cT@slbv|K0CB z+qhfmH6vRj^H~iR@d=j-^gE8;N5@@0)O+V_WRb9T<##h7Z$EWsu4881S55h+Nqb4f zTMa5{{j$Pe8sxJ82~g$&W^MtJqlyl}q@WB?oX?O1W+R$7hNx79K-Lna@TVF;fI8l) zG#L0a_m1uA`~iJdxom6)0Z^w!GxN-qN&(m@K!DnGvu!qcp9-+Oce!t+!EHW9YRuNF^MO8!p$yfimNN$W&;3MiNCy9Ofu$K z5MBhw38h{Nh5%Dwfn|z*<04)vkCM2H3+pUH6A%G$7LQjoITPVLTeWp9?;!~)g-&nJ z%>Wz0hYV$q>VPFugy>S1264CTtG1r)(k(l-6?dzqfkhl3B)2)MqK=9z1Q=5cBaRcJ zMp6t3Jsn{j#=_+a;X1Z>^*KEIrI*w*fBFOa&h@)^@XE95$TJMzxyq~4F(FFdT!j9; zfAMwRu-3#@;rQ#{#YZBvqX5zW`E9xG8yG7PMJTPHZrzu;QBb~zK#~#xGx9-eMJ54^ z2*l{*r(z-XlLZ_qVV`6%uT(SJ`QL6JXv^j9Qr@=p#^inr08BH9n1NqZt~xPD&P=fa zS*#?SFS)vNjN>0)$F(dH*Qu}|33^&9652B~fIus%z!T3mG=V3kcULM3k3x+D!b|A~um~2dhu`U6_rrLg%g7h*EzQ^PztjznWftDkw{V8Cr zG(MBHHC-z!p`qwq&cv;$wvTOC@uxNf*j1?RlbH<9G$-_loy{kBnY$AE-05r*R6`Oc zn;LKAbltSUY*JE!kc*HT2N}qMc$5?VX&FHFjI;c_JJ5P2+mgElNKwI89^(Yi3XH8t z7}0uOYSlyVWRArsfUotS1yH@co`E`=slZwhr7Cb@8wgNZ={4j^2@#Z)U}_*hgML6Q z?Jtep`%Ir&?lS)FZ&u>AJ2>n5{oW~uwuOV7B`DD2#H3%5!M3TzUI*RoUs)tLTY!LG zfqzTtr|o@~EUxRjw*t|6I}Ph6KK>`|Z~k`ljeq*p;}7m0+x6$K=!1g^J)=NRL1~@L zJ0wU|DPNMB7FL!uwXofNNTCn_L`4UH1Z|-v09sH|eE~`V9=IuLN0q-eW=pZ3n&6-# zsh;ZzNGe-Mmh)Np*EoS$1L#rGKd6-{WTgPI5mxJ463}LgR<##wAmcD|jw@Lf!)0P* zfxm)Mii|B{CJaPnEud)4GZ%Rf$B?UcqHwi}CKqSC`17x*OMmf}dgG(pxPRwZ-}vZ` zUM@mh3oY+`=N){Q+2MWtJGd5jFrJ3Gb{ls=z|+vn6=G6I!kdlZyRe7|#M8;4=6$fB zq8HaziWI0kCad~Zh*#>7V-@>P0WuAOfd>y#vxv;V47*%oolQ{>7n~!Ne@s{zpjM>O zFrI<=%eUzH2HwF`Mw38~E*#)swT^Az(R=X<&#%`4K!U&{y~HL_t=3|xph&J(p~M7u zd?L}0uFD;3&3!5`j>TFFnXkB_f@lS`3K3chtYfT294`uiOBJ9162*xl1DIPUk^tj4 zwXVo&gd_>bwMvLYT7jBSnI>1sog@*NOe_{{y~NJ3T|`=hTWWF4*xF=yUt=>!g^KKi z`cekkxK)SYE=!&so(60U*lXGy9i{f}cW$)=>&x_(q_(K{es%^Qq=F!wVIFJKEk6~5 zV7s(@uyKDzksa(Do-6LDhnd&PDg8OT`V!U_CEhqY%-K zx2GFfkanQ93kc{n=GTM&Mj9gOHUFhW^D311cp>5CBQ+j^|Jsr@{-ZySfB4aDi^B_gjh_ESmSKgkWG5GexUmQH3%U{xBPDuS`2Sf1$sxWA`!CsQfyQeq$VfIdn1 zI{|pR=3c!ovq7$~vHm}u%Wa{NUxhvL3}B|CUz%q!P{2tkOEZmMHV5_W5dqX>XILz* zDTzB{Qfc8ltr;y|i-;F^cJjhy9sy#m-HO-O?#QuG;{CmU!~f~K$9VYBZT(j?=E3#* zy!P;IrI#TWvk9W>_i+0sH^urMJWnS9Y}Wg{agwDM0KNy4^&?dj=}42#k$h$!*z{TJ zPV`V!Gvci4oJBDtjIlmhU?~8u-lhl=jfTK8`kkwIQz_`c(|Y7<-)Ly23=9!)6$6h<#LTMA|q=NXBACKWnV^pDi|0we%u;i05s$*2^3RYW4jsGjHop2b0U{_=du18`&<_`IQwm76_K&`8_EFO$JMy9IjKk->t|dk z6DU#)IS7za`*Q)1%=#b)4ODRmX;7*NL2PM7L2G6rfmCsf*l6fsP20T89gkqH-5M%`q z!1l$yeXiY>S$l5S$=1dLf_Cmo3lLDIKyNT{ss#H)&)~mG^6?GS`5A+O`ClFrMZ<86 z(U)GdKlS?e@$Sf{e(Fe#w5F2sdbUaYDo@(w)O_0yta9uAt)uvt{+^d%XA1jSiaNEX zgOXYXzo6weWcPDix3CPL8%!6OeA2Pc%M|-;>%u`QT8Ax`vjw%FRK_4}pQ%=hwJ3zh z#$lm*f)QbsS(7BN)5-cIjFKSG+Smi2<2agxu{B01^SP(Ii(#yn7W(++F|Qd7e)V;J zAfVM6Ho1?2I}ZS@M3FE?0p2KAbQDOPMN<8JXnO<@mdaUw zkX499_5NhQ4FtI!0Nip5l@<&o9+cFIv;y%A%p|}lPPGP7_eb~!p3%_vPcVP)V>wg= z=PND_#vFSFW;Vu{pgNeSF_bXysZQ32je(v77~QyI<>~Wk`ut@%cYcQ1;S|A-uHxg_ zM0~AatQAj0j1Z+v7Z{y`9tc%Z=8&=z zstl--NPZayEJXgcu%h1~IF!EOPIJ`FjYD?}tg&&sEpsXT0=_d$Ds7G-KbZpmPC7l$ z;>&uxcX}rY-)o*h_f_x{1@Lx{#&nNSuFenTD6UIPB zD-^I?cu)WvR={;=?cKXrJalJvuWhY1yW70k(h&Hmy$fyg?_$UAR-j+`h-#U;VxCjo zofR={>{Hq5)@67IT*dxs5MGkYaRUD$IL^3i;)M38d|%}OX{Y{I1OC>h$_f5U!F&}2 zC|QQ(B7wP9L8_qE04!9F!FFf(t5>Y8$F{+CvgIfunaiJN#26)h7{i94MHs~zWK7a( zz z8vwF|RtdKf0d$%KdoahG_1cy>EJSPQ4{q>dB)$^r<~`gO0M;f6`UGeo64!x(G8%_QR=PXdgLhV~7-kuUzyjMKxZOao7XXAf{mEY#5q#uvKT|3c(XvXvn#P(aCdv%_|5`(=h~Tq{Wb zz^zGyuWKmU3ascl-yPTi+_ld?4q|;zTH}VeWP_R~#qp7C>;bM-#a=@HK1-%_c#}*7 zu+4|F;&tf=1iDOt(hf_nrLxBvaF8O0`5Gk^ec^ItqcBFC(dI}D{QnJ4yXQe$fsG?t zqeXSn^IciCN=ZN?2!OiHa|Pb2fB?-)w6=#sA!*bm7f+by7267^(RG%$P1T8O9Hz?RSUh^PsE>j(0~Yj=dx0RD5A z)a3jD1J6LE-hPPypE$x=9Tuk2=K5gkV56;!myQ!a7KGEu{1+mC6$rrfuya@hPTnmq zPjF)TvOZz959^wxmj`zjen`U)XUw-Cnc5!~$pWzCqUY@2DFbk{0CFjV4Nha5GXG^z z8^|GQmmp!2l&y&%{%RcsFI<)@zwry+^I!c_{)weI2}YhJ870aIpd|ZX;2{|MN$GsL+a7D}aq)LuaVC zyT(Jw>H8FGAy#Ms(r75pK>G&9H`<(=Vsht%;rW?8=Xu`wb5naX9m#m?WBl|5PJi;T z+V8z;o7jh& zi%<9FUM**C9RK*QZP8+Bw=M9oG1l&@#LX=amix06XC++E07WXYRze^-`@VGE#=-is zdI71@e~5za57$vZiV8TXlmGxFiclVUiYg8^t5tgO8GV=q{lom*y9bK`NDUPy=rM^l z)2N0pz2bK++k*h5Y}r;FdTTlL{SGqZp1RrTfr!29BnG)5;jiBb+br6L-Y>!eFr!>d;(R071=g1J!pCzFx_+BD?O^#E*AWuHO?1g|PkP*UDtehf`|7t%Mm-Zul^7Qy!st&@$1kk2+EfR5wXw^mGS zV-v^mR0LFHNTnBd9(wQntG_nyTJV9+MWOfv^ys>3G9{2?WNfU z6D&mIBw?da9Q_!V#gGa9twY4i6{33&vG6^^+YfR7Ykw&}CKbm%yxACI68g30aOI0H zgg1jupe>ih+ z*rZR;6#lVCpCV6x5k3u=!KVUx=#3z;!3(l)^}&`bfCeIgD-xIx@3Xj_B|-n(^~SUf zW-hnUq4g9s{>*C}ON-ll`>HCZ14oD|dU%E|%vT5j@L)zC7J~AD4y~>CC@_wa^W*5Nt*F-sPF)X&&5t1Wnwxo?!p|oIweIZ2AJWd_wkp z2`ftsIn{}^rT064fo}4Oa03X?2yFEW{>etvqy(N&AXta6zDYdnhj68Kr_?g!$-nsL z>(~E}Z!T_=;8RCxbZ*8V@L-IAD%cgJU!>QQ>C}-V%65^#0(+p$+XZ0T>*|geI_35u^r9 znwc{S+6&+%%mUbZ4>1=D`SyL>|Fa)@Z(TU>&i%?4qn`^t#>IE8@x3^XJu1d2cFD|| zqF7W`N&zZjXO3PN8zOJ+v|?%h{HDO0jaUFtw-7yb?dWGLDt?p)!$I6Muq z$}Rt$!Tz`ZN)~;jdR@4`+w9)D{PvX$ly|yFQu)^q$g#6Kb#BM{vs0W;kKo_^5~olx zUqUU`h=yUX<<45z$wi!d^Fw^}y?5=kb5jP-URJY%F?~-{nY1HGg%HJ^Mp`ETXAThM zqPbFtk!1mKqM1{%&4Z(lqfj1SstGkVSp_s=P4$YZ6sYf_%SxZKuGCaZdg3`V(4k68 z%f}lDG-T-!WIYQfiMfDSFN|XU-}xnc<>y|puZ5!TPA8MA#Qi_|j`z*^+Pg6w!NeA^2(1WhY(Z;5 zNrVwIu|!%cDlPNn&dCA6HidlbId-*f@8q&r8J;%AXq%h>IwC{qv6S6{OgOYNz$9ej zU1_$V-5Bjxbn@C}>k=pNG=WrKT3@z}srmwT$!pfELD;@sOMODAP%$ev5CMDxrBz;P zP&P9j+Qysd8>l!=26|S|O=ioh2EbDqMmkqrx>`0+Wdc+<({w%|`*Y`8 zc&cN69Ea{6V7Kg0JSd)wuWap!Oyk()}B{Npl{aT`LCGsr^m;FQYo= z!Jb&+{2@jeD{5%9J89p1!+tOe;!Bf&$I}VCr;pTl*@YYI%Ya?MrQST`X}}Uss9Bu#s5AN)oZC*jg`&_4%X)7WV!J!(QuLIq4vw{2J)*@|ySKW6?6L;oWF(vc1(0gY#%waQBX zMEZE?Hmrqg{U$TDy|peH;3(5EpJNMgx#B){Na(W##dk#m6Ui@7axp*Fl=`d3T|*i+ zmjKZM|Md-7}yaOH=}YQff^S)>xV48>f3OCMkVqpu!UrdIy;w_>0S8pzVu^Ja zBE%qowXvfaL$!`zH~J8BgCT0JWFhq=IXCRK%$Md~tToX&vU1b5B`!BNZrXTG)qiI( z*qwC=z_vSJuiGH4H2X~lRFo2M*YoDa+uU=9xs^$4TqKu4jy;|nA;QtY#>6cHD4wcnpJB)0u!7OL1%un*9ve5Kq{l6dlpGPa zRG?w^NL_VlzV< z+R%0#YDI)3tx{@fjCr_Pt&Wz<)ulKV-`Z4QyrT9gy+Qx2mVIrX;hE`1_sfQFBLs+j zIs=?Z6j{Pb9;ZORyM(?;aKHEb#)g{rz6|tj&>BY@L&_iJPAEayKA0_*CgQFZ9GlPF z1)zouxZ)ndGHT|!1xN!&vP>r^Pyz*q;$Ia@ltlUX!T|%Dc?{%(iNGOT46Wng^$fJN z6cG_Bs45W9q6povs*(nm>W=+1pd8Cg+-n%?El1;p(tq^ zf14NwwQRmaGqBP?C}1yH{pQDNQxRdY(#YKsoH?dCN0jseG9*kVwfVJO~5H^a41 zt)97PrdMz4o1>9>-w&u#YrkR6AKK6!qh_r&tJUg)04fZ_iB^oDbu4L#PrpI7_uSeY zST|9jbMf3pS*wy*`ZfV(6Q92^9lWV^{qL9Dirs( zQVu8fN)-@5lsFni4Xz!T2w=$?$9YDjy6CF?&PE@UCNe>$V$AXvmKG1mhE`;?Mw}H0 zjz{#;Vn;jl*^PHy0w2a`>M%kq6^dzw$J7R`(%>ykflaxNs>fi@?o9h`!9PpM;_e-9 zMsLg7a@@!gIGf;qL#n~Ks^p<$nv%0hN8<2lYE!IBAT5l+n;y zK^qNitsstJfAx!e^}dO4pq;+IgPtK-l3E(RpO5C2aEnbuq*5^3#KH$)1dYChgb!RhY!pEGX?? zmDmQwN1cL05{M#^8~0`Y`KQ%k7IiB1S@E;n0|tf}e%EMGa!y3P?iEU~1}j6&Dh2bCa6N|5?8nO&2D%5Sxmk4n*hnrWKSu=CR@W z;<+iN%QfZVIW-!2dC3G5ut?HaG`epti{&tb7(F z%Rb~5K-n^!6}VrVn*RK|v+SN!zDo{@Wjd$|Nee)%wI;T)5tzbUPrBHdvX5gRcOyz~ zGiB;RlpA50kqeea0$r) z6g$~vfg~+agg6jNl~s_>_#&Cdh_xcdfD<1kmf}LFq5gmCK0BSlGa5>yW=WE7*I3Y6 zdr6u&NO=mXw;kN3oOChLx|!@&dU&6VeLH+(BEWKmkQ5`y)qs^Ax-~-^+R#2x5Fpj# z$h}oWpwba-L)F~YwEw>EH6;_eCI4BC?YG-cpE&^Snec5+n!9}Tab7!c$NS1NIF8md z7Te=m)&r?3C!m$(QQJLRkB57^vK!joYwV<@Du5;IAYF-6atcx`Cgf;_;Ne`>u}k|O zH~?F&l#33#Tr6D!dz@X@olI=oY#Jv`W2232+g4+vNt&c_V>GtS#z|w_wmtJrpZB|e zz+BgvbJpH#uPy2(W@{A>iQGon$-%A+cwzqN@p~9dBHOB!kGHUjDXSl2_9Bvt(97{n zCoxwXYWn@*3?3j_sNco#q9YW*zKgZ7#lIZ64VFN}V^`MxtATk*jcMTK+<|OpcF~MC z!9Lf+KEd^5fN1AkVd}f9^IuPr9ukEk;;eGer4iD~Mmu*N(7`Lq){}atBh}lg7`AK% z@E6ZpM`g*KHj2mX<6{-QBN~iU80=5gdu6<{@^}4p7H0ws_zoj9GAZk9g)Y?_S6s## znyWe9OrL#iuWj;oebDGSw)EZ#)nsYNhi*1mW>OZ!M?Tm%9v7q>@**%EU zO;n|IiZkfHq$ce|n0hITYtMAsF=2(*@Z|=HRD@NCM-EYYhtL{(#!aZ|Wu(M1ECiKKvPAle~(CZf_<2 zI#)@9scZW+cDDI-!y3ubAMkC^28u7-=IpIV72~}bEcGCHpuDbS&FAQBLg}2nb2q}n{hNFM zXNVU7sfTOsy80q6=qDTI|;yk5#dSw2-Y5U@ILdTCs+#PxKEu+(DuIH9qi z5?y4A@q2C%BR{7{I-NIUsSfQ!`D2k_Fda;dMwHmgPN0u1al>+q)P291>wB!7Pj{if z@#8!O1($C7nV6a#(4k;mDgu|2>Ihq( zjZb^Y$TlvZK+!F6MtPfHhAcnaQYrdHlIp5olT|`nLN-lth%&U|8b}47R{RI}xQSH? zhbvSw|8|)HLRw&;KGp&X27yk2e2$eu&y}Y`aaTCcT!A(pEG=4 z4gC`XI`oX~IUAJO>b};PTS1J=hx+s%yF5~|0Fwk-JWSPF77K$tx8EaKsXiGM_f0yQ zT+Fpvk{F(4ySr6Gori@t+9X4X7-;8V4;wgR8ex}9lY)WFT;1(^(#;MBOe_wS6QVZm z+ymqaS>3i@e?^Xur(zL_7phZPaFfo4gbm~(*2p&RhqQ)@0`%*$9jp5&SlzP{r0%nCel>DSiVK_`^N4zMuhV$3q&O(onWuMcqYsodNqO91+3=VZ*O zJaEIhC8Vmtg|(pmKo+O7k$#*ct(E{VQZ3MJR;hilE+Sr!K8>N`de@~Ly-)B+WHM4Z z_92G*yq)5giv(BGxuKAr6U>J|u}T4e)H2Q|WeIK_@hG6ZJ0S%ifL?zX0jMMlp9#Aj zPU;UPK`&oVJq7Z=`43LJ$vN)Ldcv((CCHslM`m*-{V{P|e6HqXp}Exswk~Hv+@dP5 zwx(3y=nv9xNPx_XH(B;*`ZFgatg_^te@UDpn=tqk zAs%;_CJ;R5l?lH7tOtI|ZtK)CuEcG)>~$55%tN)e%DLF)jy3HT+S^YOE3IB=a`C&! z2s9eUFz*Xjr-r&n!P(SO9tI7?`5_JqCrDlYn2yr#4z=__x|d}zA{8~d^s7Thm~K#( zRorapM$P&oaI-;Kq6Od-s(8+T$9_uQf+Lx#(64I$0X(wI*|8HES|OnCOVNr%4N?~~ zuPjFx4L7Phlxq2mp(F}ZkgOHZcInovZjGkQB*DlQMXAv*Qwu0o+47Fzi83C7LYZB0 zz##CN8dR!Y{2p-Q{I<2j8#_tPM$!8$lb;wCIvaljB-bhT25Q4-RnY}Ml0;m@x7dNt;up0#2PTGE_`D@Ql+L^&BV=+sNL&F3S&wA0a(CE}Py zjbb=Yb2=gD_*l%ESXshGBCvzXD)3A|8`S-H6BG!QK{3L*dpMDtX>Z62XPNI@&<*xo zZko+!f3n2JckUzU#j)y@>Qh2}p3VjY)?ucC`!1_MZ$pcC)RiqlnKQ!ar4&~s(83>o zEAe3h=gI)}TE_~K>Hf$Gx%OJE$;aT~Az9?TAit(79J7^YAjNWj>FcCMx{3vKk2xS$ z?3oqzAsK?z2)(N92-R6bW74F+s25y}rD2E&@mEnW&a!IrAPXWF`+{N6e-p4Hdh?Au zq38QU(3w~tjDtx!bUo}284cU)ZEcNiXXyR4rVyhS)tg9lEhB9^V`EeH2RjUd;!AJ= zCC25$CG+?1OdsAS3L@-1SM91+FUfzE7U2ZIDjo-KjQ*C+!*+tC#SM7Ws4Gc@_w!EA z;kppaNP6lofQkhUiTcG)v+6E;2e}nwIU~nkzGxmH(F@D*no{QFH?}P#?jYIW;=u#0 zB50U)Ts#x~vj5VmA)yGACALbKk{@`+I<+Po9V6TL-e&8Qk+Rj`d2}TmIpzCeARL?raD<#7k79uMofoD^az!q!^ISP$uod1M>xA#UFa{S$5 zPx&={w4~sQW(=fSi*b9F!fQ>yp(~p8V^-B-A{7~q#vDp(X^k(AN?Jv@4=14~bKlOV z{V0bq?-c1~zo~PI#1L3e;z`MjlOmfz+Xf5tCl zX7WS_)$$>xyYulqgU#7}p3hgiN-`3kmjt=aIH7Aw(p|SZ`TeTDzsIu!3f7+! z$K!kzK#pxd6&QFPZu6eeKjSi3G$^|_4#-yWC2Yat$F-z0_&5iq0>^U=CZ7nVLXpl^ zI$hN5opHAr=BZhnwqXpc@qTJhsQsi@sGF0fW6HbQTowqq0ZrplAIuC z)2g7Q8Lo|+hJcqx>E#bpu;-V}StZ3RP3%g5jVC-j%Fh&lo`A_ms}DgvilNNwOSN$? zJ_qmP7q)9;Qxd!}&3L~ps8#$)jtvCR`TU{=xTh5L_i(s)Gsf`epKfU7F#4ik4O%KJ zr7;v+eftp+1$cTnu5#n>u_jWn6oyt_pQ^H0HLwJIl;t zd5D!_&_i6FeL(SB|OdJ>&99?oOp5)RaiHO8RPT^%q+;xmTs1|F=$ zJndN(1@E?2TnZ-5Pj-~BlCaXy^ep`$o22dV?T@EYvr9AdsmyBteyRkT=I#{OQH%Pj zuuE{jes^)*wZM}$$Nf|ES>*kNE(yCRA28O~KS-haO3qQZ>S1X7WcXgcPyQCy%^e_o zRRZydp4)Zlq~l4#q|*e@-gK>(%U1=z-pXh0Uj&rvjAP5E73|Fy8VH?*w4u#%0WRVs zD|#483~6BCR030HP8(nktb!WI)YD9bQ48CdlhBSvbLXEinxbVXEZG{QRSafC&9Zp# zdM1hOdgCy7Sw+9@y?jFi?Lms3>_Vq0M)@1^1fO>u7yvw2nDQK>38Kjj*_kG-E-8#& zT;@rSo+5E#2u{V~rxUrtc#jsvyVlcds|31p2BzrxwFmll?#aU`=~Zyf_aM7d5v2g0 zZ+8wn%+MknSnl53Ff(!&ACnO{CEw9%HF=kHoy(}!^@-mRkMISY%a7HjMwBGuzgy-K z;jS|51Bf{+U^CQC<{PO{6_s4gU?r!l7#OLjL`aY|7$qRlIYbd{03vRWh-qZQGvj&e z&31rm1)K10{=$CNmaO>_^mynYNNW4ZP}=QUB*y>X_9d8og!7At+s~AKscrkLZ@N%4 zGAWN{l!2Ojrq*b6Ih;SD?$a7s@-7}i=sPXgVU8~cMJ!ii1|usi0Y}Gbur)tZ4W^(F zq`p5H*$GtUW%DIC+fnMMuD3a+X6G41U*_WI*B?Vh@^312Y-^y`u1`pyPr29 z?hW?iBm`qH=>$9j}N#Ff#cvkH)?+ZySIDb{2(rWAzYT?uA>arJPImji41>7;q01*<#_ zcStB)=|Iv0lTeU56IPsvI`->Th8E}b2PzQgtX-o}Ay0Mlj5R&(IWqTi&uLI(qrZ1(AhDm>4N{=)M=K>O zVNrQ(mzQ~vJeQIp2w&%-s_P1HdpcbPz>INTDIPE1`4J#U*q*3G0;_!$awg&8H4WME z&&B>6vXl}c=pes31znk0_d%>foCV4b!NY@}_EYvubfH9cP@BhB1<>30)u8Z`MMz0>8M143<=P2U_mOlP;SBR0>5*n!L-Ob_MUI8AMeK z9;2&wk{7dw>Z`kZ$^9?&JKB*j<$*scm`Cj)$-6wkYk3I?ZQFO1Kglvg8la3b<>`pg zO%=9)bXtOGgXjPY**2oxT&c7+x=8s8pkQOD@Gcb3SDczuiJ*{hGfxvA<` zJGt=;!3WpulleLv5e@M)%ZwPfL)l14`n87Qyz`msql{3oPLu%#I$EIi_-B&Fvm`S8 zc_2om2r8shu6m*7RBDGOT#FG)8;QQofV%6prwSq!)88Bgf_f#MH~l`e;d)L%_``18 z<4Fir>=?t{;K!a4*5eEdKr7CRiOjP&-+0sj}rWm&$TnD&CEo8eE>H zqdQO&CD~mjL_xwyEA+e^To{x}ThoKfhJ5?RXvSQtvSpTF_5x+(5lErjMuG7`@IKA* zo>#)850|R2r+C8j=FUsO6xnCDO8;jMpM>vjHq!wk?na9xJ^&-!M7YH`E|qeJwbP6R z)Mt2OK!MyDxg?e(Q#YZu71CN!3>5=w_KzdW1PBx<65fE?xfn4>d%z2Z!;hfi>WIyI zLC-IVyA;arkAhRPh(6Sp3WV!j!G?G!MI`h`!hMZlujT}6d}qL7hLnWGi(;-o`o-sV zWUCQLkPJ>x`hX!Ejus6eI1~0Kuy%oO0&r~WB!i&R6jET$)-#P$pW{t7DWK*y~@HfAu!8rF8Ow4K1CjI&=fl8^<*YOlA6f9!kHKOMRpJ>H$s!s2mLTXTjkyU|p z2%mLALW7QqF<4V}WXM4}Z5G&LC&!A)6EOwmG*wlR!2-XqUdwjh%)abyzI=JwmHnC- z>uXafrPxPL=czc@Q@lqcaIdZfgpsi}wq#5Poi8&jl)bI$(WMapkvOyf+Sbwss7gg( ze!GvkG*5>M$A@VkJ?tK5>G(VT3fub+`)y#(=$uj@R$vsf8CTP6j!#;3hr4>`V{t$T zIoS{PG&qC`x9_be5UtH8A>;dZv_7YF^c)GfKXfF;I7=6-ux;3@ojD5zu5;AP44_rG zOnuBUyN3@Syhd5Q_P+Ud(<_k62hYw$+f{l^%{aK%S|?(ewbnY7SXtl{K#H?fN_ zWw3KvHEZ7hRK(-bslb2}y0eo53%_uOXbwXCP?26(r=PklRaZ&Ok|SbgqN=qJ6Fx;R zI!ZP^dT`wD|W z`ywo(0HiGwEvwF__`?&6_7(ox75w5jB<%Z2?dxeA9B@QYk#c}ZGjV=n_FRshgbWFUm7Tr{_)2MpD7G}N~$ zVo^V!J2`=-j(moEw+IR2fQ60WWhYTZu3}tR>W;R4qgH=+bI=f+e#lhvpd|t$#Bx%g z_KdhlpoAk1a;8C*_43){5x3a1aH4d8U%GGm!TpF2c}9{A!BG`gP9#FaU#5HK`G0eh zS9!Yf{h=p20zr%p+Z)gsM^Y7&Jq#KE8})!qz3uQAv!X8)m3h`PEie2S=641xf zMnw`HC2!u)u=WFsEdMc@4DPk+JU^Y@;5@+{3)p<1r(=ipCOGjj`>&tk7pkAp5jJ~- zW&PDbUTJYlbNOXXThdYlD*gMAbfNasrrJI$DYXGA*Uutj6{K0=T0|xWYZgNqR_L0h z+!tAgkAZbt2})>w*M)6FcB28~=xv%6$S4Oy4p=FYio;-!GzaYob* zIxQpQ^iy@twI_hwVXf95w6vj0HYt{C8MsE801Z=QHPdwckQQc?tQPaTi47l6QpAa3 z|4y~u=7io+@H$dp!U~4ttv;G@u2NsID&6Jaig~i!0!C&2S=tOmk}=o3_%|Zmx~zlQ z^pB=Pv*!yA#bb0IpJ$@!VV8b2!t)m*qfGXHc+PYpNd4#ev&OGX!cNP-Ia!iM{eUh6 zqSIw8&BRBvs<66*`Rpka!F(K%P0(Sls{xInytZlfsbq{-AY&FZ_AJp+jzRkmK}7>{0u$e($(Z&~Zx+_jPqAlLg1bl%shWGsXtK zurYfW;ah8-Vt=roVg>SppSaDzqHfr;8UJt(>SkYfs83N&aZ`uHs9#xzZ$i5rpNpfX zh7I`&pKf8qf?6U?u}ss023CvTCJUs*n&ENRVm!t8pZ9|hUl>lwsj6BKKkN2BYj;Jq zVHiS85RyPig~WFS-z*(a{NK4UPE#B5kZFqYtecs>nyNaaJfuT@a zfha1lQ2o!DiObE&J)3RX0U1=gURV_GHH|-6yMLqxTNr%Td4{>p)Hm=EKWuM#$TOopXMhc$E=R|j!49hKBDDuWwkbRtiyc2lgxbSI1GeN`=y*h*jq>) z+u)Ma@~;L6^&ImvW2C;(Yp`|87aw>i&g(d^^%JBtf8iu+`B#@?ZjmWb=_yX_4%7^|E`GYnAcqU^s(Yw@{^DCWYMb~^wh)J=SXiNm z%D1KiNU7i?(*!aWQU+R7!-5|~X=iEj?|$fpq82IT1Opx$bO4<(RWO!5$}NYFO_YT7 zwEn5`?H2*c9t@(@e8BHMvjxPS!;9=Q)uxB!se>(orDj%Tj>)J}U-rLU+%@3X^s9u6 zq}wvoTW}r`J9T~$7&d}fXK|l`UV7}*K-I}E@l*H~Ev+ABZ;kpa?>HWr|9gKYu7tF) zriKzpx9PCP@&Z$Tex2*ugubILt#gf^1x_qlQP%0L~|7nPUf)6*kqUWO=Yk!)pUQ91k63nwqCTNWcQ2!r zuXHafhH2H6VzpgCg#Dm@#>O51MfD9;VJ1PYMq0*oTor88u6&s>j?tqabLPbvI{3?k zd)l2#7wSQ3z4_+|f8!pReZNl>s!$q6=iOM-9?UU=tK%_+7*w7ORbr(kWA*Z(e-*uM z=;P`g)Jl4(zOci@!KFB+Zd({%conTH^wTd7vfW)$J2Tm3KGM|y3(_k=+5Kem28$Wn{g8TK3rSmvUkO9tR;ieY zDLHLC0AwS+?1xfqt{*+EmA4FC*x{I>oEaMZB|rZ=w7s}zgR3A=HImRFGVqH1n;`#sN%n)6 zTEZ7yhw&$I*~Agj-!l$z9vc;}vhFcD24%z=>nR0HEn}90566lbGk29sX8h55(}pzf z*=jr(RJpiXnEhT&hGnZVBikZS-z$a#o*u8tKOh(S-=dFeHm0y$ZJ~Y!{{w9k0hBEr zog3)0ay)ma_$tx1bA%uFpkt>g*2PuY;1cqZ_Lvbm!q|uI)lO1mVO;*pw!`rxoJaL} zt(BZ9b*<lIMM`1tfNMgl7r`IZ0eok80kDMU|)8>^1mvkC5KA9eyf1I?R5!z0^ z0UcK`TYF?xCCVq%rWTwTW~u~9OtIo+EI#Nm)-2Fb1W95(S#F7g3~nY@aP%ld3UdX} z4Yv9Mj*pKTPn&nIzIBtn`7_x_ilL{0|CwvQkN`|}Wt{QMTnQ-zsR*xzMfO7edRAr~ zQ&gz-8cal^&+TIm!!e8pGq$Bzc-yLq) z>1P-L-uw1EAD?3eir5PH_t4PF9Zyk)#W+}E{Qr(-t}sMCl7B*?i0UL5(l@`2Gqr!g z==CL9{75XO-<;HqD&z$7c0~W297V9&4=yv*Va6{RC1OJ@m@leoMy$2rk7R~Ro!~C? z(hZ`KSsVMjqx*P{g=8}f`o{?VG6t{xTPfg;WmM~_X*?u zWkhZkMD~{JM>+*8T>BF~tuP9BXZ2JYsjW~&YJqxmlP8@H9x)ftCmN|-+ zUN*@v?@_rbTbp2xt^%po?)Tcq*Dgy99n}Bb?kalkf{uOVy>#0zE3tRWM3Y60Q&3j$ zdiI%bDPe9_-lxqJ{*-ma*6qfxP}IW@89Czv7Tw=kn;o~h6n>fi&YfA1_{x=!1z$fP zLuJlicYbWchdKYiS@(+6iZ@o-g~$Jm>DYf$U(Ji?4)rq}ci?{nz-I;nfXoaUp}MIE zqs?Q1C_50Jn~ZZEFsq^_gZR8+N3T9DWVt{5Z}eeI3N3#*^dm??Lg8`a+on==nL%=y zTD@9Xf`s*#z_6c8KcToefzTSO;e)7SMeViM9N8=D4=$^=tugDjIz{$Y>GLA9gPdGa z9Ad!V+DSj@rNhEi4GBPqoXG%eT4n&S%xp~=YMrzF&0c^CtYaCblU* zA}=(JmH~t0`Tz1(bo%FLb>@zJ5x+Nl><9$R0z~X>Q7Z?5Jm7;F>Nb~#4r8Jqz4~!~ z?NdaJ*AQ<{$fqZdtpvc#cl1ZS^ncHCd3XBJg01o*m_F5GR`=LeAtl;9*?=vge4x1C z`I=XhqBxytGhL)4y3t-;!=IjtRU+F5Ri;FH^h-|elWTVctx@`O1RW`$VM{x(6pl{{(YbUgB23#40X=}pwX(o6o*{$6 zNyk5L&(td(#^~#qzU}^} z;)-e2ZwtkLBW8bOMMOjl@j*i+f2CWT+9=P~QTv{m(gL;EUKx^b%$MzIes25<7@ZeT z=SeU%OO9j3|Cr9bUh-k<78N!F)LwGY{S^F{QBmt)X1il}EJ2=F`}ypT1{915@;7J2 zp|m2=epxF4$XB(JX8B?VP8>Q5+m^8B(t@S?_>Pr;Q~BUkMOxONHCuFVIxI?ux^iVg zOQ+9(C?x~HNxuU)MK*F3X#|x%Y*JPtOZ|Z{fvKAo|9Zq%-9EN)TgsX?`35>1FIIHe zUNYv<^MSkyGxS^=0;3J;tD0ek3~KB`v6_6dm+!;o<#o_x{p{CA3b$?eLKMn}+oTI; zB)Pu=78zJs4Ib@k3)7fdSoGA8A#wP7<#?U#zJ^s45Qf%zJJX(%6j{04(5Mf-OggcU zmRG0VMP3JJ;u^9p_nkcw6WfS@>S`YVv3O*f_)-8g76ckRN?asL0=T3C7!lsd6Uhv^ z=rHfLL6`al=jsgXPrqh!i#Cizis3@1RHQ{-nk}lpHED<@DX-~O;vq^QyBTMGV}dU) z=o{q1562OI;;?KaI? zeN84PYdzyz1vY(_a`^%m4ToxVv`Y6MIp+TQtx-tl;8F67&On=WWDE2#SwaBIz28v~ zIZaFzG6T^6ozTacM+F%QI*8q(slWF>i#qzX4DjE03H4m$ zbNBf@+d0Rl;1y9ERSbG}r2F5)qok_RpjZPL*WZ|yvOfs&ajKQq)w)G3M#CtalrMH-UAVKVGxz|Yw8_>oC&N#Z-*Yh z=)=?m@x_eh280cPMkAhm_{A?^;0C>tGax5x%jqktPyn+Ig%kFp^sA)Ej+ceV+M$o4ROy~VMYYl8^dO10yZC&9A~q?Rl}uSa=n@;1FpB&j%wz|Q95T1Fk?vdM zn*iTyXMx)JubccJ2%bo=7?1#h!FAvVy-L{kt#tZ}y!kWkc?3Q6&}RVj$G9CElk(%< zV8!}lz%bIXfxPBSjoGxjIC3SdyGQLzY}0p)5fz_d+CSuai(!8>%BbaY)KbIwB1v(8 zgbHjzK4gc+Msx5`|Jetm60w+|<@WEg$DPGnjHw_(| zuFz1Dp95t(5wVebR5StZXf~vJXIlWt?&yhfN9StaMPkoOM?b!&_4-5ST4IW;w12)? zd{;gbld(Qm>>%pSf^@Q?jpi`#)`}|(XT?!IRY;dH6Gxa{FK;>_-`LQLj@H=|*eWh`uul%C0Ia3nM-kz{J^j;CjI$RiY zg&~u#$0pz3NkctrhWF}@{k1MN>(8;_o6(gcxu7lC>RI05r+<_x0#?27yPO2g=ss8h zHhoCf9c{q=MpWN{gg#UsUpU|Wpc)uG70j2eN3Cd3hr7j42**kU@(DYGjwbVJvr2GU z`VbN(Pg@9IvDcAiSfj_VlSooLVOORHWV_V0IX~09gz8yY@V_^13kzsM0wQpz)Bl2u zO8vd|4=pz7zCbz=HeV=wp}Vga(V{;~S`bRuM_jZ14oR{Q)kitB+DFtcutQZg0_iK2 ziiKzC0O{#q^F}a0|D{bH2T1ezC~Vr@(Kl@4-cgvW1Kc~bzs)vPrTU*=jZNV%Wl-0D zSTZMCo>O0JHqkR8Oqdy5sfbLii7aMP5@~LPnW6Ro(Z|!=>G> zSlHVKcqLbKmmj2j#pA>9kL0N|>lPh~506rpNQCF-%8IJ{I0h3FdQ-V>TLgtVi8ae!CiUCGFQ5>mODxVJV?Y?ck2nIFT*ty=9Te z;Qp~8pWD~)!BNI!o;9eHQ;lL}Is7&W8|o8w+fL7?u6`stj-+J^STb1q6J8!)DeN6c z5Xk>hBHNG*3i7|Z-+C63alHi zH0=v+rAz_Rv6D7R;p4`oUZS}~g{J46k=n!}f2Z^Rwg$=YHy^dc?a7x0uiUr`HAf=n_MCqol_`G7SmDp^O?hIw_td@7e z_OHcGUb5Y1r~?he6k$eI7(C@!_$;xpn@(-~preojkpEZs(#gtyuOMD9JcfPuEsREN zBG6L&S>Hnu<-7_PYWe&E81(eO(j!VKDYs*rsuGdy+CrJGVsUM&1vq zeh|y;)zwuC(jgoS%yoE~jF240&p7}EDc91R-v?5Zk%K%O`$~tUCR`E9)9T@9(5XjhaWMZMRs<24fV!q?|8y4mf21pEVBkQd4th5%?d$K@H7~W%oLPy-mVAuy*}) z4)+rQ%ClxWKy-6sKdFGP-N*q@0(+Cw1m%V{K?nXu^>df_>^v_2qPa8nam{6Sa9}8V zpw;1fm80qD_O^4s5&$P2F^#@Pt(S(Nyy8^cU?_h<;j#fVvJrmn`dnH0$t9Qh;Ww8T zWGJ^(^=T9jz;O5F`wQk*Dw&TkEPl$LSvQl!S;5kr766___nK>enmVjNuH~09D5K*~ zD;K)klmUJ;7y~u^oEQ=0t>$(fKY z#POOTUd%UNlGztgtY|*KUt*d@Gw6zWgusJFP~?H|C-7JbBC45>c(ebB;P&ceOR4a4 z5BZMkJ6hWbDHswUu)uH1>Oc*eJ@l)I&0A>*RiJ_l_=qt}M!c)UDtJ?Q$BQe?#e2+! zhG(8s@+>NO(cd}GMhhNg?S6eq{mM>J(_h79_-fszV>=FPkc`;Xj{LpQjxXb!(qN+% z{&|2iCL1WwP@P#DLPlJ3dviL@9%B>}xQh^fyNnGv%!HWz%dTEJv)f4Ad`I!q*`eM| z8c(*rP;6oj{SD2ZU50c|AR8RkrO73A&JeV*h%z&}st%if)dFCzJ4!M`o42Q-_-=*o zoxuWLNHXY&`Vy){A=*D6J%ca`uxRJ{x`Msty-7a$;o-|Kg5AP@4kKR(6GLFhy+ zq=7~j>3SwCuC%Z~t&$qLEv1o@`5Q0dD;9qMfjzWWA&H*2y`U!V_tp(Sn-~}Qy#wg; z>xd4Szz3s#FH5;o$C5Oip_@0$gQH-Lp?%_{j|)nGVjW-0J+dvb?z@#(&#F2CarIq|;|NorK$MP;i)VLJUDqCh!n1dwSC z6<`N8I`z_VZQR3kJ#Y)>2TY+_0mb=f&TriKY!<_-Q;i;%WfCkjb=s*GzQf3TGOSeY zw|0Q~Y59tcEh68Pd@yfC%8BvoTSx3SFoflicRe9=buE9L# zAzkJ=L2(TkO3<#ZU+d<5aNnSwhR2anmYJTq$WF)H6lCs`uzA&9_2)BkE)~K&hxX9{{Zt$b1M!z zj5kXa1%V~oOT3hdl8b!0aqF3AlTz)YP@P-u3hL%vS#vpX^&>hmtFEDe9arp1v7*_v;@fur`E)0zK}RW8D*c2Z`}u0PgEh*^!$v1k-4_B@aUiDyUXe)wE<54aCP?p z$5nA_&i@Y{d7`f$tpxHBPxcKbG(+eA3FwRqUxpB*YDc38JhUE4VLVy z2D$7D@0q1pqCdpziDWK{^hCN73A?;Y1f2K&JV6v-LhSDV`J>L_SnEjAp8TA@swltT zq0Bm_)%dMMSu-vEO9sf3NfE_d5fJL5H@(%60UyTH#G81mcn(Mr+)Fe^M3R!$pFxg2 zeing@su@yumZkaeyt2!|&c-gOJifh0DQ9x1d#ZAoD{RquP^H$ z{Plu!aR~2WCtG16dvO~ibxspruc1GWoA~+mv%Y}NVx!-v&{#N+Xgj8W{d4L!DEc4T z3Zhtb^RwgN(~uV*{BO0EC_nHky&wV{l#)8G>0c=cy5&#PrJvG0p*RIq@C98g?f#ss zw3@w-f4bF}`-;oM3UPxUdh!pTB{?Q_80%YukLbF-a)p!O$q#EVz-qbo>$k`E-jH8o z&!tBqk9B0aUbabEHe3a?y2QG{E*Pd+@P@&KudVzE?h~>%uBArX3lpM zbqfrPG8(!KqBc7O^RYhnEIYS2aP9;RKgq@hwb=b>`X} zzt=#0Rm8o$yz0j^U83yHt?&$Jw_Fh%>W!n{;;mvpQZlkJ6!MaS>vCcF9P?w=ssrTR zZRfBxBn3>5KG}Bzj3JHtGcWEnQX7&1w_5oQ4&Fl|;ovlM*;Qhh0Mx){PR^hXKFnevkd8_gI&`C+RBfbDJOq!#vTI!ISMD26p{siTw z5MwbZ37af!l>4+LPd3tq#5m6|y-@Hwegfe>)%Z7)%kNhHT8*}1cuu)PtU|zjhwVqC z{>BzevV}B#72)2to`k9%MWaspIYOo+kh=kSO!6__`}_N zTWhqW-^7Vp3Yc}eL#nEMAavlWC2DA@e|aWTXgU&3&={vLYjgVgqU(z?O6vZ5mO{)! z6xwUq@@CnD`MrtE_!~6CKv|n-{%8|*8s0nfFD-AH`ErH@V68f-A}1O!@^OeD;Mn=~ zjrgLbTCkRIoip7?LfHSG-SMXfz=+l;&Oima61DUr{0uv^jPyy$E>ACoVrXoaBA=SQ zvL1KUDF0I-IeF0W7RbBlB%T+9>Kmb@wSmD^|i-~B3-9@ zas}f^g+(YQ+FPsUJx{9Abl(_O7%guzw}@1zV#Xeo1_c%vl({)@;q-&u%pWxra)}W` z$;hWz)IHoA1G=*>s(ue0#0E?A(q{7qZQgqY!r*gGR!r4YAN9h6V5PF61$93Dt}33i zQqo_IdXDL_(lV)LV^fI7Rs5KthW={?PwT=_D;9G9FgfDU7yXJ0M-1~FU@+a8MW%`gmglH1;`FJ ztjI~B{F50908(U;HJVJKLV8&baLk6~mrv~=jMGa1o;*_GAQ=OV1OicTRv^ipB)2zb zjz63Ci+D~<_LHq}|K)3T^NH@nrHN(-7DS=k`9-5}$Tg;qz#(zCD**_d9367rRR-J6xv8pXS#{G!(E}AHdocf#K85EmbO3gn zRdkF3RoT=bYuomS{IOV`MqVdcThL_Yf4agv29$g7Q}*h9xUM4td~FD+;@rjADNXD) z=k!gvYM8rHDnU<~>~O$MQ$`sS=X{op=&7OV?-kCg#gsW_j|K+w#yXa4j9{t)1Pp@z zBk8K5+TfaP0>Ryi6?clZP^^VODQ?BxrMMR>?oM%cio3f*DemsY-3btK^ZoZRD-X$< zb4K=_J#)mwZR zrVz2DZi|$H*su%&R|Ky72A-X;K5-@kV?$lPV-f#oymL%g{8}?Z>G<(`F47nOwnO#j z0zHn85`K;|A6X!&;A{`|N!$Br#N`_b!2j6F`!ps1iq|H^_7%>ih$lzWlyiy;Ps|)E zz?z_sQ&muYC@|>oLw)`P<1g(Bh}$f1n1M>Fd5)uJVj#erk)S^Sre?X5{L39ZNtJ{q z^BX@A?~YCLmk;5+3aF5a*GZ`2c{I;c8Wq(`QSH~46JNhr_>a3SyB}=BBb&=q19?v{ z7bd4XV}flwM~vPgNwkz}40U)aHLuq~DXZzR!tW#nBb&`9x!$zGjrSopjj!Ju|CQuj zkRG^+Thr=}Q*9eV`s#-KLPrdBnhodfr_rk{H&t=vM$&Q4EEc^2G#3#T3OuiPs>Mr`kpOlb34jO`*x;~GkQ zQ0KnX;a8tjuTT05`J?(Yd1?=!EfWP(+(xZ$@O zA44MBh)GBcu(#mXLm;;dAJnUl3-T)cN42mL<4VR~V(R1*{ALw^pY$FuCd}A4Ck-x- z-Bdr#OU$!BTK($*>R`#+G+vJ`LQOf^?sP(V=r3C~a2!5~4V0yvbILl8{rIP6C?Y=X zj_ri$n-$`p^!Er8rDfYd9hDlWrF|nsaky*)ZjhhXm#j?hjWf>&IO&cPOFUZmf%G7# zr;_gnrgRk3F~@1!$cEI}tJLna_!)mlv~gpt3b9a$yf;9X^PN77x{$_z5A0VP^BrN0fh4eIk{gB`TjmsBw15WZm&lZ0{OGUJAzHt{Ww zvq`~AOL%d4Ps()2c50ZBQQgJeeXD=_h=wX5->B5gqO4fM`R``G# zOF(Z@yHbiaj3}y9RqeoZNsF$|gd03@O`lB9EWZDgBlQi9%pX;n&d~4=SMHB5ZTcFg z3)D4CO$d@=LNsHu2W#igA_6`;z7WnU0^gI+$Ib$@{B6)L9EAU7+4HlOUSDJX!}4)xczNn=_hoOU}a@LHp!$|_s0+?nl_w0#d)u^TXxx$f1)jUxjv z`UA*B@iB0F=tTh_F=Po`WH5=+vz|#avVWNv-!rD~*#nco>ua~~k@v&KC!ckZC%l(S z`C^avbq+i2>;D;tU24WvFiX~>Sp5J&%|bOv>CfD{K?eOrMWTA`&UMb`53;>}GXyD( zI943Jx5aeL$LF*vE+d*gn&|eZsS_R5n}_N&2I`5>%@>JOTg$~bQF8z5 zU2L`ih++h(q->qp=w`bf*l#z3=Ww@vyIwj};VqOa!r$c?SflvY$62ib&$GKqvs1^SPN zpF#C2Lklph-nq|x+{3iA?oCenxsZ%H zS9(K?M5Nu_BsP?B_PUUE z-!!ck1%1qJ7`#q@s>)DB`P^NwTk|DBmJ+|T_%7D`f7YO)w_FGnGB8(one#%f4mWO8 z@DI(dOUV{KxPOocqbufcejY{bRxzUlG2g)2Mphb(V?ON8*_?W%Uny2VM-#N(JHIH( zVKSTnsMBb{Gfse!KmBvQpSezaiTx^v&tHjGqvRHauwtrOESgq7c)-SYh3)zj(@~-3s zeFE55d?T$9^9g5=n|s&3`boJmdXmF!sqNFzXP%ge{&mgpip81-PmECyVwsFfzXe?c zHWJ+Vbons}oi|B9DP9{jop*hM20eAtp(|wmPbD%eHF4%@B*RmcK%p#L35v|whQRt9 z5F9(XceGe!D|zg(Z!cKe;Z#vbT1{TGOcPADu0w0#IE}AXn!INKh5G7ows1b@jV#b= z*n(YNB62tXcOZpqBk1U7-Ftm*6R4IE_#6Ywz`y_tQo<)#U1R1_1A-9J{SJd%I%8^e z$o)^;KM0cm3z%oz0B6x8#^M%qbsQm6u#h(0eon#I z)v>~gNP!}^idu4hIp?@XH~hAq$K9$m#4nQp1_6<3J$H-0a?Vx(LJ&-5u>I4B{YH}U zxTxuI^9hvODR!Ga2DB{Vxni$eym!CvSbd&??pnYeU^2efOkEilEe)|o?^zy({%bUa zDn>}HzzbY+PW}TiSF7A~rDaI4S_Q)w_%F!$7kS7#>j~GvL3_9_QWqEWtaaAyI#D8)OU*NVYn^AwDm(dA{t;k-`mvl8jF653Y)JE) zcLDuTL;e6C4gW-QruL`8!ss<433gzrXJNpJ3pt9N;84+Qx;Je3xA~6y;GW%XLF_b^ zHoFJ0A~3})c6GQ^9h;eFkhgF=xnZzMolkWZyXK?2QW?l_Pk-Mg3Ji=gafMO_+5{@* z%tj7>T*5)Tc)ft%<16D(6=pG)^A;_IbuS&x)IxoLf!AOCpRe)c*i2z287_c7?{7=r zij+*3 zS|zVO9!r0xwAs_JnoD=x4q*JDw>@anKY_D*DbW4Fk5G_m-1L%Ik4r7hw4Qk8vh{K1cFoM22xfVwuc)YC8Eu5P zmvPH*KydsYmjKs>YBnzzDY_T&QO-*(irGf+(4Swz#oY;JA?Tm%B$DZmx z4z&;4p9HOBh^IbM|JSf-YgKZM*f?_Gh;NVvfTQatOje zs9znBmRRoRuwhHf4Nv9c`H4l&!?bd>EQYr$@HtdE>PSfbc)QVWqOfNm1`vY5WHf_- zAwLNKUI`v88Y;kudgUz44l8Q?kTk^=1vdcp2&44AKG@`YIu?1sxaaKNvs-gDBKGq4 zztV_;8;p$W3#Y1D0QC}Dzk{M01C;wuL=ifOfmpXz981#(=j$&ut!qU>V+3b3=+9#@ zy>vgynsILr-b}3T4Fbs@6Kxc(lS4hfzWwp+&tOpPm2k2?S=7N;18S~veSPN){ox-h zP~_*D26RdrHCyJ)9_%zO$0||bFIlCs?BF#d0nJLv5YkCtqF@}nqx@eHC@5tfZ{_o- z7pSvw`*-VUT6{OM-R^o$puM~OBHyuaVxOxa1E?n@ZP+LFAp6y0=X z;(xr}y}}TIt$N{fAO9XXsTK)8+a@vbZTzoFUMWa*S+{$DoNilYVesxj#JFVn7Fr%^ zaY2TR4;IlXR44JrY${P1WPocjDg*LNtT1E42%z z76xIgj?W_L|C2;_G~{BFp$9Z~$=J2;$<>simx)pNtmyyT?^vaZ;cY@c zAS4@f_y(t!Yiff9Fy6FE3UCRasom9wujz9&y}GUL?Msr@QN0hS)&{MHBb z4SbS~4^B%$qo#rJARr@PAv&%r*;Je4kBj0`kb~5N!i-zaCz{)^wr4&(z6g3vAs$+^JhNrEpZs9U^QgJv44530;tgTljJGJ#aOzh9-P+ zZ(^=bsK{ZVWi1bncFQ4(8IxvR7(tEs?I|45Jaq|qpmeO({>ReFVncFS;;4Kq4kqkE zcL+U=G?-$AZQbrA$RxR4c&6RomQqMc=^&PAqcmb4t6I|?SC~fDVF&zStP}k3*Q#}> zQWuuP<&hmX`Yqva=>RZ}qn}9i1Oa$jIRU9<2y-OUTz(jcCSH2se9w&7n0Uhu z#mxebkcVgyn4-_oj0Wu0Yq$I5ta|Y|#6)h!)!pDfVwYDW_DGywffm8?cLv%tF3YE< z_{HC?Ulve6=#$@!M|iy0_n5Rjf6YI&jyrthVIE7Nw;!b-A`azk*=lSOca&ayDiZd< zooPbub4wKqB0{HaSp!;G4@b0aqiWq%B*(4YxE(5WG~zi2hzoFc7vHyjKRKdhO;K^dI8p$~~< z&m7kVv8py6-fD>W(#}LI7#kX<6Df_?J!)-QCC6*0lPhSH-zqv3l zF*L-!6Os~oEU>k2epQ;0@kgq95Uj$%e;eQnwx!j7=k_g75ll`e`SG?D)vB6sK_Y-Z zwt125?@)Oh*0;tGpMdk_L&t^PRW@l`?8zqw~mh&CjQhYZg z6wK%^H}BH){bOn}g4{?~kMyxP9efE<^0^FN+q}1}6_+E8ayz~3us5AHvpRKrjsjn5#LUWL zvt1otWv=09Y^gr=ub6Mwr{^5^OjWDbS>I7%KvDdT%y19>h+*T2%rA|x3Scn5jeKcu ze)q|D%oA+izw3n|!?p5-#@x+W5TW&r6*UxHCkRoD*|}sDNVz%L`+FO;dd^Lvdij_} z&L&DJ3m2W+VrtgsQ`av$Z3+C? z7$^UUp5gb6SOVN!yzAC2(6Za!RqHhythaswLZuY3hQHDCzRSf?k;&^zbm*_h0?qlh zihF}!8UTltS5DjF{_)lD6r8dtjhS*i|78x&T!jsTKK zeN{+A5CcXlMfpjm0A@(?36$FN9HCW9qMPD6feszZI7}f8P>y~DFk~J_p7Q5b-iW^6 zHv8to`2E?YJKqI=cjRaJw$sPD|2#C%fx#k*R9-00A^mD{UNL+s2Wc=-P8zLP4X9!U z?%j&blz*NqLu2g-Lb{H&dB15;30%XgsrlXT^PO|A z>#g=&aC<27bNfdFGYIZ=_LoMgDqEv(W{=u8+IRt;`7!%;Bf%I+YWb6bDPZ*il#0k| z-c%+z+9f;Ggmuy@(3LaiVG)7O(lx;wcrj2=3|Dd3An%KhY&o8|?GC z{kZl4&H=!C-uIGZinJ?BeS_-rg8V5UU^?=_aqdKfC@%($zZ_be+z(f)`xJ&@`V&B$ z_$dPxrV_{)KM6n+XCsh+j3_sAuOt=5Ej>j|^P0 zU^hH~et5L|_UCo)<4E^I^}X<21UXanv%d%tbeXSvrqk2fZ{l1y1YTDFUEwB8^1wfG z3Wz88`Gx|(GKdXeYkjbw1n$-O{e4E_=oQpgK4t5fQ^;g{?!d3dKVfW!zT7PrGJhC! zu{_Ycj)GxOS5H^qyy>-TV6iR1z7DdnsqF2Gm_4MZ&;Hw(GwzmN&!@6GHVT~7cj!NpKT4k?JetYI zhCLd2?^I>DcTS=Fui^3On)^$&NT9VM_EI}+blTaAPCS8Rg5-~cq8OcFH3k8hjPZyf z9*uIoeBD%oU^E6jJEBT0n0DK(%uleTK_%MCyt?|xdKpGBM`UgqQ)(h_9LKw!_~yOA z5xMEiG`7wV47p0U>o`Oh*Ei8KMm~E#ZQe55=HKi3j{+|M7+TYU)U3vUP>P z&67=h(>=d{cb*6Az0dFpG>v2O`oOBIe&sHOkg8~JX5m+`?SiA?0)^XEdf9gF{G=R~ zr|hD+k1@L0PX;9PH0D!`oG%Nt#n+y@u3UN|78j9XX|h+Jx!4~{+ASg$^|!qVV+$M< z3PrOG%FNOvXA(waS~VoICVpR2u4<|>`&lcdijwqzffn1@9-?j=SIDiy?l&U;UHVv7 ziPVm>uFIiu{}D5%*iUC1pM4h2PO*9GxaZmmF~I4siUNFEBMUWo2hMNYlOu3?c*X}y zOAX$WSieu3q3_S;e_~*87YqBP`ftz_5yOXmAo;54wpac``RvTpp92vB9l@@6auLs0Cao|xRKWwL!F>7ZYo zA@(;kLLyl5F_DmpO3&aKm$}quYwW7{tAhX)GrgHC%c(D^^Lj&XuI`x3X6bDKpZ^mp zU0yQB(t_qieQ$;M>=;QAd%joPPg|T$6nV=rVowwud9o`gxumyh*uE`rq5@}4IBT-B zz5}h$STf24#m&KmWfg&c8WtP5N+Bt8TwE}Asd+TC5k9yE4zCXs#En1zUsq#D4~YJT zEKLgNQ)(b5Ar9H`)FYr+#bnY6>G15wXiuw+plTUEEm0SPiFbXhIQ1!HrYA7F%$pP3Y=>? zt8xA|mrbhh_rLGSG`vZ;a~y$4m7~NBh`Mq(t%TnU4pnk1GwRu?2)DNNL_)9Ah!F5( z8y(s9M-Bw9oEGayHwx;X=m+zuqmg2~ zvl!BR(Ws*quTvNy@=4>23lLKVv5H|u<*w$D;aMpo_u7SSFXlL>_#EIA4F9;N(Dy3e zxXW%%dw$YOul^KXd_SD(f*3S}f&gz+I8Cb2an*ipsE@sZWQ}aS1b2S0l3ZMOVqEID z4|0LM8Vq=CLfKz_KX-3YQhx0X)*sen)=OSaf$Nw4oyJ=FHE7=G@qpMCRhWL4m7Kku zIz&^VmgH@``Tm_r(*z*pV2AY@wU&-GYE(-MR>6Xe`Q++Sa;J1BSzjzS7 z0xDhbDj8sK@-{xF73-dPSm|G^J-pihKr9MNB#dh5i&{@uVPm7yBI75QZ(^V)xHiON#u)e8sZDIHjtC|1qV_Jc0;B|zEHu$)_lip zcTZmTacqAc+#^?e+y{8<_vZ{E7NCCP6X!q7PXUSjl+F$vj*Pui92s(m8hIrtAXjK3 z?>dpchwno4I$O;Cr+@l=)5Xo@EKOyl{XSLTuKZ$ABn&Tm_3ifxbjfdGr4^?82V^nz z5)tDSUETTc5u*L_co=JRsYj($#JA<{U~lMtNyWF3A<9B*-w@8q&G&}F3u_ZygEZYP z=N|}9Ftl#WWb^*j(5g-I?Bq1vjEnS}=KqpCDz^oUZ@OPZ`%>&}q!(p4eq8Cda`{b& zW~?{xUE#J2mFAGGfgtS26}RNKGY5v(&p_xn@cA|T6wY04*P_NtJ&cbpB14(7>z{Ex zz12H(Bh_8`;$qX|U`?H+fVzAryM$&)Pm!gXr*KmtoQbF_*0jyzc&C9Pm{NkERD(0c zg7w>6%R41%5CW?=40scT{DHX7MO8J+yt9GCZLyEODVO=r3rYkOt^QYY9R94BjHq-; zoI(`8$pGmWauPu#-k79LY{3Gw(|*O)o9?@-!)c+3!_kZO{&i@G#`XQ;y5$7sa9Gz9 zeKun+7kFzF5$TGeQ{E0*&@KTMpfL7bPVau)=; z!!vU8RrmXBK9#R)p<|!jMfhuF2ftYdq$dJh(Ge@;fn4obJNKrdDS_AbWGNXw)q^6~ z2Ed*l=zjU|p0gyd=MB2w46mX>v%i>DM{Xe|vmH~?OA--!sv3w;z`Zu(OOuTs)cZHs`T4e=_$b$>fFpv{tv7IaOTm zm5U3q==BhFXSPu})DT)+0EECf%cnMQT9jL#xa8K%IWSzNN0h~nAB^;_S2#CP8hILVtm8 zoKKyroQ!OpR5)&aQXbSbbl35#i{}>%-#6RC_Ek{F6HyhSp!fUdgqQUPL>tIMlJi;T zAN$JWVI7+uCbMKc*70gy0Gqysaz{@>A!2z1P#EgZ_jzRbyL{vCLK5cma4zW)g4|XS zI_tlP=)=8#`UbhzYT18m=PLZMm^^~auJW6M_6JwL_5GKcc9o0)=<8I@kHoN%bNkPi zQ|^i8O_#^30SWePLLKJ|ANH5-83nWahU6sW8>O28YQfsUze#-?-%POT+9WL6+-e3gQ!ElDVz{U#n62(0p^r!===!&5CNF}d zN;E`n(qrxhw<5K(dbF-uH_~7%VSgXFKJE7R6I3AW1@hOAp%XnK0)H)-C(uQS|1$ z_H(lD)8bgH&wlS!QTL7WGZnOPGvntT9nOHF?JWs1FxquWRMEjosHb)ujEIO5A)f`w zOn#U67kQU$Dl~w;m3n?cD3C}FA@W}ik%#vPkE^t?h>mbiox6uWVRtw=uM^eB8yfYW zC<~N;l4STfwcnY0W5@u?7;rR|5R`}kCFyhXN%V;i&BB11AjsAlJ|OKFW`O`;2=|E| z$f-ZDX9Os*pa4cz@Ih|^*@+1HtVqFGKx&NM&o#nZ_=!3AX2!w^Wz}pdF9;u`MSG9( zy9Oona7x4qj9$aqEpYuNRA=JP$lQer^z?sY{U)R(fhGXwNs1N-XQ$WhKI~}o z^wSDfLp|TzNJ_UI=bHP9O+;K31_6jQuOKeh*&$tRshB`ZKD_(=6_6SA>V2(9X|8M$ z6ttC^SYPC%8HdZN`=r0~aPWI{@6%@%L?y;OhxA`QG;_ZLyXm!j$od4Bd+F^&{rv+8 z6vbOtBY~WEZa93G<-f?2_s(UbC?;DZxv}JMG3P1G&!W9g>5MUIZ)NkQS zjgrt|r=OHW?CtrVIGZ`xNoAH=hPW$aFB+L8-fAt)t}Y4tAOuzdJ?(!Yoxj{K?slDF zeV#t~{_w%T>A+_{=i+6f8xosPEur4HY28xv{ER99|UjmEsHz}w-;hz>OEbt&G=ADRE+Ar)3MLBdwoUC;z^ZyLc@Lz|T zyd!@cejh_TXfU@~$|;M_=B>Q3%C!AU^mg7};v`~?e4+c4G-o~8{6YGx%IV&;^qF66zqWjp<`5E3WpfuASJwu;62pijGo+7hx`>+daC^tM!lWENn~FC@Z4T&?d?8lw?prg5X_k7MTkc zyeV8>ML_L7eA1t>d0lq-bfV~*??^9X;1eI~y(8*#l;-Sd=@#V31fIIc&q%_x68#KU zOEkW}@$`x#rPWEb)+h)Io-ESWTy|zsLlnRz8GWTZdGGN1r6T>YSN~{@asnI8O03i9P5(1oM05Z>67InnZ&+pC- z${2Q#?%d70Lao}{k{JMvjG;4zZE6C z^=Sox%g_PRM1c4U>*=>#8YEI?o%0vP6R9HIKe8b>_MUZ86S8}+yr8bC-{NIZ)PuR$ zu?7;kXBL0c@6@<|f+^O?V|WCeWnxMd>S_NM-6_j^Sl}6AMBk- zb1!r>du8g*Fu=cTM7#8F^&=+=k;0(m`?b09o+5gY>Q2`*CUD*xJ}-8y=J5p$IO0Gy z8`r)m6BEr?_@t>OANwVLNrtffACr@@9!JX5It^nMU_Zp#{ZvPvV$J=jzCViGS%OaK13~}`=1IYihnNr zs+{a$H1M(YfL?ErULw)_-yy!*RN^TCCJ0|=Nx?4{&bXixlboUJ9i-b5V0)g%f!~&| zo|+UaPQQ|$$CGzM^gE87aRw(vyhJ%WpU1Z;0%KM^x2&&%7uSpw^n4?RMV?wmW~m-s zZV#abwH9voYyTjTf*lRjyFMuXsFom1%z;)O<`Qr--4Yqe;za}oLL0b*R@DTR)>`WC z?fp2@y>@hPO*~U2i%1n6ti+N|>LW;l3?dQDV)(U6ck^rR+0(Ip^*5Tij*#RHq zh6{Y9jDgQ!K<*)s@5^a`Fg`oz(;jX+7Kzqp7YOqlI3|tX4C4*u_%3BX=lMEZ1=8lK zY!UGxtyZ^w=65|Nd0xym>|T@(vBjH;D+FQ@e6cQfm`H|;WND@ykm|Bok@5R`SV%*i zk7wQlrs0EC@?+U%bC3{qo1!fN)M&VJh=8vIeV;Uy&;Z|et~5{?4JFXxoLmz-b8TmxQs{vJG@fN@wYx{+N~&9-{&NM~z8(Hw(RJ zG__wd2cgPpG4WgceFLab?_3I$;ky+QP^TquIz@3hrGrWqMRP4#tWAw7RTz2`bk_J= zgU35*hK$0t?mx7g54`z^MYBsX?GQD6C2vDXZs_og)iHrO2GLt@uh~5%Ki?VOO-)eI zX@ib=l-qX*@k9S4+|MlEw7ETu??2|2!&f-O7`X2UG`kr`u3I-1!5W#)ikPyUg&us5 zU=|nhCblCJCpC>-o#n@vZtf5A>*GFe)9aak)iRIX66z$sMT<9~4hy9IaZTrt`GOrs zjk?thMEED^1M<%TiUQ~yb^xL~1EQuQKYGLy_rl&VBv{SRXN+g-cQ4v^^`}`~K=+2L zAaeo_YkV#b)(duPK5iu{#bpXuUX}LV)~!0tR6+HM@HZ+a-n2bET^!iI^OHuFjUNKr zIC831_If(v47k|zZ7hZGYn_}5y2vR5=Y$`N#}!#Dt40W7U#v^1=zmPvjaBf`LP<({@}>Gj*RINJJ!*7`X+E> z&D`q|CgCf*<5VW5iubd&tFHsB#u8j?1fc|}%82wEXXAFqKI7(F6DMkS1c4G+Rlz&2 z%p~Z!xZ)?tK(*k;zibcYwbvgf18L@US7M#9u%<4$NY7vD7gL%m*~Sh;?5bYUs_8jl z^9BmAd5ujM`*Dqt^+mgpj7=X35g&*A`aN`glHPEVFr#e&J=y%wt8d6R@;aq=FHN4m z0(fq|;o}@^H~z?*#Vx_=bmN)sg-RxCYtbggmN=VdZn_d z|MA@?`g#3|Mj5RVWvAPp1i_C?slNPsN2lv~f_?rvJ-PeAj|ytvz4r<+cpbbgHpdue zqFYK3u-JSOZ7C?bPVr@dT=x@PNQFSrhTW(jYUey1E?U2tod0cl&2D;a;};hY-n(^W zbXx>Jo~RBO$kb z%jCW&l@&8=5uGyfB1fw3=il9m0ij-Rf8~bA90n@ACAX&iqliyiD{l35SS#^G1wg>` zyaINtz!Ql$on`Hi118mFpq{;Y{UHB?@w4=wXQ6@pppVd_fsQv-&-qD%{>kpakjOb< zd-2KHQhVmp|o@wUQ^`sEz`_5chLu1iv1bsHNRKH$02>-6rp1}E6B z8TPtp*OU+R)clQw9W(!oD#SL1YzE#{R>mK52GOLMaTWdJdLWw#Qr6v1h)zkc-rfqy0C)LO)>+V?)BlZRrK%wJR1{LRpcCIcO7DQCm+ zb}S=o@B&v!ZKoh;a}oNuAqg-DAi68d%OgQG8wG!>wI9IDKLTzgxnh9puMOl5$)|l$ z(W|3Vd&&-|T**a^&^4O?-}NB&f3B>j^q`*;dr`lN8>T^s5DvX@iB&Uib~@5=1A=mG zQt6M3(VAV3ABN>(?*$+b&Xp7ns<4+e;+X=dblsB<%&(hU#~5-*Sf4<;Uo5L<>8Fj6 zp{=RHpPnKIt``)F!r`v5SKqaw4c!ya%6>M(>A7JIN-xfuuwnr=ipQjb+3H%l@%{;G4be$G^6|D1cx2+*Etg+Em z9&1d_ilcZy(=3r{Cipr;_0Qh>G~%=v?d)OW_JJxpgb0v1!Q;CfA=h<9@o+ybFm?w~UdP$IitV~(@$zWuIdMtY?%%O0n`;bS>rTitc=i|l(2T4w8JjG9yjTj z4llgsnL z?hUJ#5bZQXXnWC~4qx&Oh&za8lm=%jxzfk9^DF zzGoW51Ip=g4;rQN6~)Hm@whNb?e=DRYp~M)?^<}6>4R(YdFZkiPXEre@CUkomCr^$ zF8J9tS__I7WB5HC@RM^Osq3(blk?aAzJf|g@Lhz|kA!^$9iKF>UGW!vLo%0jZ4H#f z!(s(h0;B!iL#dI+^yuH=BaRg0ClwG5LENK@(6CTFt3{=>5m_cRtf>e0g3dwu^b?6+ zl!$05Eg!K+l35w#*~7)=3#bcwjtO()uMXfah z&PzrhWG$>re&ThA{OWXH7}faAYc$v1;xd*4V1P1fJF)$u*|R?O;OWQa$u;i*0xY+W zD@Fn|`Od6uHov0!$^ZUIMF_01v)f$ixY&fPBAfT@m@!_GQU|VT{+|k!X+GrNBFdX`02?S zwmbrZo>5g&#wf3hgxwoFR&+jHS({(XbeYa#{;=;eO`N6=3DI>sw8sSyp(zD;Y<`5Q zT##>V(vck#om`v6dgpO5M+0^}N#qe^kpN22HHXJoG*B1vMbedluCS^;Qb`m-Ugfc` zJTu`#?^MZ?1_(UxSi4W09^p3>Ar@%KT;~%Jo}#|IUWR^xx-6rR(mDo@i=7z{4zPK?%Y}85%r^k38PLZ@ywUF_ zb~E3prh0V^Kjca(nm1dqpL6W&Zxz&1{QMA|Z)7SRu#0J#-lOoIQS!MhMT_3xl}F#> zS%DuqChG*5*3$GjN_ct1*}TX3FYmjZKYdM}iusVrX9wB4lg$*YZh`i2MmQ%7ThMfS z@MW5_oatOZ2&lFmhT_*m76y%rINZ1^X3<+UOW_d|pc+9UGeGIXh`fU^M_5^EDTW8^ z)SwTkWe<&*o8i%CIt^c9Wg0eHQ#Yg6eyeEPQO&D+!&ZavTN<&Ro1>i%kDJjrG2|g8 zxwAJf;?i)B2!SU&MQoX%Qtt2H>f}{MF$Un5cmxs^b>>oK|9}Wp>$MX?GR-v0rrVa#Z zEZbMz&!9|zzl-;ri(G}zHFyBFpN|V(uQ^eGxVD{58pNj#6zxLr!RPji_TQ)_ACmx^ z&(Si#sRQNKANkqk*h{8UQ-*ZO@7#;00$FBf{&5BYUvPEB56 z#0qhlU8<&mYE;UjzU!eX>(i6n*`x-ExsF>E{3$N^g4obQr42#M7sVyK6MJLGfDR4P z9uMij&}{WntNL>TrjoJt|1FUJ%B7rmYsM?1e@=wQY zTNsHN(w~cYHmP z+%hO1t2)Bdfc!v0|8_`2iJ$AW9wk+z?*QlPtfI?8-i;qSE+2 z67Hl{YZr4e^lauc?r|*GO3GyUtJTv8q36;c3S!RahD%+#u51{f^w z7J7d&g;eXTTwEfrft9lmUu%1DolfdblDuq`-)18AJqO4_aY-0QgBrh z0BrouqCtKxeo%9juKOo)wc}wLfV)ozwWkV-AP6j4*qHT@69*{S_#$}qvr)JE<96g> zcg3SD!%51-)5lbtAGCl)Rlxc~($iC!u;i-Xg%ExQFVhHz&{~(kk0jwD4P{6tI(7M5 zpRR!Rj!8T*Bjm#^UJ0IMQT$I)I9931K%#Pm=}ag7_lmx%rkf5fp;tgGH4t*D$g|q> zvH@h}_6`Q2%G#hP;<@;Yd86|HJ#~mZV$QqDE3si!Eh$1&S3|R&FF?-_VNE2HceiS< zkaDx;xt{*(_wIGrTn#Jl{c9w($ebnOUN<8+{P1w^8PBo>2=Wg5EmuXJ=oabYUv5oFq zHEt$nuSt(b`xlxnx;}?J!1LxKcGn4_%TZj;c&)p8h{yIgt}=!RXoxHoKS(X1yRSR9 z`D<-Ol>K+1rJ{l;-kbqegjSmRa|Pp!i&@9kYTWDxR5Pj;oXd^=14?1;8nqx(ww_!- zZakw@RL@4sZ;i@4$e3)4@ZUIi!63Won{n|nqj8l))k%JS9{Ya)B0=50!sXAtEJt@A zdiUZLnf#ysc=hIA`K9D5fA<@!*FXERTsoZv_r2G{LJ9rW58S)&-qW+=v#>l{Aom_& zw$!|oy&FTSdRP<57;EA*H+OK85lyp5)jW{hKJ%nK(XFEAq-LAd7{Z!T;vNrYbhVF@ zXd}_xzMAAm6iicth1OKJ1`*Vvl^zsGl+%-iR{?|&!@|%~BG@;@_i-7D2w)fu_N7ss zlVWCHT$thmLh$iCiS0#N8GsfNe2I4BOLa9@-oE4OKoQJ_MhVem8ZVH!v3Ch3pXS2_J_l^AY)z?=`Bj9T{ z!=p?4A`nw5^YwIMSsNr5s%p!l;ER}2uP(ea83vFz9&6j+D|it>8{ zNmuB-0`6!?|C?35mMp(WA`sL+t45?>8s-H=fDi$EoVJIWC(&{lG$g-xrf5Ao>s13o;9rh~yNbiTw=B=&V{vn`_0vs{)xMT&w~qvgOx$vDe< zYBP$iTo(bDB7Z%xFwVo9m<1ow1ZKX%s%kq42-ZL(-iMKU_;OoDDJ&3^A*LgY7b~m) z@bW(P4)=8Wsq4J<&OO|}a=<-n)cldp;8U-@p|`Fd>d_ZJDc4^-!qE@jUakJrm+i+5 zm5Ze!Oc4B4JA9fsk<>rUdt(Ex^AOh%xbRmhpQdFjZwy ziuAAcoLdnU4xwrV@-f!ad#D$Npml<0$kC#k_F)><=w5f)Yz(&R~t@rvdFf33T%%9>}f67inZ2T56(*qcv5`H zXMlWLB9>hp>>D_eTW~6SrgdDi(0@#*&8K!)p9&kGkNFn*B*X?ArkQJizkL>Kr54eK zVgv1qqqPd6mN)lYl0D2^#~`C8MuUBqRWWIC9=h_-@hCp9f+8HB;p}jV$zZuQjOTTD zA18DopmR`T;^mTigksXycNfqP3(LE0EEejG0kf3Gd4z|jy4;^I%@Ua7Q(cZT+QdZg z@S)~%bTAejM(=r{X@=34Ug3?O|6=yq?|ygn#+3u?KROMo@4w|AT|VIG%Apx~uc3_9 zF;e(eLpvT%O)+&rjn|d)sI`sG=BB95BOn_4MKixxS}*(keJ%5^<^Q$Z7i9}TKv&w& zw#>hP;DytFC2?=~^`SBw)0QfrBq6HmfBn)5@M|^4)Os}~XHm}~i%x(-=)h7bP`-`@ zSx_BV)uQ)UgE9aSQCIk{5n13>HO~Wb7wEj2iNXX`ssgJV?pr_b?|St?2>I=A<6RdJ zE=@W9zkX+Ndz8^$J>>Y>C7Db!B>SJXS3Y?aFaE+;%-+h$%o>K1IToW7_6P6CTYF=j z%$7X<#C2Y|c~4J;2=gV}GUt4;QU}sS2X~&v&n$WwOf!z|pX%9Sh1ED?;sbP?Az7}} z7jkfu7?_|4_l|M0H^SuI`?$Y9!T8Y`7B61L-dpeKy+869zLHwVIK$}bA@}CX;D7iI zZmB}Q^hw;fa=__}mvQOUABVet>Sy?w-}t8f;lKMA7zR+{bkJ@KjfCyz7sD?|XV8LVW#Ot8d+Y;AgMC5$0b`V=QbR;Ze5}ex0*~BIWt)by z*AxVRDSC~?lq5(5{RI(Vq8|XF5r45KeeH4OY43|xmeNqWAVr5-9`6H@C>N7rCAdk}Rz zU5LIYwr&~#`r`R|er6w$u&K3R8zMZ18Ms(-+!F!Q3xUZk(TDFhu>MfI+v99p?{t2> z@?NU$c#$GM`#;rw5`t|7ev^FJ*ecQ?x9l3mXZzw|?bh9l_`}-Y`_uu=n-+l6g}N(; zGA=jjY=(JaVUuK#{tx5%9gog*nHresn92QPT^#K*ODt-|VWYp2PvdU)KHVc#fl&qv zKx0A&crZl@RXC53Sjg#ISEH24cm!M32nP~i7|+Qd!QhbZ@9W{e{)_f!-?%l(|KT_1 z4@Mc~)_p&_bx&s3FPVuEh&74;LJDOz+HTdAXHo$?%IYvxi@fdV1wgNrSsJ1dVCfA& z_)zF*%io8}P!M%80Luh`Qs*B+4GwDHU-$H*l+8n1%c3LzfVQ##4THmmqrMi3gwpD( z+b^#n*7rk%7Oc_(iz8K7C6)vOLjw_%WI+(dj)6jTpp|oZ^>5X~tkJFoOcPb_gE}9A z^UC0X+y{8$nIyERdJ`ftaRK4heLYcC{P1nP?|c+9>`#zRMobbzlcg|+ zQ;tsOSbgbJ=EaAPkT{RAHDF>W))1oVZ(NhfD53Qpemagt;Goc>eU3i!lHGsnPB{M2 zO@H#@WtqHl*Uvt8!yKj-_H?fK;gso}N4l6VG20tseCs~%9_{1c%Aq9JFY(~}Z-@83 z@@anj-Xop8cv<#t-t)6-mt_3iH~jsB36sT2HFv6eW2ATX!<{$Yh5g)1`0A@alKi*- z(9LgLqxpl^{GG4=9v}YJxAU7n{V8+xJFok@){?jHhnY2y*-~>T=tFd@hej!Wmcp#^ zs5l@6qYR@+gR#5@6h+&3l#Z zflyC;iHbOiRs5(t5rG=UFEI#4H2!R;#(-8Lp>IShKwlF34M}>_B%-nsD0}&fUV4gD z2K$Kjk&*zQvBlqQK?0P$z|Bdzb_jq_n~4VRHCF$X-g`*#obE%yMIoMO5`2XTXmu|D zKqDjtWxGSOmzXY8?J43_=>^`9kn(mBH&zPk52?f(RX@vmfwWk?b_FLnpguA6bid>W}62S*8v zD)hlgSd3Gde#n8|Fow}PL?CXC#TS1{Uiqb;PjCM2_uPBVxk>KezW0WIaOFV8FJF`C zIHR>jMT9CDmIpV%d(+sjA@gs#|D$jeN9~-?#&T6Rdhr_8Dgm-q2aw8IT@V^h zAXTSe<9DGb&6V2`DlVgP7Hk?8ic$oYF>uh>fS|TaA}HJm<8c!8%#!FQK$Z@MrNLS> zHakAU;=!rTp#edup|Cdi)(_mfP5FNDuUZ3fu4s`WUdBYfxcA2&z$j>9~)u>bi3{eIE9qIZvVF�PFV&%x z+6(BM24g6TmAb^zcpuH+RxXmZs=zp<`OR;-A5TU|R8>bQOk&Bsk&Knl#6-OA%UUj_ zN}#9<@WLh%uOp{e#d)DJx1!XQs`9DWZz2*tVjN}K|D9qSo{0<*`5RwE#q~9=}%V7fgRvbL>?SP8D2`a(ehL{$J>0GtQCk3>Lp{U^LuRsQ<> zVm&?-9srHXU;*$WaxSI++A!WY?QeANa}Ev{u-fL0*A zVO!Lw_7~~{HnxL>ZlGK*E4gy(`%+wivger$h(*S@tRRSrGUl^~MqqidOR;gjb}3e} zP9Ae@TPxYBpT(VHmW>T71ogRmFA|HhowoxyOWFt01hU!3cwnn5fu^A2slo~ zC={_OUl&>_jeSETpWxid0mEl#Q<1_H6lUB zBo-#Mu;UbVlp;wCO%YEf<#~}i`r}zxJvh;&^O!w4!~AUS^Vw2$xdK-%l4%se3XxcX zNzwBJN})o~_4;DL6?RUjEfW@H2l{VJ1?Z3YTk9?8i~U1iYr)0>?Pl=FwW-vF)Sx?i z18BF4;=_Qf&oTdd9LqgkU^S1Spx_gbF6UbvUWA5_&F2wO-L`AXj81w)U-y2c7SK8c zU?WqsCW&D$>(-5(s5T-LPxZrnWaVWa6zT%}I72p6|A+B>vJ_?FZkImhxi^((bi(T{ zf7gvSCO!9F)OG174UbaNpy5_MjA1;F!x#_@*}wcJM>l@&`|kGd|6sAav?s~y?}n4h z2Y!@TV@RZvj3GgT0%*o$X*=J#K)X@^Zz+I#1pXc<0l)Kra}ehN=NU-=1b>-Qz9u3leH?zR42TV`Wu zfqOKS1E_WSiWb38%@o#B3{b_67rp}#eh08_IcSg#AY!h08AHh8`^u?Zs#{%XzHd|O z-K>O{yA`_psX|wI2rg(~qyJhrgA=VH02&clEP&xCF(%7s+HIL_*dtN8ZR)J=N+vJD zwr#T(x{ETp!569%1XW+S$5ZN~9U7r-O0*)k>-AO%-{sGu^>S>3eiT7-kiz+aRe+YR zw*j!UtuKr?OERE13@j7;%GYR|(i#S_AwWE#pq?3nGZ2oV&Iny%G$a;2weV>|O)Zcn zU=~RL8UfQJwuNLV>?EU|j*yV#z2k5;TQc_^Aw&z0%B~<9`Ng?%Vqmh2$v8nW&X7*W z$R;V%@rbDqd~_OCt6YOfG#zZH7DT8RXJSXG80Vo&r*5<P~3=a?KY@TIb=l5ZjA@ ziGkgpFuQ!nsS$9t(A8{-e7S;K=IT}s-Z^;Z5mt^407nVzbj<8G2k{l)2V50LwY

    ~mMp$nC8F7ikSxb4cWqfc4EU<>SCx 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%0D{^5|28l^0?16^t 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

    p572_e!# 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%0AZ!)nCX?K=@h`s_ZWZQ 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%0Av3BQAo5P{9e(mS1Gz9PMui-xB3Oqz;?*;_5W2H_ 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�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

    ?ZZxJAQ|+xbff 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 _SWXCuRsiY z#(%%ShR_GK1#&A3@ywCV%W&Y4K{ijt(vnh5GTdHOAl({Pw4ci130*^9Afp@`o}EVp zkqI@0c=!SnSCje=8x=~=CWuMeYJ{QnHH3F>tTgAEPSX&R#WCLbLzt0h9BfzGR7rop zZbfStq%dYaW0G}S#T(>CydOCyzhV|Oh`(za>ihi^GjIW%a+3NwdqOI3?r(>LJY5;R z9-UopkQUbE7x=PwgNnLMYW@=YJ7uPw4Ki^^x5Q!8hGD9ncS19K6;r-O$c)1B5ufOP?5gA zy}FdFC0cLJvl<+Dj zjJls+U8Brvb1<@_-EVIpGf#+o4L!Q$O6eZA3jdp^LT3J_#o;$>%@B1D_+yi89KId) zMcq8=8?=Oh#OZXN#QArnt=9WCjDm>sNI*R8yCIlX|onmlRS1gXGN$=}4xpDP`>RWcoyrO7H+PR7jZ zu-e;HSBs&%t8KgbW{A37epRP=%YEQqEta&skSBc%j_Vi@DJ_ zrVLWvM*-p>vN`TBV>qs~3;xw+$dTokUoBI{a#92szn~{G(wT(;YGFIea)0TWbKq_b zKcBRZdc>p(m*Eg|NXyF1`~_bCwfqzLSqpT`NC*ZTfBW{vv^G%Lp1{3a{1s{U1`Phz z*-OAGO$v5RBGq>Rf&nmdiH7a6?xD?TqIHKxY$(96(SW~tcek73%0UF)*Wy1weKgH& zIK&X9OZxip{9oybN8uw#HM(Oh(?3Uh8D_S?zXoU;9o@eUg_(jfWTpddXaoaJH2l&b zLq@i#UfL}Lko_oKy4Aty|9a)8Dd=U!G`SEp?Vb(m!m#>unbaMB6uw63+yItD;bp_y z)37zN;Xw^9Ap~FmTCM!jf*mIf|H#&k(7z$$DpfMqkK|uAQ)bOCY4Z9ahT~;QXhm-C zK>Yb+Adm!qj%7#&hs|CtWmtZ<=Dh_Rt%@!%YB(RsIO8#EoUqWaNnjK&3%)vqP z8l}PssE@i!-0XZibF@O3K@44>Q(tSUz`ma*r`HeltV(^E`tW_qT7^f+Q!8Lnq)n4? zcDM@>th6gZ&e5dFrRdT8PwGo6kYfSQtm6JI-C_8L zqtQ5b-l|x<=NvdyV&`<_L35x726`yCd9>~6l8q?Ll#4Gi{l zpJv!roPzg)@H_>r;cb|5Dg`;`Je?B#7SWCyDStmbzR7}fZ)UR;`BHYVe+qp>!{T!I zyW0_?Incv{niRQ^uz;MW)@GRL|&n8g4qKwFuahGyN7&Wa1S(CJB0&S|W-ca#f?%avj1&CLxW$U0 z9IU$7lp8d43#f!T`S7a9=t#q&utp~zUze6#FjKXFZ%dZgZv~Z8CSHcWOv5(Z$#Ea| zptAS%ShyWjP9boEy&bOl>`-=ec7ggjnb8|w*rDWdvl>z*`{O$0R^|88n2c#tun@c0 zM7@JSho<702-^q6Y>2Gz4|E|T>Cned$O>POJw3m375z&pzI-V=PtJA`15{RzPj3z0 zx(ifA6~nc)mCrK5{(#BSse1YKX=WjD(M#b4vz>}IfOV5)(Ws6`TkSU2O_o0Rr`>3C zT}`ssRIGBm{7z62W`I4cD+T$QA?{xt*@$nncPS@=pdfB%Ef|6?Uv?|4Za@rek`%*Q>h^^gNfNcx?Pr(0fW1)|pECpw+PjBTKs|)Cth%@ysl8Ogx-_eK{29eSU6{R{ zWz`BBDI^NRl1?_&+3taWKC1eStZ=b>r;^~=4~0|YPC?YVkvmWr>cezj-j?z%)6H;9 zAkmMK`TW-|#mdeZ)HJ%Am!^h4>V~?hlD)=dPTl>e+XaPFB`+Lz^Y$wl%R58J6p0V= z^45~d!uU!kdxPt_eSnUtR2?j8R{<_gxgAJHyyKUW3r^L zL6X_8R2b}_!UaQYqqZL~2?@jYZdI35PdgS)lHskvd9QMO8r4shknu>!l)0zj;O%5d zTawu3O$nnu8$IAYR_r|T-X<&f+kT$x5p}GC%#ZX?*=tO>w2^v^##=!FFPmOeP~4g zLVd8(@0A7gMsd@HYibIgQrYA!ou`^g7j;NOL1Y!x^jps2-&eAvP!s; zGqkHpwW(V5c48O`cUQ$|+ZcrpD7zl8ZanXcvY|HrLSJpX3~7Nou6vcqlaP`0aWa2U zy<;s{7h(X8ajJh2?|!K5LP0yr@;^Hs1VkT1-NLxwsqTdAunEYbP2S~20CrH}sP>ir zdT54d_g(RUEv4qV;2gPT{HK25C=4M1yI7aoed@nMU{_Lzui<4$M zYvN?BJ3@s{8Dy9{GEPFqb@Dtw{~|wY;$^!JIy+O)2*bE_@v_=)Lajt|AQ|K3+@2YX z*uw$XafRu0LHI&}BhFZZ=gdUO-!pTTJ;x(Xs1UI$266CO7sTyZ-1qK^+1Ezp;{SoF z!5=&Raiz~*4&{KxWIQ`o!rN#kFL5@a6Q2$hI7(igH3^0BWnx#0!2ujn0nx2Kzq~xm zzya3_>L-hDulhIa%@Bpxy0^Y(!?_9uYq0WaU$N?4P6KABaDhuBO?xiV15|h^B2YJu zn**2z7p0Gk32O%6s{E;KoQwK5z?_LDzLP&+r`UYV8eUV~cKq|)l z4>#N2Txg;iQ)E#4YObMNl`lp^_!s7mmCuaj@^C2%r%FF;yr-BUQm&(Am6Mm|n+k)~ zk9Rk@((H7ah4BsG`%7GRf0(#jWi_u4mZg3;1z4%V$=oxauH4NGQsMWq5^fEZ&0nq7 zJ-cnT&z|7+uZ`&S$-;Y za(kV0uZ?X7AH`+e8nDudJr^c^%A-Iu1cyo^>`%^7R&80Oh6?_aiZcJcf+{47lVznP zb7(7A1BG=fhR_RC!M>JG1~tXPWSQcYGhdCIHZ>}=F3))#{hN$;Y%1(t%H1AJ^8goU zYIBMhv;^~Zz_G0?K1Z7)2XOVE=9hJx=1o%@x^GD4B=BV}4_^><&X%RMIYk63O)@^K zZ*?SeH6Y_ES=?HbTiAkOhIWz6zm#3w`R_77L=O7G;I z&NzHoq@;etatVbyTEZI3l(UZ)p`j#cP)*%KZh8o@p-n<;+F)UJ3|SNSld^u!>osH2Q&tj0w`= zmvV;#s1Ym)_#$@~=g(QS1J$~pE{1h4p(UX&q{`dm!j;I{&$Cp0>;3!_ZIx9UhJ|sA z?;no#p(W8JjY%@PUDcL#*kNH21ur=V`4jB01II*gnFQTNB!$62+_P@jZ1 zC2sg^GK&G~xA)iEbth!rz<;}cx$`K8!GOF0YRt@{^eW)aPer`l0p)YT{Ar3*}YO)&jI0>3;hm(3Lc)Yl}+D?E@}g;Fuh5@fq? zr?RG00m)69ASbtDVzWs()sXA51l*&5`kR%B4zvbF_JHoMLpa|Ui^B1;YJAuGvzWax z?jxDEuZO}rl>xkwf&u9I(NIF>cIWYN_%mn>ZMzlMK^XTjE@XrTtjpstfzeqLEA=Xs zKkCE*7o)R2R>ri$d}F_&N$1EOD&{1I&%7NwMcbG z-8k7icOd6E+5qT_!oSwQxW7d??=w+V|KRHJRy{cY(cST~XC}t7P$g>*4I3|-`uILH z1Up4^O1u;um~1tkW{0~`c&k@?*JU(2V=_+Op5GVQmyp2_C-DKj-UPESgCR~51G>!6 zF$l>yRy^BbrfQ;YS`{l>#x$kNmPUXI<1FfDv3oq-jZgtR9WsQ$FwucMB~G@D!*Cpo zf1@Cbm()Pay+f4Z2S_sT@57V$oPV9t_BD665IG;O_t?j%L(V~nzQ3}&vy zT(Wskl_h{k6vhOZ*tHQiB?9jw$pAh(v1rarGZlq1L%cXj9{YKP+V1lUY25DUvxsRV zUcS7($gL7xG4n<|)(gK;$OdtcN)wOsP%Ht~DWx|lRh;~GEQr<^b%HQfZl)}670iwU z2-78N`+vDleUVf_jh~Ha{95IgFMx20OJhu!*C>y@&=5EqpF)h)%0H_pMx4C6vFBYD zvl%k57Sw+p9gkyTfYIDDb7 zjty1ObKH-W_r?2$DRc^F1+g;Su?nRkthGBveEIKYCKWt&F_?^DvK^wV=?|BorySa} zFm)%xj4>G_8OssgoAEW)R0tU(WoLt04C4F>@r;HF_fKV9U73N*0I7aUTDT;NROCs( zf|xb+$8f5Kt^pzKYhfpFo8n!a6RKEgR~0kW?MlZEjgCQ{@yut zX8zYO)QyoPliHdRg}dP=3v}mc=ttX>!I9`?`WQ)CHHeeI@)MDQzKuBSc(OL$`p zz9AaR)kGP;PJ-$FdSu|z!zQXH3dc%I3)Br)Mpf;B!m$$S)BPXYNHo+1)Hpf3-HYFs z`QPh=cH_i<7*?sIwl~z-5)Z@f;>TzsdbLxj$G1#$TMz|m2bGmuhnl)^W>(<5c2cY1 zO}MylRNEci5g{6>cyH;f!fS^S-UpS^Jy;(><~G(Ae;K*ffRKRFuEA4vtCqP&#qfW4sUR0|e^iN)=JjhjuVGylj>eyjRy{I-)c&edIyACen80P)KrHl(O9B`TD*`sM&j!eyOJ%e2*RXy+*W-NsFt zeXJIBwNbeHfgs$g%(;yL2-MWg?oYPTgCkVx;|q!2He3O5h>4Out*{kl3c>{6D9H{Q zI<^C2gULKf_W59F+on{j=LuGkq8(iOu!aH5t`RB!yeMF|+WKmY3Y%3cSD-GIF&u;H zud$tQoC>m+MMur4-mp-+9+{pi=jMRi64bofiY4v zEi7jKOn1Y-P$6_OcBc>E@m1~wM#`LFtutPmSwYCaF-{}H&Fw-eN1I>9YN$T+)kH|Y zj!idqp^((~px9O{H^r4cqP_=ZVn6Ip?okb_P^hAbpv{s9+Z%u^XpxbKq1v^j`?Mn2)d>RA%l)m}w%# zuyfj0 z^9u&CUFd5J$KN98U8_+@$PC!1YK2#SQzPcdaIvjYX;T3Giv)$b1DgHBAY@FsSC0_y zp7jXlcEYHkkB}7Y@W6CNED|GB2pZOsS+uGRsPIwl&MC~Iq&6> OQpN9%FQwRY@N_VSBEnh3|_`)DUF`pFpxvrJk*WGA6O$8)+uFA zF{9AL$W|XDs5LkP!k~%FaAxCJ4ynI*F9#K)hP!RaKg&^fCF;hCA!3nf-M!pUOXB2O z(!9!lE-_J!aro5bITtnmv&LEyWA|sC@hwpF*H@u#Jl>zo%lBP?!ho2KT-M=w;aqj4 zS@u(+T#v!AU7#}b8|q@R{YUYp)=g%Ex(0<4@s)jeeEeKfT}<+Syg2$(4X(<;%9wqsgfq$=9#I(z9% zQ(?&bqU0dOc;gMun2h~(eLpt`*lyXz1bLD@W9@=Kz#vfLB|pm7=r~8E(pK-E7q4%} zWjNbSzzc+Pxpna9Go`}jUhLeS*S$auQQ?nwS3`@Ym?8E>r{Yx0Qz@Ie9vUTycNeVa z$0?6?Z%}29pJ~U-TCH}YF7*B1Yxrm!>TWQ!K98^6FP$o_Fa|JGrS6{Ak_WyG6hK(x z_v@#Bzc>ukO)7OvJDjBsR~k$MgeAX!f+fc&&wW@pNw$x~#kL8`&7No%VmwS=K^Rs_ zF%l&u(23{2zk861McmsPqlM zMd2t9OnPz990~|q-H5_<*~v=c2R4KtJhzqSzkh9^t>WeBslWx}yipg%0rmS=oTU3G zE1uJ^fFG~0uj$uZHC*u=Oc*csQkLDbp%=gk4PB4*p$b(0 zqidYBu8fTZPo>2K8a7TY#DO|p*>{~9VaYSQ165c&98eP{{pw&}#YY+O01AS-e?of( zVZCJtBxr>HhUShs+#HZS(Dv$NC1$){Tf z*x4sfL6_9TN%S)J0^H40qa8`+_q@&hUsEb}oET}zO{Yc5YbU0H7}-3^{=gRQ$xuj4 zdw4NMtMqPzMGdHJYheA$<^o z<`1aaXxTAu5bN4^S*F5?j&*OZ=K^7|3TKYOcev}658+r%AjcX%-zVhqq4`@(KK<B2F$REFgRx!oqR# z{cc>ZZA^VAtc}AmZQ0#uCMZTutb_;j^IFWlfSv-_yD^d*w+%xLTdv2-{zW4gNS`}^ zs)@zvQr9N6SeG3(MmpC(R$(?2Q_l8c_$C0|uZ=(xJhI*+0d|xztV6 zhz{MfBU;uBK~`C$SoCHPM$2?fT^0_Fhme5dyWrx)B4w?Cp%Nv*(>u~-W!Di`fD2r^ zk=mmr6^z8oT7B);X~CJ)NV%Ron}ylXzKN0Yzn7Pv7tsq0;7Iv=Igz2Vwkry2BPC>X zqnM2=)WRH&i^I^Z7U6Aha0c~%uaJ=fmE{ANMKPn;HQHF2UZ8?eIK~>dBRc?)oi0k= zpT`C)vv-JL+tDZtZAjNNPKcqMZ?rr+m&88!-VKF~(X!ID75ne!$L!9SF!w+fovtXo z0by7N?jlZA>TUvr+1HJ0%~Vj^6FCPya&6xr93TFe5=E@6Cv~*)>;#ictaP(1A8>^E zc^eAHNv~Sv@@(8p5WV|#-VWYxpSufGB&b`FZu;v3LEVnR334}e9zW077Yhh#xOW$R zkMqk6KyAE)@&>yo$9C^P;dl&-<>w9Sjk>$gZoHgc+n?Wvy&3|lF+q;4bY?^S?=iVy zz}+`0b}6NTkVy4!3ij}d(f7B=br=_Z{CGaS4}}E82%8(Tg<_N*MqLad*U}II787== zQtk6>{^#wUCKbRc#m}A}NDkabjS}U=BHSr*26d<5NGKmgfsZtRI}9J*BuW2f$g!eS z{hJD6*VOpIJCc?J#E|;q`_tBI6+n6+S^oKYhbr6~N+01&HlKK0ze+wG1=6rOSvCxFGY=(XBcLWlc6s$|e1djn zX3)uihL$$AoI)@&=%imGi)OQ3$5FmW3#3FDyf=uQZ4H|4LP zw3SY}Swm)5?AV&117`(;QFyZ4Lj^bEyEijYFDXjKB?>)I_bl&8~Q1& z^8g{_R43e^>!Y;FLDxWE`2OVqds#v*a}KV)yuK3Mi=B>12HooWM^dw6nN^acG!9qC z9TbP{?4g)!@5Auqq-p;Y2PiwPQH3}>O;dOA7225@DNfo}!=UM+%s5VsV)6dQMEYpV2&x|^ zr#5?c$Q_Qt%+GPMYA_t?s#N<8RBf#M??y(^b|wmDl~{@Mb6`y7c3|OH**hAYeVkII zJ-h(8Oqwyw=x%LEj1)!r-J8us!SIg3Ew~Y_S`fma7>{BC5WpTv)fLRZF>*P1dFQ+A zzw}^?{875!p(7{TfT%m9Nx5f!qW~#JjBMiD*?zM4fLA+t7G%5sB!r%eN-R8jb_Yu4^NT&8hYjFxwW7&ZJ9_fhN% zQ4;SDnf;VWPY5HW^x)*T)8?QsduXJ5$PIRn=hT#4GD7{axyD_Qg!t+c!d%F>i22vBnU3D?;3wn&*?N3?*q1vTz{mti@|lNUFwz(xiN) zt_wJk<6PySB>Q&e20Q!ymx6<`qQ6C;hI3$M!U&nz19drt2r(3_i;&01R&l~SwSYn% zl&KnP3hCdIg%8T-CncQ8Ji7xS0bkw1h36&8HU}0C7grvm`GhDOFPiS}w6HD#4q zjBwoB#NuMLa{eplIR~*G#ME?+q8Wmfweg@_J`}QeB+tvRg|3ajBjj61Emw|nqzGIi zX|FrZ(+5smBjsA;RJZ;tj5)AAQnpWM<@Uu4QTU*LFSju~iCd_$`s?Yr^p%A3RWEED z*O5Ew7FPhlYR`;5JTfT#1gOV^c@7Rx)?;^i9tuZG@rEHg?YU(Upi+aV3&%*J((G*tx}fuTX@tAVaexbc5nk{Tk&*I z!|^0eaq2bmZjUw`S0nJW)K10q&17%}^?6bCY22UmR-y6xGj8wv(Vd*b@m_sN=52Gk z;JjjfP!3gPHuiVYe)CdZ~gJV13fQk#*s26!vt$ z*3f!o{t&EUP&j4ju>O7&gYAaP=cjs_?t4#v6b_d!?=Jp(gu7eRC``WI2{Ro=cp0qx z!mxMUoO_$U41_hb2+>*gO>@m#f0}T4eb2yyjQgcH^#FYPwDf%jw+$z%tp0d`i!pnY zw{h4-MBReS4Xe~GNA59(;U5PKR^828a1i5l*;Vzf8n#JSj|`U&WkuX4)QuaaDp>X) zk5C^!Lal53=hfcY+|2_kO_(egg&^Fk7>{uWGEBbQN$p$64M~WhKY%YHtC#aK7Y4j= z_7DsI@jpnVIUxO7Sk^72%#%!o8`r#KLj}E5Xk%%yU>rA`r=i^g(!@$V<@wm$SB3WV zv6;D5`L_&EA12STS8=az)1NeKm^?hOu67?r9fARMTUwQW-G+8Xh-weuV!5^H=8v~w z`Thg4ZIMT>ZRU1CwW@;6`CS+_xbMAREGv~y)G$Qpqy1u2rTkTI#w6R_Fa6tF+}ikG zL;IzEm7m9*W=z7}VAaSHM_`-qp%Wl%^}Y~0`KDm#Xd5nnf4Y*9!k9#Nh8N%zMo#Cu zT>pk6$*d*x?TV!|6#Vh=)~3sAkf0cZ;c^#usd+`gooO>nk^?blu26vuqKr|tmdsD4%X19BL*Np<#H*g zaHtzU7oDjLT8$|LjI()sOH$X(rE$U~ZJwjW749>jF5vALtTlW9Hyirp9~9%;Vy=HJ zSF&z|+|9;j2zMd281C9fNLj%)u3|X-XqS8tx0No}bTmO0UN^K6S&bUZhW?+WtB$K; z>!Mgsd3Lwhh23@0nQdVwqFC77*w;X%yF0{IN+{vBPL9B(^s8)Y;YJpY zkQ-q`nKIc8@k7fH|LZxz{{?`Gj*d8YJ$#QVYhkM=Jtd74WtHWe-T&r{k~=Q;&cz~@Id*WdStY6A835pvagHS0!8z{KW+*0;!2 zv`pzxh_LT;hybpRd-P>yzPV0__WWI>e18Tv>!ZW_^&;iVS(t3F`mq}eM~F=|tdEAO zsaM!kg#7#P5SL41A|XED@yI3L&rx+O94>DCE9BQ=h76uf;gYfhS)YS?sVn6TmkIS? zg-Pmc3tBK-mUS#mC%l#n&jGy29V$A%w|3JpTsHNq!kwZSCE#YJFgfWyBDW<69mhhL zJUQmot}*xAm@tRQx$s%6+cX&v)IAH~NRDc?j_fE*2367f&2*-3gv%$*mt0LaM$ZYC zfmJ~rqgv*}3dV4JD6x_bTy++Wg1WUaoawQF+QyhL2_ILN+Heh_GlXM1deOm8v;wq| z6)rLM)!%L9c1NfV+gC=*q8?ih2wgotgf+WC-5(u>mLufpzL{L{x%D9xu9AOkVF33= zLcm58_O4sdD9=x#BRIpUKuFX_tvrZ&j+T`J8tkh@3$ov6d3y>Yr8~Y!N6V;d%D=@o ztTxvP*FO9gDTg*-LB!=@1UkZ@-apuH@2olp0%pP6Um$;OulC;l24+V-2dufl#q zWpoqRXrTJ#U+@gLv^&=OL)DfepjcBVo=2|mT3_*TScPJ7VKII(mw0skP`MPlkcB^v zXWbB4+y$;;t3G%Q0Zk#;2mXul{s^Y(LdC8_1!{7p6PPrHV%G&hwYwVV4iNzNE^JSe ztvpOCgyKyJG{rT0lva6En5-Pygf`k-CtCB~5GIHG=M3@hphL>rpn7#al-J2KMi<|u zKW3cvYH^=vy{Wnt%9pB0)kWzYE$sydHmJ?nFPI$O3?0#tA~fq`A+o%e<M< z!S{4s&Yh$|ArasXGq{nZdjG79_){=0P>^Gh3fn! zoXbM-Pp&IWd)7yCE(^t#$UB^@EqMlH48_%^8BCcRr(!Ax8y~OjU_zCoZw!XY0iU6} z#xUJt8i1xAV`1W~PMg4-AyiI!4J-5L4;Au8a)W)n8nU0O;}E$MGmZ(y)FDj9Lh#ia zGGu4`)0X>$!HB?T|J%+41M5&Dl=JFxey#O@U<2?L&#hLe)8BF#9wPU)O*%4@+y2Zb zLL~R_Y9>?>V<=#VyvxSyJYNkP!dMrIP1I*hA>1}GxP{`MFA#sa+G-M~)KK~L1=HeG z^;a(jH&8!bqhe#%QqK_Z-PJNJxs!l^4EX4PvwMZHfb{1OeD#JQ>8OTHKw)DD;>J@p zMWgJl6(W}+hL71d2aqu~L<+8lje5qD3kKv6`Efa5V1Mo;FlS)hC$W3Ez^6pP(xAA7 zLm<;UCK$n@Hm+oHWnt7c1mlaj{y(q(p_+okcLbLIYt;37sGMN&o{Ai4z4~E3Ef^#! zqxX9CWCk@EB%>P_E@I0~379)8ND5xv+UvXOPe(!W{n1(O2DENPu7dE>K-8t4J++(7 zf@JR+J4*-VqMUJpB+3b2k1oW|-2l;V@Whr=t}HN9O|W486Z27px8~41M2`3kUObN} zG1VR-L1Sy0Gh`nv`FXH>xRc(#DAQ?BjluFpLsr04&0pJ+9xM}^f{h7C#W|G+%a7B@ z+{UUE6;7#C9TJR@>hi^mIl)Li@BOOFjU$Fluwi=6sB$iW@ru+(zSB72a!3MxxbA(M z6E5lkzDSzCt12@$wj3<+3tN46;7$?jYYLL&rC1TnRcm>INr=CoOKIZ*jxzEbB$HcV zNG`?^C$$kIYq^)ZSe^HVx(bv*^${rMs)Kf*uqjZwa?+fwR@lTDHc+;&pVaUWr(-%& zkob?ojN_;_Z$^28@Md+p(DmHE0t7W|hT)Km$DC1fbnRk%s zC8>eZfG_b*P_50v!-$}w}> zu?7%Kntncc;m0(OkuXS>_dv)Us9IcRs1KI?OFLA_XB0)K2la?||6`9ivoqAwpr09X z3$G<~T&!OBMC9U1t=fVb zr;9MF59ZL0fU(-g3qkTEeM#kqWD@-vf@Mt8a@NHaKy(BFSNE=LoNya{-?08bwT1;d3KY9$7U!=p`{EoLh$H)l8~Ri2R1Vy` zQ&}o!+61aDNS5`gMCFt)ancMDhqmQ8JJ%cxD(e1znUmy75zrJma;H{tm*}AII4A*pfKv5jhSFS zi$R9o?l1mBs}JbT=*@8yAV$89HB-$x$voB{KbP_8e}!WZg$@3QInR#v;TWX1`-|7q zPN~Po1A@Hy*)lr22aujp7FZUy{kE_VhYG zY{BiGtgnt~1wZ*G0wx=yR(%a>mM>Pv?VHV~n{i0`iq+r62JK*s1(SgHGS(fx#N#tS zqpuwH>EC=dU6fwuE3wn9*B@b!p>lljV^*XtG)jn;*3ef>zcGn8s5)W@l4?;BN&Xo4BKna1GDFqbLhM|A8p{<-w6F!HYme^oAz!4i#g&?=(&X z{t`E(G4qX+BbhV!fy?00D>*nqC`K3=tUC6naY7wHyetLbX7QE()PkKb&uu-y>G zcFOxKV>Ancn&l()ieq$7#n<2Tb{|Dmk=hjUcitG>!YJRb1*$|IUKF!Ui6i(w-VCUaKO@4{P65a`A3Tx zfdNf^_=84UuAY3Kn?1*MOnnaaOn(Mdf9Y5rKB=g-M#f2hIpl30Q->$`42=HLg^ReJ z>cV(JKm6USBMVRJ0%-KZ_ItZyR$M!?uAfBBh3Z88Up!m(#cPf5XIu4IAFu(QpYI-@ zc>|PE%cUB7yf@<=U?iDS($1r-cuD=Xzh^f4@x@{P! zkoW3tEO@)BMSij)M6=8wM*dcQY}sGDM`In@UY+8%Rc|UM2m`01I%OCjI(mA@nRUy0 zvLjzP=`)CItQ-$WCJT_d^i+GFN57CactZ24;aqEw4IjA>hNf)Q=gX)oZ~4I_f3RA9 zIhErr`1Hf3D~BY_?Jb`!CorfUT@K$sT~ooEnu9s$7;^yg-;g@HE~AP!w!-dN730j# z5$Y`;Gg2X%Z~kQ1 z1Qks!9a`V=5W^(H$2x5N41S3{H`Eq$<=(zU92$MosjCFJzjrR-c}Grs38L}YvG!{GK~9?6 zBx5zEiI#YBpZQe+{+EgX)mrt*U~+=n;K#9eY^E07$%wQ~e%%QBIIcDN1r>EKhYn}q zyA#;ac6oAeJ>j6+oN%|x>F7zc{{I{);C8WZS#p<43)CeWJ0x~O&Au<1o0|glTC_bo zVsM+^XuI6mg*}QUYASaT(XYFG>#A-n3~0pd4)1>CxwAXCGHsQ`oiHD@Rr_uyS6lIF zgvzo1?z&ky$F}GbfkPVQjhDrI7{9X`x0`Ili(^Mb!nW#)mJF)6n^)OlPc9cG6hB@T zDHZ1z>j}uZFj*QD+f#k&4n3prI_AI%CLpREUt=ZDrxkogqh%ES_naqV&Y5QHC{{jQ z^(K`qj~oq;J%_2SyEH&S=qMqT)G!3&Jg_PE`_QHHJi z%sKi9CCrM!Z_}Mv*gugYG)7EcuhJ+s9Nk9159eu=A2T>>M2pw(@`QFKK=f<+af$E+ zClPR!$t$nc>g}&&17{+)!>f&^^+}DC$C+NFF3tipM#z{}e{VcR>vP75z^}5f5^01x zkbuTWx!^yn(y&ILGB8G%ub(whb6YZAMaWLRB-T=mUd)yw@MX8pEYlNj<2Z;532I7c{z7w+7^j9feDKZiF^b zOUwgA=sO+;b2m~yhcE(%Az@x?cd01~0~*8RVe(<^)CjBLG1>|k1R=Wv^nf+4KRKnmb$wMab<V>6VQOn?aeh>uvrfl_Lj2= z2ySiFgU49dN4{N+q>XGBkctJ->kEWAF@P}2meDOaex1^Gps=@i+JWbm>dw1>P|hzd zA6l#57Le+N#O5L4q%J#kuI}!hO|D-5VpE>7u#?4zmCT?(1zgQD&5mjbFV^*tX>B0_ z!{&BvVKon#V}s1Cv%1BT9l7IoDu0;{Fg}B4le;YL4n6n5DuzzzAq(1I(Anba6&e&x zHPbbD`6V^!F4K89-V?_hl-FGxsOPS#WjI3`(PT{aA?N%+8pBA~D} zI%=y1?k3ekHV>^u@&6sP%WN`sWUX3VL9F7e8hW+`F0D`7rx+muama zek0X>4yhh8p*i|(pw{j}=!sDViR$4|?!9_pN4i-9HTx~08!j#DE&tt=&{YQ1`D;WM zhFsLma+QH~P`I;NQPZg-i{%HmOBQd!tt=ClKo zgVo|~;2Yps-xcqtw)#xpaFZD=K~>Z<)^t%f@pbITQ1GxJm;`hk*5E@O`XoevM5C=O z<6m*IhMo-&urBKMREte#VTf-9o<)8C1#X7IBYEy@tKPmr0o`P{RpG%mxs$*^;U)uW z>H?OT2&&0dhBN@|r#|e6x@c;cRpCJ|xeNzaCKnlEg^oo1cn{F%BK_nc3)J2{C{%;c(ye#Yr0a17iLOq&7N2BT& zZWqk$J9Y#%tO~y^IvS8x*do0+!wywlc2oQe#MBuE=qVn$LV0A(w>Y6s;i~wjAq?U(zD86kvr(3>}Zp8 zuWb2a8)r$v&C=Hjg}DOSp?#jdMS7DB1y3w;lx-G6Rf}0mIne{c3bxirJ`H%$np77V z&S-}G*_N@+MaH#8Q{C0DEINtf@(%GH@KPOb6NFEP_oXXux@$vVktl{Igm$hl~vnIXc;lq zI2hAnY1P7?g*{|$ugbZ{O6g5;K5EZbs!FO|Uzn*oSM*}xk#>NnYx;p~q`Yc7foymn zIr+-MUq`SbP)+X|&ic#T6ed3XV7-W1Yi+9DQNf36&7z8f3W$#8b}Rhfjlazh5~+-$ zW$}NU6kXnl9U-r!>hltX4Q|r4tWIU!IxAeorXuWH8PB`1UsnVfP^+u0qsf)4^sNhO zO?A&!s?JsB_CyYBrB;7R#WJ=-8&+z&F`&X#Ml`k9bhQT9U{iXGWy{%P!3L=P8O_S8 zj|zhgPzUjB(NZlFvtMs&P+d5oB{rM^vs`64ZyXiFufa%l!%rc*ZJApXEfXT-wlC%6 zoUf$sN<&j_;$`2kdv*~d%v6rM#LVkCxObsHg*_xQaAFhH!mJ!PQr?GaPR>7+8w1f4 z^qik}k9E&ZCzGJQxl9|qOM^sEyXiNM3@WOQL6n!-$R~PE;Rre~A<}^Is<#`cCe(d< zg{n)s1CPz3$&mHcR6knNpFMduAU>on*x)Gh#D5-dk9%Gp5Tgu9(feaYW)ww!a)f$I z?mjI48{v^^jBaF`J*m28YNa6z6xc;1&(`Ya>6rMii+I%!iA^JQ@-0wJzH%nqk$Fy= zNIz$RGK~1hp0#~wL9)@Wn-A_@wjCQ<50Gpi>HUNZ zxt?0@F$?=*wkpOUxoZZgzS4{5&K$qHHDf1iu(yCS)Yf6;8({Lo`Of#~43HNct+Fkn z4y|Q|5OCkRfh=6kmQlr9qUU#JQw|k5*uC&mIV>%!s-?e}Vf6Hd@vo|(E}^$HuYi6l zs}0srvEC9hu`Z!w03cd+>IF6`;=gII5zJd4FjK zsegT?1-;~)pOSWggN{@$d470pU^RLj$B~z$FR*rU{-45ubE>(QgxFW1Bhe?)PUjqIE8f^?I6`%M%J-l-Ai;}c&uY99nQ}K%t8pN z3HU!{Vg&2DiIV|yN)dHzXHxY!wA6JnNvf;Zx4^(DsqP9!%NS)Nn;-%gQ$u4}*afo& z#&2mgViu?d7e0m8V+bWm*I}P}h1t>V{eUQJ+XSP#kQ!(SXmXJbW&SQ=`5y!%)fIO? zQ23kDa2Khr5;3j?Mc9yOrUp)ES}O223TNnbyH&Ad%O8$`ihgbDlwjd=OF#v5XjPg` z%|8H$evv>@b*$U;m8-0l%1+Mjlq)w`*PUsAlk+p3TH4=T*4UP5_Ti10D=7Ba2|vB? zXvoX3`QtvD()DcQV82D`?_(6-OG1a2BpV|`7zw>3d2SuTBldtDJDpfacC0zynoH~v0w>N#m z6FYPKRf>K;$7aDLPgY}{8Gu42E8gpFAEpOxgwSKLNe4Sf6dj|e_8&rp8R zFZKY2&$ZJI1M!K%XpP;;cIP$Yw zH0gp_v1r-01`3~79tKm-J~F3687JqH%HRwt))&7Ntl{K*LkOoh_XULY zBbRh`az3MUiUNem&Lu2ya=xrsA0*XFMw$Elv4d1kS<%}vs{SSP%Ru2NZVqVqq*5(| zk-II!K7|^fWi=A#gHb0mmWn^W;mf8obaS_dN2eu`HI(s<`kh!B6a15KRQ9N zN0jy96yHyVG=bNpDXm+vuAkU7N8P>3rPqL2zIc(ZzLWD#MLl7rE>Tf8L8)2#09y8u zb5Rosudky-*xU;o=HwiyH0Ta0xVn?(eb*2Iu2|StrnD>OFxgb@8MyNg`}OZFQ`7_t>_z!X7N}2@aOmK z9D{~ZW>?wiP|2!T9;oyyKiNFE0o{9m1H8`YhtvPFjL&riRKO?4d|CG#Q&V)5u?jx< zO=%iKZ}*oU*Wj`F%C*b%cHCH4W<%=pQFLH`d49sx?HRK#1~-5Cb}N}9rNA8!OkPgF z5lJzf>g(W#FR2%G&n}J&3>XV0+#7j@2wV&Y8Jy^G*M$b<{F|r^F7TK8d#19ZN7vbM zfV?>3RrlEkP{~z*WCf3La(<=!cM=eF_ir9ZZP>+9B3!xoaFIhJXC1VW1^Dg^oqx?q zsLtSz|CmJ3H@aIfQ20x?D*C{A?SaB36#jmdb!YrVP2xJo?WE7ea?P4F1;~NGDeTvi zS$$T3)USd}^%Eu_FbV3lee0>oOL}Aol&QU8&>wj9iDN%d-X7az7I2@oYGa_>+A)QZ zf7%5mHUT*B#g?Nbc5KYrc)SOyE35XO#Qe%%cC5f!kckbNf@04Fk7SU!I{}4Z!SL}| zr<7GorLieQB)_Sgp3b;4`|`u*?Z^qstN!Z%QTLyaL2k<`qba1OXn9%hdLjEOnIXgv z99#L!>@t9?i*x6*ZtUn#B3Fx0yQ@0&c)34?VU&!;q&6H&YM_MKSE2~*#;|Unc#g%S zSxDVJk6Z;xx~l`JHQAIYP~zvbCd~FA8$pt^vJXW_nu+8S=gtokXA&|~{c$QtGL8M2 z1eW8P9b5O__Kiu6sEWcS+;W_3%^2Hy0qX`!(1f~_x5F0}4n|PbS3rG(m@wnax*0O4 zs_NTdK=eDe3wA%Mss;AUfdl2VPj4o!WiB)K4wT#j*ypdVdi`Qu+;jVYUE-?hT^|&N zxsz6@VHc|COwvVFPUY3rU5&v86nige^`*N^YpEPR*~{@M=`u4lPEvUg?QIw5SCR3AxoYQ=sx`O<M?MI zmM_Il^PkTxRto5cSBp!2(+_Sa5$@+K!d_o9wM9C&hWsUHN>{EIxN{P5*Iyp<{I`+X zY%TZP{AG%QE!GBVu|8-Dbw_f$(h7G1*)ndUy+7T3BXx+Z_|n5M9B zORaem>OpRWnF8gcH)hxd>W%Y&r2cv^b8|zT zNnOviz=pLt+n1YN0TMm8-5F0Fy>VwOK$b9_ZldwHPnBmqrFj*tDc#^sBaBf*NQuh_0DR|w+ahUh5 z)I#25GFYbZ(xa7nX%G7ilBsQqac$L7KbZ=Wl>%yYb>S7t8!VGr!DQ9dx4i-3qFa~Z zXr?O8+Niorp_d`@H3Uec+ zqS|Ub>f$u*{V8vDbTl0zm_l(;1m_Di)$jMYZ-!57X12LuUB|2(oB-ZUSx=sazr#)- z;Eg@2%)32tTKbi6Tw2zxAG?=(oA_Gx%J%5;TuTC)BJl5(<{3K(xu+T_nJ%Nui^q6v z`>05{m@v=0c#PLN1mM*2-@EMS$ze7XjtAS3Ay-!$^0?51lgEvHY#(xI35X-kTid5m zq9@~Mln8uohCoqKP5YaA4wt0a$j!>)HvxdCySP2nUS176ONh%Jp+gxr>hxpbFkD~3 zg$*7iCTI^kgv){TgYAq=~79;FLBncTM$q0&NtD4^l?ZMI8b`HQ|fbnTSXgRjo1WM#-xKzSPx&60ngG z-#wj=Ad}5$1;G4QH^@dOZ|XTxMz^j&@gr|i&-kqG=3aXbrV!L*ggoBAkh4ahEn&Ds zPi;tvzDE*wws)MdJ_AM86ipx^Q*f6ejruY#O?bwkmw=4urLhYBLCR5L87ig3ync5c9ViDDEF`y|D zKPiUwOM=O5TIWJhaw`gRH>cwSt(ZfUxDJMZ<<*mcus-f!T-}9PlJil#)^ieI(rS86 z@N{?%S{~e@XwI=ekpV4#JL}J=V%o_Alt_8B52L%0TK6l@7ow1D>Jw0vH9T#J!j0~L zQ*Ajt5#s%;P_V(KVzfZKtmW7Xi*zeB=RY19@QYW>q1Dyz-RZGWxa@%xqPE(t9gk+B zr50bpudU8G%EEXtwM+@iuG|>|#8nW-0nK)0aKDah;N6e#G31Kp8dWXvX2{3WoN;Wz zc|j!x&u}5Cv{$?B=k1+Xd2nDRb)kJhMN{|*Chc4G7cU^i;TZu0#zt!UQ@n8$FX@|+ z*fc}oa7}LDeZp3lyIZU4qTwo8@%Zx{l+#)@%;7DmtXChDeM zXc^S3U@WFM79zC=Wwy%A6Wi$wpUzT*c-h8}9IGSUg7wjFZt_Yhhvv?>87J=!J5lY< z8dV1o_(D!eb!Z%o0!=N~_`=ODekf50x3gF`My|$T z^;86GY}2adMoazjaPK1O9VTONv#P}~@mZ>;Kal4r*|!iAUlBDy&=jCU$C7L+;j0;9 zvx|^y4D`q6z{6TR%=iheI6FtF!oC!94nJ4fMvUWLhIjW{!m zcdShT>$tLRl)TSc%V0ib7~-=bQck(GBhl|DGucUO;M8OHJ#8e6?LKZ zCu!ac_5W=FG(!B~;arxkbtH_H96xCCl~Unf>MB-VXF74?C?p%ytXLUQ0}I~A%7Uq! zQe*J%LTt0VQl@+c6{>rG$eBy&ai>Vd+dIJ{x+T1XykHV++}sW}o++zlbEd-`*Kc>p zhPxvnV*9a`r0$u*X)#jn$B$skTXP5_q~Jyf`@J5;i7#Bj9BO+veTtR=F+IIYo56K= z=y6h!$@ujxf8ef}ilzd_TC?uT)tuTQ<+3jXysxxqM2HtQUSolOTY32y&=e`J4r3X9 zS?O?&J#@rXDn2vcwT5*Qt^t~m z^mf82z)5B1W~{qW*tR+LuFoichk^>Oj5g)Dk96ZaSLG4-0H-%MaAt(EFrM-li|yHy z%DX9SIZ`6WV>jTka&R5`HATvklr?1%xj{#H@eotmGE(2{pssM+@YfUW_AvdhoDwZZ z{l-#!TA{%vz)cF__Iu1xqq3*yG_ z>2PYpB95ve!M^!^T|y8cr%%MP>%blt7y5s3maCM%G0wHAzIqk zDouEJAOti<%bF=F;n*2eU6gdGSDeZ@yqi>{h?)=K=0~JPBCo5(O}4XrsJbXQy1F~z z&7bC`TGuGcow1egSU6fP$0GaMi?L5?j9iG-_uQNU0kdLcLi?iJzH2mtT*ct~qeM0L zuvxJvT=4ZaMd%(6i9o%}ZKcb~vz_$V7>S$OkjimyM_t8=`;Z#cBy&;gE^+d7mm~EY z(U}7$PG<8Q=bdtU6Jt)CM2|!W`lejSV$6w?kJ(r~6;fk)agjllx6z8LS~z2b%2&lNL+d7vkkAl#LL2N#n`fuM!zRu%ih^HxdY8w-}ITLWrxtBh}nU|w4NJrM#z{5!k# zsqMlgik~18TH>U}QXR98SwVuNE=Ao!YW_Xe#f!)My0DO1g8ibY#r^A$tJw2^P~GeS z%^0rx+EF?2veK?AMfl027acXIin0Gr@$F6J;CCDD0~nFo%%gJR<=w3#^s9^dHNSX7 zLOTw+;hq?wP~FgaaHR9f_alHtyo~3D;e1&sI}lEY=>6f~0tT5Id(F^v1ByMV{G0-a zU~amPA$d}1)sr5JOeO`p@yC^rsiY#`*oIJl9BSXCS&oax)#4#+>e)<2hIk1Zg@|-r z+3`0`21ok&g48DdbnmSYLCD75vSx_y%V^(-S&#_S8?g}Ku`)Xs@&bN1wt?cm*bjr6 zw!&msm^@ZG&*oT2z|DDk)_pde%1OXgz1oM*UISNbDnSmc>dcPjbpgcf_buHEQ5!Xr z&D1MF(tXi+6eg4U>(G?<=yEe$)Dw~6xMFbv(3l{hcGdK#f&n{fM1n|FDE7EA*^ct! zFDL5}RdBBH5YPZuu?96$al1j)#mjpQianzAKW^6KA_L-8rgA%hp)Xc64`?G<>8ej& z@OINn?(?56%@7oe-#xb_EWLq&F;0@52XSMclgRR&$W`hW;VD3wp(qTK-9NO^$vF_z zeOjkRu%PKRsjr(e^u@?Yzfr8)*_IG7cH1|2*(VV)%lV`V+EVPO`wzD3oA%Cs)Um*?^%&J4%5(IZ2WE1JSaN23qUAOv=~tQyAlP_&aSsK&bQcnV zI=m4&I)ZEj5Y)+SaAuvROijX0z7cO&eY-=rsXPx9!enj>i$mV~!6f(j!(|)~xv2Ie z%}_J~ue(pDjXIoQ-Ed6Sk2yW1rkLyEdsuVfWUXN{yl_p{QU^I0`)gqzN}o^K(2!2-7zE>CzU##zy_dQLr8R7@mRz|pAgAh(2~kovxx^N zA@XqBfODhhDlCkqOdlw3^;3kn&%bRp;r}+WFa`W#cK&2-^>k>X0OIe|1x&|VQg`<) zCe@plh>Y0!y;KvbDPo_B8s#DKk@yeze61UdpVg-ibJZPa9BU)Bwm z3qeS>LqSc^91n-dl*X_xBT|aisBf5f48Uq4RB>|VsaBZuscrdaalB5YK@%6WUO$J0 zdA1lL2b?;#lzo4wA#yvkZ^f^vW(eQ-oCSmKRa&L6sSvsDZ{WZ=o&;zNmK8P_?8lYY zcgYoA$w<8CILrgE1@|gdM6? zD_SxeK}UcePZ_x|8T*n34V3q1;5qMrFO#Qmz*cWalLgAy zc2IkoQso?=DG>6)pN}XF)}XK{NbZCqIZ0N=_aZe&5@s}^1!?X=S-}!ErV3ppk{1Y# z!LqnBnu=BS_yfWUv35w*LzPyOST{u0sfE7}2-fQ|Ud?Lc3_aC24Gqyxf%@tBf%NTzBz|KMS2g7Cx^K4&A?5@RZ^*(&rxRkpMoxQMbdu6+J`Ji5SW@@t9*YgDKzqVb`i(Md zEELBD?-fe9-E^cFxg0m|ZPA%Z13fZepP?w&7z3V@wTO*~NT2T#I;-p`N<7Ckcw4le z;=r4k2r{@)Mp)rr`c;hlczEJ%(V*qWN?ecPhR%=m-RuvW_TkDjufZ__u*JTCR6a9g|9f#+vB8P?Y}6(mvl4SyIR;X zN6O3Nu`;J)S!yGm_n^>n!RH4Q!KE6<0+XV5ENt*%M{#(;TW>1)1qW;#UIsvLb5%C^ z17^iZ&N`G!J$4q^BcsV_G zts`MP-gZFr-l>e%*K}A+J=o8dTPm_-`qS%DKbv7e!AG-S?bY6ojhBwq_2`|x zirR>m9#$2ojYH$fWV}qY?M`j1b_GO7R%KAwRS5}TQ}}gqbu4&274u0tei8EM96MS+ zz)XcU$VP={6al{@41v4}%8s{8FY))uGDt7?D(_D)QIE$fDAg%%JwG!%qwQ$N3bMDb4slZtOzuN-IHRDR22!jD=iV52NqS1}c>at;GU{Xu4EU8)dc&XWkF;`jjeQw~Dz z8Rc$mKofqcuoO%lR~814x?S$Z*s*TSp{Sd+O@6$6K=`*C)A;T3bnkq2Q z7TzxPN*7^Mn@*VfT|Ug3kW79F+AibTA{*JMtmVEL3fC!VS*Hr;Un+Ko#81Hl6sROs zq1t!InE*XW$esh3wNvVr{EMD*;S%8vIl8PlU8VkeK*J8XyLSbH>X0dB_#oMpJlpGa zx67kTyBqzr{ZB{RrDa_#d6JbeYruwKyKJ#*I&DIdnF_UUo!^txjy7y+n{=uHJ?~ZO z>;yF77vz;8V1jb{86XOqe!ilM-s8d(P1!arJG3=ZCODFDyExfng&V2#F9!&d4QmDw z0+sL0&9HMd9j@Na!uVCk&Y2lIJW!WI5-tDxl;h}ibvpkxr14(}i{+qj7R>$e2DQs0DRV^HseQ29E!H(F z6FO|AQFhDTNIeoZ9|xGVM-qG%kZSjkezg~u9^VkopALxsK9~yL68=y398gW4IN0+G z=vVl&L%}Oj+v(qy0{;7)@Ihx#4T&&lQAWa7`{lPt3S-R9gP#vnQ?8dcoGXF=ick0B2_ky=}0!x)^JlIMUK0SU{e)3ux_fhm3UjUvtr>(YMSht zk9nbq5^)#MkS1U5q_jWP%G^}eepzHw$rU>lY4@nXG zO%ab_b>9~4saW@;Hd2rh=MoN112m*a!IS+g>}euQmf3Akx3gj_N3|!zkuI{MtBd~> zHoYf2`@-BZ{&r0!SKcE`m6d%ezAai+={p?|Oqxtz-xe*de0KnZ2w2qIwEWns=|ob~ zWTS2Mo0i9VUG+D^UbQRC&T8k(-t=IvnYeE;Bn+xM}IrEB6Dmk(Dm?jSBCs zSWBn&Kb|fVI+q#IVUK;Q#|R;nd6Sn01XFZ&5(Aa&Z$MUAHa{KdlH_ZjnLHaW|av2^n;rW zahcFL>5l7hUuRH_88W4F`7!UOp4dZZ$iU6a7S?(GCx-qYBUrso*r}+Ev_sMEi@-4D2@(c)?oYk(lb>5Q`1}{M4erZ+8!aDEji5|Q;0BY@$ zMcCB0GBnD5XJDOM$5QY2J)}dY(YIhma-a2pN2`aYngEUz=swdpWTnfiO+BOzg$FJe6+fwjW;@Rb;;zjnOZ- zYF?$1bzc05B;CzYrF|uc@a05pUL!H2${MA5mHZOftn1M@RqR`pt&(3Zd-?#gL|aBT zu99CjJNpmx7}tt$l{=`$ROwiyOqKjL*_Zw{!}){TR>|+59lw(zq~fopmR0g6XWOg- zgtv!G?M#?)6AXb&|mD#(hQlexrG)Bv_vfcSrqcK^wIJT>j zZ=XFS#SEKQF2TY_M*$+p)GA@=X>`ku+KQ$Co0ll;Y4pqX_{^3QW%r70`{+4+SBNj{hT(!-*aw-^&_?aA{5TrCr|fGCRbkJ z>=!ZiUc9F3C%f5HbX)3b zFOGF8vZ-bz0WnSFomqddSC+Xh;Mx)O*s|dqT1Mf9RZDsr{{b~tTQzx~SXBa7cd~7E z@uYR1)G25AIpjX5+`8WDaWR;Hr0ps3X-H_{fap@MYZiM%&@6NWbZ5jen zB8XpbEyt#=R`n1ds1Dug6S~fX_)yNn6aG0i^|j%L&4u4-ZiGI3dj~dpoE! z8||l4zn+Vso=f5BDHfjBqjHW-Q*C4pM950Qfj$JJp1rk4-IL|%sbFd{cOB(TmIIp& zgfvQuC;GjeMs3(1f{oCW>CRX#y(zMBH4y?f){Z}fyns!us*;W6 z8z^t0G^hl>YN`dl0M&>biPRRT>!ZD@iNZCjwb|3!+>`<1_nCHVQX8EOj)ksPWgqNn z3rHrDq;ci)bcX*bdFT?oJ-%U6uP&gvq2*-xeKRWRDIx3&qjauOD95IYR^*Kf*nqj8 z?k5bi1%zLHzv4}2IPV9D>FL9<<#dKmwy2x6UrvQjPaeg7*;JZLY+sFqhg{u)ruNI* z6P|2}PYoxvLe4)mxKXB<=BjU1aETD?V}!ehT)4kPTBz@}2L z*Hc*B>tJgIa5LC|6aIRTW7A9Pdt;Mcw|O;avX_>A2oNGPsZu7##zrq} zvO^~GB84q)UI(fXT)l+6s%G?Y*15|6_hybwZ|(QGjk*Z;wB3aKm(ZEnD4dT$*Gn6D zi&VgO2XbusYtdKN>*AZfU47Ho7KJwe?w1;6&~IO@=WP@=Lcq^Am*=XWnwe}^seHza z{($HgRxtg>Na?M0u_rY}N)|3muGSQRfPi(YBS7`iX1u0yApW<1Sa{1^QaQ?={I_Y~ zpQZqR-?=@~N(suq@r)wksBqu!Ls^f1R}m|nN~eRz)P9^vk7&<1Q&@aslw zkCEoOWaHDBWv532t_C#)3*L*jr;ac~v^=twMUKq~Ev@@1UG0f(_Uve}0c?P)u61jZ z=cuRbmsYq=#ikx-M`_q{JWS=R_n@BBu^F=ARu27&noO6UH+Iltm%7oP)8x(pXS!%> zBRwZwb}wr~IOaYJXW*_&X}T!u8UoUBT)0X!LCY6>;E-0Z-nr#Uuu+6Fg381&5zc&wc^ zK6eFLPL;KWayd5k+K7XIaKeHwXFFZAH`fLA$K8E7HsiEgIZO4rrjPKe$)GOMu6pd3 zcV`1~Y$j^G4=+Mfu>SA+xrvUTF3@5AyF&>h#sea3fLN&cyrX$*aj7s9?M{4jMR1M=%Vj5!D7eAEI`4HsZ; zz;SI6uX<>!4syU|%G$oQ+PcwXfS?Xjmb@6eT zcssg-?E*%Adh7u)JxJob(EB_iaHd??1Ld^PEc_`^rd&^2^K~QVUj}5f{OJVeluG<{ zGU4Ox1H-LA#oTSmlx*(-zJYZCF%e`P6uTycU24?+Lp>;OG!M>_)r*2^I3)RRj=F7W z04ka?9mH6Gt2Ebo7#V^N;_n;qjW*id1=J*{pEPncXa>~|_#Q*Dxz=F=N7*4N3>UAd$G?;ajbx`hZ8%OKs)`D*U8V6X#w5Hk_ zMlvO3T~9{f%F&D)2k=gB)9d*(2V=4|kqj&Ok9o z@2KEO2K8L!2%rg6PREnA+(bZhWcqsRSwE^B5Slc-P0z8JrHw8$Q&)S;jHWp@Gqj1_ z01X*3uwk(rn>pJ5mQ2;TGQCFOY1*E}q@t2kHDCn(Km%Zx>v1Y*uO>kL`5vvo<21T&`1nOCFH#x8tVY zWk=)DREG3wXi1)nB}~&{++567bF`VgArYL=c|c{ttON>}E_X9lG&(bQz{oQ@Cn7oDEZj?gmdKGVF&#+Vj>49L%upPgB$v%$g<8z$t~tkur^29sbT z?{;*K%{ndN+DNmWO^>EpZO}fQ9iiK(AQu_bT5ZiqQV+=eU5=zazcCzj4@klH3!_G? zL(3?fbpZbj-*M~K+CPwPh9OCL?X`;)58}OR4EA~2iTe}KG935=@{MU)yBV-A9QcrD zpB$ShnxawOgEFGA1wE%mFPPhuDbJ2=p^FY)I#-7U_qWrZSLb2CqOj}mdP&PUY0@VT z$^xZo@6}8{Ftq^|JWT9;crYM_211`H7d|;mTWqAa9}?FgRX7%g_2AeC^*J2aUfZ%4 z5Ou#@k9nEofVyi-50B7mcyt_Nem1+5GbKNhe%roo^?Pe|o%%Xr#@6coj zjBnG&-ky!R^twax?8q`2^wUZ@(n0)QZWV#<3`v+pc z<`+C+;lef86yUe3Q>`{@&x;H~U4(kmy{T54wCi;Mjja2a&~C^;z2C&ZwJf|K!B(eM z{2TqcXx**)gGt1k{Co2bZb82T^pJ*zskRM8@=`{1?!!rM*Yd9!A*ko^MY-}!NRBRT?;CcuC1bKv}VPVwOzRQqb} zRAG!Gn!Df;1I4eQ7-g^^B+9W_qSgLMwZkX#Zqf?&T}PoXsK1f(FVXBwfHdfj`(GL` zxFLKI=AECvWfmYq!4X8@M-wqO8qQGZ-k(%BXTQkA;-dh zqv+2^I?^)O?qxg$_N-a=HF zp=nha>yAqKVwMME{!oo5{Qbt=EY7fSZxf&?_rN#1KP_jO#UFuHIj4!Ecqk7;lB<|S z+UFrCoQIixh!*6^!A^LK)nsqhI&PMn%H#GWd0|sHzgeHHz#R%=I zT{*QJbq~qxZpdSMX&tsA-vG?J5yM>NXBtvOKvVu@Wz)X*|h0iliWmjc^{bN2&~+Q`S~ zuB$l}X5Axlb?Zc?d2=Jsau)ji{?Dd`+_GT0br`!_SpGNH`t1iBfQ>643u>zE`U_OU z5s6uA*U6h(G^lHY$zCHHX{hz%uXWK;f$2f~N^*sc0QW7zhE)x%*#|%a)cy^ctfqao zBUgZ55LN1EkDS>Qjq-#{vgH+>vTz$5Q)+#!>1DE!B|kpg@D8Om2q6)-hFWQr9y99$ z8}#Qk+Uf($31OovAxsfRr9;m~2>3i{!u)oq3kdN|zaBE%Y;l8i(bV((PHIP3AGx;y z@Z+&5!@2>k)mtujp58=bJ_!p#{2y0*ne&tScKTs?pS_;;wLgRe(r{RA?47}!e{f|k zm(cGA$g66NT)1q3tNez2`)mKF>8j(Z%DT2XjyiTH3MyiN-Qra_%kJ(56%(=RiU_EP zieh14$B0NbT;k9mV2h2xIF6%ZjgG?o-tT$N#Xq0l+I#J_)?T&uIrpBE=TIgLaq?&M zCJvtA3`c@SB}I`zbw_|RypFaic`zh}H3eltvsL!n7wo=RCO|Dlgfas=s722K--Hid z$FmhNE{hZI4(N-c_5TS)+uv0qj*Kt0U*c$=gS9zkXQ- zh}frLiyyMkGv!)OrJa$zH>vmS$3SK%$iw3%)%_H54h&oTZ*F%d_A1QYu;kYq%-^BWLe=6Wgd{9RyXBxB%76;`1W=L9mZ_F8lnU@) z8~|6U$!*9PgPFcossC%vT*tZa_6=%SJ4mG?XQ;4MEjB~igq@+0y}7HJ?KT9E3L>{} zQ2nR%B5WAbpG&cJ$@k12s?x0FB>JHQdw|qsa>J$9=*v zPX~cYR!H@3>XkYJO$!mas$K!0Qj8L$Yj^eXpLSRXVtl=s{n8!lBJ;zrKmJOZhr25c zYGOc0ceTm|a%SFu3hwHT#;7ebRm4$w) zHn{F@<>^SD@a8<(?ti3 z)ed45BP)_Fiq`Z;L8JqXgAL{2ulHJ8>;i-e2F`^gy;RF71585FbYANF#{EHszQ)3; z6ZT+mUr+)6DK=7kdM`kly)f`K7lL6~j=w|5ooeqi zETp4fVen4%Q!uD>mEr={{RYRt8L;H*9Sb)v%q6Q*zuK+t{S#30t7j1vxC`7e%q=Ob z*nyBj!jV4Z+M9c*a*gXE*h|o0xT^ykpphQ2V0>P~nx=#LfF+-C#A9@iR5w~6tlq^f zZ@m_f-VR9TU#a5HJt0OSAaX1Rqxj89#KYnsZdt%Pwmk{*`ToHVli8cmH!%0_v_>!3 zs1qj2KPf2mo79*Rx=NzF&pX6^BeyDA7hMvXvAb0&Ff(wWBopUl>Opka9GrV>;>#XP z6x@A?@h;kRAp2P64J`CMkL_iJmlTKbh-1@wcF{U zNle%OcZmH4Q*JUK5){vLlaU-T_;X6jM@s;y5e9#||9k{fF6>PBHg)D)nw>c(N&d~> z8$Og-ln|`gdoRO}Lg3GYUvtU%%yC*HSzab?rbaIQ(3jMA2pmUs!7(hPQy~U+aK1XR z8*F6&e3xAN&?1uN(Q)sMd-x!t6euL0`k%%l@M#32)6LygaZ>=DjU^O5VggCDc# zqL%mR&v4OyQpXQrz%s13Wd%?EWnyG#B;cDq$sFvkhY+lcFWEmI?9&^A0ly+4?^1j8 z?P+3F{P18~h6Y*D`H_J=)!AO4>a`4f+L}?;MWdGR2*A|WLv2x?WdeDUu$MaFE28WN zBGgO$ds}x5MwETOV{eWx5`V>9gk*6E(#Rh5`g>5dbp3?X<*&P8FoXSBll;A41;|uT z^0=k#zS4C;EkRfBtzHl82r3$NX0!e3n4}J1g`;K3^X{|vW3Y|Jx#ZKWx3~s1L9F{e z-`45m)u|KISX9=#RUslHbx?~cDhR@gGS*{j%3%~_7=8yNgD zu-|uP6|Bp_k514hPdOp0=;5MFP|MUw$vhCH$g2p4Q$f7JV3kb8-`U}S@2HL~fqUyy zDKq0JFp@bZRr357@vPCP1)CyzdtqE_9>bYNQY7nwlT&R*H=seq2M9XzRQ|dtjAE0BNnS}g~=PA8Z%kLYtg-Sl6ru0F#38*v3@_tp=AzutwhjruSar8zG zel-z~W>B8|-3B|(C#x-*R3$uk!ae=AYEo%wq?1~u{5FkMQPxgA0B!kbyEYi_^e$Xz zjjkS@0TnDp6KJKT1%V3q-+QD!3)OZGk_8R>{2I?1b^Cj0oWI^W&Vz~LXFz>|B%GYj z$H6=O(=}+a%36fv^?epK;DS(^b4dOM=RKU`zGz z7eHNtG^tvN=fRjN*+VUN9B#%mQWUh& z*B0Bo20|vv?V!z969xgU(1bL;OQ4H>s1GN^;Nrh=Fd3>Yw1Phae#qX(Q+fU3MJ85- z=NTGLx7!0I%ja}FsTr-lI^+N`RQd4;J2+WAnm7jwAtZ}ntLf?sUtT(?l7DRc^axh= z>3}H`&Fq{@}0R_u{N zT##f8sS@ncpLeSEiJ%(NFc`O6tJL~`u}Y>&l9wIxRim&$+TgFxuQeFD9t#cB#4sA+ zz+2RMPmp6Fi8Ss0-q_ZYS&W6n$n1O4I=&UVN{Q1ty$?Q}Scsf-+6dXK#vJ@In%8Q~W zrg)mDdhFoW8!U@T4GhK(;ylQ*__``e4E#!Kr}wIXzHLp^Vo>*~3C~(<`>Wl3?Nh6L z1Qo8L4c@0N>1z!t&x4QZJZCLy2UZB@uc)y5)dSbsU@-dFZ(3PwdK`0kYU3%!M;-Hz z6(Fngu&WHsGL|GtV4UEcCCoP^Y+7SQkW+2MG-`5SNkX$GUeeAK}k62PEGu-U8!LrRysLH$i{h!XV zg#Z<1e-^cl&B@S2RA=tdx7%!8ntHN@NWo`K7IMpe@nj2;BE>HQ6ZW$XqG;-{zn?Q% zj(u{_=fIJQUj(ik&HBrN3pXoyntqba7<|JBSp4APK2}Lm)1d<5Xq`H&Df|lX zRjU6Pc%3d?KHfg{=Ytg(Ob1SrPq~MBK4dEnj|Da1vKzf!`9DxG_f3+clN}pK)KI!N z%afz}-D0FheVdHjK3^?63deAW@#*$CLdKD=LmJd~`(A@36}_k~O?Hp7VB?zi08xg) z#V^CzdpF*O3Jdr=ati~N1vle+s_dK9mDK-*B4FX|w*%HNx_@1R`fGsc&MhQ0wKL1H zDk&!?u)=1iF!s^qe#9FK6V-xFfVvdjwz_VsXvANRiK+1J@%-84x#JeE|prX!Z5^R|a`*Q9fybbiQ^ zQVsk;2$_qnX}NA$Pfdl7xpTsN*UvI?jrf5fsC zuRH}%2hM+h>aE6lHo-!)6=L68{cU$sP{H~8U41ZfPD9Pk|32|Q)AlEX7;MG&t9!oJ z2WPN)pVZ_Z9}KRkaSq=-q~yPYfYm`wlMm0r|A}U<>3rPrA@4>Pm#iCkC^sc*9>!!f~dkiHNJjx4Ss$ESJ|s}d%>idB6rTu^!=OG zV18ERWu$YNam^)Yot(&##jh3_#&ooCfBX2%|*)X+VwCXWQG`zqPNz3Ls(f; zzvSaB3%8?y&5TKM z_uLG7^8>15E$qG_84E>>nnang3%X>vcX^&k-`eVVf6Tq@H?9w*f~~O7r@SLQ_EH7P z48y)n-L{?(wlZMLUdP*;A6L~1CCT)w_qXAq$JOKC{!3>3etr~`6yU4Y+ypATy|^gO z-ux&o%F1fC`g;5LjP1uj{er>i@`t+1-u#5x#`~={`18HXgzaMA1Ext)>R#`ICouQ} zAnMT{sm)%OLTu>AyI20Ya1zu%HR{)AFUXDuqU5q(@g%4*P*x0BSn^ z+wjz`G*TaHVmyu7$aP<~`U9*oA>+BB zWnhgA$v?Y*mhAlnw!+{yXt4lgW9bg>M36X;CAG0?e@+8=KMK~cB%9M29Db^ckSeOnlR^R<|BBg@9fNv8$?ahy= zg9_e3!7Til!y=mf;~MT!maOgjtK&y5#2w6%dELro;iXiQ180eS*D`dK-X68Ib^l7) z&r~oi9dQH|lDvjjaHU@%%5)j>hXJ1%qZ1hRKNh|?t@z~%IJjIvU7X`c2Lbfz*d0k2UPuY zIAvzwWXtrn<;ZGOJq!la52^EYC|NOIWy|;$zlHfzDhLVA3#~DDue$IXR4`;pNTfbyLMCJ@_0c>~3;fPMXT?DZf;H~^j_ux|ep-os68e_h z_jPn;A8Vz-zf)bv>S;M9s7(AR*}7|snfU>AuycK`182!$Az7q_+7?kL)*FLN^` zc~eh&^k$=9wAXC)^wI>@va+LC__FY!(iZ<@@s6U4MlHIAy3g*bm-=p2mOMT)gSVz* zoNTp)@Or)RYy&t%xo~S<=f*h_JnoLiUyNC z(3`DP<9hYS;B1+%tH-%MkNZH3Y{~cEIPwoRCxFH*c@(kAyAH4Yduj0NtuqaJmzoX> zottBJvIWm6tj-7x#f%%;Vl;YwT^7EXSnrFTyANm3XW_$+<$g_J0YbIH;DKhEBPGp1 zLN-9=$t{v>O5F@HPqQxL6imnhlr1wmm20_~K1qMhk*|Mbg|{iC0xliji9T7}r-7zX z(e<7fc@dPw%7Aia7w>LOG>{b{40SGY$wJ0;9cd3woV_H@)Ig*unqG`6| zMek#~Rg>o;Tx%wPAyRfa_05&$D>aR|k4m``f+?HWXqUonsx~ zMc;s{Kn#~r=JbskUT`EzwV-RkO1?Qjzsi<-Nj`MZ;7{-zW47#`-!wN6`u4{wje%5iK}Dy!djP2+F7vQZs;sjuXKPOC ze6YeX?Ntb=g(vMXI0b!O;G^NgL0zc9zti0LGQiK=cgnGLLPZI1E(IO_IOT_L5ce zXUnlrk|giKl?5I&yDtMwmcJ5R2#{-?ewIA*pT^^1 z;bSJZEP0!XOSakAvQbz!TRx^bal5lW4F{_n9MZK+*e;g&Do57na8c%{>i;(ogLCkS zy{c;!CPsLU5kBeAk*tD4!5P%7<5SAta+0=qMHUML48WsQbMsQL)E6y9GoK!t5gbJMSZ6O zUYEcnUAWK;1-8=V%JN>-qGwM4mD_zC-;~E0cB=Z*B`a9z&MYdgt~Z~l;)EBDW%hE7)B9|tQ#u6)k*Y*wEeIuc^! z;c*hK4kiPRRzDsDe2ojbiR!MF*ltiu-Xv|yq>Iw*x%d~*8O}D`P?!#^+y=o`Lveov zjj+%J>vB}TRRkcYYX{W2XrR6{Y#zP_g%mVW{r(ZV0M4KDcAq&epu#wyZXeNvx0f#? zaSNf(MNP?O(3Q01rNni4lYf<*_qHL-k*ltw#%~ymx%8YIiM^!%VpIUJ3xMCA;uWKT z>bw*{Y?+N2c3)BdE60qKEp6-9__AA>P> zRF4*a9_w#{;Ecbqtvi-fa?UZmwL3tAdw;(!Q7-)}8F)R*Q~+x59CGfF%Z2D0_jz^y z+K&k;8;^9o){WtdG021l1pD&{p!n+RQ1R?{Nc|4wR!?Be%S;T-%m)UMpzdy_%7Gy$S;(c z*(?h`g@CK{P`zxB3H4bLs_%U-tp}*cgk0#4pp;jAO9y94)Y@*Rw-6%7V%_hLQAGOS zmjaxdA>q#L_=u!uV?wOUYc%{ys4mq{mn@&5+>~8ukP3OySd_&5U4IQSqo%}cw$0c? z-@srb)z7yMk=3Qj$ljoSx^a|nYBo3<({QLc*K1KP3|^tZ)Po~v=Wmuw^|)4gg1)YY zTBi%B5b_rL$u4+x%~=!U&jdthCv|WUAgEsp(VKNp>pWkrQLk>W8GKJ`s$*39uOm0R*ps;tgW63!b18a znLE5)L8ls6cbCShnD56{R(GxO)D+a-j;^i-r$7uNIRAHtbN}axxnMO@;Dr1^=nl2h z^<;UJcCmE`Sz$0t*StDPOii_h83&{8zkfzCKKu$X49OCIc**DkP@mQS#KZA3$N7s4 z*a~xTOWY!_1>kl~jFJLhTGIX0Hj{!MaX;BcExUKCHn-&d#gaFCuMdNbnEMvt+)#Zp zn8pDtLI$Rg9_rMas+iaKh1Aw6)}?Peyv$u_?~1vAU+?3=jfFaF1;qfh=+b0!{)&X0 zRs7BAoSQEi0%9)QtT1}R`=#{&u@Kg_uQ4H;zBF(C!#MD&p#8O{Xnl?n9tg3z; zO5>=~yg>~lkm?hO-c-Jlk!<9^W2snWb=CI7jU*#rl)!GWludUyd8 z1T|{UWO~lGfz&qzpSNyBziQ9`)&TrgaB=4m+L^{lkxw@fp_b~{EiRgIK4qQYrhFfR zSb)Bvt58xqA#gUS?Up3tS~%mu>CUD&(&6FwL#WU}ZT5Pj$no$r zwZ>pXnIQ!q0zfQS;c+m74!4)gz&7fbW|#}=hy260XLBJ2Y>M=4QDsIQE(EAckr5p$ zGplsYT&oFL@(y{jhkE=NV&ACBpOMQ<&yH8APIFcHE6Tb2B0fr9sj)Ktlgz=csZ3C~ zIJ)DvXJhF?#uRywbB$u`i$G?8RIkFos*QT;6jXpE9|Wx6d#cPES+mn5+ynW_N)0f> zlVv2gOy9Y5vkCX$zG*sBj|}RotwXroxRHB@<3oLQ)CG!xE4Ykf^s6_Q z=ql;*BzhOcsBw~hl`a-FD-jkw2h^p@scmDKRa`Hb)-AZY)bjV=un=Lo?3>+zgWnwG z;0*DZYwc{P11dNJe&Y`n8>-#6(i$1^H*Lkdu}wW~nJ&vFccdi)*TL(sP{&3U=#%UJ z4|axvH-cRM9d2WC2EZo~I1qJG!>ZC5aJYDi9qgu_xXb-T9pob+8};ubP{Hcf*(u!6 zPI27dbV)fqkDP5kV1M=L60&DJ*UhO(Z%>!>3yA&3s?$ou0)$*KrUj{V;PsO-#A$N- z%$@XSurj8L+r)->OWK;G!r+hT$j=>A$N4OLxJA5qe)NG3ph7BRhCB+GL@^%dAQd`_ z7m?E_#+`>`g>HoPs0CboW1* z@9^0Ac+^P4;?NqjhMbU)qhy?fnQqU50qfu-X2(0tVAX)8$zT@Ol?>A+d??LIcNuG-*tC}?DVg>Y_+XKi#9oSyETZd}V8)?m)bk{cK7yLN2}2*ZN& z{XiI}9e#s=T_CGx$&V_x0+mSy_hzB6RSW#27d?Y93(fWc#_ty!WF%d-e7LE-ztQC| zcOgq6yl2wR#gAF7vZN?%HUp=60;B?bpLdGRZ_f9<0qSRs2iR`+$sLV(TcAk{ZiZyaXY#9^udTJgGSeoyQ^pn2V@ z%fX)uS++l09}04Aj+oc`jZtPXo*Lyyzt+_Ve~D(w%@*lU zmu~iGH(RD`{4v65OGg@KjYf_3?8`Vh(->VJG_tIZRA8fiJddQR%a(+TF7)>ISJ|p% z%WPfE#}%wG7gS@mTt7CERJLk&o9Eyk_>mcG)LdIOayj@Yj?5X;p49E1K?UsFt}*8_%9fj7N9y~%4j#Fi zs>XGM6^<=txC??aV6d(gN@_#AX$)5}=1AKH!Kft?PkGUp=Lb4E;mmj$}H7g-RLU0VsPzsERHD`=M+j+c)8XPdL6Bii%S?J)eh?A zHZUDvUvtfL%X;yAlq(Ls;VRseh3dbLaD*@Z)704D@%gDdeEYiz#pqj|dz2^Z$64Pz zMEgG*ku8q98l8s#JNqb~G-=h$o1)qP=&KI*UzurmhxPDiosrN*bhIEH-b+O+oN zjXWOGIQjTKT}9n8?yrLealf%Io#zx%Z%7HB?^8$zb@=%kcuQ(k`f?UNh+zP=@ap(p zRG+?aL-x}@N)*-^#R)O z?`68+Cns=14ECPfjE1$qI~=st-Q<%T{OCId>+|K?r$>&pr~+gLY~G;mWE>Doty;bq zJm*q{{zoA*s3#Yq;#jIDCP5<@wk!Xjzzm%^BNSe@)%J;HBg|!sm@k(WcV<$(cZ7)| zU$*lX&GpraE0OE;dH7G`CB=_fG@1GH@YmVspjxO7wye&%=qNULmt$q8U**a9`CUKx z{1h@zhPJMFt0S`t)-~ixy!TY5k@s7WH*|UO>>5%*eYJ@b76PlLHIQ;^tD!5H%=6^L z#^F65R>NEt>pXnu0qsX^f_ zye>LR*twzV`=0COin~KsEt^$kCv#n%MD1jmSeb{+4|pd)Px!Kk)LeW32(eI8^{&H; zlPf*ipr+JT^D;3Qslae@g;OVcDB{y(ezm04@0S&m$@7*b-BEKIN{h)fJlt?(melLd9Y$-zb*lLox4P_XE4p}-L3)K zkKL!S5X4BhqV|E`6-c zD5Ohoa0YDEpvuzY>|_8j*t#)NUj?;OWrzWI?Z|qn@F5KloLe`67?jFQ^&XjnLmXgb zwb>A|%8|DPk%UjjQRZy<#NW|ZR`~)k3*SHNb1JC6&7k_Yq2e7>d9~Yis-Gn>JBPfQ zSPq=o=delei8@dga0jTFa$!jy+Un>HK=djpXB_#WruNG5x!fPb=&MmrIv2<`MUdb5A z!H@so;8fW>3Hhp=YP|?|1vnoaThWuS*%4kHq)1mwGvildvU{`L8uja~6BN>~3?Syl zpWH-!kAJ5ac!z3{9c6aMpE(p|rON1TNakhK_%*vUA#K|>;@n2=fKZ`L9sIx9hhz&M zE|ei1`1fD`CEMqLl|ECHj`(M-60EyZUGO7QGEXe&+V!gjY3Cjm_(!jjYFVmmh>U@bpQuvi>_@Gu3I>YtgL*_59rdQ*3XNwtwy*z#-1&G1*YyQH)4n`Af-k>2_ zUAw};Int$dV=grH0ayX;p7`RXX{fveV3NED-bh zRruGPTMeM<3#5%1{_gv--Jk-@HQtxKv)b@KLf`BntNVEC5C7G9-tHt{9@gK-*S#(H z@1tgq0S)&>XN^C6K4>>`p_ewdMU%RuzWmB{@5{8V_~^-byMEs}_@1mCrv0xeUk|oQ zDUkjhv_DSQwZmKp*|jD9#@5a5zP$#X^Io6{pquyrH+4dxWP;PHFFsz8R=_TXPx zp59`DN{?=Y#zlZo(5wyy&$0X15>Wp@+Ba{;xou0x>Y=O~+l&7p+4BnLK9JVU@E@W5 z?ZW>AgcyUmcjA9YzG}HwTSzSMkD5L0LX9R?Nq!sor;(|(K*eBPJ2OIe{C8HA`aq`I z;IAxO+ts>9Ru9ExAlB_^mt@1a5Ai>r_`}HtcIAGUs81tz-Tm$V23+(5G(41{ZEFyY z=?Koo2QsHyy}Q3X9pHM2Vmy$3=2iF~l1`sY@MX%0D|KcLSa-%WczoMxcYn(p@cu0z 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 c0tv>_eSkyUCPXJs`${oT5B;K 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

    9Jc4IGl==U~cJsRy_b`_F6c2+)J~YDiThr5jQ6 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%0AWu$0=x+mY;9yje3oeL0JXC=f50{9yXY@t!_V}wF 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

    6~TF+poo43y{Dw2 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