From b8000403db1e28cadc29d42300e9558d632ad826 Mon Sep 17 00:00:00 2001 From: Melissa DeLucchi <113376043+delucchi-cmu@users.noreply.github.com> Date: Wed, 6 Dec 2023 10:33:18 -0500 Subject: [PATCH] Optionally write out all of the parquet files. (#181) * Optionally write out all of the parquet files. * Scoot python versions forward (#182) (#183) * Undo re-adding task key. --- src/hipscat_import/soap/arguments.py | 6 + src/hipscat_import/soap/map_reduce.py | 130 +++++++++++++++--- src/hipscat_import/soap/resume_plan.py | 47 ++++++- src/hipscat_import/soap/run_soap.py | 32 ++++- tests/hipscat_import/conftest.py | 5 + .../data/soap_intermediate/0_4.csv | 2 + .../data/soap_intermediate/1_47.csv | 2 + .../data/soap_intermediate/2_176.csv | 2 + .../data/soap_intermediate/2_177.csv | 2 + .../data/soap_intermediate/2_178.csv | 2 + .../data/soap_intermediate/2_179.csv | 2 + .../data/soap_intermediate/2_180.csv | 2 + .../data/soap_intermediate/2_181.csv | 2 + .../data/soap_intermediate/2_182.csv | 2 + .../data/soap_intermediate/2_183.csv | 2 + .../data/soap_intermediate/2_184.csv | 2 + .../data/soap_intermediate/2_185.csv | 2 + .../data/soap_intermediate/2_186.csv | 2 + .../data/soap_intermediate/2_187.csv | 2 + .../order_0/dir_0/pixel_11/source_0_4.parquet | Bin 0 -> 6838 bytes .../dir_0/pixel_11/source_1_47.parquet | Bin 0 -> 33062 bytes .../dir_0/pixel_11/source_2_176.parquet | Bin 0 -> 10443 bytes .../dir_0/pixel_11/source_2_177.parquet | Bin 0 -> 22870 bytes .../dir_0/pixel_11/source_2_178.parquet | Bin 0 -> 24239 bytes .../dir_0/pixel_11/source_2_179.parquet | Bin 0 -> 25729 bytes .../dir_0/pixel_11/source_2_180.parquet | Bin 0 -> 13370 bytes .../dir_0/pixel_11/source_2_181.parquet | Bin 0 -> 16010 bytes .../dir_0/pixel_11/source_2_182.parquet | Bin 0 -> 19958 bytes .../dir_0/pixel_11/source_2_183.parquet | Bin 0 -> 18844 bytes .../dir_0/pixel_11/source_2_184.parquet | Bin 0 -> 21542 bytes .../dir_0/pixel_11/source_2_185.parquet | Bin 0 -> 39137 bytes .../dir_0/pixel_11/source_2_186.parquet | Bin 0 -> 11136 bytes .../dir_0/pixel_11/source_2_187.parquet | Bin 0 -> 13692 bytes tests/hipscat_import/soap/test_run_soap.py | 31 ++++- .../soap/test_soap_map_reduce.py | 79 +++++++++-- .../soap/test_soap_resume_plan.py | 22 ++- 36 files changed, 341 insertions(+), 39 deletions(-) create mode 100644 tests/hipscat_import/data/soap_intermediate/0_4.csv create mode 100644 tests/hipscat_import/data/soap_intermediate/1_47.csv create mode 100644 tests/hipscat_import/data/soap_intermediate/2_176.csv create mode 100644 tests/hipscat_import/data/soap_intermediate/2_177.csv create mode 100644 tests/hipscat_import/data/soap_intermediate/2_178.csv create mode 100644 tests/hipscat_import/data/soap_intermediate/2_179.csv create mode 100644 tests/hipscat_import/data/soap_intermediate/2_180.csv create mode 100644 tests/hipscat_import/data/soap_intermediate/2_181.csv create mode 100644 tests/hipscat_import/data/soap_intermediate/2_182.csv create mode 100644 tests/hipscat_import/data/soap_intermediate/2_183.csv create mode 100644 tests/hipscat_import/data/soap_intermediate/2_184.csv create mode 100644 tests/hipscat_import/data/soap_intermediate/2_185.csv create mode 100644 tests/hipscat_import/data/soap_intermediate/2_186.csv create mode 100644 tests/hipscat_import/data/soap_intermediate/2_187.csv create mode 100644 tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_0_4.parquet create mode 100644 tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_1_47.parquet create mode 100644 tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_176.parquet create mode 100644 tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_177.parquet create mode 100644 tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_178.parquet create mode 100644 tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_179.parquet create mode 100644 tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_180.parquet create mode 100644 tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_181.parquet create mode 100644 tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_182.parquet create mode 100644 tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_183.parquet create mode 100644 tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_184.parquet create mode 100644 tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_185.parquet create mode 100644 tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_186.parquet create mode 100644 tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_187.parquet diff --git a/src/hipscat_import/soap/arguments.py b/src/hipscat_import/soap/arguments.py index b6d8ede8..b86a9790 100644 --- a/src/hipscat_import/soap/arguments.py +++ b/src/hipscat_import/soap/arguments.py @@ -18,10 +18,14 @@ class SoapArguments(RuntimeArguments): ## Input - Source catalog source_catalog_dir: str = "" source_object_id_column: str = "" + source_id_column: str = "" resume: bool = True """if there are existing intermediate resume files, should we read those and continue to run the pipeline where we left off""" + write_leaf_files: bool = False + """Should we also write out leaf parquet files (e.g. Norder/Dir/Npix.parquet) + that represent the full association table""" compute_partition_size: int = 1_000_000_000 @@ -66,5 +70,7 @@ def additional_runtime_provenance_info(self) -> dict: "object_id_column": self.object_id_column, "source_catalog_dir": self.source_catalog_dir, "source_object_id_column": self.source_object_id_column, + "source_id_column": self.source_id_column, "compute_partition_size": self.compute_partition_size, + "write_leaf_files": self.write_leaf_files, } diff --git a/src/hipscat_import/soap/map_reduce.py b/src/hipscat_import/soap/map_reduce.py index 68e50228..95f1e83a 100644 --- a/src/hipscat_import/soap/map_reduce.py +++ b/src/hipscat_import/soap/map_reduce.py @@ -4,26 +4,58 @@ import numpy as np import pandas as pd -from hipscat.io import file_io -from hipscat.io.paths import pixel_catalog_file +import pyarrow.parquet as pq +from hipscat.catalog.association_catalog.partition_join_info import PartitionJoinInfo +from hipscat.io import FilePointer, file_io, paths +from hipscat.io.parquet_metadata import get_healpix_pixel_from_metadata from hipscat.pixel_math.healpix_pixel import HealpixPixel +from hipscat.pixel_math.healpix_pixel_function import get_pixel_argsort from hipscat_import.soap.arguments import SoapArguments +from hipscat_import.soap.resume_plan import SoapPlan -def _count_joins_for_object(source_data, object_catalog_dir, object_id_column, object_pixel): - object_path = pixel_catalog_file( - catalog_base_dir=object_catalog_dir, +def _get_pixel_directory(cache_path, pixel: HealpixPixel): + """Create a path for intermediate pixel data.""" + return file_io.append_paths_to_pointer( + cache_path, f"order_{pixel.order}", f"dir_{pixel.dir}", f"pixel_{pixel.pixel}" + ) + + +def _count_joins_for_object(source_data, source_pixel, object_pixel, soap_args): + object_path = paths.pixel_catalog_file( + catalog_base_dir=soap_args.object_catalog_dir, pixel_order=object_pixel.order, pixel_number=object_pixel.pixel, ) - object_data = file_io.load_parquet_to_pandas(object_path, columns=[object_id_column]).set_index( - object_id_column + object_data = file_io.load_parquet_to_pandas(object_path, columns=[soap_args.object_id_column]).set_index( + soap_args.object_id_column ) joined_data = source_data.merge(object_data, how="inner", left_index=True, right_index=True) - return len(joined_data) + rows_written = len(joined_data) + if not soap_args.write_leaf_files or rows_written == 0: + return rows_written + + pixel_dir = _get_pixel_directory(soap_args.tmp_path, object_pixel) + file_io.make_directory(pixel_dir, exist_ok=True) + output_file = file_io.append_paths_to_pointer( + pixel_dir, f"source_{source_pixel.order}_{source_pixel.pixel}.parquet" + ) + joined_data = joined_data.reset_index() + + joined_data["Norder"] = np.full(rows_written, fill_value=object_pixel.order, dtype=np.uint8) + joined_data["Dir"] = np.full(rows_written, fill_value=object_pixel.dir, dtype=np.uint32) + joined_data["Npix"] = np.full(rows_written, fill_value=object_pixel.pixel, dtype=np.uint32) + + joined_data["join_Norder"] = np.full(rows_written, fill_value=source_pixel.order, dtype=np.uint8) + joined_data["join_Dir"] = np.full(rows_written, fill_value=source_pixel.dir, dtype=np.uint32) + joined_data["join_Npix"] = np.full(rows_written, fill_value=source_pixel.pixel, dtype=np.uint32) + + joined_data.to_parquet(output_file, index=True) + + return rows_written def _write_count_results(cache_path, source_healpix, results): @@ -48,9 +80,7 @@ def _write_count_results(cache_path, source_healpix, results): ) -def count_joins( - soap_args: SoapArguments, source_pixel: HealpixPixel, object_pixels: List[HealpixPixel], cache_path: str -): +def count_joins(soap_args: SoapArguments, source_pixel: HealpixPixel, object_pixels: List[HealpixPixel]): """Count the number of equijoined sources in the object pixels. If any un-joined source pixels remain, stretch out to neighboring object pixels. @@ -59,16 +89,19 @@ def count_joins( source_pixel(HealpixPixel): order and pixel for the source catalog single pixel. object_pixels(List[HealpixPixel]): set of tuples of order and pixel for the partitions of the object catalog to be joined. - cache_path(str): path to write intermediate results CSV to. """ - source_path = pixel_catalog_file( + source_path = paths.pixel_catalog_file( catalog_base_dir=file_io.get_file_pointer_from_path(soap_args.source_catalog_dir), pixel_order=source_pixel.order, pixel_number=source_pixel.pixel, ) - source_data = file_io.load_parquet_to_pandas( - source_path, columns=[soap_args.source_object_id_column] - ).set_index(soap_args.source_object_id_column) + if soap_args.write_leaf_files: + read_columns = [soap_args.source_object_id_column, soap_args.source_id_column] + else: + read_columns = [soap_args.source_object_id_column] + source_data = file_io.load_parquet_to_pandas(source_path, columns=read_columns).set_index( + soap_args.source_object_id_column + ) remaining_sources = len(source_data) results = [] @@ -78,9 +111,9 @@ def count_joins( break join_count = _count_joins_for_object( source_data, - soap_args.object_catalog_dir, - soap_args.object_id_column, + source_pixel, object_pixel, + soap_args, ) results.append([object_pixel.order, object_pixel.pixel, join_count]) remaining_sources -= join_count @@ -89,10 +122,10 @@ def count_joins( if remaining_sources > 0: results.append([-1, -1, remaining_sources]) - _write_count_results(cache_path, source_pixel, results) + _write_count_results(soap_args.tmp_path, source_pixel, results) -def combine_partial_results(input_path, output_path): +def combine_partial_results(input_path, output_path) -> int: """Combine many partial CSVs into single partition join info. Also write out a debug file with counts of unmatched sources, if any. @@ -100,6 +133,9 @@ def combine_partial_results(input_path, output_path): input_path(str): intermediate directory with partial result CSVs. likely, the directory used in the previous `count_joins` call as `cache_path` output_path(str): directory to write the combined results CSVs. + + Returns: + integer that is the sum of all matched num_rows. """ partial_files = file_io.find_files_matching_path(input_path, "**.csv") partials = [] @@ -132,3 +168,57 @@ def combine_partial_results(input_path, output_path): file_pointer=file_io.append_paths_to_pointer(output_path, "partition_info.csv"), index=False, ) + + join_info = PartitionJoinInfo(matched) + join_info.write_to_metadata_files(output_path) + + return primary_only["num_rows"].sum() + + +def reduce_joins( + soap_args: SoapArguments, object_pixel: HealpixPixel, object_key: str, delete_input_files: bool = True +): + """Reduce join tables into one parquet file per object-pixel, with one row-group + inside per source pixel.""" + pixel_dir = _get_pixel_directory(soap_args.tmp_path, object_pixel) + # If there's no directory, this implies there were no matches to this object pixel + # earlier in the pipeline. Move on. + if not file_io.does_file_or_directory_exist(pixel_dir): + return + # Find all of the constituent files / source pixels. Create a list of PyArrow Tables from those + # parquet files. We need to know the schema before we create the ParquetWriter. + shard_file_list = file_io.find_files_matching_path(pixel_dir, "source**.parquet") + + if len(shard_file_list) == 0: + return + + ## We want to order the row groups in a "breadth-first" sorting. Determine our sorting + ## via the metadata, then read the tables in using that sorting. + healpix_pixels = [] + for shard_file_name in shard_file_list: + healpix_pixels.append( + get_healpix_pixel_from_metadata(pq.read_metadata(shard_file_name), "join_Norder", "join_Npix") + ) + + argsort = get_pixel_argsort(healpix_pixels) + shard_file_list = np.array(shard_file_list)[argsort] + + shards = [] + for shard_file_name in shard_file_list: + shards.append(pq.read_table(shard_file_name)) + + # Write all of the shards into a single parquet file, one row-group-per-shard. + starting_catalog_path = FilePointer(str(soap_args.catalog_path)) + destination_dir = paths.pixel_directory(starting_catalog_path, object_pixel.order, object_pixel.pixel) + file_io.make_directory(destination_dir, exist_ok=True) + + output_file = paths.pixel_catalog_file(starting_catalog_path, object_pixel.order, object_pixel.pixel) + with pq.ParquetWriter(output_file, shards[0].schema) as writer: + for table in shards: + writer.write_table(table) + + # Delete the intermediate shards. + if delete_input_files: + file_io.remove_directory(pixel_dir, ignore_errors=True) + + SoapPlan.reducing_key_done(tmp_path=soap_args.tmp_path, reducing_key=object_key) diff --git a/src/hipscat_import/soap/resume_plan.py b/src/hipscat_import/soap/resume_plan.py index d96b1aa6..23c5f7ad 100644 --- a/src/hipscat_import/soap/resume_plan.py +++ b/src/hipscat_import/soap/resume_plan.py @@ -23,10 +23,14 @@ class SoapPlan(PipelineResumePlan): count_keys: List[Tuple[HealpixPixel, List[HealpixPixel], str]] = field(default_factory=list) """set of pixels (and job keys) that have yet to be counted""" + reduce_keys: List[Tuple[HealpixPixel, str]] = field(default_factory=list) + """set of object catalog pixels (and job keys) that have yet to be reduced/combined""" source_pixel_map: Optional[List[Tuple[HealpixPixel, List[HealpixPixel], str]]] = None """Map of object pixels to source pixels, with counting key.""" + object_catalog: Catalog | None = None COUNTING_STAGE = "counting" + REDUCING_STAGE = "reducing" SOURCE_MAP_FILE = "source_object_map.npz" def __init__(self, args: SoapArguments): @@ -50,15 +54,20 @@ def gather_plan(self, args): return step_progress.update(1) + self.object_catalog = Catalog.read_from_hipscat(args.object_catalog_dir) source_map_file = file_io.append_paths_to_pointer(self.tmp_path, self.SOURCE_MAP_FILE) if file_io.does_file_or_directory_exist(source_map_file): source_pixel_map = np.load(source_map_file, allow_pickle=True)["arr_0"].item() else: - object_catalog = Catalog.read_from_hipscat(args.object_catalog_dir) source_catalog = Catalog.read_from_hipscat(args.source_catalog_dir) - source_pixel_map = source_to_object_map(object_catalog, source_catalog) + source_pixel_map = source_to_object_map(self.object_catalog, source_catalog) np.savez_compressed(source_map_file, source_pixel_map) self.count_keys = self.get_sources_to_count(source_pixel_map=source_pixel_map) + self.reduce_keys = self.get_objects_to_reduce() + file_io.make_directory( + file_io.append_paths_to_pointer(self.tmp_path, self.REDUCING_STAGE), + exist_ok=True, + ) step_progress.update(1) def wait_for_counting(self, futures): @@ -98,6 +107,40 @@ def get_sources_to_count(self, source_pixel_map=None): if f"{hp_pixel.order}_{hp_pixel.pixel}" not in counted_keys ] + @classmethod + def reducing_key_done(cls, tmp_path, reducing_key: str): + """Mark a single reducing task as done + + Args: + tmp_path (str): where to write intermediate resume files. + reducing_key (str): unique string for each reducing task (e.g. "3_57") + """ + cls.touch_key_done_file(tmp_path, cls.REDUCING_STAGE, reducing_key) + + def get_objects_to_reduce(self): + """Fetch a tuple for each object catalog pixel to reduce.""" + reduced_keys = set(self.read_done_keys(self.REDUCING_STAGE)) + reduce_items = [ + (hp_pixel, f"{hp_pixel.order}_{hp_pixel.pixel}") + for hp_pixel in self.object_catalog.get_healpix_pixels() + if f"{hp_pixel.order}_{hp_pixel.pixel}" not in reduced_keys + ] + return reduce_items + + def is_reducing_done(self) -> bool: + """Are there partitions left to reduce?""" + return self.done_file_exists(self.REDUCING_STAGE) + + def wait_for_reducing(self, futures): + """Wait for reducing stage futures to complete.""" + self.wait_for_futures(futures, self.REDUCING_STAGE) + remaining_sources_to_reduce = self.get_objects_to_reduce() + if len(remaining_sources_to_reduce) > 0: + raise RuntimeError( + f"{len(remaining_sources_to_reduce)} reducing stages did not complete successfully." + ) + self.touch_stage_done_file(self.REDUCING_STAGE) + def source_to_object_map(object_catalog, source_catalog): """Build a map of (source order/pixel) to the (object order/pixel) diff --git a/src/hipscat_import/soap/run_soap.py b/src/hipscat_import/soap/run_soap.py index 3960e53d..54808307 100644 --- a/src/hipscat_import/soap/run_soap.py +++ b/src/hipscat_import/soap/run_soap.py @@ -3,12 +3,12 @@ The actual logic of the map reduce is in the `map_reduce.py` file. """ -from hipscat.io import file_io, write_metadata +from hipscat.io import file_io, parquet_metadata, paths, write_metadata from tqdm import tqdm from hipscat_import.pipeline_resume_plan import PipelineResumePlan from hipscat_import.soap.arguments import SoapArguments -from hipscat_import.soap.map_reduce import combine_partial_results, count_joins +from hipscat_import.soap.map_reduce import combine_partial_results, count_joins, reduce_joins from hipscat_import.soap.resume_plan import SoapPlan @@ -22,28 +22,48 @@ def run(args, client): resume_plan = SoapPlan(args) if not resume_plan.is_counting_done(): futures = [] - for source_pixel, object_pixels, _source_key in resume_plan.count_keys: + for source_pixel, object_pixels, _ in resume_plan.count_keys: futures.append( client.submit( count_joins, soap_args=args, source_pixel=source_pixel, object_pixels=object_pixels, - cache_path=args.tmp_path, ) ) resume_plan.wait_for_counting(futures) + if args.write_leaf_files and not resume_plan.is_reducing_done(): + for object_pixel, object_key in resume_plan.reduce_keys: + futures.append( + client.submit( + reduce_joins, + soap_args=args, + object_pixel=object_pixel, + object_key=object_key, + ) + ) + + resume_plan.wait_for_reducing(futures) + # All done - write out the metadata with tqdm( total=4, desc=PipelineResumePlan.get_formatted_stage_name("Finishing"), disable=not args.progress_bar ) as step_progress: + if args.write_leaf_files: + parquet_metadata.write_parquet_metadata(args.catalog_path) + total_rows = 0 + metadata_path = paths.get_parquet_metadata_pointer(args.catalog_path) + for row_group in parquet_metadata.read_row_group_fragments(metadata_path): + total_rows += row_group.num_rows + else: + total_rows = combine_partial_results(args.tmp_path, args.catalog_path) # pylint: disable=duplicate-code # Very similar to /index/run_index.py - combine_partial_results(args.tmp_path, args.catalog_path) step_progress.update(1) - catalog_info = args.to_catalog_info(0) + total_rows = int(total_rows) + catalog_info = args.to_catalog_info(total_rows) write_metadata.write_provenance_info( catalog_base_dir=args.catalog_path, dataset_info=catalog_info, diff --git a/tests/hipscat_import/conftest.py b/tests/hipscat_import/conftest.py index 91c1ba6b..00d2072e 100644 --- a/tests/hipscat_import/conftest.py +++ b/tests/hipscat_import/conftest.py @@ -149,6 +149,11 @@ def parquet_shards_dir(test_data_dir): return os.path.join(test_data_dir, "parquet_shards") +@pytest.fixture +def soap_intermediate_dir(test_data_dir): + return os.path.join(test_data_dir, "soap_intermediate") + + @pytest.fixture def parquet_shards_shard_44_0(test_data_dir): return os.path.join( diff --git a/tests/hipscat_import/data/soap_intermediate/0_4.csv b/tests/hipscat_import/data/soap_intermediate/0_4.csv new file mode 100644 index 00000000..d17747cb --- /dev/null +++ b/tests/hipscat_import/data/soap_intermediate/0_4.csv @@ -0,0 +1,2 @@ +Norder,Dir,Npix,join_Norder,join_Dir,join_Npix,num_rows +0,0,11,0,0,4,50 diff --git a/tests/hipscat_import/data/soap_intermediate/1_47.csv b/tests/hipscat_import/data/soap_intermediate/1_47.csv new file mode 100644 index 00000000..2ebf2c2f --- /dev/null +++ b/tests/hipscat_import/data/soap_intermediate/1_47.csv @@ -0,0 +1,2 @@ +Norder,Dir,Npix,join_Norder,join_Dir,join_Npix,num_rows +0,0,11,1,0,47,2395 diff --git a/tests/hipscat_import/data/soap_intermediate/2_176.csv b/tests/hipscat_import/data/soap_intermediate/2_176.csv new file mode 100644 index 00000000..3ebd662c --- /dev/null +++ b/tests/hipscat_import/data/soap_intermediate/2_176.csv @@ -0,0 +1,2 @@ +Norder,Dir,Npix,join_Norder,join_Dir,join_Npix,num_rows +0,0,11,2,0,176,385 diff --git a/tests/hipscat_import/data/soap_intermediate/2_177.csv b/tests/hipscat_import/data/soap_intermediate/2_177.csv new file mode 100644 index 00000000..c9b7e09b --- /dev/null +++ b/tests/hipscat_import/data/soap_intermediate/2_177.csv @@ -0,0 +1,2 @@ +Norder,Dir,Npix,join_Norder,join_Dir,join_Npix,num_rows +0,0,11,2,0,177,1510 diff --git a/tests/hipscat_import/data/soap_intermediate/2_178.csv b/tests/hipscat_import/data/soap_intermediate/2_178.csv new file mode 100644 index 00000000..476fa0a8 --- /dev/null +++ b/tests/hipscat_import/data/soap_intermediate/2_178.csv @@ -0,0 +1,2 @@ +Norder,Dir,Npix,join_Norder,join_Dir,join_Npix,num_rows +0,0,11,2,0,178,1634 diff --git a/tests/hipscat_import/data/soap_intermediate/2_179.csv b/tests/hipscat_import/data/soap_intermediate/2_179.csv new file mode 100644 index 00000000..ea9d9bd0 --- /dev/null +++ b/tests/hipscat_import/data/soap_intermediate/2_179.csv @@ -0,0 +1,2 @@ +Norder,Dir,Npix,join_Norder,join_Dir,join_Npix,num_rows +0,0,11,2,0,179,1773 diff --git a/tests/hipscat_import/data/soap_intermediate/2_180.csv b/tests/hipscat_import/data/soap_intermediate/2_180.csv new file mode 100644 index 00000000..17322b50 --- /dev/null +++ b/tests/hipscat_import/data/soap_intermediate/2_180.csv @@ -0,0 +1,2 @@ +Norder,Dir,Npix,join_Norder,join_Dir,join_Npix,num_rows +0,0,11,2,0,180,655 diff --git a/tests/hipscat_import/data/soap_intermediate/2_181.csv b/tests/hipscat_import/data/soap_intermediate/2_181.csv new file mode 100644 index 00000000..71ea1554 --- /dev/null +++ b/tests/hipscat_import/data/soap_intermediate/2_181.csv @@ -0,0 +1,2 @@ +Norder,Dir,Npix,join_Norder,join_Dir,join_Npix,num_rows +0,0,11,2,0,181,903 diff --git a/tests/hipscat_import/data/soap_intermediate/2_182.csv b/tests/hipscat_import/data/soap_intermediate/2_182.csv new file mode 100644 index 00000000..1a1a3832 --- /dev/null +++ b/tests/hipscat_import/data/soap_intermediate/2_182.csv @@ -0,0 +1,2 @@ +Norder,Dir,Npix,join_Norder,join_Dir,join_Npix,num_rows +0,0,11,2,0,182,1246 diff --git a/tests/hipscat_import/data/soap_intermediate/2_183.csv b/tests/hipscat_import/data/soap_intermediate/2_183.csv new file mode 100644 index 00000000..1a8fadf4 --- /dev/null +++ b/tests/hipscat_import/data/soap_intermediate/2_183.csv @@ -0,0 +1,2 @@ +Norder,Dir,Npix,join_Norder,join_Dir,join_Npix,num_rows +0,0,11,2,0,183,1143 diff --git a/tests/hipscat_import/data/soap_intermediate/2_184.csv b/tests/hipscat_import/data/soap_intermediate/2_184.csv new file mode 100644 index 00000000..26c6b1a4 --- /dev/null +++ b/tests/hipscat_import/data/soap_intermediate/2_184.csv @@ -0,0 +1,2 @@ +Norder,Dir,Npix,join_Norder,join_Dir,join_Npix,num_rows +0,0,11,2,0,184,1390 diff --git a/tests/hipscat_import/data/soap_intermediate/2_185.csv b/tests/hipscat_import/data/soap_intermediate/2_185.csv new file mode 100644 index 00000000..c780cbd6 --- /dev/null +++ b/tests/hipscat_import/data/soap_intermediate/2_185.csv @@ -0,0 +1,2 @@ +Norder,Dir,Npix,join_Norder,join_Dir,join_Npix,num_rows +0,0,11,2,0,185,2942 diff --git a/tests/hipscat_import/data/soap_intermediate/2_186.csv b/tests/hipscat_import/data/soap_intermediate/2_186.csv new file mode 100644 index 00000000..a2932ad5 --- /dev/null +++ b/tests/hipscat_import/data/soap_intermediate/2_186.csv @@ -0,0 +1,2 @@ +Norder,Dir,Npix,join_Norder,join_Dir,join_Npix,num_rows +0,0,11,2,0,186,452 diff --git a/tests/hipscat_import/data/soap_intermediate/2_187.csv b/tests/hipscat_import/data/soap_intermediate/2_187.csv new file mode 100644 index 00000000..4a479d99 --- /dev/null +++ b/tests/hipscat_import/data/soap_intermediate/2_187.csv @@ -0,0 +1,2 @@ +Norder,Dir,Npix,join_Norder,join_Dir,join_Npix,num_rows +0,0,11,2,0,187,683 diff --git a/tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_0_4.parquet b/tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_0_4.parquet new file mode 100644 index 0000000000000000000000000000000000000000..e09937478c9b1c2a81f49a7789a2bccf2adfb431 GIT binary patch literal 6838 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 literal 0 HcmV?d00001 diff --git a/tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_176.parquet b/tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_176.parquet new file mode 100644 index 0000000000000000000000000000000000000000..2dc12f9faf10555a0cf32e00ed19131cfc59523b GIT binary patch literal 10443 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 literal 0 HcmV?d00001 diff --git a/tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_178.parquet b/tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_178.parquet new file mode 100644 index 0000000000000000000000000000000000000000..734d4141e71a7957dfdf4bf1c69f32bf2f2c30a7 GIT binary patch literal 24239 zcmeI)d03R?{`m0^G})kzktK~}#jzslG>JRfHh{u_3?dnfSc)hJ${=otScV&p=qPSD z;)XjeC|W9-8g2*(hFXeRhC41OZiu%1-ZPkK+IKnE`JO+1S6;q`nP<6|&%HeNGdveT zp25uJTHJV`;(CDQ`(oiH(`L(?~X(zi>N-4&E9L0~gtWqlEi6`4C#FB$uPIw|%~rPwQoo^Q#TWnNQ?<%P(dlhIxjx6I{whbs2Tk~NtPP(|sI;+^d%G{GO>57~j1M`mt4ghSrYqZhTJY&zRggSELa%jnP%AdH;-F`p zc*)SP@2ti}5vArxqYs;6Ut-frRhHsVQ#QrD%cgigHtAH!iZSmyI7+@MQ`#U=V-SNX zO@cHgMO_aEcX?9dBGXjKvPPvKI?N{XsL z(fVZvH#w^^D8720z02uagIe?Ek|swS^^TIK@{mQE8igu|!=6{UE8gnB-uap=3D88# zMNNftP`Qhm)1G^U0vzSTLh{sgrjpUmQt}>JN?xW{%0QJ#bQ(uFMgbbC)bfL>Ms8~| z6;oO|Xce1v9JNB_ruf32R~iUu_j*n8a?DYRhGPJOqMgMM2Vo@zY(V+jU9rdEgPDtN(rJ) zp3^ug8ocG;Cfik|ip8EJb55@ocVnWo&sNJ@RIayKNdclIRFxx}G`V8XmrAHUSA1xk zYpN>gqe_!0noKD$s+k=UWtYB!;3P{URlKBee0NojqJgVJ4vn5jTUZ-DTCpXNYMbfH zpHZC-RA&Rd>433Df~bBR+xw~V6r%$ibkajpB`>fcj2isHLBS;JK`i1md9siczvX8q zim==mFO4WdB*(2$l}SvAqfFJPDQda2qW8OHTV$vzlb#SHhltQNvzxS6706fmWCoLk zYBgYMi)Kn=y(JM;c zbkI`tQrSaGohHfl>{v~lzatziXtiWIM-z%@M*`V;gM6TImk%|GGJ|lA;@AoNT$o)h z_4HK|Wo=2S5I`tqJ0~h-Yo&`!HCyDkK1(KPJQT-UIh2WsTt+!-9b`5o{*g#rB$ClY z#Z{$~IVuMrG+HdJ3G*R7qEGW+m;1W5#w&3H|gl&RclX%G2;=*Lp^PmNWQ zoLwWmIA#b%=wGRo*UgFY3GbKC$#<~tV^x-{;@BzrAn_pd8#Fmm)Z9d2E2w1@wcS?f zE;C6ri-3+MGG9^Cf0C1ehPkLJmr?vYXv~u@^;#*{I8wrJ@i97D$EE~Q?ogvi=4x~j zP3aft^GL%YUo$>h(0J!*$hJi9O-;C*V0fmn@0iiTEa}4RA1^1U)sE}}CY=g#q!y8t zX-vmDYO9lz^u@2TD-_?g@{49P=FoBTh#Q%IN8(RVy>BSw(a=l*BkaHIE@%N4rGczWi$s$B6T$)N-#jB++%Ftw$O zA5xK#ocuHiFEv_&>n@da!-Ztsn?ct^lO_?))6v8$2d4cWniR7%h}32+d(Rg z8`FH6%q9o}*q24y-e933H&>-{4=ofvB457M5%r5eTK9lLHO1{-sajDCdr?YiT;z7)VIdZ+y zLf3VZY?}4}&3Az4|AS^KAVg<5{#ypTnnCjdQ(6Oasn}_ha@{EOeG}6potyN2(gaDe zCX?wboN0(bX3mjuW*y;IN*!akv{qT9KKpa^N^z!3c$AprDULg@w{Yz?$r`iTdhw%7 zI;kS!ea!CCgrLo&3GGXAxu}&%hA~s#F}le@8aq>?mBPwIRx@SNlDb}}ZdIJ?OI_O0 z)N9!mNcsV6H`3kvQMV(s==+t)Tq*PDio!J^SDLC^q_K)=k$Plt&LmB^>?Q^ismCWA z-;)*}VHS?55C>v#qtcB@r;NEEPc9InH;7SBdc-TFbDMNlP?rSi+?>w&u|_SQQinq4 zc%^h9Ag}5fPsUQ_cCGj^*3O&5xfYAK&_i0$;*B|B36=j!Wf2z&pGx8It__4O$*3dj214O3>q)?u+Le%@P>Y4x$;=pzGM1VpSi^Eq z?;#6~YEhbV=*o3k0H8n9YI)BrsrK!GLp5Xl1`b;hij*`r=`#G;6W!Oa@ zkE}GwINE!W(b{&btY``qVO^eWz3V8KbyTp5a{b2ppY(a+#s1^QH1bZ9=Zz*wq;E`C zB}-U#nY>J%-xHL^#%LyclT@>EJ=@kPM=3{Wuvav0bcT4=zU4BQT)jE^9JRfpH;5w* z-ik0bq+Q-~&UBEzY_v8+6SE6fcBO2ixGy+YIIw!klF78zPP$NERXq1kWir;RWTm7P zcj`Y~Q%c#ia*8@Gq8@SNc3iJx&F>*Xo%~cT%(?}P-yBKT=P*BbP^V;BoEUFrkLaI7$)t zjEhPss_Zne({mwH)yR5%jW|%D6B+{-_OKrX9mt;o>5CPVrx=G6Ym=4flPX~yZow&ml;I(Gurw!y+z(9HlC^i zDJM1!HI8yvlgE(DqI7Puk6|*1IBX%`0mfVw?uimZ92--MTNuxf7xg?s^NxamjOKjJ;NdgT#OI1q3N+~i&%k&Z@!DGmB zp4mB5B}+-<7I@ArI8rrp2c`0d>LOn=6qlr^_OUc&+BEC*R@43a`}+(Zkkr*|JwX~j*i=E`It zK#WlOT)w_cyhv#VRh&&oVoHQDRUu>b96GUoU`gmSEE7nd>Fw25oDF_TvJc{IjR|D z9>eUimngYWZiS|dNSkDVCX<^oW;F(4Bg(j(rut2NzSm?mCB z4Epf?gep;-==E`ofS-w72*-v|_i|!b$o^fV;bL~<_STWBSq^tdEUg%MgN_Qdlzg;(i?byBnpr8~VxYYtSoFzaM8>!nFw$`rym1NGr7 zZA|i{FcHwiJa^wlKGv+SQ|)=Gkr+f91T zMe;g8;8H1{iG4>@X;N8Y%|k2AjaAY-JBN#*LHsoFl3H0MODIeK5=Uk?ckwYNOS#^_ zVwU?y>K{OFP09|kUH5j7c8$g)b&Y9?=Uc@vol~JQO#ydL;WR>yoYB-ssy<78)azK6 z$5R2W;;KA}qd+y9L>Z<}qj__=c&g*UzaCx3>*1MlK`Fye@ zT2if(d@@yWXXi_*Dn(o)hXQ(MfjrN*3{|fT~@uBaIH|EM!Dw@Q()+^gB3acb7J+@JyFwQ%oH_0*D(RN#;GB8%tSZe3l zM&O)mcezG@UN+Xycip88=lnpRb`qTD^g8CuAP4EEFXM}b3TZ~Co2n0&5yl|7O-CxG zAo1C0a?v^dX|Yh!M8b8Ea4w`XG$PmfnlegYlH1g@J2kehrH81h7~ffPo{}a~;#HOI zgx|tU6V4?d+;&&-3cd5Ql6Ve!5aKEoU&Piu6{TP_ksHI`B5S9o7Z>93nD zTup0aE1hNy@tvZly@|&eVv~zA?dFexw?svV&O61aV8?K|`y_z)_+ZbT3dPJzd|z zlB44R26XZJ?K`+wuvu_F7>q0#MjUaX^yc@ z--`%hG20L5Epmfy7^yE~-ecXwwmj>+HIp}YiR4?VX!+b($yeIc@I8)vl@hces(Y!y zUHZ?*nq($~XjwuI`D|ZKsR}h|EW|xn_mr_L)biDifr%noYAW4jgmbu3dg)EJeq>M8 zhZ!B^Or@5Ek#)|lqUi3jTkp<&OR@x;%UMgtOCOr$x>3p3sp0aZN-2ko(GsrlkloIC z*7abn%rz$4hSv!*-{w%i_eaXas}d( zU8AUJvm%d6Ns#q>_8eLKOtQ+rMByP}#x&ctAcIaijJB$#P~oJtgW60aA4k$JF}o=i z`Z*-iv2-%nY?5y)8J>hIm;=7ZW_3$uP06@|1lJf7xsxhq4i6IVk|3`8+!;{AQyNz5 z8aH{xTBFH&t!$=bKN{VoK0PL#u&gD9Q6$)tp1Pf%_WCStKZ3Y6=1EOSxY*Gv_S3rY z44YBZFpVCZWG#k~Z8$&&_q#S(i)P=g`gE88=}h;IE42ULuiu zZa41zT^I`1`xzzSWv%60pcKcFDwZ{T(ZGg$2K#zv6JP4mCB_=F_|~!Z%b%w!xkJ#n z%g@wpH6y#P*}~nXqwFMT{Yh;h#qML)${=z-M=pn{W;bIw-G{qLVok16l{(yQL*qD+=L+GKk*4X#VJcgjny<56zsXi8SNYDd*Il-sKd zlIyg|8`U7O{0SH3D5Z~fbVEzI!c8}-Zb;r}r`+-<-A$wFM`_16mzCG?C>YfsA#cn} zHRVrfm7^U~v}2p9Pbzh~(GAn{#=3f(bOR6i zb-p&Gh2>=ZXx$j+!+9xfa!;z_O=Fsz(~fUncCtZY!I+n-^TxklbMonAhGsb#V2Xnrb-H zR9$HDX|r?cYS(36GglhUzG)~-4cWMJ=9|ezoPZ*eLHg$I8yN$t^U;CG47WqUK!NJcr5gDc*BWsn2^9_)Q*^ zzH9C|kMr$HCrlo)%zNHN!}<1Qg_9FD?wWTc@%%gG4pS2Iz2{%IoPW2%Z%WePUGuAR z&%akSValiHycgUpJOBRYHHA|~R_|KyYt8u&q;6Vroer7yjVrWD|FqFgyEE&wtMGJ8 zO&jalVPV~F6<+G1w3Ifx7d9AP;q6j)s>!FrqK308I=J~yO%2(-$Z2y$NB7jJlcG8- zc0O9+<54tqa>DM#FWsr|)z+PsmeOHK)5aHcI{#_Y(swU$ZFj*hD0SM5WgV8j+3kYA zp=etA#@$Qb9)6)yc-`ri{0_@n%)Ss1?LR%^@a|=8Heb-kr%s=HuEX;7M=t~>7EPaD zy?golcP?~Jt~(>MPRA^-#utN3{xcRi?aA_Kcd<)a>Wn3>9as2wyBKUKnz5|So)v+^ zFMgO=cV?DP$CbgeFLurHpSdz*&&rU^7eC5Low+)yZo>?x|OD;f4QtVG7oc8ACx4SYhZQ|TBuD+X# zx?LG$**EuGo4uR&55F=vv);T4AKxtpXI~kT)oI?vkiA3g@HYj<^c>BRXrm-%kH*zIak*}nPJ z8~1LzGW_a@@_Gwu@_n~opMCYyicSme9^SjXdh^xKKCha%;OBF`U*A1?b!5%H1;1AB z{rcBCS3j5fnevn_&)&HzSs9RN|9nASo%U6u94BQeUf1oY8&)-1U7T5`ZNZKPNmXN9 z>MvCK>UK8Fs2b}Qu&{1u!A_?wRpZwbm)Vb`ZwikG;yEi4R7x;{O#{!%wzzoOub>oc+fmcAKUSQN75 z`ple3OW*42w=eA2_4M50rEd=_+}Gpo^;voKm${GkD~@o!VJQe$)?!v+aa8*ovr8u} zYqi|3q+i&LjI!coZ8jB_#3kLBQ(k|$$6mkvgEDT+tq54&{z&2ege^DbRZUv{?s>m& zl8)V&UsJsN{o94#jJ$hefvB>yPx+UQcD|XZ)Mt4;UsRgX{^mkQb5@7f{STyu-CU$D z$?|DibYODQ&BZRN6*^!4gVQo@E^*VZ@DD9In7-xaQg`!;fWH2RGLGF`=25aDa9Giy z`FC$F*Q!>#Mtqy;x zQ`t`E>Kv1Pb;R@g%JSP+uS+wp?(=%5qeWrW>n$a#quTB}x<9G}>~-|72P&bM<5^lJvq z+V}mr_O~~en%4|j-sy*nVYj!Gm8?nFwC{&2Nw>c$SFKIl+v&vhjN4oPQK4U(bY$O& z>MggoRhid*dcM<-caPoPUQ@Dm=fU|FQ zzf)w`zdn6a@!7XW+}Ri2prvh*#Ea|qQ|%sjHfQjFp@Vuy-hVddZk3(W@XeQN<&oH;deeqd?VM%)zE9ctSvZ|b?-TYK5< zZY-`}&Y-OJ_nsrF6F6W{pU6SA4-t)YO0jc2Jl)Q9&2+mae@f;5rYyzj50vGJ4lxfF z{~iv?3CjZoQ3S@vBt8(5WQ(0^*{s@khTz-h*Nfm*jfJ10|`~Z$M03&qvy5Muwg1<=M3bdLXI)zChNB|8M)tjCl_f zNNFq3!wt1@uAS@Tx&J~#t^cdiSa+xu)>r;L9G;v750u8CHariv*1`F9t}Ex)7UzM4 z9vd9%vu;bG9(dM`uk(1;joUGMJOKr)H`jIW6s%thI-oALLhT5R4De z6(1o4p)jBu!q6Qb;}i6N_3PVk^g;xBqYokxg}#VJ4En)(+Z+oc;xGX57>Gd_j3F2b z>o3ZOArZr2{e9U8e2UL75}zX(qc9p{Fc#yGg7Gk60#Y#%lVHYVOhFo^Vj8An24*51 zvtYq&WMB^FVjkvW0Wz@=i?A3=uoTO%99dX_l~{$<$i^D1MGn?sJ-)z~*no}Lgj{UK z7JP-R*oN)+8hO}(o!Eul*n@oRMF9#?gncMR3HIX~l;Qvm;t;;YcQ}kAD8o@4!*P6% zA8-Ocq8ul23a4=fXK@baQGpA%h)cMPN?gHJRN)$~;|6Zx7OHU@HMoPj_z6Gb7yOFf zRLX02_~o13-^1UFaCoBwI>HCO(7_M>=!5|15s1zRLKg(%Lv+PQ2tg3=!FRMMju2X3Vjic81zGb#KMR;3_v^vVh{#n2!v25#aOs&N}NxP!a+2|wc({EFXH%9pM^&G^6b^xv0%;^B=B=m;P9 zLI*$iqZ0z4M<6;Q2wf12578ALAq1f?pc}%_9UtQp^gvI9qZcC38+{OoDD*`%V$cu$ z5ep;YFaYrwh(Q>PAsC7T3_~J@BMBq$DL%tUe2!#{!f1@aSd2po#>0dONX0}%j_MsRh*pF{eiUT-^L--co z;V_P%3`cPc$MHRWzzO__a-75|oW>cP#W|cu1uozsF5xmNaRpaVg=@Hu8@P#EsK#y7 z;12HMC;W_G@GE{}{9kyU@qg|4zsEoE@J0u8gb#e7gCG3S2?5X}5S0RH4PoexkMRk5peMr73lZpzK8QpV`XU-J=!gD@g%NQWfOrhVAPmM33`GKlArZro zgc0}@pJ60EM>0lXG{#^o#vujcVZsEYVj?ENjLDdSG)%=bOven&L^@`{g4xKx9L&W$ z%*O&`Vj&h`F_vH{mSH)vumUTw3agQgHCT%rtiyVIfiJNE8?gzw*o-as3R|%a+wnE> zumd}>3%jug`PhpB6ru?GP>d4n$2Ta&0UX33e2edJ7)MZsqd11+_#Qvt1b#$0PT~|! z;|$K?9L}Qx7jO}ma2b`jf~%;)HC)FH+{7(Z<2Gt=2Y2xke#S5O6~8h5Prl6fzwq+k z7V=xxukb?0r zVFFSy5tCrXWK2OCreYeVV+Lj-9kXD;Y-C^#=3*Y^V*xU;5R0%FORyBnupC)fft6T= z)yT#gtVIsiVLiUUm)L-f*o0hc#uj{qt=NX`_!@cGft}ce-PnVC>_q_zQG|UcMhW)g z8jX8!FZT30jZdXNibtFrXUSdF%8o(12d71 zS+HO>GB5{oF%R>x0GU{bMOcg_Sc+v>jx4OeO02?aWMd81A_wcR9$(-~Y`{irLM}FA z3%_I;Eq5y>`!afwE1pDy~N^t-OaR}eyI~>Lll;J3j;W)m> z4>*AzQI3;1h0{2Lvp9$IsK5nW#3futC9dEqs&Eb0aRWDT3)Q%d8r;EM{DhzJ3x36K zjQ<1882?9`{XPDPhc`N)BYfZs9sJ;rP6&V=f#{4NbU`paL|1%-5QM^jZU{qne2h=f z13mdm3*mKYf9ccf-p|KAdG`BGo(RA9&-x40N4K)`?|zc@#NVvJ$uH)^@&XE85@}p8QasnXV2QFn5<8rnI_t~rj56E zEy%Rv8MH?iOMkJ1dfa0(jaRo8b)CVzqa%&I8a3o^M!jbLz#pW#_xb)qaQuBK_TPKZ z>@}x=)z2y$vNE%6wLbFonlqbR?r*X^eD$Yo4?YI{_Q`fqti&-LH)gq`cZ_3=2@f8VohuK&gd(_H`agWBoD zr6(8$u1cqk3+M3G|-s+KhS*86Iyvu<6janBD{WL^kE< zxS_`Q;rDmc{>?kBZqAnnuQPcuZVh>$x9w_0f1V{p_694|5g2%!ynD*-p0pd)3U|m^QqnbUu9%{Ecelze&70U&FX>YZXeC@ zPdguz@xL0%-=D7ii#-1?f_ncE+P}#2|02APn+qN@qcB4M6x;jb?cs^x{^mdT9@{i9 zD6-d(0fTH)MQlvOpk9N9TW5;+;k^b88ZgXS>x9TbgJTB7S+_QC^|t%l&6_fQf6w}X zoh{hcvgv1{uJ0Kf+&Q#;?FvX;^K3Kgzm}dlPfyP-u>R}h>DkKDtFNbzr)OVJ@4mKe zUS1FFA7=A<`D+3)`phBt$X`g z)AfvrXyHFFEHu!)c7OBOKE6KGDLC4%-+;c6!~J6;jDZPZzSPTFCU5_ckdEDkboTad z7ZvhQ*^{ithqfFXbH7~P{t4ZT@v+@n22-ytF^?_#V~*+V>q88Ek{&E0v2zdXSDQve zT*#2#y4VNn7#|VWrA45(pEU+U!YDiEyLY=Eo5Xej-qyDHJ(iv^y<4QLyQ07m^iQK2xD+`@8<2?BMn}$*7{o8yHAI1_hR>GY#%CjXo!2a(BSAk zz8&wkXVizotT7(iEwp)Udi`4`^fm^^_KvaD#n>w}WN?^IyT981*!H&O*||0r^qJWAByy(e~;Z=M^7WTkpS&i$1BgE|2L$&8=~}zyE*IR>t@Q&WY-3Y&V=Sf3Kd8 zmaCVsU3^4ryUr0U{TctY`Tupi`r2asSLM6cuK%MxelOqqZS=^z;q5;#qDAabgL`oN zz5e!}joTmX^=Lo;J+^-w^B*ajt>1ZD=gCLg(a@ZBWNb$Iv>O~|2#byI@fc=k?qO@M z$F=7}WB*^6vkc4)e#XGzVWB?m5iR|!a|Ux*Vtlta|LERv{cUqM^C0j26Z#Cd%@-}g z4E{;ILfZ|s%}xC}x(D?09IF4&pZSkD@BX|R7TY^6Fg~J1D_a`+m{!9A`srh$x_J6q zuWt#~%b>0cmpxAp>$R|>^>b(I9`C`{*GTJ2N83fxcD;-YYTK-t^>W$8&$iK)$o)(4 zy+gUy5syc%f7YaW|9-ypa?QUXzkj}$p7p~1$EBN6Sab2cH}?$|?RBL#ON!Ljnl3+yr}agjWKEAZ9ldRh>SbI1*xp)qdwTYVS5idFkm220 zgjlcVeD?OZS6)v~TS>{(tBW-~((PSaSTebv$Y1o2+V*T0)5{prua8f=_%LgBl#j|% zmEN`Gvu&&GAGWui@4Y8#m-t?T1`drJqUjwUudyvCUG6OyU22z-jpsHI`K$jD@T^D> If2#if0ewvHW&i*H literal 0 HcmV?d00001 diff --git a/tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_179.parquet b/tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_179.parquet new file mode 100644 index 0000000000000000000000000000000000000000..48e0ebb59633e9fd1fa525a5620df227dacfe0fa GIT binary patch literal 25729 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 literal 0 HcmV?d00001 diff --git a/tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_180.parquet b/tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_180.parquet new file mode 100644 index 0000000000000000000000000000000000000000..ad9be736dc142434b82e718717f5f2941ffa4b64 GIT binary patch literal 13370 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 Yqif?>-f3=gQ1ONa4 literal 0 HcmV?d00001 diff --git a/tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_185.parquet b/tests/hipscat_import/data/soap_intermediate/order_0/dir_0/pixel_11/source_2_185.parquet new file mode 100644 index 0000000000000000000000000000000000000000..12ce7a02805543b659b648a8b37381827048e340 GIT binary patch literal 39137 zcmeF(d3cQH-|+vBnCb+hBP7O9QdN!R(m_Nl)zlix#bgl?TkK;QMnptxu|+IHL`1|E zYKbL`h=@>4RW()7AP7}WRW()7*dtVb@A18VzoYka-}mtx&vP8V|Gqtr*Cd&_uJbz2 z&$(XbHD&%Zu#LOMJ+`X*tt$Q9P440*l2=9hxr@A2MNaFqat2@H8+?m%D8Ln5LkaHS zS3JaHyu>T~rPFGvRDElWMqK%;HavCOE={V+oBulh$4_^0-(AK1K$TYRuM~H^do}lJ z4Gr4=_d|m-D{ubu5U>B{T|Npb4|JyVN~!WzoQs^QQYFsCCC;U4oQo#Tg?FmOxx5|c zqK$KLt=c!^=+!Vsl^Ss_HRD`#aW1vuT;7Ru(Z{*ej&pH~bEy;OQa8@UJ~P5t&#O<&*OI&Ji%abqG!P8{p*;_*uHIQy2zK25VYmuA}kldRTnMWn^uMR?Kk zLxjIe{&aEQkxT3;yfgUa$Ewu)-m{8SsiJwikE>R5Er1t$e_nnt@N&ExFK@rcOZ#_u z`R*fLY#n%czaB45-sh!%eOIlt)|oZ+6j!~h(s@ZAou8!Y;$^JPSH|e{njN3GnlxvE zICjQ|yjWWEa=$q*)q{E2>A_2rR=m91mY1G&c^TiAm$$u0_&c3N)3vj!UQ^MXzkbxE z%R8k0yJFDn_jmP_G%mMJm!kQgtE)kVDh8>etB^Qdg+|wpPj$LzsjlT2Ihq9>UA;6mGgscwgO?ctc&X8l7e_BH{f^?L>FTS~ zD;8O$lxr&eTn(C*ZTM8*fKUI{rD?K1p!_B>G?POO?p!iKHA$&1PXbk6jhnZtr$!yf zv7ag;gOp;;&z(r(W0fTS4CL)El~~!Nq|0ZDN%P=S4j$5skBYiDKX1fKRtpXqqO(X1 zU93DHjdf~{^j7ldDkf>GE0?aiaJqs)X6eE;Jxs2l@-cZSS9~Q{5lxSeDe-&c$6Il5 znPTandP+H(QTn!Ox~$NZ%J-a*s@MoqtmKnwSH)kmvyQ7x`g71P#C?gHFMCwI+~iVK ztcQhG-zAwPNYL{}^)u~ru^x86jcm{RLCl}%ma zWxe7r9o16#lKS1NOVI4@?dm1X2;_58OH;z7kWyt?!zG7^Erh#v=mWa2`A#-(UQmht=qIyX+tEc#K zp-xmyfD$b&)My%_fpmOjWk$XP*nOp^&c=`!FN!@!cGF1)Q{c;Lx~#Q2q&LScRt>UO zF-x|Ujzo2raZVFzQd^KO0|@PUU8!bom*(+uj0<&DEpmgx7<8UeU-gx{)(SbO#7Y+u zTg%^hiYFO#$X2yjF3~KyQpp#ol67TyVztIfEu9zV=ZO?}NhdPup%h9Tj*YRKWg{6g zlYtO|(Oij_DOR%-+2f^5F-S`?YNQ}hoO^}FGs0R(b1$LSJH(AZE>&aY1G|II9MYU1 z{y?xdQi*%W=XkDjuAo9}O1_*`{bW~0y1b|4$e$eZG3W2#x`U|n@pgj@DX_@*1agz& zcoVp>{Om#S%%tg=;V-=jTr$`0qYIbOyua2NI2y(g^3{ck{Zi*I2b2;yQahh3%u*bh z0iX7Xe$#d4Duv=pmT%ijqz!SsK)e4@$&+WQNorcd>35-o$ShOI<}*%SpsSD!YmR(M z|2(3WNGsamR>E-9nO!ARcF_(#APc>?Yy_chz_BqICUGz#ETWiS6`15L(%D4yXlP@D z?P(Im@pbJYGj+upFOTLNZ1-YZER@D}Ef=-OaLT3CrO@B?#4caDD8BNP_nn>cA@xv% zPpx|S#U3h4bQbxUreDSdgLToG@7!F|79xKUQ@TfISvS}EnbUAWFDd(rZ3?%VNquy0)w2p0D;jih1oc=xq>rH;Y zU_`k`06eVetPnhTKTRf*-$P28yjB?K2-qVEeT-u#a9)WuMTV2~V_mwutx(7OwBZ6N zALH|h)PEPNmbx#OJT7f13zd6TU&$y)mw3{Opi<^hv|3#Ek?Jqk)jT;!;NMYm7!>qW zmYz8B+ZvoJRK{HF=u~T2oLWeTe5@N+GSo zBD3+mk|K?C#nK?7MEdg6Pc0;Et-MbsYOgcNR?hv1j4EVQXU~yJMz$Ih{)#cyRVLcg zWI&l#JgAfiPM&Ryc9r+(9u3INM2gyjoQ>s!G0rer3#EwK9Y)TdDZP4dOSdZ*7fNVWpuq zCeap@JdQ>cL|xUVLCjXdnF-A@mke~_*euS!q~u9sO1RFNPc`_`SWWbe68VrcqwOU! zuOLSza^7$voUZ!IMhbM5f(22aMC!GiC_J)jMMnf1)AJ8;z0WDw_lm!Cu$PO$>Pbx! zS*unuNY7DVVDMzlB-%qrb5(|yJmH+-Is=1YzBr5}t`bcIuILKMh!-P-K|bNavyJ&$ z`GGoZqIyZyG9e6w@-FqY%FaAV7{695Qk4*1B!qXViw$&(VODuF2lnQ@&g8D2Vv`5t zE`h&S@_Do|t-6e}d(zipWxKURZc&l7=-(676d7HR!reePeKlPUu&!&~^4oZ+pfc=~ ze;qk#PrkcTj`s?*%%m3aQo~t9mP?#!VriK}XV%i1z2xnTd~P@Lq=co?GH=&-d6E$= z1}fmcwI2!0 z03w@1jeV--OE@+9%P;`D(#Me82mI`&Fyt$qQmHGX3zTqKUs`L0R3Xe;Xk2$_ku51?H9HGMKHEzn z_bP={q!(*sy{HQ3SVLtD<*cw4N)^@cX6E)*ie;v%l?$p(78cm#BBNDqLAdOqi{4QT z5=)xfIsZ1*v{%V_(@^e{pSK9?8Up%~#(Q1ym(LiSY7mYpq?JJaYLRarewLHQ*W|gH zG0&Cu;Ke8w&H5%yP7t@2)Y>C5Rns2L0?Jc1sCuTB1j!(d2Z(bwl?!IX$|qcKt=+-$ zBF}mE!3fB(ud`{E223=|F01F8&L2$-*IP|;j-0$SnrkosTNn>3WD+$|m8{Gp1kn_w zfzDqd>3^rG!Nx|<>g2hU(cB?=C7q$EnBgv+&X+GM_}z9=mbI9kbyP7e*&tJi zXeb|KsHOA=hE(!WNCdA~_3|M#bkiD7pNVHtZ6p7lbj)a3Utp4-tXjqn3$=^?c#XbQ(Sre*A+ z;FYBN3Hj=1wa`XWT&0|*^ATfMC!Jn)tML-7#7kSNzceAyX=;MR^Vwp$q9HqH+9T^k=%|pj@iv7hR}$lF$Te9;+r_DW)U?h-zp-ir5u~F)lcs z43D(NYdU%TF4D0qO**T7+)wCPj`_=3Qr*W@zo6+o<@c3FPpy=a;w`e7NjBS%N|G*x zdw^Kksk6vuq?SU=Ty)N5WH>iTIV^rF*ZHtidO!hMn9o2vvu)u z!)SA5Icj4#jTeL6Q^f8|L-pdIXqj(KlS|fUmagRtVCAxuyj-H1%D8-0n!^s7+eQ-c zDd3)}z{0JJAMKg-4AEbfVPRcukjYB8EaR9;vUH8>{6Us2Wcj%@LFQRK$*v!3k3!Z* zvE1?dNq1@}kHOK0aDl1>%fnj2=;tX41-M5+lgo-F zlREPvVBV@jUg-Q7h00}PhCd6vbawDUsc?TXM&YRRXnu-fkl&2yt}KWh++dW@*h3|n z56!AS0}NA)QX#8J^rGs?9IPdCf!D&rC|8(h5w>o?2FYHVTs`E2-V% zI<5R}Eo3*rActszHx(~Amr+VfbKXp9>G+-u0HLCxpPW{0@`*7`OGD3RIP{fBN}kC@ zN70Dp@%I&~YmPOYxvWCA7<1}~-CioyxXNET8{IXZ-c-R|ObJUye^y87blpP9FVM4V1Iuuuvt@5^N8Z>4a!onV#ui zWEkhxA+)bDSlv^?kCg<*M*|BkJ#!(Y(S^%Cot~AUgYcU;HbqX=PIvaxGGl&qCIgdP zCBH3{6ee1|)UaCKEMG@*Tsyl~<`9uf{I0ipNr*LGMv=c7)_mEn#L~VjvLeGFaYXDe zd7RI&gUI7>j`gGc^;Q!kgf?7-_Bew`*C$xzjn9ZpoZ$HrPNmVn|M2qn@E{^(GR{S9|gqn zv6>@otmPU@6OVM>DTtS@R+A>~MQ^l8o z&7WB#pLy0fV&_N&;c3I=oOkyHc9Gh43*#9x4b^*#>YJ+bml61bkiRS_tOF4Q0`pAoVH6 zhsN02;-@odwl-}ZEu*ZZOxWc#fON^A^8X@eKj?}HgctXZv7+$a3Er!2_md;Mcg7iD z0`@WQZ&oZ!o}sdjAiky0I4NCYK0l$DrGe^@N;?(L-<5V2OlpO+<=7&+K^rRW64%_X zmdg}!+Le-SCe2@rTCFTpQs|TA@(#N`h34jdtT)1?sp`erkA;%elm6i+S)6&BGkwY7 zBdW-`4DM==m!GZ0?B2x75W2*7sxRw4PZnMVa-C03!sU$Jmlc^mqk1SyyMJwMw4^DY zAPP5?SZ?2PSmWeN2b$Ue{{Fg*ZLop_mIv%MaPCoE8Z&sBj8R#qTD1%uUJN9mEDb|h z&6Kb!kk0U2!D7z26IDucE|DBYvK!VyqUvDXR4!Y{%LFBd-5@_1$@zK4!Wy)7Eeka* zTRlwQI6{Hg>}Ag-olz%^cFJuBmHnHwg4s7kUfT0n;Q2958|Z6n15xo+m2iew=hjq; zbfSSBr^4T+G3``*MWZVr?NBKuqkA}SEE%&H#g&|~O6DS4s7n_jH?X#WkC)K`q9}tO z$(D2KJk`RuyQY1qd92RzI5vT9RUso3V%EmQ1sju*`()Tz zOL{edZP6Tgk&!OTjA^bivn*PYIn=qH_}S=NgCn)FMoni8Ztt*l&nD4|U0W|@^y zA^m9#eq`$-#+DhxU3M@C;QBc^kmqZJndG|O%fEk8@j^4R~5 zC&gHnBB3;BKY5SZ@~~I1Q_E%~&8-gaH81dGb0&q6&Blo2khcqpWxq~OE(+<&#S%xC z&o(A7B+}L%sioYMM>GA#v;AO@PQ>&UvEI)6hp6^)UA&y9sHGXs?TQllhV1XBO-;`mz*oPS><4>h2RV{+?C1Pt&s*oi6XHB0o_#8!`&HF;Ann#dAv;OYgJE z4AOJUNMYreCa0YDMe$ZI8KKg>`LG|Q(Q&YbjxoWSBO{EVT6rtOAceH1g$3)Y5Xt#@1I^0u#B3`yTdq842FEmQ&LyEWosyYN~7Ln~k6@3RSG8v0@CD z%>^a$x#}g`?Kup(@zPsy&XRs|md~@46xx@TsiT71@Nns0+m8z0n!z@ov7(0TQM59P zYe(CQr6H#VswU~L= z#jeMDCa&@wRo;oJ|C{$*DW*lur_nk$>I|%kEG(&WWT@iYRrQqPG>wlk!WqN3&$63X zkND9CwUS7Q&Z-XSrt_t`4Kmsq&u2W|q^Z0jT{}jT)+dz6pZ7neTAbUhcM09kx*XQk z;q;_Z))RgV*d_97hFQ{ed2BTJbK~q>YsbqrC7yiHM7aKXW1&ubXn)sL8Zt%hW6zUX zRs#jpN}Scg=$-QBcBCq?`Go{NZe(`lI?m@)D>&tEyPjsvl!pKgt-_%FCD-n6)yoS$ zs~{$;)jTF69tzvjm=Z-Sls%p6?<5XE9N&iOo}*eASp8WOiS)4g(^0i7XKiwxEG?j{ zSpG$Tx~! z6Cb#oVYPt00IJ(xWfPE#ZY66ERD)Deqa}~TbcEm#q578Q5pK1;S-ORnj~jaG zaR|EEwPIAXa)fHhpyW--P=@L&uM`XOQMl$(%RV-8z&<&-JWE2Qw2q>TSTPafwv<3m z4sKBz=N`IqmFE0*#wR*IX-N0EPCb83nDsgyU6WvYC0;Y$+ck}i74~DT&MmVNIc&{g zrNpiu8WS$(vy0S#JUe^+_B5$Y8LU*eiOVdemQoaU!|h&-YYFUd6ia};SYA^L+}CTW zHFnKm|0Y(xvTDUl^|WVztDw-%=T$|j^V=lh?C1DVQ_gP>q{*~0cKPUr{kUu;)x1kB zWKi^yd%94{X=4y%6~KGWm9KLSS)`aGk)J&X&?nSZUCs-(ddW-D8pZjabKD|3y@nXn zqV?8S!dZ9w%3Q9wjqCKvaBgrqn_xKebsBB6M2^uizEH~Lq}^Ap7lhNR*?cD50i-{p zjC*#~Bpz0pD>0sJx5!77?KFWHkwJ@~Jbz}e;3ALbXmS1=Yon=(;wyhz{n*SXmLJt< zR@%|hGNXc>n|xNq&bgXz+)%##8F|vc814MBMF}Hp9!nN4akHCcxN2d+!LtQ5MP39L z$Z|TxYeDh+%M#?2)mJ8{JS9*JjIR|W8Ov~>XYud6_sgN1d%bx^z1tRe-*1Xr;T&q!jnibkdq|Iz$hpy(xndihKB<))yV30W)C36HZM zv?b1WloTdEk?B@?cA1&6Fh`D&o7%)bopMj${O(q6aCN?{Ie64#_af(MOc|bx4i$3L z9!sY*&|e5Sf1hyfo#@EXL|Xk+wUkG5&NZ)AhGsaVFCloPR7gicbD9gS;ka^@MO;CS ztfJ9OvGQ_qV1uN0yW={m=>2r}`$uAJ#cE2F6YDt4{d z?0kiUjP+L;hpFv2rBt$Y7V0HOV|MFfBRb*onKeiD7I-l&JGUl0Y3&t~&k1H4P&iG+ zTPbJUN+UvfQpH-rO2AKkv+HF9byt@bI4&cW7U9P@na-FP%6i$4PH&LQr17;Xa-7Vp zBNOZStdg(O>}}{;&YHwaoX?khGZN$^p}%RZc+-WyCIW@lP3p2ZqcLj=dsogivp>zxAZ;?z2z@v? z{8t@LA>3Qgd!)IFHt;>?R?+F%OiZWku?u01XX+x-85W*z zl*(Gpzd_Y|(&wG$I%`9#bFOK9MQ`U3BTZq9v9Oj@$zcDNsO-==xIhY<&!OzZc*>Vn z=TlTq`H+G0E@~>moDK%zK7;n6FJ&Q`QEK%T29ISd;X9(=|VwG?sg(fn?;(M~MVii=Jx2$clq zBfn1M=2x|pjvLLy7b<A;z(Q;UcmZXAkwpE?Cxel5a zjh;MC;Ipsn;UpH$y2!a575ip-e89z=yZz2>TQBloYIp9Wl2v;NX~xPE)%h&WUq0oS zam3&!GI*F4H<`@sB@QpGB@)1A8fs}d$JZ@$cFue<@5#vFC!eatBD9dUz@&{*oq?LV9785K0VVrgTK=Mko-R1mb^ z6qAVRoG}>}h*^-%xwYe*DSc&Afpc=o<58WLv@By=%$}x6>g$?L%g$$JGci2+ve#nZ zmVqbVqIHyqlSu~njkl6AD4CE zGS}|M?36FDsvpa9y?jE<+UX2(z|K;nAeI)+j7Y|M68mL}L;MTah9%DaR<<08%Qk*@ zqY(}wv+WCcNFX zoICSJbgZhm$TP*czm?8CfJMHrhx1(5SLXAXbBtX_*|$?4(OfK?;^a|$=U2`;lCg4% z`4#bfPNwH6d8}$2qHyi0q+_x>cNR;zy^LqYkRZ;lH2s(nF3xXHyiMJDQlLxJ-6geL z)4x%3=Z2n*#i>aum3S(YEeEGcC4J6){iN%^XrIadpyHf#hVqd zp6EFDDDIPi@3`3CYAjQzCmVGljg?p)5-~KAQD+8UTNC)Ah_5T#n4t_`X-wv3*`C4E zO^Riwcs0qju^^rsnKZ^1t^CC?xzQnqW&~ zcy-nueCa^vTtSl?`oM>69OQYk&R=R%?GO7lFO`^#Sm|l?o4i;0jgfLC`eD zlA7$%`tgiDkM^Kt0b!9B{0vj`=n4r8_Rdv%3hS*r8PX<)P;4cZh4jAOgkhXwk%9Ck zhsyQ{zt87qXFAD7)gsNw@?dMaY$bbF`Fp?Wr)kx-c{+FR&YJ?0Y#^Z&n&Edw-|FnG z*%&WqpGxtY)l+?=wmO4oy3C+q)!=C7H(u7!a9h(ZB4~IX{Jc#`+LtjfFlgM*s9?%v zHX?zCO1cD<<%^FouR3!z_n4GsCHW{J(qB@#E0ii)Nn?~176LYUhcH#}{Y6Ub&auO- zJT0(>v-|A)o>v~XA-;0jUMQm!zB;O!#4p476v1D1sGh9Zw5)8{TI4#bsLg{!>afZP zOVu1NU@@$g$j@p#Q>TI1k%xn-ftzJNdY+f;wA;8F&lBetL7cOYtJT5iWsxUk7Kx=g z@2L5*kzU!Jf;k_$bRn+?NT-}@&sF(~tyRzH=gAOnlRd=yKJO2qAG{zh2GakXCNo6g zW{)(SUl@GO`OdA+S)|v`nnN$w(`@5;loreWU>di+4zW;9I{^+Q9u<7HobvTrTh19D zkeenM@iLhbR45FMNYIDI@9z1ZzMdZ){I3rU+KAf!`px0D^?M6LZFU(m0)K=k5b5{+4^*+iQl)g4l^P->NnUSGw{RHd%DiifR=A)$)VQKeyF zl}6=NJoPS3OfF5$F3oH%UI{KO94@U2U0RpBnDkZKnyPx6tNPfg`X*HEYI8-wLt46`Jr?nB%Qsg>Q{0e=A&H zZM3P{SaY@UwrZAyYLgt*rW972T3*eje>=kTcBJ|3DBIi732(zl3u|5|uUV+qT{7v4%(|;KU2%f$hC_F=P+*M`w%(tFL}o zU-P2A)EWq1k~*{y{`Y-x_uAV z?SHZEfQNO>wcYt2O@ag5L#Dfju5}MP>^|(G`-q3`;k7+RxA7Po;4yx>hh?qDq{ALl zE_zIT=wYi}FQQGo$bfoL)9XdAtrv5+-rS4z=0B_#TidXxjbTZEA#S=Meyw4}VZ*A6 zhSd)Z3AO7dwyB>KP(OKk{gk!!QxDhQe6jx4hxOBH8+WuZ?hG*Qo^DKEYutC(c;KS( z;6tOMc7x0|4YC3nWKVC9v$jF*;RYu!HaPXLL0;{Kr`t3<6VUMN^oIFs8=gDd@chMw z7ale&to`n#Ht!Y%ynA)}yTxnYy>a;6n-|}`_3+)2+Kq0vX>=!`(cS5dO4l~Jcev60 zi;W&UY*b#m@uN14p9D01HoftJinWa^4>x{wvGMDNjm6E=rLCtX(6d^Er#8{EdZuU1 zOP;kJdFtKXb8Guv-N5%eBHlA3zGuvQui>Tl8a;Z?)2&I9woRG_Hfa{o#4E8$i_9ji zE;VWWsENt#{kCo2_YQpDC*pnI#P>U8zTf52`&}Qs@8{OETid2R0-N@VXzHKXv~On9 z{+F5#c+}MF_Ca9V4}t?f2#NS0H1UJ5%nycL`e4MP55nD=jc(g)Y+$qT5zQ=#%_e0w zn{uhy)JM&1ZXZUp{V+1{!>EW4qZ2=j$^3Bcr4Q#n`Y_hbYf)RTC4pXX5nl0$UMn)a zR$cO1{m3i9t$AYG=1GCglOvj^BsNdYY`*zY^R17Xr@6J*(YD3Tz!tkBTBIko*q7Pj zz@-)kAGL6}wajeWGApoUc0|jZ#Fn|4El*x*dFoNiJhxV-+qOCr*y?OVtNg@P=Q3NJ zztrl&qgI7(%B8kSQJ``)LMcvEZe%JqFDbVkDJ5>LZ?|oIC$RP1h}NZvt?y;FzJICp zgGa5)-9CEM_M<0(A3clss3P&B%FK^mUHa(tqmQJH$)%l16J)A3!=znjs(!>&^RlVd zW0Ss48@G0C>ISv(n9;_tu8r|Xn}(O$GT=uG zkK3B+v}@b0op(?>pBe3Z*R|_(q+OTG?Ycg0=U2zOTRZO_LEgP)c>AyO?t8?$|7Gt1 zkG;)x+6T649~{&^WJdeYb?w8Bv>$f4{fNiy!|V8rZs#*L$Y=ZvAImzQNk@F9T=tpz z*vD3gN4v-QZ6>B0n`GeQM15v|-Vwjh=k!S+`pg?`}~ zMcrCI>1L|iy{&h5@8Iq}k==chx_8Rz-leE}*C*Zm>h|d7-J?fvk6w{I{F8e0&Fay= zsKa)41&(((3lz;oWyMpP$tKTvq?{Mg1>4 z>0ek^z2vPH1*=yh)#4=eMwWWBNWJw$EvY-;w)cQL!2|9_4k%3;a4&1X{h|R6o(w3j zJMfYBz$d{2pG6L=NE%p~HSkr@z}HU(io4mRy;(EJTy3UVyWU*=sJZ49bFHUly?cOL z`+&NG0z7607}f_Ej|Mcn642;rfTw$4llFm42L(2p8R)e>u*K29R#yUBKMgdw2eoY< ziRUu&po(X``{jff_u#j_Fo^|_h@kcE5QSv2Akan1-2g) zJZMnJ%t4{+2ZbFSH0;Wt5l;t&yN8T!A2N1O$oQEdmh~Z%j)qLR5;FB^h|PU)MEk*! zg9b;<92~uVaLm!cbFU1Z|8#Jyd+4I}p-TpZ#?1_kUmv>SXy~ddp{t*UCb$ntY(FGv z(2(SrLsHfcNj*Ab^OYf6pAJcL58Kf`Z0De`-7~||*N5#p8g}4H*uke^4)>v%?T2O! z8k#+GXwLefxkrbdyfXCE)1i6p!%nv!c4pA9vonX~uOD{q=&fSWvot#J!^5dN#__V{{Xr(M>}}H;WqWl{~sd_UKkuN4I`9+T<~&t z85a^YE;M;uSoXMKSI3QbHZI&_{Ai!?V?)M|j~Z`D9zQ92{FJNXr#>5R^Oz9fGa)i$ zLR8d*=;R48*%RhooiP8|gjf&DA|K0=5KCN?B|h1*BHOa+s%7;vOM=J5M4yRCArq6M zCZ;4$OwFFS`Rc^2&nBjMOxocyX=li!-BFX$lPB%Vo^;^qq=U~UIXot3`b^FWnVcOp zIVX8?ZuaDpS0|r(HaX8@%4we|XF{f&jhd35Jmp;Wl=D}oTzEF6(8GGk$66F(y&7dL zPPX32w%)vIz4gpm;xYBM&(u31Q}0GiElr+!FMI0!t5Y95n_BKM?UB#4Cn3|GMNO+n zo>rMX?bX$3ub)kmdN!91HqBsLwOKap23z%Gwwl*$wVvDb^`^UZm|l1AbdOon4I8E# zk4?1&H0co0bZ|toSrJ|vB3c}aXmu^3_45c*y%}vg%GLWtk`{Bd^onEAtFA?_ejc4rZ+2pb*-3+EC(oLlvSD`W zvDuri&EEQac3Qod9UWqJ4vyJ9D<*wI%)VnW2d>2&d>-SdHz%{hoUFlfvS-c7*)S*f z*qoEs=A3#yC$HYz(;eoX89evwthxCc=AJt?_x!cF7oN{8tT*pchj~SV=UtsOuXw|} z8^`9|yf*LF^LYzO>dn91Vg8-L^Y6}@U%Fxby<_w5Uz`8n`TX*F3m$b?@MQ3UXR{Vm zY*OT z%vsp5cwwW8g`S2*O?($M4PDeMdXZPkq82%eS`{y9U9reySlrfkv3KZVpXkNDDT_Ph zEbdagxNF5?Kf{u4zDs(9F6kA$#6M+8-<&1=i8C2mqq+?3+DsTFZH!?Fn9Ws#xFqN0~Yr!0%fSvI$L z+5C!Sv4;3XzVS;!^<5S{S{5XXVM_m8U9J z<{4I<_FZ)*bk*7DRrx8a&gHB+U%cu<#i~Ms{gSV}DAazHuP&t6Z{*l-7Ta%C*h>tn zZ~Lyk6T13t^y<=-)%S8%-!ESMpkj5oVa+4oHBUmvDZv*B9&j>L+#U znABrPQm@%b{u`6}9#86jJ!!y;By;`sfgRTe4_O~FdwuA}^eX%jEe(H{n zsXK?H?w*~RzA<&*@zev?QxCpKb=2RK*>O|WkWJaMH|1>HlzV*B$?Ka=z1WmjfAi^% zo6ii{e0KKc{EeH>9p8NZ`sNESHW$|4a;f8%q9I$Z&fYS)c;l8E$G6F`xOSe%2}Xvo1G2>stAlpK)im zPCI*q?d%n^(?4}*-`t)3Z|odUxzlXi71(K4aM-Spm|dZ%yTWpJ4ZE>xMCGn<X)*q*4EJ<+LqVsiJ)y|HJ0<(^n$`l3$h zOTyCQV$$PN(^urCuey=Gx-vb%xHqxW-lVX-$uWCVQun6j?%jN2@7Bt_X~um!I_=vT zwr_XLzVy_6`*QakxUuhG?Tcb7s?_na$>8 zdTq*VaU!$T51FlBW||rtY1{dT_s}CgbB_3KI@0OHkuEH6}BUxTb}owIrj&FVEL z%YRc=-xFE=f5;l}GRxfHXkh1~!9$OR%sCpm>1f!Aqr-kUI^yNg@CMnVJ7 zA>`q1{Ks~Xk9cXE9~j=e@=Fb`|Jd)T@=B3rXO@#$m;d;e6sirF7BO~Q#J~O-h4~(F zRhr$6cWHJi-lgIHlFI)-dAYgrA9<x4kqn&G9n!Q^6uMGVossDY3oEQ8*Z7(|$|B)f>n+*NuiaNX2rPa zh)(E?F8CPE@3%O=k?VY@_bIxeJ9?ledZ9P`(Fc9e5B;HH00zR000bfk!5D-P3`QuN zU!n?w^O4Ii495sKzib$eQ5cOe7>jWjj|s3~A|_!nrof7+m6+dSc3$tMIzQA3G0!J4M@R8q+$~` zV+*!o8`7{HJMbBHVi$H}57Mz0`>-Dekb#3Z1P2Zy6GxDRqsYcFk!ifgf-aKjIdCLJ5Ax zZTx~e_!W2Y8%psz?%@yIM;RXAPn6>!9^o;b;3=NrIV$i1m3WC)_zSP`w@&-;1>X>; z^6&27jc{~F5A;MY^oBqBpfCENKU56BK$sDLKm;KegAjtj2*nVDVJL=SI7VP3!Z8Y? zF$QBX4&yNa7EHt>OvV&gF%{Eb!*oPo1|l&NQJ95j%tj36U@qoiJ{BMr3$X}`u>?yI zhh>Pza;(5gtb!e@u?7iPi$ttL64oOb8<2vHNW~^>#ujYFHl$%YcHlGY#4hZ{9;9P0 z_F+E`AOi<+2o4-ZCXOHrN0E(V$iZ>s;sj3ObDY8#$itU7jjwP9U*jykK|a34Iedrn zD8L1Lk3w9;C0s@kuHY)Jp%~Y313%yt!WU?9v0Kp=t;j6n#&V1!}_!Y~xWFdQQ=65$wy(HMiV7>Dtg01GB!5+-8`teA>v zuwgnPFawd8i73oMG-e|Pb1)b4FdqvLi-lN(#aM!+h{H0(V>wn}C04#E zG34Mla&ZDD@i|W63*_NToW@r;gRgNG-yk2~;vBxic@*FRzDFT0;u0>S2v=|w*HDb> zxPc#V6F=e>enJU;#%=t9JNOlM@f%9gIhxPv5|A|L;^gvJaLT~t^5Bj1X`a{J441^g02t*KqF$f_Tj8F_g z7=~gPhGPUqA{?VI8e=dP<1ii*V8KL8!emT=6;m+{HcUqZW*`zX5rtWZ#%#o34(4JW z=3@b3u@H-}7)!7eaae|UEXNA0#46aa8f%b%wMfJ|Bw;<0u>mRAh*WICW^BP$Y(pBh zV+TINPVB;N>_IyAVjuS705Wh8hv2|rWa0?2a1_}%h8!G6E>7SiKF2A1fjoSP)A$N! z@HNij8|33#oWplGj{;o4_b9|gT*74(;R>$e8j5ipH}C^);z!)VPbk69xQ${-*!`+?f9Vd*grif8x;{ zJQ~fgTCm8{!lRh17Su00uh8@3_=J7BNRgrhM^dS;TVCD2*)Ul#u$vnIE=>x zSTGTjFd0)|#Z*j#4bu^U8HmJ8L}3=9F&i&j4jxTZAim*?7(N(iCx%@JxIr1?8AN>Kn4!t5F9v+OdLTLjv^b!kb~pM#R;6m z=QxEgkcTgE8eicIzQ$R6gM568bNCMDQGg5h9)-AwOSp_8T)|abLou%727bUz{D@ol z2_^U$xA6<^;8)zmZz#p@xQ9P*A7yxeKT(c{c!bAzf~RfAsJEPdvJ#2YR9xdcz-m&=>vCA1Vf5Aj}9rAc7E#K?uQMgklK7FciZu93wCi z;TVO{7=y7Ghw+#I3npR`CSwY$n2KqzVLBo(1Cf}CD9l1MW+Mi3Fc6+dSc3$tMIzQA3G0!J4M@R8q+$~`V+*!o8`7{HJMbBHVi$H} z57Mz0`>-Dekb#3Z1P2Zy6GxDRqsYcFk!ifgf-aKjIdCLJ5AxZTx~e_!W2Y8%psz?%@yI zM;RXAPn6>!9^o;b;3=NrIV$i1m3WC)_zSP`H~s(H4)p(v9sb?_iAQ(zKu`2SZ}_7R z`l28DL&X3Lgc$({L=b{82q74ZPz*sBhGH0oV+2Mb9HTHAV=xxuFdh?N!9+~LWK4k- zQ!x!TOh*J}AQCeXg;|KkY{Xy==3*Y^V*z5Z5R0%FORyAiScZ5k#|o^(D%i0aYmk7o zNW?lMVLg(u0V&vsRBXa#Y{6D+LmIYY2R_42?80vBK|1zgANJz_GH?)w;J{&I;s~;E z6xle292`e3PT(Xy$0>Y)Jba1M_zGw6HO}H2 z5-;%zf8jO$rvHEW3H|@uPyXHiiAQ(zKu`2SZ}_7R`l28DL&X3Lgc$({L=b{82q74Z zPz*sBhGH0oV+2Mb9HTHAV=xxuFdh?N!9+~LWK4k-Q!x!TOh*J}AQCeXg;|KkY{Xy= z=3*Y^V*z5Z5R0%FORyAiScZ5k#|o^(D%i0aYmk7oNW?lMVLg(u0V&vsRBXa#Y{6D+ zLmIYY2R_42?80vBK|1zgANJz_GH?)w;J{&I;s~;E6xle292`e3PT(Xy$0>Y)Jba1M z_zGw6HO}H25-;%zf8jO$rvD%BP5=M0_rLo; z@#u~o=!stF4S)1OU-UzNs2G5OFe3ng2tqIhAq0aFiXjNYPz=LxjKD~QV-!YX48~#{ z#$y63n21T3j47~UDyG4P>4?A#L}DhQFbmO`jTp?qT+G9KEI=$4Vi6W&36>%b%Mg#{ zSb>#T1v^$_4HB>xiCBjutVc37AO#zdicQ#zE!c`}NW*sQz-QQrUD%C1NXK66!+sn< z1`gs795{?j96=V2A{)n$gX74>37o{|IE62ehc9s&U*QbC##wxWe0+;@_zve$fD8B@ zg}8`IxQrrP!Bt#CF|OkVe!xxqh+FsxCHNV)@eA(YSKP&KD8=u%hd*#1Wq5!;QI3ar zgvWS-r+9|vsK5(U;w4_;FTBRz5aZ#2|Nj0Tf#`DHQ0z6>ca{0xfAdS|~T=E;p2N-}imAKneWcSF(J_4yCir2S%FwZ0Wt8 z=Y3x3c{QHdf51_24CFxpaG(fya4EP9Tn?TBO5mwL03wh;8OWdls-OlGPzS3(1sc%7 z8Zf{*Xn-bYfi~!XF4zD)unCTXE5H_b8hAQ*26!fT7I-#z4tOrO5fR}=ofos8a;CgTacsY0lcqMohcr`cyUIShWUI$(e-T>YR-UQwZ-U4m} zZv}4yZwEJlcYu@No#0*IW^fC5H#h}u1-F6sfcJv;f%k*k!5!cO;Dg{!@FDPF@DcD) z@GGw_&oRmxEp*CdwBWcM!ym=p4LJBY{OZKN>^jU)!1+~He8JjS7XD~*l;yAT#XG^W5dQhyB}FgG8zoil$ZE-7Dw%Q(L~G;T(~t07 zefJ}M_gudNVjIriXQupWGf5v{-^s9Nc2`rX$(peDJkQ>p`*+NqvnJMMsRelt>)Mw4 z@a)}zdP`Ab|IE_KJ-g4tk3qDQXj|-mJc{P*BC0YmRyM5nFgAj%yfD^fpn)({K^%3) z$TRc6!F}iNJK;Mu6w1MT%n;u7sF|B~`mWsJ+l}Zwfe44-nB9G+C00SA=PdO&qj&a1 zQMOId#J4SSB);v@67g-T5QuO4R6Km!D8b=7`%m@E>HBu!Iq>bCx#6mvkHi1bd0=*z zA?RhHIeX2ck9*CuBCV-yO>cTHp1aiRNHyNe56pSZ7G@TbX~W}QUC?B7(c7wu78ONS z%capW(@?3^Ge|>kTUVsDvg}1`y{#ENyTZ&dq+F9*LRn}DXnx!)>u9d%RnixNjt3XL zTU!HXM!oRbd5R1(;>>8(m`{q{x^ThikzG9G5Si%K0r+K2(rc$er^%73Z8T|W<2daN z%EyegF_T5-{Osa0%@0Z3X~`;_U?votY{x7=lOZBN-w`EZ1HQZAT~QSgM0#nyh_MiYZwJbw4kG|-TR)>?z63RMvsLZe4A zh0zlljkPYBbw_SAl{KA|1{N;xUl8!(`R$t?stlqo-LPi-quNk;~wG5&hYVQkvT46Zr)$nC*zkd`r|b%Cf?WDK%0N(3aPLC>NFzWL!oOgXwj?koBAO z0kxcnV@|nRs=ij0dudhFvK>Bwc@dwY>3lv`Y%NFAkxG8V_f68i5Nay6U(s}@s2OT8 zl*7DMl!?AiXd@-!h+%wl*hj?9pRJo?h!AL;TvMLu;SIv3z2G(Si3!b5k&elXNSCaw}zs#{JnJ-!I@}Z&?J7;W1 z{4V7E#X_!DPQ>i>tQ_f*7`KasfH~f3xFcyfRZ{3&G@+1h^6|*D`ibjJY%ZIzz&#V_ z%K0IG^*o8y!lboET$^GNYnmKc!tR3pn`D2?ae zv_CywRT}GQ{#on#pzd+YuDwQ%yb(>Wi$S%``E!PKzn$H<4c5zfpZ8-sXmeJ4qxW5u z|4%;w_ zdb%d*t2B2b58^!CDfei;2=ZKdQz%5*G&j{_{-rw8&KyZ2{~_nud6icsJ!^=;1v*AX zS?Dg+GfHKJNt6ApL$<->3bs9Fk?e&ra=lDyqD}HClaCnPB0+Q)IQD?-Hs0|KAMVKQdM`u73TyD%DFd&Cbg#jyIhCv2qhLJ@;vs_AX zA;}d}40ljb+!D1Cr4%*Gwx5<+X3NFOw(Biyy`OVt*aYf!f7V~k%l9+qJj-`|&U2n; zFh(7xk}| zQ|2n`A?x8GmozuY1p(s6jl4UlMbiMCAf~vdQ?~`qw7}UZ&Dj-KjB|Iz24@c$B*(N&7%E^ya(yMGEQ!bNwGwNsv7{E!$6PCZH zg&8+7FeCz6ejNq{t2|IVH5A3GJc_X4=EY_pYTfZ!Myq$rbMw#j8qLnhw|PO2DTGF85 zG#dj|SEv^{|G?@<3c39e<8ssoah2r871C2|1r6sU%;o;lIn161AhItkn8&9uqeeoh z1YIBC8=3AgP)e{Mf~}z(t^#q8P%)x3nMcJ{$I;Uh*a;c88(0QUI19S2`&Bkn#g(9LDhC^QL16f)xhG!H(zAC#|HI?kowSZk&W3MPI(Ul=(3Lc8ubJ z=q28jIOrROLEqr}a|Ed#LO+1<$6$021oUFPX-sth27A*czJfNwl&NeA&4p<|Wu43$3R!&OpBE7)YlCh+Qw7i^VLHQDl8_E{r5mHhpucTbQfj&imyb!E# zAwbacv84{PwUpN4zNzF2K2Rr-_sF#ow9)0iUuFxg4zs1?;ON%F2Fp(OO%y%%EQW5-eOCd#Zgv6xK%Sc2X z>NxnX!u?`PBRzRa8)KzNlI1*A!Hy%AQaDpc z*Z36L&0nE~aB41+GM>|ts@juMFpGa-GiVl%RqsBjjXp+)pDo@r-%?3Ga5YrG>gX&4 z+;6F%FWDMuWG`YG*1(SnIttDqBBLQ}3jZ}CSW6GV)RlGL1;5z+)zaI6pwmdLUo)so;`2M=jyPq$B_J78Iu}46crFCL0YOq~|i|E%e*O$Bg@Ah?BS#$W`0F@fKbw zk!_H)+c`8%vNy^lWqs{e!p@;%EhH^wZb+RSn+ItwIZNb06?5ixll1e})m6-$-_zAg zTNbo&-jgnJ-;9fO8|N?VKn?`n-`Sa6_C?-@%ZM2 z%kB-DCvn$oDSmp8cDZ-ri7ks(42jvKU8~u;c-1i7zKnNHY+bTuM9PU`_uy?y*ZO6= zQJGl3tz_M3+tr4(!P}oIA6xis<2&`+mp%L79B1jk36-TAgNyqOO?s*F>CIuKUg6J7 zs9L^tVwtb$-IuCXY>%$cEE*WHV`bH(%DAeemv^k%nNXuY{Y=Qt)zwpLbFRJn^3FAT zlI!M4?+V>jw%5?GeCX7ZyVmZXc79X%y3p!p4rX24XS#HA+6}Ef*;oQbI zs-~XWU4FFS>#L{Nh3(n!!mOrmuU$H|=hYTnf2lOx1C!Tko(ztr}uAv z?b)FDz3z@UQ2F|1?TQB;K69Yz&FwLpBg!KV?s$8rZhz+GGY5BG*ppJf`0k0%?RsZ_ z#+y4HKKoqtr9-xl&Xi9)wEObW!hd~s`Rt)R9~_(0&E=lR+L{mRi~A3I4 zG;u@Z;eDT+E%VEI|CPi0|M^-)@RED@BL}X%SvhIvBj=7B{QN?V;p_(f=yTUE)#iTw z{<))vzWShUzRSIL2=hwu%L8rpi@DkPIR<0Pe(^iCTiFoBmHQN*cEgUb<8FfSK$yEu;)XGPy29u zscN-?iL#jr+XSOjrD#-&X0#FT`@sONI@^)0(t`$+yVLk zSI`&q1O36Bz;RBc0l1a}cQ6p#1w6pr;2v-+E1z|u7!a)R> z2qFOwqChl=0kI$sOahaEu+fhP2|x#gjZqSq3LXLvgGWFzNCBxp4-6m;7(qIi1~PyN zWCGz#U@AgD1d~U;$VN zioqhV7%TxxK?!&YECZ$BX|Nou04u>Nuo|oZWne9M2CM_?K{?m}o&^BxMfSq6$s0O>i9#8}Jf_-2=H~);LWCU^_H4gL>Y02jeK;9YPDyaz6W_rV9? z3iuFQ1s{Qr!6)ET@K4YPu7S_M=im!)9efGC0$+n~z_;LE;0E|N_zrvzn!ru)1NagA z1bzm;fL~e3H#Zq4Cu!fmAAf`+7)$^mAQXfFEeHn@U?PYFJct6(AO^&OI4}uJ22(&h zNB}yJ2$H~5@DO+yJOYwI3P=TdU;t^r2-3kckO52}6J!B1umCH_1~xDqPfk(k?@ECX;%mH)3JTMcDaQq^1{+1>ZcC8(2 z(faq%=H={@>Nu^s zm~5Tx^W1m&le|Z+A;V}%mG#4~?1P=#{DSYeZ#kji7kRWh4nl+7B6szd;FoxNt#B$C zJP=i$Emh(X;g-6#`}JESv}~Sl8Pd9wZPOqa+A%(azc{#ixUc^!{vz?$oMLa!5mfR2 zKR+sN!{JYH`%Z3(+jQ(w+^#c|;xB!2-4-l$!dzEK+)hrplgQmi-out^O-s#{FY7hS z%f4zDvd#GxYp&NAJ=RuZp=eLTJFJ?x8&QS3O&%bIF2Vu&^0Y(|fClhK@(+`i7P zC^@glCUo@5x0(#uX+|&fw&q)GMJ)~XKLiT(7Gqv&T54V@y3g`5TG8EPohFQ(GC7nB z@R~il)tL5Hc(wd7Q4rJ4nD$M#*krQijT+g}qL%751__SN_JLgvC%sx$yN)W`HQh#) z_Mb00>T9jPMOi*P3FzowOZ9L0hjqH6CP!r_YW#dV*JH2$Ek(i)L>)CX*WOlDZGHsm zsPUG@P89#Ip=|!Orwg5bMo?RR)#*a#pAp{9)`Ct}6g;7~#J1&mYrinGRNp###AP7I zn3|WJBQ6zYlRhUkr$|^SY(=R#IoSn**E5Vcxu$HZP^%g_Tsd6jh3B_fb(= zCV6jlTwHX*82c_q-qe4D@bOb?)oOJt5Iz&t>XB;AGH;;!;ae1f@8(X4xY86PCirJ1>UdlSV7z8@xW$~G6c#^H=NmOc zuZ_>sTX|EoNuv)p2d1Z@Z;~z}T^|vL7{Wpk!_b*+ZA9#pQJHobdTV^1L2GX7qfKv(^^FP+7h;f?1luuQnb;DW!obL2 zAvevjRGSRGfhvO~%B=G>XW9KuvLPo~I^W;uW7TBnEpZtJRiM(S)0hQ+g?y(?NOZ)m zV{F^moe-}~Oo+=!3kzwOPtwY5`D3xCdB6^g$8!j-f6xC zozeDKV9uxtjPY&kwZ;pv8rfN{5!YP37CF_n%V9{WF1)MUwX}7Xv$O;uHhfW6^R9h+ z`+3)eEzyQBv%~g|`I>Ci*o=0+yNnAz)9y0H$(6-617p%BTLO#l%sc$- zXjiHw(55#BM(h0|@ci5LcO9>3VywHe&ym;vYK}Yfw&bY8x)B^PUGHno*D2#{j`{Z2 z#;rA99p`y-Y+L*MCANw4E?8J6JLXZRLLTvK8bbqflXOXDeP}>|P8A^LtFwHzd-nf_ zHA{!JA>0yGl#~#v)cb`CYX;V^LR+FWBEw+K64!35gSd{Ekya$G7rsflh?%Jgf%)Rv zlo_Io%v9&|lOnMGVa;n)qhKrS=kd{}mqbuHZh)0L_pCHQ6JYINR zS?Fj0XR8u3a9tUAQMAXR7Im`tAmeWDeb0$hzit45t6 zcAX-WVt?^gJwf;qZH|gWPrJXCTl9%Ww243VL4rQ}d&RC2CQTFM;v4Z43Vx;_4;LZ9 zVp28Y{ztqNn$_wopqZ)ni!Vy_jTheMxDO6+*sE5HmO`l}R*(m|2D`CP(jugb`C-pz zpefZ7pP3dKXiE~*!9F+(R}6Oh#5()@5HHo^$CKRCmYOp?-WySs}s*t|tcs9lR979prEmVIU2d3(UYA7`fx6Fcm4K zsL;sFP*KsO+}2v!E=ykVf}sMEX`-Tn>1L&_wOxLnGlK|%yW9TS{>oSHGc)Ho=Xt)* z_j%59X3mQuRnhMDjD3=QSeX4#d%BNEA=zn518wLME1|2bgs~kk@BtsXX8>9LIdr|+ zlf8%ir1ADGgYE6?2iXrAC6nALl8F^q4<^@s_M&J+l2}d4V4DHKRBUTgY-?L=JD}K> zxnVO-`6bPb7>^E;y)9v5 zhZiDz-agB|a(tK=zS!s1aYL6sVna4I%*zi;C5+x1oALl`hD2kt{yuDkU~I+&Ve^fz zR6>7Z?U<$GrFP8oYD(0-HBSVDnQr zHmb)^(@r*tI$0T0FjFdH)=tOnCm+P_b*zC&c0dDJ6R;~i2Ad;1_OE1X$;jE!HC9bS z@EXgi8Cj@Q!Q7aP(nTE65!Qz~SOZOC>zKbiBy}Yzc09rbGv9;C#-@IBBYMg z#MUwgTv1ZS-K2CjiRn`zYlbV?zXPi9(xo!4AkSr&onP_qps++)@DU7dVCU8;( zxpPVAq!OvMV^XG~UuF1kkgufKteGC*TImw!O3w)jYDU8vPJyv0p+^KCnuD>}$2v0O z9i;|(gRP@Lu7f=I?eq=TMvGWGS}xSnqiF6KM3>6d(fwQ{eae;4Lx?<%t0r64m2x== z1#wBtx1*#eC@mrbM)m_%NertXhF6mt?@B*#W%PG^epRTZEu1T}ajH~J`voP9MCNOG z8OEdlL)$?uTqGSp#xvP^sz6JRv29c?NGJ+pR_u;2eUODIXd#ER#GV2N(v0c z2Bgx+m(Wz+k={a?I~z>iY$M%3NDB~BV`(HgqAy>w5?YR-Y(_&LU|La)l9YTIvM!_V z8YJlNO=kY1(wmfx3LZnc2lCZa-(aT8JkcJ$k!kmrD(OD7a04yJp{5;tBh5pEU-7M^ z!@e`Tfod@vFP1uD(iG6^7=i_S8}n_5)J!?TRXT~97PDnE9HC7^*5>lTbdsy5x49xJ zu5lzugB^vTOQ%YGnEXIwE{Q8(E)SF1(GYZ~xl~QI7||JA1@c@#BN4(INYs~@gLa$` zIu>b}pHUd)LWDB+N-Yf+iZBx}OW2!~hz@T;=c_Px-)FBP)FiUQ;5Ii9MPs^sUsF#v z(4Ftm|93ECB}iT^7mV2)N%4X!twByYQ1>v@aTML%+MuN85reOwzgvdZ02lK0^a@u?2N9$m?RBDDhV?6bxEo<|ZKw1GH7!HN zY|!{dOpSAF5>?~p zdko)5=W%=+%3YDlM}#`&(qnFIv>Q8jqT&5W#Ze6MIJS}23Xb$-4KDbaHZ&SciKUKM zUJ7U#-+^Px=rvwVKO)_ixFk~XL`7&Y0Xl0OiA5%MVHl(s^K!m`9uw?n46-K0s`525 z(e0y=SX{2-b>9^tRcS4Kgbuz@qoDT?&oH#L81bFvkR(n)I-!#0 zqONI}+!`*J=AiT0sDC@R;;gTsz;~G*(4f=4t16Wqf#X$pprSf zlI96@^iD%0?HgGpwe)fUS5JFOD`^Q=iIqcvN@Ntlw=yRlk=A0dZ6x1PB7e-pbLi5O z9F~ikS}Nx-bJ3k3zLs7?lH*m(=Jw2K!fst>M~0$PIi z73e?%8XAROuSb9lIHwd7aWZRWnj@v#Nyio8wz3_`@37o{oN5gC{ufO1g(CDuO^bvQ z+y>0_4l1}-Q%1#XJuaUl%Hz%C#Mv>6!lhWEOB=DqSJHbp;bRO?6{1>=N`~U3;iWRn z)G~@FO`;Fc`j-OX`ZZwnsHT}*9j@6D(h5qNg+R1IJuO4SFL4Tb34{0+&RZ;$ku#3J z53{F+Eup88p6Ljpf-j0Rz$?*pr2R6^wc}-!R$5I0 zva-9h2)9W!rQ(h^%-^kmi4ebNY(vDZf)Blji~U6`1`_llz6L9QjRg6Pq;S;kTUtVT z&OlN`w-!IJr0pxtBW;c`sQD7eDo&WyR>%evBGWYr)T5LXe626m)!FipWp+mQ-ybf6Nc`i`xg zc4e#$z7`Yh2(Z55oAM#nzJ=}e{XRX$S}2p0470v-!1w#Udr{AYLD%#Hy1wEMewrA^ zI%0+=)!9g#E9-2BdbZUKu=98Pgc%-_^vOV(uJV&XqjK6l`GeyU$DI=A@}!+o*Q&~$ zgU9b^+c`wB+i}-W&!(hZtg^jw*FDp&we7mshZ()w&VP9F?qR{s>vrE4=6PoK{gM8o z_Y9ATN#0|x)~(y)FgxeWo(GbajNU8Ll_&2VVW?WSccf{@nY|C1caPpTDyJ!V-$MoM z>-Igo;M$pej}$RZ^^Qx1YwAarIIpjFTH$%NeoUFa(|+gj7|ni{3f=ns@-;bU_m8by z;&i~Zs$6rxt-5OcfpOb*oIUWz?Yo^0j^ELwImp$vuRr+chu6*?oKVM%Ii%P9lK2+E1t7Y~S$dV?SIw_vzy_(7DlvvDY=KBra8rzC*p*8~yA8oR9bqpQSqz zAk$YJ2^^K%ek90osq@ib=assnA+8&%j)snZxBci0#UAHlVV=#pW4!Ww)v@qt*V~Up z_zZMuiuAYFH$?@zY;1}S^E%%&Gcv%XIVNV7zIm2fzp*)XcJBG+xTK{nEo$9LeM`Jy zTG{GGSKaO zc}%SF{7QAomh-D-=XIWcC8^l$LWORX@xrTyOKrPj%C{-xmj>V$bKgt#E*EgW zznCTVL&NNCEkBo;p<>%uBpmEV_E;h&kt-t>$ShmD8RFWt2H3O=CV7);l)Y`&5Bovk znOQo0mi1TtQx3&8@*6(#!#<<#sN#PU$OXUKfei3B_Kc#$Pu}MH%cB@_w{(aFGDh6u zU+;8$6L32UCfsZ+=#h-_0QqHqOBg*W`1i@MJlp7RRKx-q)AdxQcNj&%x5F5cmTAmL z>@zg$gXG@_TB7Mu&%cjG?D8+2BWpr$Mp(-~kiC6TDy&Oa}2wzBf#PsW1(u!(;F`_<#z0!4Lc)00JQhf*}M# zVFrW&58)62kq`yZFcV^67Q{jvs39H_;0c%wbKpr3fAl6nGH5^xI?zK3q=EsAkOt{s z0s%506U;CdvLG9BAQ$o=9}1ul=D~be01M$Mcp8de5j+EnVF@gSVps+x@GLwB%V7nS z!t?L~l);Pe61)uMuo70mD^LNi!fJR8*1+qq7T$nLSO@E21609A*aVxQ8n(bzcoVik z4ZHAHaw35qu1PgF5&GcET>$4SQfO?1OsP4+r2N z9D)Wo44*744R-BTHrXe!e?*-K8KTV3ci5T&<1DVES!UOI1d-#B6L6}T!Js* zGF*Yb!&h(>zJ_n$Tet?-;RgHzZo+r)J^T}XfFI!}_?eY_{T*XtBOUhp<&SjufjV zFhUxng9!x4fJ`vMT*!iK$bnqQgM27}LYN2hVF4_Jr{HNQf<^EQEQTep6pCRPl)$s_ z94v&ybasoPw)=>8Fs+C@E-gHYTO1OjA0CYWI^WI;CMKrZA#J`_M9%!B!`02abi@H7;`B6tQC!xC5u z#jp%Y;8}PMmct4th3DY~D1#T_C3qRiVI{1BSD*r3h1KvHtbx~IExZAhunyM42B?CK zun9IpH7l96rR&$i)~?rn9|_$mlu4}Lpozp^lzsQ2^!G|L(p{(j(&*ycsDLD^b^ zUP!jT4}V_aV%y_SH@ZG|KbpdyVxYY136P6J*tYv6_!A84Uh#2^%Sh~U?A~R0HgdpilP|4PrBvklj9kH7*j-@#6EJbVpwCIxCFdmL@cB;q3>3dGs&}WMBTf41SEEJ;dsQ=)k&xB<*sj&y^4OtCan){ z`?hy`{~e9xq9@9}{p;TSulk3Dx^GKeJNs#7qDTMjSoi;{hQvqXeOtP<_g8JI$K&t5 zE#6VsPs9IhDsMgKzDt|`i==ix&%R5W|BLkYw-)rXqTmX>Be&hxTknOTd-t8Q$FdA$ z>63FZvn)%6$*9Rn&MFjF3Ugs{R#s-d*y}ufR<!z=z+3{ zP76skR23Z^5jVy9HAi;y{t4p0iK<|gN)-j-zZoi(r^+`~6{u3Bs{B$d`+R+SmFJ5) z1G>utqHwJE8UHM`Sjt0Gs(cmB!>gqdyxuw}9`Ahfn-CQ1 zsrCrZ(*(!nXfk+Xgwa4E~$ zr)Wb+T4t)gFw~?G!t)Y>&@VA2ztGs&fcTsUzfkX#*j};E6OWIZm~HHi%P%x9UND>D zCq|=RQO15_@8=k8P#|&`IIm}n$ekiQ&02>hBQ{4HZ0gxZvnC_TBit`U%t1~9V#oQ4 z`0m^kc!&9kV{eRJC@?zmV*d|b3a7ZlJvo+&f)#T@6x$GKbUOZUpt3ehI5(b5+oIW9Ik zA<+A7<^7Jg*k*(^7nn2d`TE!%@n*z|x$^99tdZAjO)$nZxYrm4B&$R2Hg?@*{f(I} zPRtEoc(-}iyS(?jyGtw)+8|R`?0v^8Cd1dPxAyz4dEw_-`_j)Gau@T~UH+epm0-@p zIVmxMcOkC%u7387D_QV1YfRn|nu(#f{;lobJzuGoT;DCeu5ta3=6F}T-DA{e-S7*Y ztMM@9suj`ZuKD)c=I!=)^_}Opa(nxj-y}B6yz>*+$-d*LcE>p4+SCVnXD6r=OqxJt zzS>=B8L$4vv)8r%U#wYbtPLSTcws_Zph7b-L|iklh839OGeQm8jC9M|jdc+3L-TZn zmi59TK^;0TInF!RvNoj!D8kZIx%|vftbbVZy4TeNlQtvVtnu)))WI7)^TX13V@i}N zRJ_0CiMPSvDBSi`O7UJ8AbySzOZ>9MtzO&&SZ>b*dv literal 0 HcmV?d00001 diff --git a/tests/hipscat_import/soap/test_run_soap.py b/tests/hipscat_import/soap/test_run_soap.py index 4f2e4220..28dfa15e 100644 --- a/tests/hipscat_import/soap/test_run_soap.py +++ b/tests/hipscat_import/soap/test_run_soap.py @@ -3,6 +3,7 @@ from hipscat.catalog.association_catalog.association_catalog import AssociationCatalog import hipscat_import.soap.run_soap as runner +from hipscat_import.soap.arguments import SoapArguments def test_empty_args(): @@ -13,7 +14,7 @@ def test_empty_args(): def test_bad_args(): """Runner should fail with mis-typed arguments""" - args = {"output_artifact_name": "bad_arg_type"} + args = {"output_catalog_name": "bad_arg_type"} with pytest.raises(TypeError): runner.run(args, None) @@ -28,3 +29,31 @@ def test_object_to_source(dask_client, small_sky_soap_args): assert catalog.on_disk assert catalog.catalog_path == small_sky_soap_args.catalog_path assert len(catalog.get_join_pixels()) == 14 + assert catalog.catalog_info.total_rows == 17161 + + +@pytest.mark.dask +def test_object_to_source_with_leaves( + dask_client, tmp_path, small_sky_object_catalog, small_sky_source_catalog +): + """Test creating association between object and source catalogs.""" + small_sky_soap_args = SoapArguments( + object_catalog_dir=small_sky_object_catalog, + object_id_column="id", + source_catalog_dir=small_sky_source_catalog, + source_object_id_column="object_id", + output_path=tmp_path, + overwrite=True, + progress_bar=False, + write_leaf_files=True, + source_id_column="source_id", + output_artifact_name="small_sky_object_to_source", + ) + runner.run(small_sky_soap_args, dask_client) + + ## Check that the association data can be parsed as a valid association catalog. + catalog = AssociationCatalog.read_from_hipscat(small_sky_soap_args.catalog_path) + assert catalog.on_disk + assert catalog.catalog_path == small_sky_soap_args.catalog_path + assert len(catalog.get_join_pixels()) == 14 + assert catalog.catalog_info.total_rows == 17161 diff --git a/tests/hipscat_import/soap/test_soap_map_reduce.py b/tests/hipscat_import/soap/test_soap_map_reduce.py index 6c4cfcf9..8e2c3bf4 100644 --- a/tests/hipscat_import/soap/test_soap_map_reduce.py +++ b/tests/hipscat_import/soap/test_soap_map_reduce.py @@ -1,26 +1,51 @@ """Test components of SOAP""" import os +import shutil import numpy.testing as npt import pandas as pd +import pyarrow.parquet as pq import pytest from hipscat.pixel_math.healpix_pixel import HealpixPixel from hipscat_import.soap.arguments import SoapArguments -from hipscat_import.soap.map_reduce import combine_partial_results, count_joins +from hipscat_import.soap.map_reduce import combine_partial_results, count_joins, reduce_joins def test_count_joins(small_sky_soap_args, tmp_path, small_sky_soap_maps): """Test counting association between object and source catalogs.""" for source, objects in small_sky_soap_maps.items(): - count_joins(small_sky_soap_args, source, objects, tmp_path) + count_joins(small_sky_soap_args, source, objects) - result = pd.read_csv(os.path.join(tmp_path, f"{source.order}_{source.pixel}.csv")) + result = pd.read_csv( + os.path.join( + tmp_path, "small_sky_association", "intermediate", f"{source.order}_{source.pixel}.csv" + ) + ) assert len(result) == 1 assert result["num_rows"].sum() > 0 +def test_count_joins_with_leaf(small_sky_soap_args, small_sky_soap_maps): + """Test counting association between object and source catalogs.""" + small_sky_soap_args.write_leaf_files = True + small_sky_soap_args.source_id_column = "source_id" + + intermediate_dir = small_sky_soap_args.tmp_path + for source, objects in small_sky_soap_maps.items(): + count_joins(small_sky_soap_args, source, objects) + + result = pd.read_csv(os.path.join(intermediate_dir, f"{source.order}_{source.pixel}.csv")) + assert len(result) == 1 + assert result["num_rows"].sum() > 0 + + parquet_file_name = os.path.join( + intermediate_dir, "order_0", "dir_0", "pixel_11", f"source_{source.order}_{source.pixel}.parquet" + ) + assert os.path.exists(parquet_file_name), f"file not found [{parquet_file_name}]" + + def test_count_joins_missing(small_sky_source_catalog, tmp_path): """Test association between source catalog and itself, where sources are missing from either left or right side of the merge.""" @@ -38,13 +63,15 @@ def test_count_joins_missing(small_sky_source_catalog, tmp_path): ## Pixels don't exist on either side of join. source = HealpixPixel(0, 6) with pytest.raises(FileNotFoundError): - count_joins(args, source, [], tmp_path) + count_joins(args, source, []) ## Pixels are totally non-overlapping source = HealpixPixel(2, 176) - count_joins(args, source, [HealpixPixel(2, 177), HealpixPixel(2, 178)], tmp_path) + count_joins(args, source, [HealpixPixel(2, 177), HealpixPixel(2, 178)]) - result_csv = os.path.join(tmp_path, f"{source.order}_{source.pixel}.csv") + result_csv = os.path.join( + tmp_path, "small_sky_association", "intermediate", f"{source.order}_{source.pixel}.csv" + ) result = pd.read_csv(result_csv) assert len(result) == 3 @@ -54,7 +81,7 @@ def test_count_joins_missing(small_sky_source_catalog, tmp_path): ## We send more pixels to match than we need - not all are returned in results source = HealpixPixel(2, 176) - count_joins(args, source, [HealpixPixel(2, 176), HealpixPixel(2, 177), HealpixPixel(2, 178)], tmp_path) + count_joins(args, source, [HealpixPixel(2, 176), HealpixPixel(2, 177), HealpixPixel(2, 178)]) result = pd.read_csv(result_csv) assert len(result) == 1 @@ -89,10 +116,46 @@ def test_combine_results(tmp_path): partitions_csv_file = os.path.join(input_path, "0_11.csv") join_info.to_csv(partitions_csv_file, index=False) - combine_partial_results(input_path, output_path) + total_num_rows = combine_partial_results(input_path, output_path) + assert total_num_rows == 131 result = pd.read_csv(os.path.join(output_path, "partition_join_info.csv")) assert len(result) == 2 result = pd.read_csv(os.path.join(output_path, "unmatched_sources.csv")) assert len(result) == 1 + + +def test_reduce_joins(small_sky_soap_args, soap_intermediate_dir, small_sky_soap_maps): + """Use some previously-computed intermediate files to reduce the joined + leaf parquet files into a single parquet file.""" + temp_path = os.path.join(small_sky_soap_args.tmp_path, "resume", "intermediate") + shutil.copytree( + soap_intermediate_dir, + temp_path, + ) + os.makedirs(os.path.join(temp_path, "reducing")) + small_sky_soap_args.tmp_path = temp_path + + reduce_joins(small_sky_soap_args, HealpixPixel(0, 11), object_key="0_11") + + parquet_file_name = os.path.join(small_sky_soap_args.catalog_path, "Norder=0", "Dir=0", "Npix=11.parquet") + assert os.path.exists(parquet_file_name), f"file not found [{parquet_file_name}]" + + parquet_file = pq.ParquetFile(parquet_file_name) + assert parquet_file.metadata.num_row_groups == 14 + assert parquet_file.metadata.num_rows == 17161 + assert parquet_file.metadata.num_columns == 9 + join_order_column = parquet_file.metadata.num_columns - 4 + join_pix_column = parquet_file.metadata.num_columns - 2 + + ## Check that the row groups inside the parquet file are ordered "breadth-first". + ## Fetch the list of healpix pixels using the parquet metadata. + ordered_pixels = [ + HealpixPixel( + parquet_file.metadata.row_group(row_index).column(join_order_column).statistics.min, + parquet_file.metadata.row_group(row_index).column(join_pix_column).statistics.min, + ) + for row_index in range(14) + ] + assert ordered_pixels == list(small_sky_soap_maps.keys()) diff --git a/tests/hipscat_import/soap/test_soap_resume_plan.py b/tests/hipscat_import/soap/test_soap_resume_plan.py index 689e27ff..29e56e58 100644 --- a/tests/hipscat_import/soap/test_soap_resume_plan.py +++ b/tests/hipscat_import/soap/test_soap_resume_plan.py @@ -147,8 +147,8 @@ def never_fails(): @pytest.mark.dask -def test_some_reduce_task_failures(small_sky_soap_args, dask_client): - """Test that we only consider reduce stage successful if all done files are written""" +def test_some_counting_task_failures(small_sky_soap_args, dask_client): + """Test that we only consider counting stage successful if all done files are written""" plan = SoapPlan(small_sky_soap_args) ## Method doesn't FAIL, but it doesn't write out the intermediate results file either. @@ -168,3 +168,21 @@ def test_some_reduce_task_failures(small_sky_soap_args, dask_client): ## Method succeeds, and done file is present. futures = [dask_client.submit(never_fails)] plan.wait_for_counting(futures) + + +@pytest.mark.dask +def test_some_reducing_task_failures(small_sky_soap_args, dask_client): + """Test that we only consider reducing stage successful if all done files are written""" + plan = SoapPlan(small_sky_soap_args) + + ## Method doesn't FAIL, but it doesn't write out the intermediate results file either. + futures = [dask_client.submit(never_fails)] + with pytest.raises(RuntimeError, match="1 reducing stages"): + plan.wait_for_reducing(futures) + + ## Write ALL the intermediate results files. Waiting for results will succeed. + Path(small_sky_soap_args.tmp_path, "reducing", "0_11_done").touch() + + ## Method succeeds, and done file is present. + futures = [dask_client.submit(never_fails)] + plan.wait_for_reducing(futures)