{
"cells": [
{
"cell_type": "markdown",
"id": "cb3afcaa",
"metadata": {},
"source": [
"[](https://colab.research.google.com/github/casangi/graphviper/blob/main/docs/graph_building_tutorial.ipynb)"
]
},
{
"cell_type": "markdown",
"id": "ed122f09-ead5-4a22-a70b-7702d556e7fe",
"metadata": {},
"source": [
"# GraphVIPER Tutorial\n",
"\n",
"This tutorial provides examples of how `GraphVIPER` can be used to build [Dask](https://www.dask.org/) graphs by mapping a dictionary-based container of [xarray.Datasets](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.html) to [Dask](https://www.dask.org/) graph nodes, followed by a reduction step. The dictionary of [xarray.Datasets](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.html) used in this tutorial is referred to as a [Processing Set](https://github.com/casangi/xradio/blob/main/src/xradio/vis/_processing_set.py), although any dictionary containing [xarray.Datasets](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.html) can be used. Using the `GraphVIPER` [map](https://graphviper.readthedocs.io/en/latest/_api/autoapi/graphviper/graph_tools/map/index.html#module-contents) and [reduce](https://graphviper.readthedocs.io/en/latest/_api/autoapi/graphviper/graph_tools/reduce/index.html#module-contents) functions can be thought of as a generalization of [xarray.map_blocks](https://docs.xarray.dev/en/stable/generated/xarray.map_blocks.html) that can be applied to more than one [xarray.Dataset](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.html). Both [map](https://graphviper.readthedocs.io/en/latest/_api/autoapi/graphviper/graph_tools/map/index.html#module-contents) and [reduce](https://graphviper.readthedocs.io/en/latest/_api/autoapi/graphviper/graph_tools/reduce/index.html#module-contents) build [Dask](https://www.dask.org/) graphs using [dask.delayed](https://docs.dask.org/en/stable/delayed.html).\n",
"\n",
"The following types of mapping are supported:\n",
"\n",
"- Partitions defined by any combination of the coordinates in the [Processing Set](https://github.com/casangi/xradio/blob/main/src/xradio/vis/_processing_set.py).\n",
"- More than one [xarray.Dataset](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.html) can be assigned to a single mapping node.\n",
"- [xarray.Dataset](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.html) partitions assigned to different nodes can have coordinates that overlap.\n",
"\n",
"The tutorial will cover the following examples:\n",
"\n",
"- Frequency Map Reduce: This example explains the concepts of `parallel_coords` and `node_task_data_mapping` that define parallelism.\n",
"- Overlapping Frequency Map Reduce.\n",
"- Baseline and Frequency Map Reduce.\n",
"- Time Map Reduce.\n",
"\n",
"`GraphVIPER` provides improvements over the [CNGI prototype](https://cngi-prototype.readthedocs.io/en/stable/development.html):\n",
"\n",
"- There is a clear separation between the concurrency layer ([GraphVIPER](https://graphviper.readthedocs.io/en/latest/)) and the domain layer (science code, [AstroVIPER](https://github.com/casangi/astroviper)).\n",
"- The memory backpressure issue was solved by incorporating the loading of data into the compute nodes. An example of the memory backpressure issue is cube imaging where large in-memory image cubes have to be created, which [Dask](https://www.dask.org/) is not aware of, causing [Dask](https://www.dask.org/) to be overeager in loading data from disk into memory. In the future, [Dask](https://www.dask.org/) might provide an alternative solution where graph nodes can be annotated with expected memory usage.\n",
"- The number of graph nodes has been minimized; this was also solved by incorporating the loading of data into the compute nodes. When [Xarray](https://docs.xarray.dev/) backed [Dask](https://www.dask.org/) datasets are used, a node is created for each data variable, and since Radio Astronomy datasets have numerous data variables, it led to a bloated graph that impacted scaling performance.\n",
"- Multiple [xarray.Datasets](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.html) can be processed together with overlap. This cannot be done with the current [Xarray](https://docs.xarray.dev/) functionality, such as [xarray.map_blocks](https://docs.xarray.dev/en/stable/generated/xarray.map_blocks.html).\n",
"- Using a [Dask plugin](https://distributed.dask.org/en/latest/plugins.html), the [Dask Scheduler](https://docs.dask.org/en/stable/scheduler-overview.html) has been modified so that data can be cached to a local disk when multiple passes over larger-than-memory data have to be done. This reduces clustered file system or binary object store access (see [GraphVIPER Client](https://graphviper.readthedocs.io/en/latest/_api/autoapi/graphviper/dask/client/index.html)).\n"
]
},
{
"cell_type": "markdown",
"id": "ffbf2b16",
"metadata": {},
"source": [
"## Install GraphVIPER"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "937bd155",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"GraphVIPER version 0.0.39 already installed.\n"
]
}
],
"source": [
"import os\n",
"import dask\n",
"import toolviper\n",
"\n",
"import numpy as np\n",
"\n",
"from importlib.metadata import version\n",
"\n",
"try:\n",
" import graphviper\n",
"\n",
" print(\"GraphVIPER version\", version(\"graphviper\"), \"already installed.\")\n",
"except ImportError as e:\n",
" print(e)\n",
" print(\"Installing GraphVIPER\")\n",
"\n",
" os.system(\"pip install graphviper\")\n",
"\n",
" import graphviper\n",
"\n",
" print(\"GraphVIPER version\", version(\"graphviper\"), \" installed.\")"
]
},
{
"cell_type": "markdown",
"id": "2682bb1c-c377-47f2-9faa-271108954d8f",
"metadata": {},
"source": [
"## Setup Dask Cluster\n",
"To simplify things we are going to start of by just using a single process (everything will run in serial)."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "f4e50179-3486-4454-9036-ff55d24346fc",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[\u001b[38;2;128;05;128m2026-04-06 15:38:38,938\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m client: \u001b[0m It is recommended that the local cache directory be set using the \u001b[38;2;50;50;205mdask_local_dir\u001b[0m parameter. \n",
"[\u001b[38;2;128;05;128m2026-04-06 15:38:38,938\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m client: \u001b[0m Running client in synchronous mode. \n"
]
}
],
"source": [
"# Code to start a Dask cluster with two workers and 1 thread each.\n",
"from toolviper.dask.client import local_client\n",
"\n",
"# viper_client = local_client(cores=2, memory_limit=\"4GB\",autorestrictor=True)\n",
"viper_client = local_client(serial_execution=True)\n",
"viper_client"
]
},
{
"cell_type": "markdown",
"id": "e0aa8d3c-6fd9-474f-9223-6da8856ab948",
"metadata": {},
"source": [
"## Download and Convert Dataset"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "d4f2b674-78e3-4dbb-9079-2b46825e1f3a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[\u001b[38;2;128;05;128m2026-04-06 15:38:38,947\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m client: \u001b[0m Initializing download... \n",
"[\u001b[38;2;128;05;128m2026-04-06 15:38:38,948\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m client: \u001b[0m File already exists: /Users/jsteeb/Dropbox/viper_dev/graphviper/docs/Antennae_North.cal.lsrk.split.ms \n",
"[\u001b[38;2;128;05;128m2026-04-06 15:38:39,446\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m client: \u001b[0m Updated partition scheme used: ['DATA_DESC_ID', 'OBS_MODE', 'OBSERVATION_ID'] \n",
"[\u001b[38;2;128;05;128m2026-04-06 15:38:39,453\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m client: \u001b[0m Number of partitions: 4 \n",
"[\u001b[38;2;128;05;128m2026-04-06 15:38:39,453\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m client: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [23, 24, 25, 30, 31, 32, 33, 34, 37], FIELD [0, 1, 2], SCAN [9, 17, 21, 25], EPHEMERIS [None] \n",
"[\u001b[38;2;128;05;128m2026-04-06 15:38:39,803\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m client: \u001b[0m OBSERVATION_ID [1], DDI [0], STATE [23, 24, 25, 30, 31, 32, 33, 34, 37], FIELD [0, 1, 2], SCAN [26, 34, 38, 42], EPHEMERIS [None] \n",
"[\u001b[38;2;128;05;128m2026-04-06 15:38:40,021\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m client: \u001b[0m OBSERVATION_ID [2], DDI [0], STATE [32, 33, 34], FIELD [0, 1, 2], SCAN [43], EPHEMERIS [None] \n",
"[\u001b[38;2;128;05;128m2026-04-06 15:38:40,298\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m client: \u001b[0m OBSERVATION_ID [3], DDI [0], STATE [39, 40, 41, 46, 47, 48, 49, 50, 53], FIELD [0, 1, 2], SCAN [48, 56, 60, 64], EPHEMERIS [None] \n"
]
}
],
"source": [
"toolviper.utils.data.download(file=\"Antennae_North.cal.lsrk.split.ms\")\n",
"\n",
"from xradio.measurement_set.convert_msv2_to_processing_set import convert_msv2_to_processing_set\n",
"\n",
"# The chunksize on disk. Chunksize can be specified for any of the following dimensions :\n",
"# time, baseline_id (interferometer) / antenna_id (single dish), frequency, and polarization.\n",
"chunks_on_disk = {\"frequency\": 3}\n",
"infile = \"Antennae_North.cal.lsrk.split.ms\"\n",
"outfile = \"Antennae_North.cal.lsrk.split.ps.zarr\"\n",
"convert_msv2_to_processing_set(\n",
" in_file=infile,\n",
" out_file=outfile,\n",
" parallel_mode=\"none\",\n",
" persistence_mode=\"w\",\n",
" main_chunksize=chunks_on_disk,\n",
")"
]
},
{
"cell_type": "markdown",
"id": "33a13d40-5654-4011-9467-d269fe601826",
"metadata": {},
"source": [
"## Inspect the Processing Set\n",
"\n",
"The [open_processing_set](https://github.com/casangi/xradio/blob/main/src/xradio/measurement_set/open_processing_set.py) is a lazy function, so no data is loaded into memory; only metadata is loaded (the [load_processing_set](https://github.com/casangi/xradio/blob/main/src/xradio/measurement_set/load_processing_set.py) will load everything into memory). Metadata is defined as everything that is not an [xarray.DataArray](https://docs.xarray.dev/en/stable/generated/xarray.DataArray.html). Note that a [Processing Set](https://github.com/casangi/xradio/blob/main/src/xradio/measurement_set/processing_set.py) does not have to be used with `GraphVIPER`, and any dictionary of [xarray.Datasets](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.html) can be used."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "774b2011-8921-48fb-90dc-f56689862110",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" name \n",
" scan_intents \n",
" shape \n",
" execution_block_UID \n",
" polarization \n",
" scan_name \n",
" spw_name \n",
" spw_intents \n",
" field_name \n",
" source_name \n",
" line_name \n",
" field_coords \n",
" session_reference_UID \n",
" scheduling_block_UID \n",
" project_UID \n",
" start_frequency \n",
" end_frequency \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Antennae_North.cal.lsrk.split_0 \n",
" [OBSERVE_TARGET#ON_SOURCE] \n",
" (50, 45, 8, 2) \n",
" uid://A002/X1ff7b0/Xb \n",
" [XX, YY] \n",
" [17, 21, 25, 9] \n",
" spw_0 \n",
" [UNSPECIFIED] \n",
" [NGC4038 - Antennae North_0, NGC4038 - Antennae North_1, NGC4038 - Antennae North_2] \n",
" [NGC4038 - Antennae North_0] \n",
" [] \n",
" Multi-Phase-Center \n",
" --- \n",
" uid://A002/X1fd4e7/X64d \n",
" T.B.D. \n",
" 3.439281e+11 \n",
" 3.440067e+11 \n",
" \n",
" \n",
" 1 \n",
" Antennae_North.cal.lsrk.split_1 \n",
" [OBSERVE_TARGET#ON_SOURCE] \n",
" (50, 55, 8, 2) \n",
" uid://A002/X207fe4/X3a \n",
" [XX, YY] \n",
" [26, 34, 38, 42] \n",
" spw_0 \n",
" [UNSPECIFIED] \n",
" [NGC4038 - Antennae North_0, NGC4038 - Antennae North_1, NGC4038 - Antennae North_2] \n",
" [NGC4038 - Antennae North_0] \n",
" [] \n",
" Multi-Phase-Center \n",
" --- \n",
" uid://A002/X1fd4e7/X64d \n",
" T.B.D. \n",
" 3.439281e+11 \n",
" 3.440067e+11 \n",
" \n",
" \n",
" 2 \n",
" Antennae_North.cal.lsrk.split_2 \n",
" [OBSERVE_TARGET#ON_SOURCE] \n",
" (15, 55, 8, 2) \n",
" uid://A002/X207fe4/X3b9 \n",
" [XX, YY] \n",
" [43] \n",
" spw_0 \n",
" [UNSPECIFIED] \n",
" [NGC4038 - Antennae North_0, NGC4038 - Antennae North_1, NGC4038 - Antennae North_2] \n",
" [NGC4038 - Antennae North_0] \n",
" [] \n",
" Multi-Phase-Center \n",
" --- \n",
" uid://A002/X1fd4e7/X64d \n",
" T.B.D. \n",
" 3.439281e+11 \n",
" 3.440067e+11 \n",
" \n",
" \n",
" 3 \n",
" Antennae_North.cal.lsrk.split_3 \n",
" [OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SOURCE] \n",
" (50, 77, 8, 2) \n",
" uid://A002/X2181fb/X49 \n",
" [XX, YY] \n",
" [48, 56, 60, 64] \n",
" spw_0 \n",
" [UNSPECIFIED] \n",
" [NGC4038 - Antennae North_0, NGC4038 - Antennae North_1, NGC4038 - Antennae North_2] \n",
" [NGC4038 - Antennae North_0] \n",
" [] \n",
" Multi-Phase-Center \n",
" --- \n",
" uid://A002/X1fd4e7/X64d \n",
" T.B.D. \n",
" 3.439281e+11 \n",
" 3.440067e+11 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name \\\n",
"0 Antennae_North.cal.lsrk.split_0 \n",
"1 Antennae_North.cal.lsrk.split_1 \n",
"2 Antennae_North.cal.lsrk.split_2 \n",
"3 Antennae_North.cal.lsrk.split_3 \n",
"\n",
" scan_intents shape \\\n",
"0 [OBSERVE_TARGET#ON_SOURCE] (50, 45, 8, 2) \n",
"1 [OBSERVE_TARGET#ON_SOURCE] (50, 55, 8, 2) \n",
"2 [OBSERVE_TARGET#ON_SOURCE] (15, 55, 8, 2) \n",
"3 [OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SOURCE] (50, 77, 8, 2) \n",
"\n",
" execution_block_UID polarization scan_name spw_name \\\n",
"0 uid://A002/X1ff7b0/Xb [XX, YY] [17, 21, 25, 9] spw_0 \n",
"1 uid://A002/X207fe4/X3a [XX, YY] [26, 34, 38, 42] spw_0 \n",
"2 uid://A002/X207fe4/X3b9 [XX, YY] [43] spw_0 \n",
"3 uid://A002/X2181fb/X49 [XX, YY] [48, 56, 60, 64] spw_0 \n",
"\n",
" spw_intents \\\n",
"0 [UNSPECIFIED] \n",
"1 [UNSPECIFIED] \n",
"2 [UNSPECIFIED] \n",
"3 [UNSPECIFIED] \n",
"\n",
" field_name \\\n",
"0 [NGC4038 - Antennae North_0, NGC4038 - Antennae North_1, NGC4038 - Antennae North_2] \n",
"1 [NGC4038 - Antennae North_0, NGC4038 - Antennae North_1, NGC4038 - Antennae North_2] \n",
"2 [NGC4038 - Antennae North_0, NGC4038 - Antennae North_1, NGC4038 - Antennae North_2] \n",
"3 [NGC4038 - Antennae North_0, NGC4038 - Antennae North_1, NGC4038 - Antennae North_2] \n",
"\n",
" source_name line_name field_coords \\\n",
"0 [NGC4038 - Antennae North_0] [] Multi-Phase-Center \n",
"1 [NGC4038 - Antennae North_0] [] Multi-Phase-Center \n",
"2 [NGC4038 - Antennae North_0] [] Multi-Phase-Center \n",
"3 [NGC4038 - Antennae North_0] [] Multi-Phase-Center \n",
"\n",
" session_reference_UID scheduling_block_UID project_UID start_frequency \\\n",
"0 --- uid://A002/X1fd4e7/X64d T.B.D. 3.439281e+11 \n",
"1 --- uid://A002/X1fd4e7/X64d T.B.D. 3.439281e+11 \n",
"2 --- uid://A002/X1fd4e7/X64d T.B.D. 3.439281e+11 \n",
"3 --- uid://A002/X1fd4e7/X64d T.B.D. 3.439281e+11 \n",
"\n",
" end_frequency \n",
"0 3.440067e+11 \n",
"1 3.440067e+11 \n",
"2 3.440067e+11 \n",
"3 3.440067e+11 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"\n",
"pd.options.display.max_colwidth = 100\n",
"ps_store = \"Antennae_North.cal.lsrk.split.ps.zarr\"\n",
"\n",
"from xradio.measurement_set import open_processing_set\n",
"\n",
"fields = None\n",
"ps_xdt = open_processing_set(\n",
" ps_store=\"Antennae_North.cal.lsrk.split.ps.zarr\",\n",
" scan_intents=[\"OBSERVE_TARGET#ON_SOURCE\"],\n",
")\n",
"display(ps_xdt.xr_ps.summary())"
]
},
{
"cell_type": "markdown",
"id": "20b44df1-613b-4eaf-9c04-55bad4c5ced3",
"metadata": {},
"source": [
"## Inspect a single MS v4\n",
"\n",
"The [xarray.Datasets](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.html) within a Processing Set are called [Measurement Set v4](https://docs.google.com/spreadsheets/d/14a6qMap9M5r_vjpLnaBKxsR9TF4azN5LVdOxLacOX-s/edit?usp=sharing) (MS v4)."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "14c1b6da-4c81-4f97-9000-0f5784dfbc66",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
" \n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
"
<xarray.DataTree 'Antennae_North.cal.lsrk.split_0'>\n",
"Group: /Antennae_North.cal.lsrk.split_0\n",
"│ Dimensions: (time: 50, baseline_id: 45, frequency: 8,\n",
"│ polarization: 2, uvw_label: 3)\n",
"│ Coordinates:\n",
"│ * time (time) float64 400B 1.307e+09 ... 1.307e+09\n",
"│ field_name (time) <U46 9kB dask.array<chunksize=(50,), meta=np.ndarray>\n",
"│ scan_name (time) <U21 4kB dask.array<chunksize=(50,), meta=np.ndarray>\n",
"│ * baseline_id (baseline_id) int64 360B 0 1 2 3 ... 41 42 43 44\n",
"│ baseline_antenna1_name (baseline_id) <U9 2kB dask.array<chunksize=(45,), meta=np.ndarray>\n",
"│ baseline_antenna2_name (baseline_id) <U9 2kB dask.array<chunksize=(45,), meta=np.ndarray>\n",
"│ * frequency (frequency) float64 64B 3.439e+11 ... 3.44e+11\n",
"│ * polarization (polarization) <U2 16B 'XX' 'YY'\n",
"│ * uvw_label (uvw_label) <U1 12B 'u' 'v' 'w'\n",
"│ Data variables:\n",
"│ EFFECTIVE_INTEGRATION_TIME (time, baseline_id) float64 18kB dask.array<chunksize=(50, 45), meta=np.ndarray>\n",
"│ FLAG (time, baseline_id, frequency, polarization) bool 36kB dask.array<chunksize=(50, 45, 3, 2), meta=np.ndarray>\n",
"│ TIME_CENTROID (time, baseline_id) float64 18kB dask.array<chunksize=(50, 45), meta=np.ndarray>\n",
"│ UVW (time, baseline_id, uvw_label) float64 54kB dask.array<chunksize=(50, 45, 3), meta=np.ndarray>\n",
"│ VISIBILITY (time, baseline_id, frequency, polarization) complex64 288kB dask.array<chunksize=(50, 45, 3, 2), meta=np.ndarray>\n",
"│ WEIGHT (time, baseline_id, frequency, polarization) float32 144kB dask.array<chunksize=(50, 45, 3, 2), meta=np.ndarray>\n",
"│ Attributes:\n",
"│ creation_date: 2026-04-06T19:38:39.489741+00:00\n",
"│ creator: {'software_name': 'xradio', 'version': '1.1.3'}\n",
"│ data_groups: {'base': {'correlated_data': 'VISIBILITY', 'date': '20...\n",
"│ observation_info: {'execution_block_UID': 'uid://A002/X1ff7b0/Xb', 'obse...\n",
"│ processor_info: {'sub_type': 'ALMA_CORRELATOR_MODE', 'type': 'CORRELAT...\n",
"│ schema_version: 4.0.0\n",
"│ type: visibility\n",
"├── Group: /Antennae_North.cal.lsrk.split_0/antenna_xds\n",
"│ Dimensions: (antenna_name: 10, cartesian_pos_label: 3,\n",
"│ receptor_label: 2)\n",
"│ Coordinates:\n",
"│ * antenna_name (antenna_name) <U9 360B 'DV02_A015' ... 'PM03_J504'\n",
"│ mount (antenna_name) <U6 240B dask.array<chunksize=(10,), meta=np.ndarray>\n",
"│ station_name (antenna_name) <U4 160B dask.array<chunksize=(10,), meta=np.ndarray>\n",
"│ telescope_name (antenna_name) <U4 160B dask.array<chunksize=(10,), meta=np.ndarray>\n",
"│ * cartesian_pos_label (cartesian_pos_label) <U1 12B 'x' 'y' 'z'\n",
"│ * receptor_label (receptor_label) <U5 40B 'pol_0' 'pol_1'\n",
"│ polarization_type (antenna_name, receptor_label) <U1 80B dask.array<chunksize=(10, 2), meta=np.ndarray>\n",
"│ Data variables:\n",
"│ ANTENNA_DISH_DIAMETER (antenna_name) float64 80B dask.array<chunksize=(10,), meta=np.ndarray>\n",
"│ ANTENNA_POSITION (antenna_name, cartesian_pos_label) float64 240B dask.array<chunksize=(10, 3), meta=np.ndarray>\n",
"│ ANTENNA_RECEPTOR_ANGLE (antenna_name, receptor_label) float64 160B dask.array<chunksize=(10, 2), meta=np.ndarray>\n",
"│ Attributes:\n",
"│ overall_telescope_name: ALMA\n",
"│ relocatable_antennas: True\n",
"│ type: antenna\n",
"├── Group: /Antennae_North.cal.lsrk.split_0/field_and_source_base_xds\n",
"│ Dimensions: (field_name: 3, sky_dir_label: 2)\n",
"│ Coordinates:\n",
"│ * field_name (field_name) <U46 552B 'NGC4038 - Antennae ...\n",
"│ source_name (field_name) <U46 552B dask.array<chunksize=(3,), meta=np.ndarray>\n",
"│ * sky_dir_label (sky_dir_label) <U3 24B 'ra' 'dec'\n",
"│ Data variables:\n",
"│ FIELD_PHASE_CENTER_DIRECTION (field_name, sky_dir_label) float64 48B dask.array<chunksize=(3, 2), meta=np.ndarray>\n",
"│ SOURCE_DIRECTION (field_name, sky_dir_label) float64 48B dask.array<chunksize=(3, 2), meta=np.ndarray>\n",
"│ Attributes:\n",
"│ type: field_and_source\n",
"└── Group: /Antennae_North.cal.lsrk.split_0/weather_xds\n",
" Dimensions: (station_name: 2, time_weather: 259,\n",
" cartesian_pos_label: 3)\n",
" Coordinates:\n",
" * station_name (station_name) <U10 80B 'Station_11' 'Station_12'\n",
" * time_weather (time_weather) float64 2kB 1.307e+09 ... 1.307e+09\n",
" * cartesian_pos_label (cartesian_pos_label) <U1 12B 'x' 'y' 'z'\n",
" Data variables:\n",
" DEW_POINT (station_name, time_weather) float64 4kB dask.array<chunksize=(2, 259), meta=np.ndarray>\n",
" PRESSURE (station_name, time_weather) float64 4kB dask.array<chunksize=(2, 259), meta=np.ndarray>\n",
" REL_HUMIDITY (station_name, time_weather) float64 4kB dask.array<chunksize=(2, 259), meta=np.ndarray>\n",
" STATION_POSITION (station_name, cartesian_pos_label) float64 48B dask.array<chunksize=(2, 3), meta=np.ndarray>\n",
" TEMPERATURE (station_name, time_weather) float64 4kB dask.array<chunksize=(2, 259), meta=np.ndarray>\n",
" WIND_DIRECTION (station_name, time_weather) float64 4kB dask.array<chunksize=(2, 259), meta=np.ndarray>\n",
" WIND_SPEED (station_name, time_weather) float64 4kB dask.array<chunksize=(2, 259), meta=np.ndarray>\n",
" Attributes:\n",
" type: weather
/Antennae_North.cal.lsrk.split_0/antenna_xds(13) Dimensions: time : 50baseline_id : 45frequency : 8polarization : 2uvw_label : 3antenna_name : 10cartesian_pos_label : 3receptor_label : 2Coordinates: (7)
antenna_name
(antenna_name)
<U9
'DV02_A015' ... 'PM03_J504'
array(['DV02_A015', 'DV06_T704', 'DV07_A004', 'DV08_A072', 'DV09_A008','DV10_A009', 'DV11_A016', 'PM01_T702', 'PM02_A017', 'PM03_J504'],dtype='<U9') mount
(antenna_name)
<U6
dask.array<chunksize=(10,), meta=np.ndarray>
Array Chunk Bytes 240 B 240 B Shape (10,) (10,) Dask graph 1 chunks in 2 graph layers Data type
10 1
station_name
(antenna_name)
<U4
dask.array<chunksize=(10,), meta=np.ndarray>
Array Chunk Bytes 160 B 160 B Shape (10,) (10,) Dask graph 1 chunks in 2 graph layers Data type
10 1
telescope_name
(antenna_name)
<U4
dask.array<chunksize=(10,), meta=np.ndarray>
Array Chunk Bytes 160 B 160 B Shape (10,) (10,) Dask graph 1 chunks in 2 graph layers Data type
10 1
cartesian_pos_label
(cartesian_pos_label)
<U1
'x' 'y' 'z'
array(['x', 'y', 'z'], dtype='<U1') receptor_label
(receptor_label)
<U5
'pol_0' 'pol_1'
array(['pol_0', 'pol_1'], dtype='<U5') polarization_type
(antenna_name, receptor_label)
<U1
dask.array<chunksize=(10, 2), meta=np.ndarray>
Array Chunk Bytes 80 B 80 B Shape (10, 2) (10, 2) Dask graph 1 chunks in 2 graph layers Data type
2 10
Data variables: (3)
ANTENNA_DISH_DIAMETER
(antenna_name)
float64
dask.array<chunksize=(10,), meta=np.ndarray>
Array Chunk Bytes 80 B 80 B Shape (10,) (10,) Dask graph 1 chunks in 2 graph layers Data type float64 numpy.ndarray
10 1
ANTENNA_POSITION
(antenna_name, cartesian_pos_label)
float64
dask.array<chunksize=(10, 3), meta=np.ndarray>
coordinate_system : geocentric frame : ITRS origin_object_name : earth type : location units : m Array Chunk Bytes 240 B 240 B Shape (10, 3) (10, 3) Dask graph 1 chunks in 2 graph layers Data type float64 numpy.ndarray
3 10
ANTENNA_RECEPTOR_ANGLE
(antenna_name, receptor_label)
float64
dask.array<chunksize=(10, 2), meta=np.ndarray>
Array Chunk Bytes 160 B 160 B Shape (10, 2) (10, 2) Dask graph 1 chunks in 2 graph layers Data type float64 numpy.ndarray
2 10
Attributes: (3)
overall_telescope_name : ALMA relocatable_antennas : True type : antenna
/Antennae_North.cal.lsrk.split_0/field_and_source_base_xds(6) Dimensions: time : 50baseline_id : 45frequency : 8polarization : 2uvw_label : 3field_name : 3sky_dir_label : 2Coordinates: (3)
Data variables: (2)
FIELD_PHASE_CENTER_DIRECTION
(field_name, sky_dir_label)
float64
dask.array<chunksize=(3, 2), meta=np.ndarray>
frame : fk5 type : sky_coord units : rad Array Chunk Bytes 48 B 48 B Shape (3, 2) (3, 2) Dask graph 1 chunks in 2 graph layers Data type float64 numpy.ndarray
2 3
SOURCE_DIRECTION
(field_name, sky_dir_label)
float64
dask.array<chunksize=(3, 2), meta=np.ndarray>
frame : fk5 type : sky_coord units : rad Array Chunk Bytes 48 B 48 B Shape (3, 2) (3, 2) Dask graph 1 chunks in 2 graph layers Data type float64 numpy.ndarray
2 3
Attributes: (1)
/Antennae_North.cal.lsrk.split_0/weather_xds(11) Dimensions: time : 50baseline_id : 45frequency : 8polarization : 2uvw_label : 3station_name : 2time_weather : 259cartesian_pos_label : 3Coordinates: (3)
Data variables: (7)
DEW_POINT
(station_name, time_weather)
float64
dask.array<chunksize=(2, 259), meta=np.ndarray>
Array Chunk Bytes 4.05 kiB 4.05 kiB Shape (2, 259) (2, 259) Dask graph 1 chunks in 2 graph layers Data type float64 numpy.ndarray
259 2
PRESSURE
(station_name, time_weather)
float64
dask.array<chunksize=(2, 259), meta=np.ndarray>
Array Chunk Bytes 4.05 kiB 4.05 kiB Shape (2, 259) (2, 259) Dask graph 1 chunks in 2 graph layers Data type float64 numpy.ndarray
259 2
REL_HUMIDITY
(station_name, time_weather)
float64
dask.array<chunksize=(2, 259), meta=np.ndarray>
Array Chunk Bytes 4.05 kiB 4.05 kiB Shape (2, 259) (2, 259) Dask graph 1 chunks in 2 graph layers Data type float64 numpy.ndarray
259 2
STATION_POSITION
(station_name, cartesian_pos_label)
float64
dask.array<chunksize=(2, 3), meta=np.ndarray>
coordinate_system : geocentric frame : ITRS origin_object_name : earth type : location units : m Array Chunk Bytes 48 B 48 B Shape (2, 3) (2, 3) Dask graph 1 chunks in 2 graph layers Data type float64 numpy.ndarray
3 2
TEMPERATURE
(station_name, time_weather)
float64
dask.array<chunksize=(2, 259), meta=np.ndarray>
Array Chunk Bytes 4.05 kiB 4.05 kiB Shape (2, 259) (2, 259) Dask graph 1 chunks in 2 graph layers Data type float64 numpy.ndarray
259 2
WIND_DIRECTION
(station_name, time_weather)
float64
dask.array<chunksize=(2, 259), meta=np.ndarray>
Array Chunk Bytes 4.05 kiB 4.05 kiB Shape (2, 259) (2, 259) Dask graph 1 chunks in 2 graph layers Data type float64 numpy.ndarray
259 2
WIND_SPEED
(station_name, time_weather)
float64
dask.array<chunksize=(2, 259), meta=np.ndarray>
Array Chunk Bytes 4.05 kiB 4.05 kiB Shape (2, 259) (2, 259) Dask graph 1 chunks in 2 graph layers Data type float64 numpy.ndarray
259 2
Attributes: (1)
Dimensions: time : 50baseline_id : 45frequency : 8polarization : 2uvw_label : 3Coordinates: (9)
time
(time)
float64
1.307e+09 1.307e+09 ... 1.307e+09
format : unix integration_time : {'attrs': {'type': 'quantity', 'units': 's'}, 'data': 6.048, 'dims': []} scale : utc type : time units : s array([1.306547e+09, 1.306547e+09, 1.306547e+09, 1.306547e+09, 1.306547e+09,\n",
" 1.306547e+09, 1.306547e+09, 1.306547e+09, 1.306547e+09, 1.306547e+09,\n",
" 1.306547e+09, 1.306547e+09, 1.306547e+09, 1.306547e+09, 1.306547e+09,\n",
" 1.306549e+09, 1.306549e+09, 1.306549e+09, 1.306549e+09, 1.306549e+09,\n",
" 1.306549e+09, 1.306549e+09, 1.306549e+09, 1.306549e+09, 1.306549e+09,\n",
" 1.306549e+09, 1.306549e+09, 1.306549e+09, 1.306549e+09, 1.306549e+09,\n",
" 1.306550e+09, 1.306550e+09, 1.306550e+09, 1.306550e+09, 1.306550e+09,\n",
" 1.306550e+09, 1.306550e+09, 1.306550e+09, 1.306550e+09, 1.306550e+09,\n",
" 1.306550e+09, 1.306550e+09, 1.306550e+09, 1.306550e+09, 1.306550e+09,\n",
" 1.306551e+09, 1.306551e+09, 1.306551e+09, 1.306551e+09, 1.306551e+09]) field_name
(time)
<U46
dask.array<chunksize=(50,), meta=np.ndarray>
\n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Array \n",
" Chunk \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Bytes \n",
" 8.98 kiB \n",
" 8.98 kiB \n",
" \n",
" \n",
" \n",
" Shape \n",
" (50,) \n",
" (50,) \n",
" \n",
" \n",
" Dask graph \n",
" 1 chunks in 2 graph layers \n",
" \n",
" \n",
" Data type \n",
" \n",
" \n",
" \n",
"
\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" 50 \n",
" 1 \n",
" \n",
" \n",
" \n",
"
scan_name
(time)
<U21
dask.array<chunksize=(50,), meta=np.ndarray>
scan_intents : ['OBSERVE_TARGET#ON_SOURCE'] \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Array \n",
" Chunk \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Bytes \n",
" 4.10 kiB \n",
" 4.10 kiB \n",
" \n",
" \n",
" \n",
" Shape \n",
" (50,) \n",
" (50,) \n",
" \n",
" \n",
" Dask graph \n",
" 1 chunks in 2 graph layers \n",
" \n",
" \n",
" Data type \n",
" \n",
" \n",
" \n",
"
\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" 50 \n",
" 1 \n",
" \n",
" \n",
" \n",
"
baseline_id
(baseline_id)
int64
0 1 2 3 4 5 6 ... 39 40 41 42 43 44
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
" 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
" 36, 37, 38, 39, 40, 41, 42, 43, 44]) baseline_antenna1_name
(baseline_id)
<U9
dask.array<chunksize=(45,), meta=np.ndarray>
\n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Array \n",
" Chunk \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Bytes \n",
" 1.58 kiB \n",
" 1.58 kiB \n",
" \n",
" \n",
" \n",
" Shape \n",
" (45,) \n",
" (45,) \n",
" \n",
" \n",
" Dask graph \n",
" 1 chunks in 2 graph layers \n",
" \n",
" \n",
" Data type \n",
" \n",
" \n",
" \n",
"
\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" 45 \n",
" 1 \n",
" \n",
" \n",
" \n",
"
baseline_antenna2_name
(baseline_id)
<U9
dask.array<chunksize=(45,), meta=np.ndarray>
\n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Array \n",
" Chunk \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Bytes \n",
" 1.58 kiB \n",
" 1.58 kiB \n",
" \n",
" \n",
" \n",
" Shape \n",
" (45,) \n",
" (45,) \n",
" \n",
" \n",
" Dask graph \n",
" 1 chunks in 2 graph layers \n",
" \n",
" \n",
" Data type \n",
" \n",
" \n",
" \n",
"
\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" 45 \n",
" 1 \n",
" \n",
" \n",
" \n",
"
frequency
(frequency)
float64
3.439e+11 3.439e+11 ... 3.44e+11
channel_width : {'attrs': {'type': 'quantity', 'units': 'Hz'}, 'data': 11231488.981445312, 'dims': []} observer : lsrk reference_frequency : {'attrs': {'observer': 'lsrk', 'type': 'spectral_coord', 'units': 'Hz'}, 'data': 343928096685.9587, 'dims': []} spectral_window_intents : ['UNSPECIFIED'] spectral_window_name : spw_0 type : spectral_coord units : Hz array([3.439281e+11, 3.439393e+11, 3.439506e+11, 3.439618e+11, 3.439730e+11,\n",
" 3.439843e+11, 3.439955e+11, 3.440067e+11]) polarization
(polarization)
<U2
'XX' 'YY'
array(['XX', 'YY'], dtype='<U2') uvw_label
(uvw_label)
<U1
'u' 'v' 'w'
array(['u', 'v', 'w'], dtype='<U1') Data variables: (6)
EFFECTIVE_INTEGRATION_TIME
(time, baseline_id)
float64
dask.array<chunksize=(50, 45), meta=np.ndarray>
\n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Array \n",
" Chunk \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Bytes \n",
" 17.58 kiB \n",
" 17.58 kiB \n",
" \n",
" \n",
" \n",
" Shape \n",
" (50, 45) \n",
" (50, 45) \n",
" \n",
" \n",
" Dask graph \n",
" 1 chunks in 2 graph layers \n",
" \n",
" \n",
" Data type \n",
" float64 numpy.ndarray \n",
" \n",
" \n",
"
\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" 45 \n",
" 50 \n",
" \n",
" \n",
" \n",
"
FLAG
(time, baseline_id, frequency, polarization)
bool
dask.array<chunksize=(50, 45, 3, 2), meta=np.ndarray>
\n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Array \n",
" Chunk \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Bytes \n",
" 35.16 kiB \n",
" 13.18 kiB \n",
" \n",
" \n",
" \n",
" Shape \n",
" (50, 45, 8, 2) \n",
" (50, 45, 3, 2) \n",
" \n",
" \n",
" Dask graph \n",
" 3 chunks in 2 graph layers \n",
" \n",
" \n",
" Data type \n",
" bool numpy.ndarray \n",
" \n",
" \n",
"
\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" 50 \n",
" 1 \n",
"\n",
"\n",
" \n",
" \n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" 2 \n",
" 8 \n",
" 45 \n",
" \n",
" \n",
" \n",
"
TIME_CENTROID
(time, baseline_id)
float64
dask.array<chunksize=(50, 45), meta=np.ndarray>
format : unix scale : utc type : time units : s \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Array \n",
" Chunk \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Bytes \n",
" 17.58 kiB \n",
" 17.58 kiB \n",
" \n",
" \n",
" \n",
" Shape \n",
" (50, 45) \n",
" (50, 45) \n",
" \n",
" \n",
" Dask graph \n",
" 1 chunks in 2 graph layers \n",
" \n",
" \n",
" Data type \n",
" float64 numpy.ndarray \n",
" \n",
" \n",
"
\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" 45 \n",
" 50 \n",
" \n",
" \n",
" \n",
"
UVW
(time, baseline_id, uvw_label)
float64
dask.array<chunksize=(50, 45, 3), meta=np.ndarray>
frame : fk5 type : uvw units : m \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Array \n",
" Chunk \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Bytes \n",
" 52.73 kiB \n",
" 52.73 kiB \n",
" \n",
" \n",
" \n",
" Shape \n",
" (50, 45, 3) \n",
" (50, 45, 3) \n",
" \n",
" \n",
" Dask graph \n",
" 1 chunks in 2 graph layers \n",
" \n",
" \n",
" Data type \n",
" float64 numpy.ndarray \n",
" \n",
" \n",
"
\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" 3 \n",
" 45 \n",
" 50 \n",
" \n",
" \n",
" \n",
"
VISIBILITY
(time, baseline_id, frequency, polarization)
complex64
dask.array<chunksize=(50, 45, 3, 2), meta=np.ndarray>
type : quanta units : unkown \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Array \n",
" Chunk \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Bytes \n",
" 281.25 kiB \n",
" 105.47 kiB \n",
" \n",
" \n",
" \n",
" Shape \n",
" (50, 45, 8, 2) \n",
" (50, 45, 3, 2) \n",
" \n",
" \n",
" Dask graph \n",
" 3 chunks in 2 graph layers \n",
" \n",
" \n",
" Data type \n",
" complex64 numpy.ndarray \n",
" \n",
" \n",
"
\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" 50 \n",
" 1 \n",
"\n",
"\n",
" \n",
" \n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" 2 \n",
" 8 \n",
" 45 \n",
" \n",
" \n",
" \n",
"
WEIGHT
(time, baseline_id, frequency, polarization)
float32
dask.array<chunksize=(50, 45, 3, 2), meta=np.ndarray>
type : quanta units : unkown \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Array \n",
" Chunk \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Bytes \n",
" 140.62 kiB \n",
" 52.73 kiB \n",
" \n",
" \n",
" \n",
" Shape \n",
" (50, 45, 8, 2) \n",
" (50, 45, 3, 2) \n",
" \n",
" \n",
" Dask graph \n",
" 3 chunks in 2 graph layers \n",
" \n",
" \n",
" Data type \n",
" float32 numpy.ndarray \n",
" \n",
" \n",
"
\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" 50 \n",
" 1 \n",
"\n",
"\n",
" \n",
" \n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
"\n",
" \n",
" 2 \n",
" 8 \n",
" 45 \n",
" \n",
" \n",
" \n",
"
Attributes: (7)
creation_date : 2026-04-06T19:38:39.489741+00:00 creator : {'software_name': 'xradio', 'version': '1.1.3'} data_groups : {'base': {'correlated_data': 'VISIBILITY', 'date': '2026-04-06T19:38:39.541311+00:00', 'description': "Data group derived from the data column 'VISIBILITY' of an MSv2 converted to MSv4", 'field_and_source': 'field_and_source_base_xds', 'flag': 'FLAG', 'uvw': 'UVW', 'weight': 'WEIGHT'}} observation_info : {'execution_block_UID': 'uid://A002/X1ff7b0/Xb', 'observer': ['Unknown'], 'observing_log': "['']", 'project_UID': 'T.B.D.', 'release_date': '1858-11-17T00:00:00', 'scheduling_block_UID': 'uid://A002/X1fd4e7/X64d'} processor_info : {'sub_type': 'ALMA_CORRELATOR_MODE', 'type': 'CORRELATOR'} schema_version : 4.0.0 type : visibility "
],
"text/plain": [
"\n",
"Group: /Antennae_North.cal.lsrk.split_0\n",
"│ Dimensions: (time: 50, baseline_id: 45, frequency: 8,\n",
"│ polarization: 2, uvw_label: 3)\n",
"│ Coordinates:\n",
"│ * time (time) float64 400B 1.307e+09 ... 1.307e+09\n",
"│ field_name (time) \n",
"│ scan_name (time) \n",
"│ * baseline_id (baseline_id) int64 360B 0 1 2 3 ... 41 42 43 44\n",
"│ baseline_antenna1_name (baseline_id) \n",
"│ baseline_antenna2_name (baseline_id) \n",
"│ * frequency (frequency) float64 64B 3.439e+11 ... 3.44e+11\n",
"│ * polarization (polarization) \n",
"│ FLAG (time, baseline_id, frequency, polarization) bool 36kB dask.array\n",
"│ TIME_CENTROID (time, baseline_id) float64 18kB dask.array\n",
"│ UVW (time, baseline_id, uvw_label) float64 54kB dask.array\n",
"│ VISIBILITY (time, baseline_id, frequency, polarization) complex64 288kB dask.array\n",
"│ WEIGHT (time, baseline_id, frequency, polarization) float32 144kB dask.array\n",
"│ Attributes:\n",
"│ creation_date: 2026-04-06T19:38:39.489741+00:00\n",
"│ creator: {'software_name': 'xradio', 'version': '1.1.3'}\n",
"│ data_groups: {'base': {'correlated_data': 'VISIBILITY', 'date': '20...\n",
"│ observation_info: {'execution_block_UID': 'uid://A002/X1ff7b0/Xb', 'obse...\n",
"│ processor_info: {'sub_type': 'ALMA_CORRELATOR_MODE', 'type': 'CORRELAT...\n",
"│ schema_version: 4.0.0\n",
"│ type: visibility\n",
"├── Group: /Antennae_North.cal.lsrk.split_0/antenna_xds\n",
"│ Dimensions: (antenna_name: 10, cartesian_pos_label: 3,\n",
"│ receptor_label: 2)\n",
"│ Coordinates:\n",
"│ * antenna_name (antenna_name) \n",
"│ station_name (antenna_name) \n",
"│ telescope_name (antenna_name) \n",
"│ * cartesian_pos_label (cartesian_pos_label) \n",
"│ Data variables:\n",
"│ ANTENNA_DISH_DIAMETER (antenna_name) float64 80B dask.array\n",
"│ ANTENNA_POSITION (antenna_name, cartesian_pos_label) float64 240B dask.array\n",
"│ ANTENNA_RECEPTOR_ANGLE (antenna_name, receptor_label) float64 160B dask.array\n",
"│ Attributes:\n",
"│ overall_telescope_name: ALMA\n",
"│ relocatable_antennas: True\n",
"│ type: antenna\n",
"├── Group: /Antennae_North.cal.lsrk.split_0/field_and_source_base_xds\n",
"│ Dimensions: (field_name: 3, sky_dir_label: 2)\n",
"│ Coordinates:\n",
"│ * field_name (field_name) \n",
"│ * sky_dir_label (sky_dir_label) \n",
"│ SOURCE_DIRECTION (field_name, sky_dir_label) float64 48B dask.array\n",
"│ Attributes:\n",
"│ type: field_and_source\n",
"└── Group: /Antennae_North.cal.lsrk.split_0/weather_xds\n",
" Dimensions: (station_name: 2, time_weather: 259,\n",
" cartesian_pos_label: 3)\n",
" Coordinates:\n",
" * station_name (station_name) \n",
" PRESSURE (station_name, time_weather) float64 4kB dask.array\n",
" REL_HUMIDITY (station_name, time_weather) float64 4kB dask.array\n",
" STATION_POSITION (station_name, cartesian_pos_label) float64 48B dask.array\n",
" TEMPERATURE (station_name, time_weather) float64 4kB dask.array\n",
" WIND_DIRECTION (station_name, time_weather) float64 4kB dask.array\n",
" WIND_SPEED (station_name, time_weather) float64 4kB dask.array\n",
" Attributes:\n",
" type: weather"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ms_xds = ps_xdt[\n",
" \"Antennae_North.cal.lsrk.split_0\"\n",
"]\n",
"\n",
"ms_xds"
]
},
{
"cell_type": "markdown",
"id": "9a2e880b",
"metadata": {},
"source": [
"## Nomenclature\n",
"\n",
"- `input_data`: A dictionary of [xarray.Datasets](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.html) or a [processing_set](https://github.com/casangi/xradio/blob/main/src/xradio/vis/_processing_set.py).\n",
"- `n_datasets`: The number of [xarray.Datasets](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.html) in the input_data.\n",
"- `i_dim`: The $\\text{i}^{\\text{th}}$ dimension name.\n",
"- `n_dims`: The number of dimensions over which parallelism will occur.\n",
"- `n_dim_i_chunks`: Number of chunks into which the dimension coordinate `dim_i` has been divided.\n",
"- `n_nodes`: Number of nodes in the mapping stage of a MapReduce graph.\n",
"- `_{}`: If curly brackets are preceded by an underscore, it indicates a subscript and not a dictionary value."
]
},
{
"cell_type": "markdown",
"id": "aa7e11c7-18f8-4174-a713-a020a8f91273",
"metadata": {},
"source": [
"## How Graph Parallelism is Specified: ```parallel_coords```\n",
"\n",
"The `parallel_coords` is a dictionary where the keys are dimensions over which parallelism will occur and can be any of the dimension coordinate names present in the input data. For the `MS v4` [xarray.Dataset](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.html), the options include time, baseline_id (interferometer) / antenna_id (single dish), frequency, and polarization. Each dimension coordinate name is associated with a dictionary that describes the data selection for that dimension in each node of the mapping stage of the graph.\n",
"\n",
"The structure of the `parallel_coordinates`:\n",
"```\n",
" parallel_coords = {\n",
" dim_0: {\n",
" 'data': 1D list/np.ndarray of Number,\n",
" 'data_chunks': {\n",
" 0 : 1D list/np.ndarray of Number,\n",
" ⋮\n",
" n_dim_0_chunks-1 : ...,\n",
" }\n",
" 'data_chunk_edges': 1D list/np.ndarray of Number,\n",
" 'dims': (dim_0,), \n",
" 'attrs': measure attribute,\n",
" }\n",
" ⋮\n",
" dim_{n_dims-1}: ...\n",
" }\n",
"```\n",
"\n",
"The `dim_i` dictionaries keys have the following meanings:\n",
"\n",
"- `data`: An array containing all the coordinate values associated with that dimension. These values do not necessarily have to match the values in the coordinates of the input data, as those are interpolated onto these values. The minimum and maximum values can be respectively larger or smaller than the values in the coordinates of individual [xarray.Datasets](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.html); this will simply exclude that data from being processed. It's important to note that the `parallel_coords` and the input data coordinates must have the same measures attributes (reference frame, units, etc.).\n",
"- `data_chunks`: A dictionary where the values are chunks of the data and the keys are integers. This chunking determines the parallelism of the graph. The values in the chunks can overlap.\n",
"- `data_chunks_edges`: An array with the start and end values of each chunk.\n",
"- `dims`: The dimension coordinate name.\n",
"- `attrs`: The `XRADIO` measures attributes of the data (refer to [XRADIO documentation](https://docs.google.com/spreadsheets/d/14a6qMap9M5r_vjpLnaBKxsR9TF4azN5LVdOxLacOX-s/edit#gid=1504318014)).\n",
"\n",
"The combinations of all the chunks in `parallel_coords` determine the parallelism of the graph. For example, if you have `parallel_coords` with 5 `time` and 3 `frequency` chunks, you would have 15-way parallelism (5x3).\n",
"\n",
"This description may seem somewhat convoluted, but the following examples should help clarify things."
]
},
{
"cell_type": "markdown",
"id": "86fa2f48",
"metadata": {},
"source": [
"## Frequency Map Reduce"
]
},
{
"cell_type": "markdown",
"id": "33094606-edf4-414b-800c-589146c4a55a",
"metadata": {},
"source": [
"### Create Parallel Coordinates\n",
"\n",
"GraphVIPER offers a convenient function, [make_parallel_coord](https://graphviper.readthedocs.io/en/latest/_api/autoapi/graphviper/graph_tools/coordinate_utils/index.html#graphviper.graph_tools.coordinate_utils.make_parallel_coord), that converts any [XRADIO measures](https://docs.google.com/spreadsheets/d/14a6qMap9M5r_vjpLnaBKxsR9TF4azN5LVdOxLacOX-s/edit#gid=1504318014) to a `parallel_coord`. In this case, we will use the frequency coordinate of one of the datasets in the [processing_set](https://github.com/casangi/xradio/blob/main/src/xradio/vis/_processing_set.py). It's worth noting that all datasets in this [processing_set](https://github.com/casangi/xradio/blob/main/src/xradio/vis/_processing_set.py) have the same frequency coordinates but differing time coordinates. This is the case because they represent the same spectral window but different fields in a Mosaic observation."
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "a33a781e-9b81-46c6-9c16-7510d0f4eae3",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"data: [3.43928097e+11 3.43939328e+11 3.43950560e+11 3.43961791e+11\n",
" 3.43973023e+11 3.43984254e+11 3.43995486e+11 3.44006717e+11]
data_chunks 0: [3.43928097e+11 3.43939328e+11 3.43950560e+11]
1: [3.43961791e+11 3.43973023e+11 3.43984254e+11]
2: [3.43995486e+11 3.44006717e+11]
data_chunks_edges: [np.float64(343928096685.9587), np.float64(343950559663.9216), np.float64(343961791152.903), np.float64(343984254130.8659), np.float64(343995485619.84735), np.float64(344006717108.8288)]
data_chunk_slices 0: slice(0, 3, None)
1: slice(3, 6, None)
2: slice(6, 8, None)
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
"
],
"text/plain": [
""
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from graphviper.graph_tools.coordinate_utils import make_parallel_coord\n",
"\n",
"parallel_coords = {}\n",
"n_chunks = 3\n",
"parallel_coords[\"frequency\"] = make_parallel_coord(\n",
" coord=ms_xds.frequency, n_chunks=n_chunks\n",
")\n",
"\n",
"toolviper.utils.display.DataDict.html(parallel_coords[\"frequency\"])"
]
},
{
"cell_type": "markdown",
"id": "a679dd6a",
"metadata": {},
"source": [
"The display of the frequency `parallel_coords` clearly shows how the data was split into 3 chunks. All the chunks must have the same number of values, except the last chunk, which can have fewer. `GraphVIPER` also has a convenience functions that can create [frequency](https://graphviper.readthedocs.io/en/latest/_api/autoapi/graphviper/graph_tools/coordinate_utils/index.html#graphviper.graph_tools.coordinate_utils.make_frequency_coord) and [time](https://graphviper.readthedocs.io/en/latest/_api/autoapi/graphviper/graph_tools/coordinate_utils/index.html#graphviper.graph_tools.coordinate_utils.make_time_coord) coordinate measures:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "078f9152-a57d-4c26-bd32-7736dffa850a",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"data: [3.43928097e+11 3.43939328e+11 3.43950560e+11 3.43961791e+11\n",
" 3.43973023e+11 3.43984254e+11 3.43995486e+11 3.44006717e+11]
data_chunks 0: [3.43928097e+11 3.43939328e+11 3.43950560e+11]
1: [3.43961791e+11 3.43973023e+11 3.43984254e+11]
2: [3.43995486e+11 3.44006717e+11]
data_chunks_edges: [np.float64(343928096685.9587), np.float64(343950559663.9216), np.float64(343961791152.903), np.float64(343984254130.8659), np.float64(343995485619.84735), np.float64(344006717108.8288)]
data_chunk_slices 0: slice(0, 3, None)
1: slice(3, 6, None)
2: slice(6, 8, None)
dims: frequency
attrs units: Hz
type: spectral_coord
velocity_frame: lsrk
"
],
"text/plain": [
""
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from graphviper.graph_tools.coordinate_utils import make_frequency_coord\n",
"\n",
"n_chunks = 3\n",
"\n",
"coord = make_frequency_coord(\n",
" freq_start=343928096685.9587,\n",
" freq_delta=11231488.981445312,\n",
" n_channels=8,\n",
" velocity_frame=\"lsrk\",\n",
")\n",
"parallel_coords[\"frequency\"] = make_parallel_coord(coord=coord, n_chunks=n_chunks)\n",
"toolviper.utils.display.DataDict.html(parallel_coords[\"frequency\"])"
]
},
{
"cell_type": "markdown",
"id": "f3b99bcd",
"metadata": {},
"source": [
"### Create Node Task Data Mapping\n",
"\n",
"Now, the coordinates in the input data must be mapped onto the `parallel_coords`. This is achieved using the `interpolate_data_coords_onto_parallel_coords` function, which produces the `node_task_data_mapping`. It is a dictionary where each key is a node id of one of the nodes in the mapping stage of the graph.\n",
"\n",
"Structure of node_task_data_mapping:\n",
"```\n",
" node_task_data_mapping = {\n",
" 0 : {\n",
" 'chunk_indices': tuple of int,\n",
" 'parallel_dims': (dim_0, ..., dim_{n_dims-1}),\n",
" 'data_selection': {\n",
" dataset_name_0: {\n",
" dim_0: slice,\n",
" ⋮\n",
" dim_(n_dims-1): slice\n",
" }\n",
" ⋮\n",
" dataset_name_{n_dataset-1}: ...\n",
" }\n",
" 'task_coords': \n",
" dim_0:{\n",
" 'data': list/np.ndarray of Number,\n",
" 'dims': str,\n",
" 'attrs': measure attribute,\n",
" }\n",
" ⋮\n",
" dim_(n_dims-1): ...\n",
" }\n",
" ⋮\n",
" n_nodes-1 : ...\n",
" }\n",
"```\n",
"\n",
"Each `node_id` dictionary has the keys with the following meaning:\n",
"\n",
"- `chunk_indices`: The indices assigned to the data chunks in the `parallel_coords`. There must be an index for each `parallel_dims`.\n",
"- `parallel_dims`: The dimension coordinates over which parallelism will occur.\n",
"- `data_selection`: A dictionary where the keys are the names of the datasets in the `processing_set`, and the values are dictionaries with the coordinates and accompanying slices. If a coordinate is not included, all values will be selected.\n",
"- `task_coords`: The chunk of the parallel_coord that is assigned to this node."
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "4ffb8a9b",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"0 chunk_indices: (np.int64(0),)
parallel_dims: ['frequency']
data_selection Antennae_North.cal.lsrk.split_0 frequency: slice(np.int64(0), np.int64(3), None)
Antennae_North.cal.lsrk.split_1 frequency: slice(np.int64(0), np.int64(3), None)
Antennae_North.cal.lsrk.split_2 frequency: slice(np.int64(0), np.int64(3), None)
Antennae_North.cal.lsrk.split_3 frequency: slice(np.int64(0), np.int64(3), None)
task_coords frequency data: [3.43928097e+11 3.43939328e+11 3.43950560e+11]
dims: frequency
attrs units: Hz
type: spectral_coord
velocity_frame: lsrk
slice: slice(0, 3, None)
1 chunk_indices: (np.int64(1),)
parallel_dims: ['frequency']
data_selection Antennae_North.cal.lsrk.split_0 frequency: slice(np.int64(3), np.int64(6), None)
Antennae_North.cal.lsrk.split_1 frequency: slice(np.int64(3), np.int64(6), None)
Antennae_North.cal.lsrk.split_2 frequency: slice(np.int64(3), np.int64(6), None)
Antennae_North.cal.lsrk.split_3 frequency: slice(np.int64(3), np.int64(6), None)
task_coords frequency data: [3.43961791e+11 3.43973023e+11 3.43984254e+11]
dims: frequency
attrs units: Hz
type: spectral_coord
velocity_frame: lsrk
slice: slice(3, 6, None)
2 chunk_indices: (np.int64(2),)
parallel_dims: ['frequency']
data_selection Antennae_North.cal.lsrk.split_0 frequency: slice(np.int64(6), np.int64(8), None)
Antennae_North.cal.lsrk.split_1 frequency: slice(np.int64(6), np.int64(8), None)
Antennae_North.cal.lsrk.split_2 frequency: slice(np.int64(6), np.int64(8), None)
Antennae_North.cal.lsrk.split_3 frequency: slice(np.int64(6), np.int64(8), None)
task_coords frequency data: [3.43995486e+11 3.44006717e+11]
dims: frequency
attrs units: Hz
type: spectral_coord
velocity_frame: lsrk
slice: slice(6, 8, None)
"
],
"text/plain": [
""
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from graphviper.graph_tools.coordinate_utils import (\n",
" interpolate_data_coords_onto_parallel_coords,\n",
")\n",
"\n",
"node_task_data_mapping = interpolate_data_coords_onto_parallel_coords(\n",
" parallel_coords, ps_xdt\n",
")\n",
"\n",
"toolviper.utils.display.DataDict.html(node_task_data_mapping)"
]
},
{
"cell_type": "markdown",
"id": "bbbea156-e5e0-45eb-8a40-ca1f11c97e1b",
"metadata": {},
"source": [
"### Create a chunk function and map graph\n",
"\n",
"The [map](https://graphviper.readthedocs.io/en/latest/_api/autoapi/graphviper/graph_tools/map/index.html#graphviper.graph_tools.map.map) function combines a `node_task_data_mapping` and a `node_task` to create the map portion of the graph. The `node_task` must be a function with a single dictionary input and a single output as is the `my_func` in the example below. The `map` function will pass the `input_params` dictionary to the `node_task` and add the following items from the `node_task_data_mapping`:\n",
"\n",
"- chunk_indices\n",
"- parallel_dims\n",
"- data_selection\n",
"- task_coords\n",
"- task_id\n",
"\n",
"If local caching is enabled the following will also be included with the `input_params` dictionary:\n",
"\n",
"- date_time\n",
"- viper_local_dir"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "93a5da8a-6b40-4912-903b-e9c9ee196fbd",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Iff an error is given about graphviz not being installed, please install it using the following command:\n",
"# conda install Graphviz\n",
"\n",
"%load_ext autoreload\n",
"%autoreload 2\n",
" \n",
"from graphviper.graph_tools.map import map\n",
"from graphviper.graph_tools.generate_dask_workflow import generate_dask_workflow\n",
"\n",
"def my_func(input_params):\n",
" toolviper.utils.display.DataDict.html(input_params)\n",
"\n",
" print(\"*\" * 30)\n",
" return input_params[\"test_input\"]\n",
"\n",
"\n",
"input_params = {}\n",
"input_params[\"test_input\"] = 42\n",
"\n",
"viper_graph = map(\n",
" input_data=ps_xdt,\n",
" node_task_data_mapping=node_task_data_mapping,\n",
" node_task=my_func,\n",
" input_params=input_params,\n",
")\n",
"\n",
"dask_graph = generate_dask_workflow(viper_graph)\n",
"dask.visualize(dask_graph, filename=\"map_graph\")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "2dced77b",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"map node_task:
input_params: [{'test_input': 42, 'chunk_indices': (np.int64(0),), 'parallel_dims': ['frequency'], 'data_selection': {'Antennae_North.cal.lsrk.split_0': {'frequency': slice(np.int64(0), np.int64(3), None)}, 'Antennae_North.cal.lsrk.split_1': {'frequency': slice(np.int64(0), np.int64(3), None)}, 'Antennae_North.cal.lsrk.split_2': {'frequency': slice(np.int64(0), np.int64(3), None)}, 'Antennae_North.cal.lsrk.split_3': {'frequency': slice(np.int64(0), np.int64(3), None)}}, 'task_coords': {'frequency': {'data': array([3.43928097e+11, 3.43939328e+11, 3.43950560e+11]), 'dims': 'frequency', 'attrs': {'units': 'Hz', 'type': 'spectral_coord', 'velocity_frame': 'lsrk'}, 'slice': slice(0, 3, None)}}, 'task_id': 0, 'input_data': None, 'date_time': None}, {'test_input': 42, 'chunk_indices': (np.int64(1),), 'parallel_dims': ['frequency'], 'data_selection': {'Antennae_North.cal.lsrk.split_0': {'frequency': slice(np.int64(3), np.int64(6), None)}, 'Antennae_North.cal.lsrk.split_1': {'frequency': slice(np.int64(3), np.int64(6), None)}, 'Antennae_North.cal.lsrk.split_2': {'frequency': slice(np.int64(3), np.int64(6), None)}, 'Antennae_North.cal.lsrk.split_3': {'frequency': slice(np.int64(3), np.int64(6), None)}}, 'task_coords': {'frequency': {'data': array([3.43961791e+11, 3.43973023e+11, 3.43984254e+11]), 'dims': 'frequency', 'attrs': {'units': 'Hz', 'type': 'spectral_coord', 'velocity_frame': 'lsrk'}, 'slice': slice(3, 6, None)}}, 'task_id': 1, 'input_data': None, 'date_time': None}, {'test_input': 42, 'chunk_indices': (np.int64(2),), 'parallel_dims': ['frequency'], 'data_selection': {'Antennae_North.cal.lsrk.split_0': {'frequency': slice(np.int64(6), np.int64(8), None)}, 'Antennae_North.cal.lsrk.split_1': {'frequency': slice(np.int64(6), np.int64(8), None)}, 'Antennae_North.cal.lsrk.split_2': {'frequency': slice(np.int64(6), np.int64(8), None)}, 'Antennae_North.cal.lsrk.split_3': {'frequency': slice(np.int64(6), np.int64(8), None)}}, 'task_coords': {'frequency': {'data': array([3.43995486e+11, 3.44006717e+11]), 'dims': 'frequency', 'attrs': {'units': 'Hz', 'type': 'spectral_coord', 'velocity_frame': 'lsrk'}, 'slice': slice(6, 8, None)}}, 'task_id': 2, 'input_data': None, 'date_time': None}]
"
],
"text/plain": [
""
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"toolviper.utils.display.DataDict.html(viper_graph)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "eadd60c8-e248-4356-9183-35fabdf27e7f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[Delayed('my_func-35293d3c-fa79-45e9-9305-ffde684ab851'),\n",
" Delayed('my_func-a6be55d4-1b4d-4dff-9ff8-95fb5ff77164'),\n",
" Delayed('my_func-1acf1cc7-b5ae-4e56-aea1-b7b7b2f457d5')]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dask_graph"
]
},
{
"cell_type": "markdown",
"id": "5f509ded-23dd-4c08-aabc-d19678a7bbb8",
"metadata": {},
"source": [
"### Run Map Graph"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "252e010a-b04f-43dd-8e4f-798d31267b71",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"******************************\n",
"******************************\n",
"******************************\n"
]
},
{
"data": {
"text/plain": [
"([42, 42, 42],)"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dask.compute(dask_graph)"
]
},
{
"cell_type": "markdown",
"id": "291e9e20-8b36-4cb2-82b2-90fdfaf37a01",
"metadata": {},
"source": [
"### Reduce Graph\n",
"The [reduce](https://graphviper.readthedocs.io/en/latest/_api/autoapi/graphviper/graph_tools/reduce/index.html#graphviper.graph_tools.reduce.reduce) function takes the graph created by the [map](https://graphviper.readthedocs.io/en/latest/_api/autoapi/graphviper/graph_tools/map/index.html#graphviper.graph_tools.map.map) function and adds a reduce graph that combines the outputs using one of two methods:\n",
"\n",
"- `single_node`: where the output from all `map` nodes is sent to a single node,\n",
"- `tree`: where the outputs are combined using a binary tree reduction.\n",
"\n",
"The function that forms the nodes in the reduce portion of the graph must have two parameters: ``input_data`` and ``input_params``. The ``input_data`` represents the output from the mapping nodes, while ``input_params`` comes from the ``reduce`` parameter with the same name."
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "3286a1c5-cd4c-45e1-9ada-c14802538b82",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'map': {'node_task': , 'input_params': [{'test_input': 42, 'chunk_indices': (np.int64(0),), 'parallel_dims': ['frequency'], 'data_selection': {'Antennae_North.cal.lsrk.split_0': {'frequency': slice(np.int64(0), np.int64(3), None)}, 'Antennae_North.cal.lsrk.split_1': {'frequency': slice(np.int64(0), np.int64(3), None)}, 'Antennae_North.cal.lsrk.split_2': {'frequency': slice(np.int64(0), np.int64(3), None)}, 'Antennae_North.cal.lsrk.split_3': {'frequency': slice(np.int64(0), np.int64(3), None)}}, 'task_coords': {'frequency': {'data': array([3.43928097e+11, 3.43939328e+11, 3.43950560e+11]), 'dims': 'frequency', 'attrs': {'units': 'Hz', 'type': 'spectral_coord', 'velocity_frame': 'lsrk'}, 'slice': slice(0, 3, None)}}, 'task_id': 0, 'input_data': None, 'date_time': None}, {'test_input': 42, 'chunk_indices': (np.int64(1),), 'parallel_dims': ['frequency'], 'data_selection': {'Antennae_North.cal.lsrk.split_0': {'frequency': slice(np.int64(3), np.int64(6), None)}, 'Antennae_North.cal.lsrk.split_1': {'frequency': slice(np.int64(3), np.int64(6), None)}, 'Antennae_North.cal.lsrk.split_2': {'frequency': slice(np.int64(3), np.int64(6), None)}, 'Antennae_North.cal.lsrk.split_3': {'frequency': slice(np.int64(3), np.int64(6), None)}}, 'task_coords': {'frequency': {'data': array([3.43961791e+11, 3.43973023e+11, 3.43984254e+11]), 'dims': 'frequency', 'attrs': {'units': 'Hz', 'type': 'spectral_coord', 'velocity_frame': 'lsrk'}, 'slice': slice(3, 6, None)}}, 'task_id': 1, 'input_data': None, 'date_time': None}, {'test_input': 42, 'chunk_indices': (np.int64(2),), 'parallel_dims': ['frequency'], 'data_selection': {'Antennae_North.cal.lsrk.split_0': {'frequency': slice(np.int64(6), np.int64(8), None)}, 'Antennae_North.cal.lsrk.split_1': {'frequency': slice(np.int64(6), np.int64(8), None)}, 'Antennae_North.cal.lsrk.split_2': {'frequency': slice(np.int64(6), np.int64(8), None)}, 'Antennae_North.cal.lsrk.split_3': {'frequency': slice(np.int64(6), np.int64(8), None)}}, 'task_coords': {'frequency': {'data': array([3.43995486e+11, 3.44006717e+11]), 'dims': 'frequency', 'attrs': {'units': 'Hz', 'type': 'spectral_coord', 'velocity_frame': 'lsrk'}, 'slice': slice(6, 8, None)}}, 'task_id': 2, 'input_data': None, 'date_time': None}]}, 'reduce': {'mode': 'single_node', 'node_task': , 'input_params': {'test_input': 5}}}\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Single Node Reduce\n",
"from graphviper.graph_tools import reduce\n",
"\n",
"def my_sum(graph_inputs, input_params):\n",
" print(graph_inputs)\n",
" return np.sum(graph_inputs / input_params[\"test_input\"])\n",
"\n",
"\n",
"input_params = {}\n",
"input_params[\"test_input\"] = 5\n",
"viper_graph_reduce = reduce(\n",
" viper_graph, my_sum, input_params, mode=\"single_node\"\n",
") # mode \"tree\",\"single_node\"\n",
"\n",
"print(viper_graph_reduce)\n",
"\n",
"dask_graph_reduce = generate_dask_workflow(viper_graph_reduce)\n",
"dask.visualize(dask_graph_reduce)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "d1efd95c",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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Q4fg4+MDhUJxz9G8XC5HSEiIwHQtk52dDY1Gg/r6enzyySetngHEjNe6detARKirq8OPP/4oOo4wXPAmbMOGDcjOzsaWLVswfPhwAIBMJkNdXR0GDRokOF3zZWRkQKPRAPhjat2CBQsEJ2IiXLt2DUePHm3cFy5duoS0tDTBqcTggjdRxcXFmDdvHmbPno1nn30Wu3btwqZNm2Bvbw8bGxv4+/uLjtgsGo0G+fn5jX+uq6vDpk2bkJSUJC4UE2Ljxo33TJFVKpWIjY0VmEgcnkVjosaPH49Dhw4hKysLbdu2bXy9tLQUW7ZswaxZswSma778/Hy4u7vf85pCoYCvry9SU1MlcdMKaxp/f39kZmbeM1PMxcUFBQUFJrcfmNa7ZQCAPXv2IDY2FitWrLin3AHAwcHB6Mod+GNK51+p1WpkZGRg48aNAhIxES5cuICMjIz7pgHfuHEDR48eFZRKHC54E1NRUYF//vOfePnllzF69GjRcbQmNzf3odM+582bh4qKCj0nYiJs2LDhgfuBqZ6m4YI3MQsWLMCdO3fw1VdfiY6iVQ86ggfQeMv6Z599pudETIR169Y98O7suro6xMTEPPTObanigjchycnJWLFiBb788ku0b99edBytyszMfOiHV61W47PPPrvnIiyTntOnTyMvL++hf3/79m3s379fj4nE44I3EbW1tXj11VcREhKCiIgI0XG0ruEu1ochIvzP//yPntIwEWJjY6FSqR7690qlEjExMXpMJB7PojERH330EZYsWYKMjAx069ZNdBytKi8vh62t7UPX15HL5ZDL5aivr8fhw4eNco4/ezSNRoOOHTs2LgH8MBYWFiguLoa1tbWekomlEB2A6V5OTg6ioqIQFRUluXIH/liioKHcFQoFiAj19fWQyWRwdXVF//79ERQUhICAAPTo0UNwWqYLiYmJKCwshJmZWeNUyIYbnf785+rqauzatQsvvviisKz6xAUvcRqNBtOmTYO/vz9ef/110XF0Ijc3FxYWFvD29ka/fv0QGBiIxMREZGVlmewdjKamTZs2WLVq1T2vRUdH486dO/ft97p6mpgh4oKXuGXLliE5ORknTpyQ7AMwnn76aZSXl9/z/mxsbLB9+3bU1tY+8rwsk4agoCAEBQXd89qxY8dQVFSEGTNmCEolHl9klbArV65g4cKFWLBgAXr37i06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06ahc+fOCAsLw4YNGwAAX375JR577DG0a9cOTz75JM6fP9/4dR9++CEGDx6MS5cuPXCb//jHP5p8QXHBggX46quvAAALFy7ElClTAACTJk164JrmUVFRGDx4cOP2p0+fjjlz5uDatWsYP348unbtCg8PD7zyyiv3reVx5swZhIeHw87ODlZWVujfvz/27NnTpJytIZPJoFKpGr+3ulBVVQULCwudbb/B9OnTeb/R035jYWGh032G6d59Bd+w0L9KpdL54L/99htCQkJw7NgxhIaG4siRI5g0aRKeeuopvPPOO+jUqRMGDRqE+Ph4hIeHQ6PRAAC8vb2RlJSErVu33rO9y5cvY926dbC3t4dCcd/lhQfq2LFj4znqzp07N14oPH36NE6fPn3fvz9//jySkpIas6SlpWHXrl3o168frl69inHjxqFz58748ccfMWnSpMavO3jwIAYMGICcnBy8+uqrGD9+PHJzczF69GgcPXq0+f95zWRubq7ThzjU1tbqZZ9JS0vj/UZP+42u9xmmB/QXW7duJQCk0Wj++ldaB4A++eSTxj/v3r2bAJClpSXl5uY2vj558mQC0PhaeXk52djYUJ8+fe7Z3hdffEEAaOfOnc3KsWbNGgJAiYmJja/5+vqSt7f3ff/2lVdeIQBUU1NDRER9+vQhAPTOO+80/p/V19dTUFAQtW3btvHPAQEB1LZtWzp//nzjtrKzs0kmk9GECROalbclnJ2dadmyZTrbvlwup02bNuls+w0a/r95v9H9fjN79mwKCQnR6RhMt+47gm84gqmrq9P5DxczMzPMnz+/8c8BAQEA/lggy8vLq/H1hgWssrKyAADW1tZ49tlncerUqXvm6W7duhVOTk56f9izpaUlPvroo8YnX8nlcgQHB+P27dv4/fffkZqaijNnzmDMmDH33EDm7e2Nb775Bv369dN5Rl0fYSsUCr3sMwDvN/rab/T1WxnTnfsK3tzcHMAf31xd69ix4z07UMM53L8uN2tmZnZfpobznNu2bQPwxwqYycnJeOmll/T+sOd27drdd/654YJjeXk5Lly4AOCP27//as6cOZg7d67OM9bW1jZ+b3VBpVLpZZ8BeL8B9LPf1NbW6uW6CtOd+wq+4Ruqj4srD3uYiFz+yEfFAvhjzWoXF5fGD+q2bdtARJgwYYJWM/7Vg2YVPOqCNBHh5s2b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McYkigueMcYkigueMcYkigueMcYkigueMcYkigueMcYkigueMcYkigueMcYkigueMcYkigueMcYkigueMcYkigueMcYkigueMcYkSqHPwXbv3o2MjAx9DvlIGRkZKC8vx2effSY6SiMPDw+MHTtWdAyDcenSJWzdulV0jEa5ubkAgK+++goqlUpwmv/f22+/DaVSKToGMzAyIiJ9DTZlyhRs2bIF7du319eQ/1+7doirOhRGYfTn5gZBsGDpCJgBCZ5JMB0UFsUwOpIaDB6CQxAUVz317nMvtOysNYGz1Xfaph/ldrvVarWqtm37njIYbdvWZrOpxWJRo9Go7zmD83g86nK51P1+r+l02vccBuatT/BVVev1WsD+Ybvd1vV67XvGIHVdJ2C/+HMBwm98gwcIJfAAoQQeIJTAA4QSeIBQAg8QSuABQgk8QCiBBwgl8AChBB4glMADhBJ4gFACDxBK4AFCCTxAKIEHCCXwAKEEHiCUwAOEEniAUAIPEErgAUIJPEAogQcIJfAAoQQeIJTAA4QSeIBQAg8QSuABQgk8QCiBBwgl8AChBB4glMADhBJ4gFACDxBK4AFCCTxAKIEHCCXwAKEEHiCUwAOEEniAUN/vPvB8Ptdut3v3sR+h67qaz+d9zxik/X5f4/G47xmDczqd+p7AgL018LPZrJ7PZx0Oh3ce+1GWy2XfEwZlMplU0zR1PB77njJYTdPU15eXcf42er1er75HAPD/ufYBQgk8QCiBBwj1XVV+aQEI9ANMy1gtG0pfKAAAAABJRU5ErkJggg==",
"text/plain": [
""
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Tree Reduce\n",
"from graphviper.graph_tools import reduce\n",
"\n",
"def my_sum(graph_inputs, input_params):\n",
" print(graph_inputs)\n",
" return np.sum(graph_inputs) + input_params[\"test_input\"]\n",
"\n",
"\n",
"input_params = {}\n",
"input_params[\"test_input\"] = 5\n",
"viper_graph_reduce = reduce(\n",
" viper_graph, my_sum, input_params, mode=\"tree\"\n",
") # mode \"tree\",\"single_node\"\n",
"\n",
"dask_graph_reduce = generate_dask_workflow(viper_graph_reduce)\n",
"dask.visualize(dask_graph_reduce)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "530eafcf",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"map node_task:
input_params: [{'test_input': 42, 'chunk_indices': (np.int64(0),), 'parallel_dims': ['frequency'], 'data_selection': {'Antennae_North.cal.lsrk.split_0': {'frequency': slice(np.int64(0), np.int64(3), None)}, 'Antennae_North.cal.lsrk.split_1': {'frequency': slice(np.int64(0), np.int64(3), None)}, 'Antennae_North.cal.lsrk.split_2': {'frequency': slice(np.int64(0), np.int64(3), None)}, 'Antennae_North.cal.lsrk.split_3': {'frequency': slice(np.int64(0), np.int64(3), None)}}, 'task_coords': {'frequency': {'data': array([3.43928097e+11, 3.43939328e+11, 3.43950560e+11]), 'dims': 'frequency', 'attrs': {'units': 'Hz', 'type': 'spectral_coord', 'velocity_frame': 'lsrk'}, 'slice': slice(0, 3, None)}}, 'task_id': 0, 'input_data': None, 'date_time': None}, {'test_input': 42, 'chunk_indices': (np.int64(1),), 'parallel_dims': ['frequency'], 'data_selection': {'Antennae_North.cal.lsrk.split_0': {'frequency': slice(np.int64(3), np.int64(6), None)}, 'Antennae_North.cal.lsrk.split_1': {'frequency': slice(np.int64(3), np.int64(6), None)}, 'Antennae_North.cal.lsrk.split_2': {'frequency': slice(np.int64(3), np.int64(6), None)}, 'Antennae_North.cal.lsrk.split_3': {'frequency': slice(np.int64(3), np.int64(6), None)}}, 'task_coords': {'frequency': {'data': array([3.43961791e+11, 3.43973023e+11, 3.43984254e+11]), 'dims': 'frequency', 'attrs': {'units': 'Hz', 'type': 'spectral_coord', 'velocity_frame': 'lsrk'}, 'slice': slice(3, 6, None)}}, 'task_id': 1, 'input_data': None, 'date_time': None}, {'test_input': 42, 'chunk_indices': (np.int64(2),), 'parallel_dims': ['frequency'], 'data_selection': {'Antennae_North.cal.lsrk.split_0': {'frequency': slice(np.int64(6), np.int64(8), None)}, 'Antennae_North.cal.lsrk.split_1': {'frequency': slice(np.int64(6), np.int64(8), None)}, 'Antennae_North.cal.lsrk.split_2': {'frequency': slice(np.int64(6), np.int64(8), None)}, 'Antennae_North.cal.lsrk.split_3': {'frequency': slice(np.int64(6), np.int64(8), None)}}, 'task_coords': {'frequency': {'data': array([3.43995486e+11, 3.44006717e+11]), 'dims': 'frequency', 'attrs': {'units': 'Hz', 'type': 'spectral_coord', 'velocity_frame': 'lsrk'}, 'slice': slice(6, 8, None)}}, 'task_id': 2, 'input_data': None, 'date_time': None}]
reduce mode: tree
node_task:
input_params test_input: 5
"
],
"text/plain": [
""
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"toolviper.utils.display.DataDict.html(viper_graph)"
]
},
{
"cell_type": "markdown",
"id": "717022f0-fed9-461a-9943-ea6f31714249",
"metadata": {},
"source": [
"### Run Map Reduce Graph"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "199eb981-3852-40d6-915c-70cc63818677",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"******************************\n",
"******************************\n",
"[42, 42]\n",
"******************************\n",
"[np.int64(89), 42]\n"
]
},
{
"data": {
"text/plain": [
"(np.int64(136),)"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dask.compute(dask_graph_reduce)"
]
},
{
"cell_type": "markdown",
"id": "afc73f79",
"metadata": {},
"source": [
"## Data Loading Layer\n",
"\n",
"In the examples above each map node reads only its own small slice of data\n",
"from disk. This is efficient when the on-disk zarr chunk size matches the\n",
"map partition size exactly, but in practice the two rarely align.\n",
"\n",
"**Example:** a zarr store with 200 frequency channels per chunk and a map\n",
"graph with 2 channels per task will cause 100 map nodes to open the same\n",
"compressed chunk on disk — decompressing it 100 times instead of once.\n",
"\n",
"The **data loading layer** solves this by inserting shared *load nodes*\n",
"between the input store and the map nodes:\n",
"\n",
"```\n",
"disk store\n",
" │\n",
" [load node] ← reads one full zarr chunk (e.g. 200 channels), shared by\n",
" │ │ all map tasks that fall inside that chunk\n",
" │ │\n",
" [prepare] [prepare] … ← sub-selects each task's 2-channel slice (in memory)\n",
" │ │\n",
" [map task] [map task] … ← receives pre-loaded data via input_params[\"input_data\"]\n",
"```\n",
"\n",
"Only the dimensions listed in `disk_chunk_sizes` are coalesced this way;\n",
"all other dimensions are handled exactly as before."
]
},
{
"cell_type": "markdown",
"id": "1d8007b5",
"metadata": {},
"source": [
"### Detect Native Disk Chunk Sizes\n",
"\n",
"`get_disk_chunk_sizes` inspects the dask chunk metadata on the coordinate\n",
"arrays of a lazily-opened zarr store to find the native compression chunk\n",
"size for each parallel dimension."
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "db977ea6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Native on-disk chunk sizes: {'frequency': 8}\n",
"Map tasks: 9 | Zarr chunks per dim: {'frequency': 1}\n"
]
}
],
"source": [
"from graphviper.graph_tools.coordinate_utils import (\n",
" make_parallel_coord,\n",
" interpolate_data_coords_onto_parallel_coords,\n",
" get_disk_chunk_sizes,\n",
")\n",
"from graphviper.graph_tools.map import map\n",
"from graphviper.graph_tools.generate_dask_workflow import generate_dask_workflow\n",
"\n",
"# Re-open the processing set with dask backend so chunk info is available.\n",
"from xradio.measurement_set import open_processing_set\n",
"\n",
"ps_xdt = open_processing_set(\n",
" ps_store=ps_store,\n",
" scan_intents=[\"OBSERVE_TARGET#ON_SOURCE\"],\n",
")\n",
"\n",
"# Use more map tasks than zarr chunks to create a mismatch (realistic scenario).\n",
"n_chunks = 9\n",
"parallel_coords = {}\n",
"parallel_coords[\"frequency\"] = make_parallel_coord(\n",
" coord=ms_xds.frequency, n_chunks=n_chunks\n",
")\n",
"\n",
"disk_chunk_sizes = get_disk_chunk_sizes(ps_xdt, parallel_coords)\n",
"print(\"Native on-disk chunk sizes:\", disk_chunk_sizes)\n",
"print(f\"Map tasks: {n_chunks} | Zarr chunks per dim: { {dim: len(ps_xdt[list(ps_xdt.children)[0]][dim]) // sz for dim, sz in disk_chunk_sizes.items()} }\")"
]
},
{
"cell_type": "markdown",
"id": "2f01a7cd",
"metadata": {},
"source": [
"### Define a Load Task\n",
"\n",
"The load task is an ordinary Python function called once per unique disk\n",
"chunk. It receives `load_params` containing:\n",
"\n",
"- `\"input_data_store\"` — path to the zarr store\n",
"- `\"data_selection\"` — `{xds_name: {dim: slice}}` at disk-chunk granularity\n",
"- any extra keys passed via `load_node_input_params`\n",
"\n",
"It must return a `dict` mapping dataset names to loaded `xarray.Dataset`\n",
"objects. Each map task then receives its own sub-slice of that dict via\n",
"`input_params[\"input_data\"]`."
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "0aaa679d",
"metadata": {},
"outputs": [],
"source": [
"def load_data_chunk(load_params):\n",
" \"\"\"Load one native zarr chunk of the processing set.\"\"\"\n",
" from xradio.measurement_set import load_processing_set\n",
"\n",
" return load_processing_set(\n",
" ps_store=load_params[\"input_data_store\"],\n",
" sel_parms=load_params[\"data_selection\"],\n",
" )"
]
},
{
"cell_type": "markdown",
"id": "031fc619",
"metadata": {},
"source": [
"### Build the Graph with the Load Layer\n",
"\n",
"Pass `data_loading_task` and `disk_chunk_sizes` to `map()`. Everything\n",
"else — `node_task`, `input_params`, reduce — stays unchanged."
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "402bbbc0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Load nodes : 1 (one per zarr chunk group)\n",
"Map nodes : 8 (one per parallel_coords chunk)\n",
"Load node IDs per map task: [0, 0, 0, 0, 0, 0, 0, 0]\n"
]
}
],
"source": [
"node_task_data_mapping = interpolate_data_coords_onto_parallel_coords(\n",
" parallel_coords, ps_xdt\n",
")\n",
"\n",
"def my_func(input_params):\n",
" # input_params[\"input_data\"] is pre-populated by the load layer.\n",
" # No disk read happens here.\n",
" ps = input_params[\"input_data\"]\n",
" freq_sum = 0.0\n",
" for xds in ps.values():\n",
" freq_sum += float(xds.frequency.values.sum())\n",
" return freq_sum\n",
"\n",
"input_params = {\"input_data_store\": ps_store, \"test_input\": 42}\n",
"\n",
"viper_graph = map(\n",
" input_data=ps_xdt,\n",
" node_task_data_mapping=node_task_data_mapping,\n",
" node_task=my_func,\n",
" input_params=input_params,\n",
" data_loading_task=load_data_chunk,\n",
" disk_chunk_sizes=disk_chunk_sizes,\n",
")\n",
"\n",
"n_load = len(viper_graph[\"load\"][\"input_params\"])\n",
"n_map = len(viper_graph[\"map\"][\"input_params\"])\n",
"print(f\"Load nodes : {n_load} (one per zarr chunk group)\")\n",
"print(f\"Map nodes : {n_map} (one per parallel_coords chunk)\")\n",
"print(f\"Load node IDs per map task: {viper_graph['map']['load_node_ids']}\")"
]
},
{
"cell_type": "markdown",
"id": "f1b22992",
"metadata": {},
"source": [
"### Visualise and Run\n",
"\n",
"The graph visualisation shows the three-stage structure: load → prepare →\n",
"map. Tasks that share the same load node ID share a single disk read."
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "9055dbda",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAB9MAAAcmCAYAAACyxIV+AAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdeZSV9YHm8aeoKnYXZGl3QVBwEMkAoyyCFG4R9yUu7CYuidrRSZt2cjxJaNOmjTMxmkhHE9MdKBREwA1QNFIobq0IGFwCwSjgTjBqJGG/80d3OG1pjEDBC1WfzzmcI5db934v/lU89XvfslKpVAoAAAAAAAAA8Bc3Nyq6AAAAAAAAAAB2NMZ0AAAAAAAAAKjFmA4AAAAAAAAAtVQUHQAAAMDOZ8OGDZkyZUrRGTu8/v37Z6+99io6AwAAANgCZaVSqVR0BAAAADuXVatWpWXLlkVn7PCmTZuWE088segMAAAAYPPd7DLvAAAAbLFp06alVCr5VevXRx99VPT/GgAAAGArGdMBAAAAAAAAoBZjOgAAAAAAAADUYkwHAAAAAAAAgFqM6QAAAAAAAABQizEdAAAAAAAAAGoxpgMAAAAAAABALcZ0AAAAAAAAAKjFmA4AAAAAAAAAtRjTAQAAAAAAAKAWYzoAAAAAAAAA1GJMBwAAAAAAAIBajOkAAAAAAAAAUIsxHQAAAAAAAABqMaYDAAAAAAAAQC3GdAAAAAAAAACoxZgOAAAAAAAAALUY0wEAAAAAAACgFmM6AAAAAAAAANRiTAcAAAAAAACAWozpAAAAAAAAAFCLMR0AAAAAAAAAajGmAwAAAAAAAEAtxnQAAAAAAAAAqMWYDgAAAAAAAAC1GNMBAAAAAAAAoBZjOgAAAAAAAADUYkwHAAAAAAAAgFqM6QAAAAAAAABQizEdAAAAAAAAAGoxpgMAAAAAAABALcZ0AAAAAAAAAKjFmA4AAAAAAAAAtRjTAQAAAAAAAKAWYzoAAAAAAAAA1GJMBwAAAAAAAIBajOkAAAAAAAAAUIsxHQAAAAAAAABqMaYDAAAAAAAAQC3GdAAAAAAAAACoxZgOAAAAAAAAALUY0wEAAAAAAACgFmM6AAAAAAAAANRiTAcAAAAAAACAWozpAAAAAAAAAFCLMR0AAAAAAAAAaqkoOgAAAICd1+OPP55Vq1YVnbHDWbNmTdEJAAAAwFYypgMAALDFrrvuuqITAAAAALYJYzoAAACbrUWLFimVSkVnfMw//MM/5Prrr095eXnRKQAAAEA94J7pAAAA7PRWrVqVW2+9NXPmzCk6BQAAAKgnjOkAAADs9O69996sWrUqd9xxR9EpAAAAQD1hTAcAAGCnd/vttydJ7rzzzqxdu7bgGgAAAKA+MKYDAACwU3vvvffy0EMPJUn++Mc/bvpvAAAAgK1hTAcAAGCndtddd6VUKiVJysvLN51SBwAAANgaxnQAAAB2atXV1ZvG9PXr1+fuu+/ORx99VHAVAAAAsLMzpgMAALDTevPNN/Pkk09m48aNmx5bt25d7r///gKrAAAAgPrAmA4AAMBO64477kh5efnHHisrK8v48eMLKgIAAADqi7LSX66FBwAAADuZww47LC+88EJqf2tbXl6ed955J61bty6oDAAAANjJ3exkOgAAADulRYsWZeHChZ8Y0v9i6tSp27kIAAAAqE+M6QAAAOyUJkyYkMrKyk/9s1KplHHjxm3nIgAAAKA+cZl3AAAAdkoHHnhgXn311b/652VlZVm2bFn23Xff7VgFAAAA1BMu8w4AAMDOZ+7cuZ85pCdJRUVFJk2atJ2KAAAAgPrGmA4AAMBOZ+LEiSkrK/vM56xbty5jx47dTkUAAABAfVNRdAAAAABsrpUrV2bAgAGbfr9x48bMmTMn3bp1yx577LHp8YqKiqxcuTKtW7cuIhMAAADYiblnOgAAADu9VatWpWXLlpk2bVpOPPHEonMAAACAnZ97pgMAAAAAAABAbcZ0AAAAAAAAAKjFmA4AAAAAAAAAtRjTAQAAAAAAAKAWYzoAAAAAAAAA1GJMBwAAAAAAAIBajOkAAAAAAAAAUIsxHQAAAAAAAABqMaYDAAAAAAAAQC3GdAAAAAAAAACoxZgOAAAAAAAAALUY0wEAAAAAAACgFmM6AAAAAAAAANRiTAcAAAAAAACAWozpAAAAAAAAAFCLMR0AAAAAAAAAajGmAwAAAAAAAEAtxnQAAAAAAAAAqMWYDgAAAAAAAAC1GNMBAAAAAAAAoBZjOgAAAAAAAADUYkwHAAAAAAAAgFqM6QAAAAAAAABQizEdAAAAAAAAAGoxpgMAAAAAAABALcZ0AAAAAAAAAKjFmA4AAAAAAAAAtRjTAQAAAAAAAKAWYzoAAAAAAAAA1FJRdAAAAABsjtWrV+e9997LypUr8/vf/z4bNmzIihUrkiSPP/54GjdunLKysuyxxx5p3bp1WrdunZYtWxZcDQAAAOxsykqlUqnoCAAAAKjtjTfeyIIFC7Jw4cIsXLgwr776al577bW89dZbm/1abdu2TZcuXdK5c+ccfPDB6dy5cw455JB06tQpZWVl26AeAAAA2MndbEwHAABgh/DOO+9k9uzZmTVrVmpqavLb3/42SXLAAQeka9eu6dSpUzp06JD27dunbdu2m06dV1RUZNddd015eXmS5P3330+pVMrKlSs3nV5fsmRJFi1alMWLF2fx4sVZvnx5kqRdu3apqqpKVVVVBg0alIMOOqiwzw8AAADsUIzpAAAAFGfhwoWprq7OjBkz8tJLL6W8vDz/63/9rwwaNCgDBw5Mr169svvuu9f5+3700Ud56aWX8thjj2XWrFmZM2dOPvroo+y777457rjjMmTIkFRVVaVRo0Z1/t4AAADATsGYDgAAwPb1zjvvZMKECRk3blzmz5+f9u3b58wzz8ygQYPSv3//7LLLLtu9af369fmP//iP1NTU5P77788zzzyT/fbbL0OHDs2IESNyyCGHbPcmAAAAoFDGdAAAALaPmpqa3HDDDXnwwQfTokWLnHXWWRkxYkT69++/w923/De/+U2qq6szfvz4LFu2LL169crf//3fZ8iQIamoqCg6DwAAANj2bna9OgAAALaZUqmU6dOnp1+/fhk0aFBWrVqV6urqvPXWW7ntttsyYMCAHW5IT5IuXbrk2muvzauvvppZs2alS5cuueCCC3LwwQfnlltuyZo1a4pOBAAAALYxYzoAAAB1buPGjZk8eXJ69uyZk08+Oa1atcqTTz6ZWbNm5dxzz02zZs2KTvxcGjVqlKqqqlRXV2fx4sU54YQT8r//9//OgQcemB/96EdZtWpV0YkAAADANmJMBwAAoE49//zz6d+/f84555zss88+eeaZZzJt2rT06dOn6LSt0r59+4wZMyZLly7NhRdemH/6p3/KwQcfnHHjxhWdBgAAAGwDxnQAAADqxAcffJCvf/3r6dmzZ8rKyjJ//vzcf//96dWrV9Fpdapdu3YZPXp0Fi9enGOPPTajRo3K4MGDs2TJkqLTAAAAgDpkTAcAAGCr3X777enSpUsmTpyY2267LXPmzMlhhx1WdNY21a5du/zyl7/Mo48+mtdffz3dunXL6NGjs3r16qLTAAAAgDpgTAcAAGCLffjhhznvvPMyfPjwHHvssXnppZcyatSolJWVFZ223fTv3z/z5s3Lddddlx/96Efp2bNnXnzxxaKzAAAAgK1kTAcAAGCLzJs3Lz179sysWbPy4IMPZty4cWnTpk3RWYWoqKjI5ZdfnoULF2a33XZL7969c/vttxedBQAAAGwFYzoAAACb7Wc/+1n69u2b/fbbLwsWLMhxxx1XdNIOYf/9989jjz2WSy+9NMOHD8+IESPypz/9qegsAAAAYAsY0wEAAPjcVq9enbPPPjuXXHJJrr766vzqV7/KXnvtVXTWDqWioiLXXXddpk6dmmnTpqVPnz5Zvnx50VkAAADAZiorlUqloiMAAADY8X3wwQc59dRT8/zzz2fq1KmpqqoqOmmH99prr+Wkk07Khx9+mJkzZ+aQQw4pOgkAAAD4fG52Mh0AAIC/6Z133klVVVUWLVqUmpoaQ/rn1L59+8yZMycHHHBA+vXrlyeeeKLoJAAAAOBzMqYDAADwmV599dX0798/H3zwQebMmZMvfOELRSftVFq1apVf/epXGTRoUI477rhMnz696CQAAADgczCmAwAA8FctWbIkffv2zW677Zann346nTp1Kjppp9SkSZNMnDgx55xzTk4//fTcc889RScBAAAAf0NF0QEAAADsmN56660cd9xx2W+//fLII49kl112KTppp1ZRUZFf/OIXady4cc4777zMnDkzAwYMKDoLAAAA+CvKSqVSqegIAAAAdiwffvhhBg4cmD/+8Y95/PHH83d/93dFJ9UbGzduzLnnnpuZM2dm9uzZ+Z//838WnQQAAAB80s0u8w4AAMDHrF69OieffHLeeeedPPzww4b0OtaoUaOMHz8+RxxxRL74xS/mt7/9bdFJAAAAwKcwpgMAALBJqVTKsGHDsnDhwsycOTPt27cvOqleaty4ce66667svffeOfHEE/OHP/yh6CQAAACgFmM6AAAAm/zoRz/Kvffem7vvvjuHHnpo0Tn12m677ZYHHnggq1atyle+8pW4CxsAAADsWIzpAAAAJEmeffbZfOtb38r3vve9HHXUUUXnNAh77rlnJkyYkPvvvz8/+clPis4BAAAA/puykh99BwAAaPDef//99OjRI507d8706dPTqJGfvd6e/vmf/znXXHNNHnvssfTu3bvoHAAAACC52ZgOAADQwJVKpZx55pl55plnMn/+/LRt27bopAZn48aNOeGEE7Jo0aLMmzcve+yxR9FJAAAA0NDd7KgBAABAA/fv//7vue+++zJhwgRDekEaNWqU6urqrF27NldeeWXROQAAAEBc5h0AAKBBe++999KlS5cMGTIkN954Y9E5Dd7kyZNz9tlnp6amxn3rAQAAoFgu8w4AANCQXXzxxbnvvvvy8ssvZ/fddy86hyQnnnhili1blnnz5qWysrLoHAAAAGioXOYdAACgoZo7d25uu+223HDDDYb0HchNN92UJUuWZMyYMUWnAAAAQIPmZDoAAEADtHHjxvTp0ydNmzbN7NmzU1ZWVnQS/813vvOd3HjjjXn55Zezzz77FJ0DAAAADZGT6QAAAA3R+PHjM3/+/Nxyyy2G9B3Qt771rbRp0ybXXHNN0SkAAADQYDmZDgAA0MBs3Lgxhx12WHr16pVf/vKXRefwV/z85z/PpZdemiVLlmT//fcvOgcAAAAaGifTAQAAGpqpU6fm5Zdfzje/+c2iU/gMo0aNyt57750bbrih6BQAAABokIzpAAAADcx1112XM888M127di06hc9QWVmZb3zjG7n11lvz1ltvFZ0DAAAADY4xHQAAoAGZMWNGnnvuuVx11VVFp/A5XHTRRWnVqlV+/OMfF50CAAAADY57pgMAADQggwYNSvPmzTNt2rSiU/icrr/++lx77bV5880306JFi6JzAAAAoKFwz3QAAICGYunSpXn00Ufz1a9+tegUNsNXvvKVrF69Ovfcc0/RKQAAANCgGNMBAAAaiHHjxqVNmzY5/vjji05hM7Ru3Tpf/OIXU11dXXQKAAAANCjGdAAAgAbi9ttvz5AhQ1JZWVl0Cptp+PDhefjhh/P6668XnQIAAAANhjEdAACgAXjqqaeyaNGiDB8+vOgUtsApp5ySVq1aZeLEiUWnAAAAQINhTAcAAGgAxo8fn65du6ZHjx5Fp7AFGjdunLPOOsul3gEAAGA7MqYDAAA0ANOmTcuXvvSlojPYCl/60pfy61//OsuWLSs6BQAAABoEYzoAAEA9t2TJkixbtixHH3100SlshX79+qVp06apqakpOgUAAAAaBGM6AABAPVdTU5PmzZvn8MMPLzqFrdC0adP06dPHmA4AAADbiTEdAACgnqupqUn//v3TuHHjolPYSlVVVZk1a1bRGQAAANAgGNMBAADqsVKplJqamlRVVRWdQh0YNGhQli9fniVLlhSdAgAAAPWeMR0AAKAeW7RoUd5++21jej1x+OGHp2XLli71DgAAANuBMR0AAKAee+6551JZWZkvfOELRadQByorK9O9e/csWLCg6BQAAACo94zpAAAA9djChQtzyCGHuF96PdKtW7f8+te/LjoDAAAA6j1jOgAAQD32wgsv5NBDDy06gzrUrVu3vPDCC0VnAAAAQL1nTAcAAKjHfve73+Wggw4qOoM61KlTp7z//vt57733ik4BAACAes2YDgAAUE+VSqUsXbo0BxxwQNEp1KEOHTokSV577bViQwAAAKCeM6YDAADUUytWrMif/vSntG/fvugU6tABBxyQRo0a5dVXXy06BQAAAOo1YzoAAEA99e677yZJ/u7v/q7gEupS48aNs/vuu2fFihVFpwAAAEC9ZkwHAACop1auXJkkadOmTcEl1LU2bdps+v8LAAAAbBvGdAAAgHrqvffeS5LsscceBZdQ11q3bm1MBwAAgG3MmA4AAFBP/fnPf05lZWUqKiq2+XuNHDkyS5YsyQUXXJD99tsvgwYNyvjx45MkN9xwQ3r27Jl27drlhBNOyG9/+9tNX/ed73wn/fv3z+9+97tPfc3jjz8+69ev/9wdq1evzne/+9107NgxTZo0yUEHHZSLL744f/zjHzc9Z8SIERk2bNgnvva6665L//79N73fhRdeuMWfa1tr1qxZVq9evd3eDwAAABoiYzoAAEA9tWbNmjRu3Hi7vNdDDz2Uo446Kk899VSqqqryxBNPZMSIERk8eHCuuuqq7LvvvjnyyCMza9asHHPMMdm4cWOSpEuXLnn88cdz1113fez1li5dmnHjxqVVq1ab9cMAl1xySa699toMGDAg//f//t8MHjw41dXVOf744zc957nnnstzzz33ia/97W9/m8cff3xT24IFC7b4c21rjRs3zpo1a7bLewEAAEBDZUwHAACop9atW5fKysrt8l5vv/12Lrnkkrz44osZN25c7rnnnpRKpcyePTsvvvhi7r333kydOjXnnXdeli1bliVLliRJTj311LRs2TKTJ0/+2OtNmTIlST71BPlfs2bNmowfPz4nnnhi/v3f/z1f//rXc9NNN+W6667LU089lcWLF2+3z7WtNWnSxJgOAAAA25gxHQAAoJ4qLy/fbiely8vL881vfnPT77t3754kGTRoUA4++OBNjw8cODBJ8tJLLyVJWrRokdNPPz1z587Na6+9tul5d911V9q0afOxE+V/y4YNG5Iks2fPzvz58zc9ftlll+Wjjz5Kx44dt9vn2tbWr1+/XS7fDwAAAA2ZMR0AAKCeaty4cdauXbtd3mvvvff+2CXlmzZtuunx/668vDxJPtb1l9Pnfzmdvnz58vzHf/xHzjnnnM06Wd+8efN897vfzYcffpgePXrkf/yP/5FLL700DzzwQJo0abLpvbfX59qW1qxZkyZNmmyX9wIAAICGypgOAABQTzVt2jRr1qxJqVTa5u/VokWLT328UaO//W3n0UcfnT333HPTmD558uSUSqUMHTp0szuuvvrqLFmyJN/+9rfTvHnz3HLLLTnppJPStWvXvP3225/5te+9994nHtuaz7UtrV271pgOAAAA25gxHQAAoJ7abbfdUiqV8uGHHxad8pnKy8tz7rnn5plnnsny5ctz1113pWPHjunTp89mvc7atWvz/vvvp3379rnmmmsyd+7cvPHGG7nsssuyePHi/OQnP0mSlJWVferl7xctWlQnn2d7eO+999KqVauiMwAAAKBeM6YDAADUU23atEmS/P73vy+45G8bNmxYSqVSbrzxxjz99NMZPnz4Zr/GrFmz0qpVq0yYMGHTY3vuueeme57/4Q9/SJK0b98+r732WtatW7fpeS+++GKWLFmylZ9i+1m5cmVat25ddAYAAADUa8Z0AACAeuovY+uKFSsKLvnbevbsmS5duuTGG29MkowYMWKzX6Nfv35p165drrnmmsyePTsffPBBnnvuuVxxxRVJkhNPPDFJcsQRR2Tt2rUZNWpUZs+endtuuy2nnXZadtttt7r7QNtQqVTKypUrs8ceexSdAgAAAPWaMR0AAKCe2meffVJZWZlXX3216JTPZdiwYdm4cWOOPfbYdOjQYbO/fpdddsntt9+eVatWpaqqKrvvvnt69eqVBx54INdee+2mMf0f/uEfcsIJJ+SOO+5IVVVVRo8enbPOOisXXHBBXX+kbeL111/P2rVrt+jvCAAAAPj8ykqlUqnoCAAAALaNLl265Nxzz83o0aOLTvmb7r777pxxxhmZMmVKzjjjjC1+nT/96U/59a9/nWXLlqVNmzY59NBD065du088b8WKFXnjjTfSvXv3lJWVbU36dvWrX/0qxx57bFasWLHpUv4AAABAnbu5ougCAAAAtp3OnTtn0aJFRWd8Lr/4xS+yzz775JRTTvnY45dccsnn+vrhw4enT58+ad68eXr37p3evXt/5vPbtm2btm3bbnFvURYtWpQ99tjDkA4AAADbmDEdAACgHuvSpUsefvjhojM+07XXXps33ngjM2bMyI9//ONUVHz8W9WqqqrP9Tp77bXXtsjb4SxatChdunQpOgMAAADqPWM6AABAPda5c+eMGTMmpVJph72U+c9+9rN89NFHueCCC3LRRRd94s+/9KUvFVC141q0aFE6d+5cdAYAAADUe8Z0AACAeqxz585ZtWpVli5dmvbt2xed86mWLl1adMJO5eWXX86gQYOKzgAAAIB6r1HRAQAAAGw7PXv2TNOmTfPYY48VnUId+N3vfpfly5enT58+RacAAABAvWdMBwAAqMeaNm2a3r17p6ampugU6sCsWbPSvHnzHHHEEUWnAAAAQL1nTAcAAKjnqqqq8sgjjxSdQR2oqanJkUcemSZNmhSdAgAAAPWeMR0AAKCeGzRoUJYvX55XXnml6BS20uzZs1NVVVV0BgAAADQIxnQAAIB67vDDD0+LFi0ya9asolPYCi+99FLefPPNDBo0qOgUAAAAaBCM6QAAAPVc48aNc9RRR2XatGlFp7AVpk+fnj322CM9evQoOgUAAAAaBGM6AABAA3DeeeflgQceyIoVK4pOYQtVV1fn7LPPTkVFRdEpAAAA0CAY0wEAABqAM844I02bNs3EiROLTmELzJ8/PwsXLszw4cOLTgEAAIAGw5gOAADQADRv3jxnnHFGqquri05hC1RXV6djx47p06dP0SkAAADQYBjTAQAAGojhw4fn2WefzYsvvlh0Cpth/fr1mTBhQoYPH56ysrKicwAAAKDBMKYDAAA0EFVVVdlvv/0ybty4olPYDA8++GDeeeedDBs2rOgUAAAAaFCM6QAAAA1Eo0aN8rWvfS233npr3n///aJz+Jyuv/76HH/88enYsWPRKQAAANCgGNMBAAAakEsvvTSNGjXKmDFjik7hc3j00UczZ86cXH311UWnAAAAQINTViqVSkVHAAAAsP18+9vfzk9/+tO89tpradmyZdE5fIbjjjsu69atS01NTdEpAAAA0NDc7GQ6AABAA3PFFVdkzZo1+fnPf150Cp/hmWeeycMPP+xUOgAAABTEyXQAAIAG6Morr8yECROyZMmSNGvWrOgcPsUpp5ySd999N08//XTRKQAAANAQOZkOAADQEF155ZX56KOP8v3vf7/oFD7FzJkzc//99+d73/te0SkAAADQYDmZDgAA0EDdeOONueqqq/LrX/86nTt3LjqH/7JmzZp079493bp1y1133VV0DgAAADRUNxvTAQAAGqgNGzakV69eadu2bR566KGic/gv11xzTX7wgx/kpZdeygEHHFB0DgAAADRULvMOAADQUJWXl+fWW2/NI4884gT0DmLp0qX5wQ9+kH/6p38ypAMAAEDBnEwHAABo4L7yla9k5syZWbhwYVq1alV0ToNVKpUyePDgLF++PPPnz09lZWXRSQAAANCQOZkOAADQ0F1//fVJkvPPPz9+3ro4P/zhD/PII4/k5z//uSEdAAAAdgDGdAAAgAaudevWmTx5cmbMmJGbbrqp6JwG6ZlnnsnVV1+df/7nf06fPn2KzgEAAADiMu8AAAD8l+9///sZPXp0Hn30UYPudvSHP/whPXr0yCGHHJLp06enrKys6CQAAAAgudmYDgAAQJJk48aNGTx4cF5++eXMmzcvrVu3Ljqp3iuVSjnjjDMyd+7czJ8/P23atCk6CQAAAPhP7pkOAADAf2rUqFGqq6uzYcOGnHPOOVmzZk3RSfXe1VdfnWnTpmXChAmGdAAAANjBGNMBAADYpG3btnnggQcyb968nHvuudmwYUPRSfXWv/7rv+a6667LrbfemiOPPLLoHAAAAKAWYzoAAAAf061bt9x999158MEHc9lllxWdUy9NnDgxf//3f5/zzjsvgwYNKjoHAAAA+BTGdAAAAD7hqKOOyp133pnbbrst3/ve94rOqVdmzZqVUaNG5Wtf+1pGjRqVjh075uijj85dd92VtWvXFp0HAAAA/Jfy0aNHjy46AgAAgB1P586d065du3zzm99Ms2bN0q9fv6KTdnqPPPJITjvttJx++un5+c9/nk6dOuXZZ5/NQw89lLvuuis/+clPsnLlyuy///7uoQ4AAADFeqasVCqViq4AAABgx3XTTTflG9/4Rq644or8v//3/1JWVlZ00k7pzjvvzIgRI3LmmWdm7NixqaysTJK88sorOeSQQ7Ju3bokSWVlZdatW5fu3bvnkksuydChQ9OiRYsi0wEAAKAhutll3gEAAPhMl19+eSZNmpQxY8Zk+PDhm0ZfPr8xY8ZkyJAhueiiizJ+/PhNQ3qSdOzYMVdccUUqKiqSZNPf78KFC/O1r30t7dq1y8UXX5x58+YV0g4AAAANlZPpAAAAfC6zZs3K6aefnsMPPzxTp07NLrvsUnTSTuEHP/hBvvWtb+U73/lO/tqd1v74xz/mwAMPzMqVK/Np36b/5bR6t27d8pWvfCXDhw/PHnvssY3LAQAAoEG72ZgOAADA5zZ37twMHjw4bdq0ya7jneMAACAASURBVKRJk3LooYcWnbTD+vDDD3PhhRdmypQp+elPf5oLL7zwM5//i1/8IhdddFE2btz4V5/TqFGjlJWVpbKyMv/yL/+SK664oq6zAQAAgP/kMu8AAAB8fr169crcuXPTqlWrHH744bntttuKTtohPffcc+nRo0dmz56dBx544G8O6Uly/vnnp2vXrpsu9/5p/jK0t2rVKuecc06d9QIAAACfZEwHAABgs+y///559NFH84//+I+5+OKLM2LEiKxatarorB3Gz372s/Tt2zcHHHBAnn/++Rx77LGf6+saNWqUW265JRs2bPjM5zRu3DgPPPBA9tprr7pKBgAAAD6FMR0AAIDNVlFRkdGjR+fuu+/O9OnTc8QRR+Tpp58uOqtQy5cvzymnnJJLL7003/nOd/Lwww9nzz333KzX6Nu3b84666xUVlb+1edMmjQp3bt339pcAAAA4G8wpgMAALDFTjnllMybNy977bVX+vXrlwsvvDArV64sOmu7WrduXa6//voccsghWbRoUWbNmpWrr746jRpt2bfcN9xwQ8rLyz/1z/bbb7/06tVra3IBAACAz8mYDgAAwFY54IAD8vDDD+eee+7JQw89lIMOOig33XTTZ16uvL547LHH0qNHj4wePTpXXnllnn/++fTv33+rXnPffffNP/7jP37s3umNGjXKRRddlGbNmqVXr15ZsGDB1qYDAAAAf4MxHQAAgDpx8skn54UXXsj555+fK6+8Mn379s2MGTNSKpWKTqtzCxcuzNlnn52BAwemQ4cOefHFFzN69Og0bdq0Tl7/qquuSuvWrVNWVpaKioqceuqp+elPf5onn3wyBx10UAYMGJAZM2bUyXsBAAAAn86YDgAAQJ3ZZZdd8sMf/jDz5s1L27Ztc9JJJ6VXr16ZMmVKNm7cWHTeVnv22Wdz2mmnpXv37lm0aFHuvffe3HfffenQoUOdvk/z5s1zww03pFQq5Qtf+EJuv/32NGrUKK1atcrMmTNz2mmnbRrYAQAAgG3DmA4AAECd69atW6ZNm5bnnnsuBx54YM4+++x069Yt1dXVWbNmTdF5m6VUKqWmpibHH398Dj/88Lz99tu59957s2DBgpx88snb7H3PO++8DBs2LNOnT0+zZs02Pd64ceOMHTs2V199dS699NJcfvnl9eIHFQAAAGBHU1aqj9fbAwAAYIfyyiuv5Prrr8+//du/pUWLFjnllFMyYsSIHH300SkrKys671MtXbo0EydOzG233ZYlS5akX79+ueqqq7bpgL657rzzzowaNSonnnhiqqurPza6AwAAAFvlZmM6AAAA282bb76ZO+64I+PGjcvChQvTsWPHDBs2LGeddVa6du1a+LD++uuv57777sv48ePz1FNPZe+9986QIUMyYsSIdOvWrdC2v+aJJ57Iaaedlk6dOuXee+9Nu3btik4CAACA+sCYDgAAwPY3ZcqUtGzZMjU1NRk3blzeeuuttG3bNgMHDky/fv1y5JFHpmfPntu8Y8WKFXn66afzxBNP5Fe/+lXmzZuXJk2a5OSTT87w4cNzwgknpKKiYpt3bK0lS5bkxBNPzPr16zN9+vR06dKl6CQAAADY2RnTAQAA2L7mzp2bAQMG5OWXX84BBxyQDRs2ZP78+Zk1a1ZqamoyZ86crFq1Kvvtt1969eqVQw89NN26dUvHjh3ToUOHtGrVarPf88MPP8yiRYuyePHi/OY3v8nixYvz4osv5qWXXkp5eXl69eqVQYMGpaqqKv369dspL5e+cuXKnH766XnhhRcyderUDBw4sOgkAAAA2JkZ0wEAANh+3nzzzfTo0SPvvPNO3njjjey9996feM66devyzDPPZPbs2VmwYEEWLlyYJUuWZMOGDUmSXXfdNXvuuWdat26dNm3apGnTpikvL8+uu+6aP/3pT1mzZk3Wr1+f3//+91m5cmVWrFiRFStWJEkaN26cTp06pUuXLuncuXP69u2bo446Krvssst2/XvYVtasWZPzzz8/U6ZMyW233Zbhw4cXnQQAAAA7q5t3/GvVAQAAUC/8+c9/zkknnZR33303yX8O25+msrIy/fr1S79+/TY9tmbNmrz22mt59dVXs2zZsrz77rtZuXJlVq5cmdWrV2ft2rX53e9+l+bNm6dJkyZp2rRpunfvntatW6d169bp2LFjDj744HTo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V07gb968WRkZGapZs6YGDBigiIgINWnSpNje31Xk5uZq+vTpevHFF9WoUSPNmzdPbdq0MR0LAFAEvvvuO7Vr105t27bVypUr5eXlVezvSf8DAAAAcEKM6QAAADDv8uXLWr58uRYuXKh169apbNmy6tu3rx599FHdd999KlWqlLFseXl52r17txISErRw4UIdP35cLVu2VEREhAYMGKCqVasay2bK1q1bFR0drfT0dL3wwgsaN26cQ4YWAIDjfP311woODlZ0dLSmT59eLO9B/wMAAABwcozpAAAAMOfXX3/V9OnTNXfuXF2+fFlhYWEaOHCgevToIT8/P9PxrmG327V161bFxcXps88+U2Zmpvr27asJEyZ4xNVq586d0/jx4/Xee++pW7duevvtt1WrVi3TsQAAxSQ+Pl79+/dXbGysRo4cWWSvS/8DAAAAcBGM6QAAAHC8EydO6M0339R7772ncuXK6amnntLf/vY3ValSxXS0m3b58mUtXbpUb7zxhvbv36+ePXtq0qRJbnur8/j4eI0cOVJWq1VTp05VRESE6UgAAAd4/fXX9fzzz2vp0qXq2bPnbb0W/Q8AAADAxcy2mk4AAAAAz/HDDz8oMjJSdevW1fLlyzV16lR99913Gj9+vEudSJekkiVLKjw8XHv37tXy5ct18uRJtW3bVmFhYfrqq69Mxysy3333ncLCwtSvXz917dpVBw4cYEgHAA8yYcIERUZGKjw8XHv27Lml16D/AQAAALgqxnQAAAAUu9zcXL355ptq2LChEhMTNWfOHB09elSjRo1SyZIlTce7LRaLRT179tRXX32lNWvWKDMzU+3bt1d0dLTOnDljOt4ts9lsio2NVbNmzXTy5Elt375dcXFxqlixouloAAAHe+utt9S+fXt169ZNJ06cuOnn0f8AAAAAXB23eQcAAECx2rp1q4YPH65vv/1Wzz77rJ577jmn/D7UopSQkKARI0bo4sWLevHFFzVq1ChZra7ze6wpKSmKiorS/v37NX78eE2YMEElSpQwHQsAYND58+cVFBQku92ubdu26Y477vjD4+l/1+t/AAAAANfgNu8AAAAoHmfOnFFERIQ6duyoWrVqaf/+/YqJiXH7E+mS1KNHD+3fv18REREaN26cOnTooIMHD5qO9acuXbqk5557Tm3btlWpUqWUkpKimJgYhnQAgMqV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nQAAAACOV79+faWlpZmOcVM++OAD1ahRQw899NBVPx8+fPhNPX/gwIFq3769SpUqpXbt2qldu3Z/eLy/v/+VW+G6krS0NNWsWZMT6QCAG6L/b4z+BwAAAHA9jOkAAAAeqH79+lq0aJHpGH/o1Vdf1cmTJ/XFF1/orbfekrf31X90DQkJuanXufPOO4sjntNJS0tT/fr1TccAADgx+t/90P8AAABA8WJMBwAA8ED169fXsWPHlJubKx8fH9NxrmvevHm6ePGihgwZoqioqGse79Onj4FUzistLU0tWrQwHQMA4MTof/dD/wMAAADFizEdAADAAzVu3Fg2m00HDx5U8+bNTce5rvT0dNMRXEZeXp4OHDigxx57zHQUAIATo//dC/0PAAAAFD+r6QAAAABwvMaNG6ty5crauHGj6SgoAikpKTp37pw6duxoOgoAwInR/+6F/gcAAACKH2M6AACAB7Jarbr//vs5me4mEhMTVaVKFTVq1Mh0FACAE6P/3Qv9DwAAABQ/xnQAAAAPFRISos2bNysvL890FNymjRs3KjQ0VBaLxXQUAICTo//dB/0PAAAAFD/GdAAAAA8VGhqqjIwMJScnm46C25Cbm6tt27YpJCTEdBQAgAug/90D/Q8AAAA4BmM6AACAh2rYsKGqVaumxMRE01FwG/7973/r4sWLCg0NNR0FAOAC6H/3QP8DAAAAjsGYDgAA4KEsFoseeOABLV261HQU3IalS5eqXr16qlu3rukoAAAXQP+7B/ofAAAAcAzGdAAAAA8WHh6upKQk7d+/33QU3AKbzabFixdr4MCBpqMAAFwI/e/a6H8AAADAcRjTAQAAPFhwcLDuuusuLVq0yHQU3II1a9bol19+0eOPP246CgDAhdD/ro3+BwAAAByHMR0AAMCDWa1WhYeHKy4uTnl5eabjoJAWLlyooKAg1alTx3QUAIALof9dG/0PAAAAOA5jOgAAgId74okndPLkSW3evNl0FBTC+fPnlZCQwC1eAQC3hP53TfQ/AAAA4FiM6QAAAB4uMDBQf/3rXzVv3jzTUVAIH330kex2u/r06WM6CgDABdH/ron+BwAAAByLMR0AAAB66qmn9Nlnn+nIkSOmo+Am5Obmatq0aXryySdVvnx503EAAC6K/nct9D8AAADgeBa73W43HQIAAABm5eXlqXHjxrrvvvv0wQcf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xHQsAAAAAAAAI8qWLauIiAgdP35cL774otLT001HAgAg11GmAwBwF2lpaerVq5fGjh2riRMn6rPPPpO7u7vpWAAAAAAAAEZVrFhRmzZtUkJCgl5++WVlZGSYjgQAQK6iTAcA4A5OnTql5s2ba+3atdqwYYNGjhxpOhIAAAAAAIDVqFatmr7++mtFRESoX79+slgspiMBAJBrKNMBALiNhIQENWzYUMnJydq6datatmxpOhIAAAAAAIDVeeaZZ7R48WItWLBAY8eONR0HAIBcQ5kOAMAtLFmyRI0bN5avr6++//57+fj4mI4EAAAAAABgtZ5//nl98cUXmjx5sqZOnWo6DgAAucLVdAAAAKyJxWLRO++8o3Hjxunvf/+7PvroI7m6Mi4BAAAAAADupnv37jp//ryGDh2qEiVKqG/fvqYjAQDwQGgHAAD4w+XLl9WzZ0+tX79en3/+uV555RXTkQAAAAAAAGzK4MGD9euvv2rAgAEqXry4OnToYDoSAAD3jTIdAABJhw4dUrt27XT69Glt3LhRzZs3Nx0JAAAAAADAJk2YMEGXLl1St27dtHbtWgUEBJiOBADAfeE90wEADi82NlbPPPOMnJ2dtXPnTop0AAAAAACABzR9+nS1b99eHTt21K5du0zHAQDgvlCmAwAc2meffaZnn31WTZs21datW+Xl5WU6EgAAAAAAgM1zdnZWWFiYGjVqpNatW+vAgQOmIwEAcM8o0wEADikjI0OjRo3SgAEDNHz4cC1dulSFCxc2HQsAAAAAAMBuuLm5afny5apUqZICAwN17Ngx05EAALgnlOkAAIfz+++/q1WrVpoxY4bCwsI0adIkOTszEgEAAAAAAHJboUKFtGrVKj300EN67rnndO7cOdORAADIMZoDAIBD+emnn9S4cWMdOHBAmzdvVvfu3U1HAgAAAAAAsGslS5bUpk2bdOXKFT333HO6fPmy6UgAAOQIZToAwGFs2LBB9evXV4kSJRQXF6e6deuajgQAAAAAAOAQypUrp4iICB09elQvvvii0tPTTUcCAOCuKNMBAA5hxowZev7559W6dWt98803evTRR01HAgAAAAAAcChPPvmkNm3apF27dqlr167KzMw0HQkAgDuiTAcA2LX09HT16dNHr7/+ut59910tXLhQHh4epmMBAAAAAAA4pOrVq2vlypVav369hgwZ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Bvr111+Vm5ur3377TXfdddcN32e6/gcFBengwYOcTAcAbspd+nWvvvqqsrKyNG7cuMte37Nnj1q2bKlmzZrpk08+ueKkMwBwUQzTAbiHX375Rc2bN1dISIhWrVp11bMns7OznWYnMCMjQ+fOnVNaWprS09M1efJkvfLKK/Ly8lLJkiV1xx13mI4IAAXyzTffqFmzZsrMzJQk9e7dWwsWLLitz8zNzdWZM2eUlpamnJycvNvTSZK/v79Klix527fk++ijj/Tss88qKytLNptN7733noYNG3ZbnwkAgDvIyMhQy5YttWvXLmVlZUn688rx273S2x71v1atWkpOTpanp6dGjBih8ePH39bnAQBci6v0667XI92+fbvatm2rbt26ac6cOUX27HYAcCDvO8fUCABuw/Hjx9WhQweVK1dOS5YsueZtiJxlkC5JxYsXV/HixVW2bFnNnTtXy5cv10cffSQvLy/T0QCgwI4cOaIOHTooKytLlmXJ09OzUG4V5+HhoTvuuKNIGxXFixdXbm6upD+fcffss8+qatWq6tixY5FtEwAAZ2dZlqKjoy8bpEt/3mL9dtmj/l863srJydE777yjGjVqaPDgwUW2PQCAc3GVft31eqSNGjXS0qVL1bFjR/n7++u9996zYzIAMOP6968CACd35swZtWvXTpZlKSEhQf7+/qYjFbq4uDidPHlS69atMx0FAArs3LlzCgsL0++//66cnBxJfzbBfXx8DCcrGB8fn7xh+iW9e/fW7t27DSUCAMDx/fOf/9THH3982SDdy8vLaW6Xnv/K9qefflpffPGFoTQAAEfmyv26tm3bKiYmRh988MEVt4IHAFfEMB2Ay7pw4YI6deqkEydOaN26dQV6Bp+zOXnypNavXy+bzaZ58+aZjgMABZKbm6s+ffooOTn5sma6zWYrlCvT7aF48eL669OScnNzdfHiRbVv317Hjh0zmAwAAMc0c+ZMjR8//oqT0ZzlRDpJV1xZaFmWunbtqv379xtKBABwRO7Qr3v88cf1/vvv65VXXtH06dNNxwGAIsUwHYBLysrKUs+ePfXTTz9p3bp1qlKliulIRWLRokWS/mziLFmyROnp6YYTAcCNjRgxQmvWrFF2dvZlr9tsNqdpqF8tZ3Z2to4fP65HHnlE58+fN5AKAADHlJCQoCeeeOKqP3OWE+mkK69Mz8nJ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AHBTDNMB2N1LL72k2NhYLV68WM2aNTMdBwBQyC5cuKCPP/5YAwcONB3FoURHRys5OVlfffWV6SgAABSq7OxsxcXFadCgQfL09DQdx2FERUXp+PHjWrdunekoAAA4JZvNpo8++kidOnVSp06d9O2335qOBMANMUwHYFdvv/22JkyYoOnTp6tDhw6m4wAAisCiRYt0/vx59e/f33QUh/Lggw+qXr16iomJMR0FAIBCtXz5ch07dozHu+RTvXp1Pfzww5ozZ47pKAAAOC0PDw/FxcWpSZMmeuSRR5SUlGQ6EgA3wzAdgN3MmTNHo0aN0sSJExUVFWU6DgCgiMTExKhz584KDAw0HcXhREdHKz4+XufOnTMdBQCAQjN9+nSFh4erSpUqpqM4nKioKC1fvly///676SgAADgtb29vLVmyRDVq1FBYWJhSUlJMRwLgRhimA7CLZcuWafDgwXr99df13HPPmY4DACgiBw4c0BdffMGVadfQv39/ZWVlafHixaajAABQKFJSUvT5559ryJAhpqM4pN69e8vDw0Mff/yx6SgAADg1Pz8/ffrppypVqpTat2+v06dPm44EwE0wTAdQ5BITE9WnTx898cQTGj16tOk4AIAiNHPmTFWoUEHt2rUzHcUh3XnnnerSpYtmzZplOgoAAIVixowZKlu2rDp16mQ6ikMqXbq0unbtyq3eAQAoBAEBAVq7dq3S09PVvn177voGwC4YpgMoUjt37lTXrl3Vo0cPTZkyxXQcAEARys3NVWxsrKKiouTp6Wk6jsOKjo7W5s2btW/fPtNRAAC4Lbm5uZo9e7YGDBggLy8v03EcVlRUlL766itqPwAAhaBixYpat26dDh06pK5duyozM9N0JAAujmE6gCLzv//9Tx07dlTjxo0VExMjDw+WHABwZQkJCUpJSVFERITpKA4tPDxclStXVmxsrOkoAADcltWrVyslJUUDBw40HcWhtW3bVpUqVVJcXJzpKAAAuITq1asrISFB33zzjR5//HHl5OSYjgTAhTHZAlAkfv31V4WFhalatWpaunSpvL29TUcCABSxmJgYtWjRQiEhIaajODQPDw9FRkYqJiZG2dnZpuMAAHDLpk+frpYtW6pmzZqmozg0Dw8P9evXT3PmzKHZDwBAIalbt66WLl2q1atXa9iwYabjAHBhDNMBFLqTJ08qPDxcpUqV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43qgUvrDRnYC0q/169ejd+/eGDBgAH788UfY2PByLKtq1aph8+bN6Nu3Lzp37ozNmzejTZs2smNpxtWrV9GuXTtYWVlhz549fNd9OY0fPx6Ojo548803YW1tjU8//VR2JCIphBAYMWIEFi1ahGXLlvH7UsupZcuWiI6ORpcuXdChQwdERkbCyclJdixdYX00DdZHIm1ivTcN1ntl4fym4ji/ITId9iOmwX5EG7geTIPrgR6F35lOUuzatQvPPvssXn75Zfzwww8wGAyyI6labm4u/vWvf2Hnzp34/fff4e3tLTuS6t29exfBwcFIS0vDrl274OrqKjuS6v30008YNmwYpk+fjjFjxsiOQ2RxH3zwAaZNm4ZffvkF3bt3lx1H9RITE9G2bVs0atQIGzduhL29vexIusD6aHqsj0TawnpvWqz38nF+Y1qc3xBVDPsR02M/ol5cD6bH9UAlmMW3kpLFHTt2DM8//zw6deqE2bNnsxEzARsbGyxbtgydO3fGs88+i927d/NdaBVgNBrxr3/9C9euXeMPIiY0ZMgQ3LhxA2+99RacnZ0xePBg2ZGILObbb7/F//73P8ybN4+DdROpX78+tmzZgqCgIPTt2xerVq2CtbW17FiaxvpoHqyPRNrBem96rPdycX5jepzfEJUf+xHzYD+iTlwP5sH1QCXhJ9PJoi5evIjWrVujfv362LRpE7/3zMQK3o2WmpqK3bt3s4iWQ35+Pvr164ctW7YgOjoafn5+siNpzrvvvosZM2Zg3bp16NKli+w4RGa3dOlSDBw4EJ9//jnGjRsnO47mxMTEoGPHjggLC8P3338vO45msT6aH+sjkbqx3psX673lcX5jXpzfEJUN+xHzYz+iHlwP5sf1QP8wi4fpZDF3795Fy5YtUalSJURHR8PZ2Vl2JE26fPky2rZtizp16iA6Ohp2dnayI6nK2LFjMXfuXGzevBnt2rWTHUeThBAYPHgwfvnlF+zevRu+vr6yIxGZTVRUFDp37oy33noLn3/+uew4mvXLL7/gpZdewqefforx48fLjqNJrI/mx/pIpF6s95bBem85nN9YBuc3RKXHfsT82I+oB9eD+XE90D/wMJ0sp2/fvvj9999x6NAhPPbYY7LjaFpCQgICAgIKv9+DSmfFihXo27cvli1bhj59+siOo2k5OTno1KkTrl69igMHDqBq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demll1qJiYmmIwEBbdasWVarVq2sxo0bWy+88IKVl5dnOlKtKikpsT788EOrbdu2VoMGDaxXXnnFKikpMR0LtYz6CACnR71HoKF/A8BO2I8AP2I9AD8Lw3T4n5kzZ1qdOnWygoKCrDvvvNNKTk42HekX+/rrr63+/ftbkqz4+HgrISHBdCT8Aunp6davf/1rKygoyOrQoYM1adIky+PxmI71i+zYscMaOnSoFR4ebp133nnWa6+9RgMM8JEjR45YI0aMsBo3bmw1atTIeuaZZ6x9+/aZjvWLFBcXW++884510UUXWW632/rTn/5k5eTkmI6FOkZ9BIDqUe8RiOjfALAT9iPAj1gPwFlhmA7/VFZWZs2ePdvq1q2bJcm64YYbrK+++sqvPkXl8XisefPmWb169bIkWX369GETFmA2btxoDRo0yAoJCbEuvvhia9y4cdbhw4dNxzor69evtx566CErNDTUatWqlTV69Gjr2LFjpmMBjlRQUGD9+9//tpo3b27Vr1/fevzxx62tW7eajnVWDh48aL322mvW+eefb9WrV8965JFHrO3bt5uOBR+jPgJA9aj3CDT0bwDYDfsR4EesB6BGGKbD/33++edW7969LUlWq1atrGeeecbatGmT6VjVWrNmjfX4449b5557ruVyuaybbrrJ+vbbb03HQh3aunWr9ec//9kKCwuzIiIirD/84Q/WokWLbPtcmtzcXOuNN96wrrjiCkuS1bZtW2v8+PE8+w2wiaNHj1pvvPGG1bJlS8vlclk9e/a0xo0bZx06dMh0tCodP37cmj17tnXnnXdaYWFhVoMGDay//e1v1u7du01Hg2HURwCoHvUegYj+DQA7YT8C/Ij1AJzWaJdlWZYAPzds2DB16NBBmZmZ+vjjj5WTk6Pu3btr4MCBuuGGG9S+fXtj2SzL0vr167VgwQJNnjxZGzZsULt27TRw4EANGjRIbdq0MZYNvnXo0CF98sknmjRpklasWKEWLVro97//ve644w7FxcXJ7XYby5abm6uEhARNnTpVX375perXr68BAwbo3nvv1VVXXaWgoCBj2QBUzev16ssvv9SkSZM0Z84clZWV6dZbb9U999yjvn37KjIy0li2oqIirVixQrNmzdK0adOUn5+vPn36aNCgQRowYIAaNGhgLBvsh/oIANWj3iMQbdy4UZMmTaJ/A8AW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dOmibt26qX79+n6PWizZ2dn68ssvtWzZMi1dulRLlizRjh07VL58eXXu3FkDBgzQVVddFdH7SwFhR+/0Djvond5hB73TO+ygd3qHHfRO77CD3ukddtA7vXuMZXosHTp0SLNnz9Ybb7yh999/X4cOHVLjxo3Vr18/9evXT926dct974REtG3bNr333nuaN2+eFi5cqCNHjqhZs2YaMGCABg0apA4dOvg9IhAz9E7vsIPe6R120Du9ww56p3fYQe/0Djvond5hB73TexyxTC+p77//Xm+99ZZmzpypefPmKTs7W5dddpkGDBigvn37qmHDhn6P6IusrCwtWbJE8+fP15tvvqmtW7eqfv36Gjx4sIYMGaI2bdr4PSIQNXrPH70jEdF7/ugdiYje80fvSET0nj96RyKi9/zROxIRveeP3pGI6D1/9O45lunF4ZzThx9+qMmTJ+uNN95QVlaWLr30Ug0ePFjXXHONqlWr5veIgfPpp59qxowZeu2117R9+3Y1adJEI0eO1I033qgaNWr4PR5QIHqPHr0jrOg9evSOsKL36NE7woreo0fvCCt6jx69I6zoPXr0jrCi9+jRe8yxTI/Gt99+q6lTp2ry5MnavHmzOnTooJEjR+oXv/iF0tPT/R4vNFatWqXp06dr2rRpOnz4sAYMGKCbb75Zffv2VXJyst/jAZLoPVboHWFA77FB7wgDeo8NekcY0Hts0DvCgN5jg94RBvQeG/SOMKD32KD3mJgkhyKtWrXKDRkyxKWmproqVaq4O++8061bt87vsULv2LFjbvr06e6SSy5xSUlJrk6dOm7ChAnuwIEDfo8Gw+jdG/SOIKJ3b9A7gojevUHvCCJ69wa9I4jo3Rv0jiCid2/QO4KI3r1B7yXyNMv0AmRnZ7s333zTdevWzUlyF110kZs6dao7evSo36MlpM2bN7tf//rXrnLlyq5SpUrunnvucdu3b/d7LBhB7/FF7/ATvccXvcNP9B5f9A4/0Xt80Tv8RO/xRe/wE73HF73DT/QeX/QeNZbpP5WVleWef/5516RJE5eUlOQGDBjgFi5c6PdYZnz33XfuT3/6k6tTp44rVaqUGzx4MM86gmfo3V/0jniid3/RO+KJ3v1F74gnevcXvSOe6N1f9I54ond/0Tviid79Re8RY5l+yokTJ9yUKVNc/fr1XWpqqrvlllvc559/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9A7YQe+AHfQO2FGS3pOccy6aL9i5c6fq16+vWbNm6eqrr476QAA/uuSSS5SWlqZ//OMffo+SL3oHYofeATvoHbCD3gE76B2wg94BO+gdsKMEvU+KepkuSX369FGpUqU0d+7caL8UwP9v27Ztaty4sebOnat+/fr5PU6B6B0oOXoH7KB3wA56B+ygd8AOegfsoHfAjhL2Pimql3k/5fbbb9f8+fO1ZcuW4nw5AEkTJ05UnTp11Lt3b79HKRS9AyVH74Ad9A7YQe+AHfQO2EHvgB30DthR0t6LtUz/2c9+pgYNGujPf/5zsQ4FrDtw4IBeeukl3X333UpJSfF7nELRO1Ay9A7YQe+AHfQO2EHvgB30DthB74Adsei9WMv0lJQU3X333Zo6dar27dtXrIMBy5555hklJydr1KhRfo9SJHoHSobeATvoHbCD3gE76B2wg94BO+gdsCMWvRdrmS5Jo0aNUrly5fSXv/yl2IcDFmVmZmrSpEn65S9/qcqVK/s9TkToHSgeegfsoHfADnoH7KB3wA56B+ygd8COWPVe7GV6+fLldfvtt+v//u//dOzYsWIPAFgzffp07du3T3fccYffo0SM3oHioXfADnoH7KB3wA56B+ygd8AOegfsiFXvxV6mS9Kdd96pQ4cOafLkySUaArDi5MmTevzxx3Xdddepdu3afo8TFXoHokPvgB30DthB74Ad9A7YQe+AHfQO2BHL3ku0TK9Ro4Zuv/12/eEPf9DRo0dLNAhgwbRp07Rt2zb913/9l9+jRI3egejQO2AHvQN20DtgB70DdtA7YAe9A3bEsvcSLdMl6cEHH9Thw4f1zDPPlHgYIJGdOHFCjz76qG688UY1bdrU73GKhd6ByNA7YAe9A3bQO2AHvQN20DtgB70DdsS69xIv06tXr67Ro0drwoQJOnz4cIkHAhLVlClTtHPnTj300EN+j1Js9A5Eht4BO+gdsIPeATvoHbCD3gE76B2wI9a9l3iZLkn333+/srKy9PTTT8fi6oCEk5mZqccee0w333yz6tev7/c4JULvQOHoHbCD3gE76B2wg94BO+gdsIPeATu86D0my/S0tDTde++9euKJJ/Ttt9/G4iqBhPLUU09p3759oX7W2yn0DhSO3gE76B2wg94BO+gdsIPeATvoHbDDi96TnHMuFld07NgxNWvWTH369NHzzz8f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5dKCBQvUp08f/fOf/9Rrr72mnTt3aty4cVZHw/83YcIE7d69W7///e+1YMECJSYmavny5VbHAgAAAADgilCmAwAAAADajBMnTmjSpEl66KGHdP/99+vo0aN65JFH5OPDw1tv4+fnp5/+9Kc6evSobrvtNs2cOVOzZs3SuXPnrI4GAAAAAECzMNsAAAAAAPB6dXV1+tOf/qTk5GTl5ORo8+bN+vOf/6yQkBCro+EyoqKi9K9//UurV6/Wjh07lJiYqPnz51sdCwAAAACAy6JMBwAAAAB4tZMnT2r8+PF69tln9cwzz2jXrl265ZZbrI6FKzR58mTt379f3/3ud/Xoo49q5syZysvLszoWAAAAAABNokwHAAAAAHitpUuXavDgwcrLy9PWrVv13//93/Lz87M6Fq5S586d9ec//1np6ek6cOCABgwYoJUrV1odCwAAAACARlGmAwAAAAC8TllZmR544AHNnj1b9913n3bt2qVBgwZZHQst5JZbbtGuXbs0fvx4zZgxQz/+8Y9VXV1tdSwAAAAAABqwuVwul9UhAAAAAAAwHD58WHfffbeKior09ttva+rUqVZHwnX0zjvv6Ic//KH69++vDz74QDfccIPVkQAAAAAAkKR57EwHAAAAAHiNFStW6JZbblFQUJC+/PJLivQO4P7779fOnTtVXl6uQYMGKS0tzepIAAAAAABI4ph3AAAAAIAXqKur07PPPquZM2fqvvvu05YtW9SzZ0+rY6GV9OnTR1u2bNGtt96qKVOm6JVXXrE6EgAAAAAAclgdAAAAAADQsVVUVGju3Llas2aN3n77bX3ve9+zOhIsEBwcrCVLlugPf/iDnnnmGR06dEh//etf5XAwdQEAAAAAsAbXTAcAAAAAWCY/P1933XWXDh06pI8++khjx461OhK8wGeffaZZs2Zp+PDh+uCDDxQaGmp1JAAAAABAx8M10wEAAAAA1vj666+Vmpqqc+fOacuWLRTpME2aNEmbNm3S4cOHNXr0aJ06dcrqSAAAAACADogyHQAAAADQ6rZv364RI0YoKipK27Zt00033WR1JHiZlJQUbd68WZI0atQoHTlyxOJEAAAAAICOhjIdAAAAANCqNm7cqDvuuEMjR47U2rVr1bVrV6sjwUvFxcVp06ZNio2N1bhx47Rv3z6rIwEAAAAAOhDKdAAAAABAq1m/fr2m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+lLGjBmTJBk+fHi++tWvbvH3Vl+LFi3KcccdlzZt2mT77bdP7969c++99272dU888USGDh2ajh07pmvXrvniF7+YN954o/b5c845J0OGDNnsdVdeeWWOOOKIbNy4MUly3nnn5cILL8wLL7yQs846K506dcpee+2V4cOHZ+3atf+29fbbb88RRxyRkSNHvqfvdWtwMh0AAKDpKS86AAAAgIa1bt26Rj2mz5o1KwMGDEj79u3zX//1X6msrMyUKVPyuc99Lj/84Q/zve99L0nyhz/8If369ctOO+2Us846K+3atcv999+fL3/5y3n22Wfz05/+NMk/R+lPf/rT2W677TJw4MA0a9Ys3/ve997z58bX93r16dt3333z+OOPZ/ny5dl3332z9957b9H3tiXNJ5xwQtq2bZsvfOELefXVV3PHHXfk5JNPzsyZM9OnT58kycqVK3P00UenTZs2Ofvss7Nw4cL86le/ymuvvZbJkycnSR555JF3vFvA0qVLM2vWrNrnFi5cmFWrVuWuu+5Kly5dcuaZZ+bhhx/OuHHjat//ndx6660ZMmRIjjnmmHzzm9/cou9za3IyHQAAoOkxpgMAADQxGzZsSIsWLYrOeEelUikjRoxIy5YtM3v27Hz0ox9Nklx22WUZMGBAfvzjH+eMM87Ivvvum0mTJqW8vDzPPPNM7ZD9zW9+M127ds2UKVNqB+eLL744LVu2zCOPPJLOnTsnSS699NIccMAB76mxvterT9+ll16aTZs2Ze7cufnWt75Ve436fm/1UVNTU9s8Y8aM2sH+G9/4Rrp165Zrrrmmdkyvrq7OyJEj84Mf/KD29b1798599933nv6uli9fnm9+85u54oorUlZWlpqamvTq1SsPPPDAO379LbfcknPPPTf9+/fPnXfemZYtW76n990aWrZsmfXr1xedAQAAQANym3cAAIAmplmzZo32c8gfffTRPProoznmmGNqh/QkadGiRYYNG5b169fn/vvvT5J8/etfz/z58992Inz9+vVp06ZN1qxZkyR56KGHsmjRonzlK1+pHb6TZJ999snQoUO3uG9Lrlefvnfzfl5b12OPPZZFixbl1FNPrR3Sk2S//fbLL37xi3zyk5+sfaxZs2b51re+9bbXH3zwwVm9enX++te/btH7JkllZWVGjhyZsrKy2uv37ds3r7766mbXGz9+fM4555yccMIJ+c1vftOohvQk2bhxY5o3b150BgAAAA3IyXQAAIAmpjGfsF26dGmS5KijjtrsuYMOOihJsmTJkiT/HIOrq6szatSozJ07N8uXL8/SpUuzZs2a2iH+z3/+c5K84yn07t27b3HfllyvPn3v5v28tq6nn346SbL//vtv9tyFF174tj937NhxsxH7rUH/tdde26L3TZJdd90122233dse23nnnTe73sKFC/P5z38+NTU1KZVKjfJjCNavX9/oBn4AAAC2LifTAQAAmpiKiopGO6avWrUqSd526vstb31e9Vung6+66qrsvvvu+dGPfpQNGzbkuOOOy4033pi+ffvWvubll19+22v+Vd2Rtz625Hr16Xs37+e1da1cuTLJP4fy/6RVq1bv+lypVPq3r33r7+ZfVVZW1ut6q1evzllnnZVzzjknU6dOzcSJE/9ja0Nbt26dMR0AAKCJcTIdAACgiWnMY3qXLl2SJH/84x/zmc985m3PzZ07N0nStWvXrFy5Mt/61rfSvn37LF26NDvuuGPt111++eWbXW/mzJk57bTT3na95cuXv+e+/3S9+va9k/fz2nfy1i8mPPzwwznzzDPf9tz48eNTU1OTYcOG1ft6b332eV1PPfXUFre95eCDD8748ePz8ssvZ+rUqbn44otz/PHHp127du/5mh+09evXN8oT8wAAAGw9TqYDAAA0MY15TD/wwANTUVFR+7no/2rGjBlp3rx5+vfvn+eeey41NTUZOHDg28bm559/PgsXLqz98yGHHJIWLVrkwQcffNu1Nm7c+J5OP9f3evXteyfv57XvpFevXqmsrNys+U9/+lOGDRuWmTNnbtH1OnfunOXLl2fDhg21jz3xxBO1t5N/L1q3bp2ysrK0bds2V111VVauXJkRI0a85+ttDW7zDgAA0PQY0wEAAJqYHXfcMWvWrCk64x199KMfzYUXXpjHHnssX/nKV/L444/nqaeeyg9+8IPcfvvtGTJkSPbZZ5987GMfyw477JBbb701U6ZMydKlS3PjjTemT58+ad26dV577bU89dRT2WOPPXLBBRekqqoqX/jCF/Loo4/msccey+c+97m8+uqrW9xX3+vVty9JOnXqlCS57rrrMn/+/C16bX185CMfycUXX5zFixfn/PPPz4IFCzJ+/PgMHjw45eXlOf/887fo76B3795Zv359hg0blhkzZmTs2LE59dRTs9NOO23Rdd7NsGHDcsQRR2TixIm55557PpBrfhD+8Y9/ZIcddig6AwAAgAbkNu8AAABNTNu2bWs/m7wxuuKKK7Jp06aMHj061157be3j559/fkaPHp3kn78QcMMNN2T48OE5+eSTkyS77LJLfv7zn6dVq1Y599xz06NHj2zYsCFXXnll1q5dm+uvvz433HBDkuTYY4/NL37xiwwdOnSL++pzvS3p69evXw499NBce+21efLJJ/OHP/yh3q+trx/96EcplUq56qqr8r//+79Jkt122y233HJLevfuvUXf/yWXXJK5c+dm4sSJmThxYjp27Fj7fV955ZVbdK13UlZWljFjxuSAAw7I+eefnyeeeOJtJ/SLsGbNmqxfv75R3XYeAACAra+sVCqVio4AAACg4UyZMiUnn3xyXn/99VRWVhad865eeumlLFy4MC1btkzPnj2z8847b/Y11dXVeeyxx7LbbrulW7duKSsrq3189erV2XvvvWu/9vnnn09VVVU+/vGP1372+ftRn+ttSd8LL7yQHXfcsXY43pLX1tfatWuzePHitG7dOvvss8/7+gzwlStX5m9/+1s+8YlP1LZ9WD377LPZa6+9Mn/+/BxyyCFF5wAAANAwrjamAwAANDFz585Nnz598pe//CV77LFH0TmNwle+8pV6fd3QoUNz2GGHbeWa+tkWm7dV8+bNS+/evbNs2bJ07ty56BwAAAAaxtVu8w4AANDEtG3bNsk/Tzgb0//p6KOPrtfX7bbbblu5pP62xeZtVXV1dZL/+38HAACApsGYDgAA0MTsuuuuSZIVK1YUXNJ4DBo0qOiELbYtNm+r/v73v6eysrLwz24HAACgYTUrOgAAAICG1aZNm7Rp0ybLly8vOgW2CcuXL0+nTp2KzgAAAKCBGdMBAACaoM6dOxvToZ6WLVuWLl26FJ0BAABAAzOmAwAANEHGdKg/YzoAAEDTZEwHAABogrp06ZJly5YVnQHbhGXLlqVz585FZwAAANDAjOkAAABNUNeuXfPMM88UnQGN3htvvJEXX3wxXbt2LToFAACABmZMBwAAaIJ69OiR6urqvPDCC0WnQKP2xBNPZNOmTenRo0fRKQAAADQwYzoAAEAT1LNnzyTJ4sWLCy6Bxq2qqiqVlZXZe++9i04BAACggRnTAQAAmqBddtklHTt2NKbDf1BVVZXu3bunefPmRacAAADQwIzpAAAATVTPnj1TVVVVdAY0aosXL669kwMAAABNizEdAACgierZs2cWLlxYdAY0WqVSKYsXL87+++9fdAoAAAAFMKYDAAA0UYcddlj+9Kc/ZfXq1UWnQKO0ZMkJnwxMAAAYnklEQVSSrFy5Mn369Ck6BQAAgAIY0wEAAJqovn37plQq5eGHHy46BRqlWbNmpbKyMgcccEDRKQAAABTAmA4AANBEtWvXLvvss09mz55ddAo0SrNnz86hhx6aioqKolMAAAAogDEdAACgCevbt68xHd7F7Nmz07dv36IzAAAAKIgxHQAAoAnr27dvHn744bz55ptFp0CjsmLFiixdutSYDgAA0IQZ0wEAAJqw/v375/XXX88f//jHolOgUZk2bVpatmyZI488sugUAAAACmJMBwAAaMJ23333dO/ePdOmTSs6BRqVadOm5aijjsr2229fdAoAAAAFMaYDAAA0cSeccELuvffeojOg0di0aVOmT5+e/v37F50CAABAgYzpAAAATdyAAQPy5JNP5tlnny06BRqFhx9+ONXV1TnhhBOKTgEAAKBAxnQAAIAm7ogjjkjr1q3zu9/9rugUaBSmTJmSLl26ZL/99is6BQAAgAIZ0wEAAJq4ioqKnHzyybntttuKToFG4fbbb8+gQYOKzgAAAKBgxnQAAABy+umnZ86cOfnLX/5SdAoUav78+Xn66adz+umnF50CAABAwYzpAAAApH///tl5551zxx13FJ0ChbrtttvStWvXHHTQQUWnAAAAUDBjOgAAALW3er/11luLToHClEql3H777TnjjDNSVlZWdA4AAAAFM6YDAACQJBk8eHDmzZuXP//5z0WnQCFmzpyZ5cuXZ/DgwUWnAAAA0AgY0wEAAEiSHHfccenUqVPGjh1bdAoU4vrrr0/v3r2z//77F50CAABAI2BMBwAAIEnSrFmzDB8+PDfeeGPWrVtXdA40qFdeeSW/+c1v8sUvfrHoFAAAABoJYzoAAAC1hg8fnldeeSV333130SnQoG666aY0b948Z5xxRtEpAAAANBJlpVKpVHQEAAAAjcdJJ52UN954I9OnTy86BRpEqVTK/vvvn8MOOyzXX3990TkAAAA0Dlc7mQ4AAMDbXHDBBXnggQeyaNGiolOgQdx333154okncsEFFxSdAgAAQCPiZDoAAACbOeCAA/KJT3wiN910U9EpsNX169cvZWVlue+++4pOAQAAoPFwMh0AAIDNjRgxIpMmTcrzzz9fdApsVYsXL84DDzyQSy+9tOgUAAAAGhljOgAAAJs5++yz065du/zyl78sOgW2qp/+9Kfp0aNH+vXrV3QKAAAAjYwxHQAAgM1UVFTkoosuypgxY/Lyyy8XnQNbxTPPPJPbbrstl156acrKyorOAQAAoJExpgMAAPCOLrroorRs2TKjRo0qOgW2ih/+8Ifp3LlzzjrrrKJTAAAAaISM6QAAALyjHXbYIZdccklGjx6dl156qegc+EAtWbIkEydOzMiRI1NeXl50DgAAAI1QWalUKhUdAQAAQOO0du3a7LXXXhkyZEh+9rOfFZ0DH5gzzzwzVVVVqaqqSrNmzhoAAACwmav9tAgAAMC7atWqVb797W/nmmuuyd/+9reic+ADsWjRovz617/OyJEjDekAAAC8KyfTAQAA+LfefPPNdOvWLX379s3NN99cdA68b8ccc0zWrl2bhx56KGVlZUXnAAAA0Dg5mQ4AAMC/t9122+Wqq67KLbfcklmzZhWdA+/LHXfckRkzZmTUqFGGdAAAAP4tJ9MBAACol379+mX16tWZN2+eW2OzTVq3bl169OiRQw891F0WAAAA+E+cTAcAAKB+rrrqqixcuDC33HJL0SnwnowaNSovvvhirrjiiqJTAAAA2AYY0wEAAKiXAw44IOedd14uvfTSVFdXF50DW+SZZ57J5Zdfnu985zvZfffdi84BAABgG+A27wAAANTbmjVr0r179xx77LG58cYbi86Bejv++OOzYsWKLFiwIBUVFUXnAAAA0Pi5zTsAAAD117p161x77bW56aabct999xWdA/Uybty4PPDAAxkzZowhHQAAgHpzMh0AAIAtNmjQoDzyyCOpqqpKq1atis6Bd/XSSy+lW7duOfvsszN69OiicwAAANh2XG1MBwAAYIutWLEi3bt3z6BBgzJmzJiic+AdlUqlnHLKKamqqkpVVVV22GGHopMAAADYdrjNOwAAAFuuQ4cOuf7663Pdddflt7/9bdE58I7GjBmTqVOnZty4cYZ0AAAAtpiT6QAAALxnw4cPz5QpU7J48eLstttuRedArSeffDKHHHJILrnkkvzwhz8sOgcAAIBtj9u8AwAA8N699tprOfDAA7PXXnvl3nvvTVlZWdFJkHXr1uWwww5LRUVFZs2alfLy8qKTAAAA2Pa4zTsAAADv3Q477JAJEybkwQcfzE9+8pOicyBJ8rWvfS1PP/10JkyYYEgHAADgPTOmAwAA8L707t07o0aNyve///3ce++9RefQxE2YMCFjxozJDTfckL333rvoHAAAALZhbvMOAADAB+Lzn/98fvvb32bBggXp2rVr0Tk0QYsWLUqfPn3y1a9+NVdccUXROQAAAGzbfGY6AAAAH4zXX389ffr0SfPmzTNr1qxUVlYWnUQTUl1dnV69eqVr1675/e9/n+bNmxedBAAAwLbNZ6YDAADwwdh+++1z55135rnnnsvQoUNTU1NTdBJNxLp16zJw4MDU1NRk0qRJhnQAAAA+EMZ0AAAAPjBdu3bNXXfdlalTp+ayyy4rOocmoFQq5bzzzsvChQtz9913p3379kUnAQAA8CFRXnQAAAAAHy6HH354brrpppx55pnp1KlTLrrooqKT+BD77ne/m8mTJ2fq1Knp2bNn0TkAAAB8iBjTAQAA+MCdfvrpefrpp/O1r30te+65Z0455ZSik/gQuu6663LFFVfkhhtuSL9+/YrOAQAA4EPGbd4BAADYKr7zne/kvPPOyxlnnJH777+/6Bw+ZCZNmpQvf/nLGTlyZIYNG1Z0DgAAAB9CTqYDAACw1VxzzTXZsGFDTj311Nxzzz056qijik7iQ+Duu+/Oueeem4suuijf//73i84BAADgQ6qsVCqVio4AAADgw2vTpk0566yzMm3atEyfPj29evUqOolt2PTp03PSSSdl8ODB+dWvfpWysrKikwAAAPhwutpt3gEAANiqmjdvnptvvjl9+vRJ//798/DDDxedxDZq2rRpOeWUU/K5z30uY8eONaQDAACwVRnTAQAA2OoqKipy11135aijjsqxxx6bBx54oOgktjFTpkzJaaedllNPPTXjxo1Ls2b+SQMAAICty0+eAAAANIiWLVvmtttuy4knnphPf/rTufvuu4tOYhsxadKkDBw4MMOGDcvNN9+c8vLyopMAAABoAozpAAAANJgWLVpk0qRJOfPMMzNo0KDcdtttRSfRyP3yl7/MkCFD8vWvfz3XXHONE+kAAAA0GL/KDQAAQINq3rx5xo0blzZt2mTw4MF57rnn8o1vfKPoLBqZmpqaXHbZZfnv//7vXH755fn2t79ddBIAAABNjDEdAACABldWVpb/+Z//SZcuXXLJJZfkqaeeyrXXXpsWLVoUnUYjsG7dugwbNix33nlnxo8fnyFDhhSdBAAAQBNkTAcAAKAwI0aMSKdOnXL22WfnhRdeyOTJk9O6deuisyjQihUrctppp2XJkiW5//77c+SRRxadBAAAQBPlg8YAAAAo1KmnnpoZM2Zk4cKF6dWrV5544omikyjInDlzcvDBB2fVqlWZM2eOIR0AAIBCGdMBAAAoXK9evbJo0aJ07Ngxhx56aG699daik2hg1113XY4++ugccMABmTdvXj72sY8VnQQAAEATZ0wHAACgUWjfvn1+//vf5/Of/3wGDx6cSy65JBs2bCg6i61s7dq1Oeecc/LlL3853/3ud/O73/0uO++8c9FZAAAAkLJSqVQqOgIAAAD+1YQJE3L++efn4x//eCZMmOCU8ofUggULcvbZZ6e6ujoTJkzIgAEDik4CAACAt1ztZDoAAACNzpAhQ1JVVZWKiooceOCBGT16dNFJfIBKpVJGjx6dvn37Zvfdd8+iRYsM6QAAADQ6xnQAAAAapS5dumTGjBkZMWJEvv71r+e0007LihUris7ifXr22WdzzDHH5LLLLsvll1+e+++/Px07diw6CwAAADZjTAcAAKDRatGiRa644oo8+OCDWbhwYbp165YbbrghPrFs27Nx48aMGjUq+++/f1atWpWHHnool156aZo1808TAAAANE5+YgUAAKDRO+qoo/KnP/0pX/rSl/KlL30pRx11VP785z8XnUU9LV68OH379s23v/3tXHTRRVmwYEEOPPDAorMAAADg3zKmAwAAsE2orKzMlVdemTlz5uTVV1/NQQcdlJEjR+b1118vOo13sXr16lx88cU5+OCDU1FRkcWLF+fKK69My5Yti04DAACA/8iYDgAAwDblk5/8ZBYsWJCRI0fm5z//efbbb79MnDjRrd8bkU2bNuXaa6/Nvvvum4kTJ+aaa67JzJkzs99++xWdBgAAAPVmTAcAAGCb06JFi1x22WVZsmRJjj/++AwdOjSHH3545s6dW3Rak3ffffflwAMPzIgRI3LOOedk6dKlOe+883w2OgAAANscP8kCAACwzfrIRz6SsWPHZv78+SkvL0+fPn3ymc98Jo8++mjRaU3OzJkzc+SRR6Z///7p1KlTHn/88YwaNSo77bRT0WkAAADwnhjTAQAA2OYddNBBmTlzZu6999689NJLOeSQQzJw4MBUVVUVnfahN3fu3PTr1y+f+tSn0qJFi8yePTtTpkzJvvvuW3QaAAAAvC/GdAAAAD40BgwYkHnz5uW+++7LX/7yl/Ts2TOHH354pkyZ4jPVP0ClUinTp0/PSSedlD59+mTt2rWZPn16HnjggfTp06foPAAAAPhAGNMBAAD40DnuuOMyf/783H333WnevHlOPvnkHHLIIZk0aVI2btxYdN42a926dRk7dmy6d++e448/PjU1NXnwwQczZ86cHHvssUXnAQAAwAeqrORX8wEAAPiQe+yxx/Lzn/88kyZNSrt27XLuuefmvPPOy1577VV02jbhqaeeyrhx43LDDTfk1VdfzRlnnJHLLrssPXr0KDoNAAAAtparjekAAAA0GcuXL8+vfvWrjBs3Li+++GKOOeaYfPGLX8zJJ5+cysrKovMalX/84x+5/fbbM3bs2MyZMyddu3bNF77whQwfPjwdOnQoOg8AAAC2NmM6AAAATc9btye/7rrrctddd6W8vDzHHntsBg0alM9+9rNp1apV0YmFeOONNzJ9+vT8+te/zp133pkNGzbklFNOydChQ3PiiSemefPmRScCAABAQzGmAwAA0LStWLEid9xxR2699dbMnj07O+64Y0466aR8+tOfTr9+/dK2bduiE7eqFStWZNq0aZk6dWruueeerF+/Psccc0xOP/30nHbaadlll12KTgQAAIAiGNMBAADgLX/7299y++235ze/+U3mzJmTmpqa9OrVKwMGDMjxxx+fQw45JC1atCg683154403Mm/evPz+97/PtGnTsnDhwrRs2TJHHnlkBg4cmM9+9rNp165d0ZkAAABQNGM6AAAAvJM1a9Zk+vTpmTZtWqZNm5bnn38+lZWV6dWrVw4//PD07ds3hx56aKM/uf33v/89Dz30UGbNmpXZs2fnkUceyfr167P33ntnwIABOeGEE/KpT30q22+/fdGpAAAA0JgY0wEAAKA+lixZkjlz5tSO0k899VRKpVL22GOP9OjRIz179kzPnj3TrVu3dO3aNa1bt27QvpdffjnPPvtsHn/88Tz++ONZvHhxqqqqsmLFijRr1izdu3ev/SWAww8/PJ06dWrQPgAAANjGGNMBAADgvVi1alUW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",
"text/plain": [
""
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from graphviper.graph_tools import reduce\n",
"import numpy as np\n",
"\n",
"def my_sum(graph_inputs, input_params):\n",
" return np.sum(graph_inputs)\n",
"\n",
"viper_graph = reduce(viper_graph, my_sum, {}, mode=\"tree\")\n",
"dask_graph = generate_dask_workflow(viper_graph)\n",
"dask.visualize(dask_graph, filename=\"map_graph_with_load_layer\")"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "73d25482",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Result: 11006957020716.6\n"
]
}
],
"source": [
"result = dask.compute(dask_graph)[0]\n",
"print(\"Result:\", result)"
]
},
{
"cell_type": "markdown",
"id": "20ef654f",
"metadata": {},
"source": [
"### Scheduler Plugin\n",
"\n",
"For distributed execution, register `ViperGraphPlugin` with the Dask client\n",
"**before** submitting the graph. The plugin reads the `viper_load_group`\n",
"and `viper_map_pair` annotations added by `generate_dask_workflow` and\n",
"adjusts task priorities so that:\n",
"\n",
"1. Only one load group (zarr chunk) is active in memory at a time.\n",
"2. Reduction-adjacent map tasks are scheduled together, allowing the binary\n",
" tree to collapse results level-by-level with minimal memory overhead.\n",
"\n",
"```python\n",
"from toolviper.dask.plugins.scheduler import ViperGraphPlugin\n",
"from toolviper.dask.client import local_client\n",
"\n",
"client = local_client(cores=4, memory_limit=\"8GB\")\n",
"client.register_scheduler_plugin(ViperGraphPlugin())\n",
"\n",
"# Now submit the graph as usual:\n",
"# dask.compute(dask_graph)\n",
"```\n",
"\n",
"The plugin is purely advisory — if it is not registered the graph still\n",
"computes correctly, just without the optimised scheduling order."
]
},
{
"cell_type": "markdown",
"id": "57673d4b-5e5e-4e1c-bf54-275ea526178e",
"metadata": {},
"source": [
"## Overlapping Frequency Map Reduce"
]
},
{
"cell_type": "markdown",
"id": "33871abd-78f6-48c1-9c7c-58388435d270",
"metadata": {},
"source": [
"### Create Parallel Coordinates"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "1278ba9b-9dcf-4a15-8265-b5e33c998d8c",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
data: [343928096685.9587, 343939328174.9401, 343950559663.9216, 343961791152.903, 343973022641.88446, 343984254130.8659, 343995485619.84735, 344006717108.8288]
coords frequency dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
data: [343928096685.9587, 343939328174.9401, 343950559663.9216, 343961791152.903, 343973022641.88446, 343984254130.8659, 343995485619.84735, 344006717108.8288]
name: frequency
data_chunks 0: [343928096685.9587, 343939328174.9401, 343950559663.9216, 343961791152.903]
1: [343961791152.903, 343973022641.88446, 343984254130.8659, 343995485619.84735]
2: [343973022641.88446, 343984254130.8659, 343995485619.84735, 344006717108.8288]
"
],
"text/plain": [
""
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dask.config.set(scheduler=\"synchronous\")\n",
"\n",
"from xradio.measurement_set import open_processing_set\n",
"from IPython.display import HTML, display\n",
"\n",
"\n",
"ps = open_processing_set(\n",
" ps_store=\"Antennae_North.cal.lsrk.split.ps.zarr\",\n",
" scan_intents=[\"OBSERVE_TARGET#ON_SOURCE\"],\n",
")\n",
"ms_xds = ps[\"Antennae_North.cal.lsrk.split_0\"]\n",
"n_chunks = 3\n",
"\n",
"parallel_coords = {}\n",
"freq_coord = ms_xds.frequency.to_dict()\n",
"# Here, we create overlapping data chunks. Currently, there is no convenience function available to assist with this.\n",
"freq_coord[\"data_chunks\"] = {\n",
" 0: freq_coord[\"data\"][0:4],\n",
" 1: freq_coord[\"data\"][3:7],\n",
" 2: freq_coord[\"data\"][4:8],\n",
"}\n",
"parallel_coords[\"frequency\"] = freq_coord\n",
"\n",
"toolviper.utils.display.DataDict.html(parallel_coords[\"frequency\"])"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "6a6b2f44",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" name \n",
" scan_intents \n",
" shape \n",
" execution_block_UID \n",
" polarization \n",
" scan_name \n",
" spw_name \n",
" spw_intents \n",
" field_name \n",
" source_name \n",
" line_name \n",
" field_coords \n",
" session_reference_UID \n",
" scheduling_block_UID \n",
" project_UID \n",
" start_frequency \n",
" end_frequency \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Antennae_North.cal.lsrk.split_0 \n",
" [OBSERVE_TARGET#ON_SOURCE] \n",
" (50, 45, 8, 2) \n",
" uid://A002/X1ff7b0/Xb \n",
" [XX, YY] \n",
" [17, 21, 25, 9] \n",
" spw_0 \n",
" [UNSPECIFIED] \n",
" [NGC4038 - Antennae North_0, NGC4038 - Antennae North_1, NGC4038 - Antennae North_2] \n",
" [NGC4038 - Antennae North_0] \n",
" [] \n",
" Multi-Phase-Center \n",
" --- \n",
" uid://A002/X1fd4e7/X64d \n",
" T.B.D. \n",
" 3.439281e+11 \n",
" 3.440067e+11 \n",
" \n",
" \n",
" 1 \n",
" Antennae_North.cal.lsrk.split_1 \n",
" [OBSERVE_TARGET#ON_SOURCE] \n",
" (50, 55, 8, 2) \n",
" uid://A002/X207fe4/X3a \n",
" [XX, YY] \n",
" [26, 34, 38, 42] \n",
" spw_0 \n",
" [UNSPECIFIED] \n",
" [NGC4038 - Antennae North_0, NGC4038 - Antennae North_1, NGC4038 - Antennae North_2] \n",
" [NGC4038 - Antennae North_0] \n",
" [] \n",
" Multi-Phase-Center \n",
" --- \n",
" uid://A002/X1fd4e7/X64d \n",
" T.B.D. \n",
" 3.439281e+11 \n",
" 3.440067e+11 \n",
" \n",
" \n",
" 2 \n",
" Antennae_North.cal.lsrk.split_2 \n",
" [OBSERVE_TARGET#ON_SOURCE] \n",
" (15, 55, 8, 2) \n",
" uid://A002/X207fe4/X3b9 \n",
" [XX, YY] \n",
" [43] \n",
" spw_0 \n",
" [UNSPECIFIED] \n",
" [NGC4038 - Antennae North_0, NGC4038 - Antennae North_1, NGC4038 - Antennae North_2] \n",
" [NGC4038 - Antennae North_0] \n",
" [] \n",
" Multi-Phase-Center \n",
" --- \n",
" uid://A002/X1fd4e7/X64d \n",
" T.B.D. \n",
" 3.439281e+11 \n",
" 3.440067e+11 \n",
" \n",
" \n",
" 3 \n",
" Antennae_North.cal.lsrk.split_3 \n",
" [OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SOURCE] \n",
" (50, 77, 8, 2) \n",
" uid://A002/X2181fb/X49 \n",
" [XX, YY] \n",
" [48, 56, 60, 64] \n",
" spw_0 \n",
" [UNSPECIFIED] \n",
" [NGC4038 - Antennae North_0, NGC4038 - Antennae North_1, NGC4038 - Antennae North_2] \n",
" [NGC4038 - Antennae North_0] \n",
" [] \n",
" Multi-Phase-Center \n",
" --- \n",
" uid://A002/X1fd4e7/X64d \n",
" T.B.D. \n",
" 3.439281e+11 \n",
" 3.440067e+11 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name \\\n",
"0 Antennae_North.cal.lsrk.split_0 \n",
"1 Antennae_North.cal.lsrk.split_1 \n",
"2 Antennae_North.cal.lsrk.split_2 \n",
"3 Antennae_North.cal.lsrk.split_3 \n",
"\n",
" scan_intents shape \\\n",
"0 [OBSERVE_TARGET#ON_SOURCE] (50, 45, 8, 2) \n",
"1 [OBSERVE_TARGET#ON_SOURCE] (50, 55, 8, 2) \n",
"2 [OBSERVE_TARGET#ON_SOURCE] (15, 55, 8, 2) \n",
"3 [OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SOURCE] (50, 77, 8, 2) \n",
"\n",
" execution_block_UID polarization scan_name spw_name \\\n",
"0 uid://A002/X1ff7b0/Xb [XX, YY] [17, 21, 25, 9] spw_0 \n",
"1 uid://A002/X207fe4/X3a [XX, YY] [26, 34, 38, 42] spw_0 \n",
"2 uid://A002/X207fe4/X3b9 [XX, YY] [43] spw_0 \n",
"3 uid://A002/X2181fb/X49 [XX, YY] [48, 56, 60, 64] spw_0 \n",
"\n",
" spw_intents \\\n",
"0 [UNSPECIFIED] \n",
"1 [UNSPECIFIED] \n",
"2 [UNSPECIFIED] \n",
"3 [UNSPECIFIED] \n",
"\n",
" field_name \\\n",
"0 [NGC4038 - Antennae North_0, NGC4038 - Antennae North_1, NGC4038 - Antennae North_2] \n",
"1 [NGC4038 - Antennae North_0, NGC4038 - Antennae North_1, NGC4038 - Antennae North_2] \n",
"2 [NGC4038 - Antennae North_0, NGC4038 - Antennae North_1, NGC4038 - Antennae North_2] \n",
"3 [NGC4038 - Antennae North_0, NGC4038 - Antennae North_1, NGC4038 - Antennae North_2] \n",
"\n",
" source_name line_name field_coords \\\n",
"0 [NGC4038 - Antennae North_0] [] Multi-Phase-Center \n",
"1 [NGC4038 - Antennae North_0] [] Multi-Phase-Center \n",
"2 [NGC4038 - Antennae North_0] [] Multi-Phase-Center \n",
"3 [NGC4038 - Antennae North_0] [] Multi-Phase-Center \n",
"\n",
" session_reference_UID scheduling_block_UID project_UID start_frequency \\\n",
"0 --- uid://A002/X1fd4e7/X64d T.B.D. 3.439281e+11 \n",
"1 --- uid://A002/X1fd4e7/X64d T.B.D. 3.439281e+11 \n",
"2 --- uid://A002/X1fd4e7/X64d T.B.D. 3.439281e+11 \n",
"3 --- uid://A002/X1fd4e7/X64d T.B.D. 3.439281e+11 \n",
"\n",
" end_frequency \n",
"0 3.440067e+11 \n",
"1 3.440067e+11 \n",
"2 3.440067e+11 \n",
"3 3.440067e+11 "
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"ps = open_processing_set(\n",
" ps_store=\"Antennae_North.cal.lsrk.split.ps.zarr\",\n",
" scan_intents=[\"OBSERVE_TARGET#ON_SOURCE\"],\n",
")\n",
"ps.xr_ps.summary()"
]
},
{
"cell_type": "markdown",
"id": "364f37c4",
"metadata": {},
"source": [
"### Create Node Task Data Mapping"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "5f5e39ae",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"0 chunk_indices: (0,)
parallel_dims: ['frequency']
data_selection Antennae_North.cal.lsrk.split_0 frequency: slice(np.int64(0), np.int64(4), None)
Antennae_North.cal.lsrk.split_1 frequency: slice(np.int64(0), np.int64(4), None)
Antennae_North.cal.lsrk.split_2 frequency: slice(np.int64(0), np.int64(4), None)
Antennae_North.cal.lsrk.split_3 frequency: slice(np.int64(0), np.int64(4), None)
task_coords frequency data: [343928096685.9587, 343939328174.9401, 343950559663.9216, 343961791152.903]
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
slice: slice(None, None, None)
1 chunk_indices: (1,)
parallel_dims: ['frequency']
data_selection Antennae_North.cal.lsrk.split_0 frequency: slice(np.int64(3), np.int64(7), None)
Antennae_North.cal.lsrk.split_1 frequency: slice(np.int64(3), np.int64(7), None)
Antennae_North.cal.lsrk.split_2 frequency: slice(np.int64(3), np.int64(7), None)
Antennae_North.cal.lsrk.split_3 frequency: slice(np.int64(3), np.int64(7), None)
task_coords frequency data: [343961791152.903, 343973022641.88446, 343984254130.8659, 343995485619.84735]
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
slice: slice(None, None, None)
2 chunk_indices: (2,)
parallel_dims: ['frequency']
data_selection Antennae_North.cal.lsrk.split_0 frequency: slice(np.int64(4), np.int64(8), None)
Antennae_North.cal.lsrk.split_1 frequency: slice(np.int64(4), np.int64(8), None)
Antennae_North.cal.lsrk.split_2 frequency: slice(np.int64(4), np.int64(8), None)
Antennae_North.cal.lsrk.split_3 frequency: slice(np.int64(4), np.int64(8), None)
task_coords frequency data: [343973022641.88446, 343984254130.8659, 343995485619.84735, 344006717108.8288]
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
slice: slice(None, None, None)
"
],
"text/plain": [
""
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from graphviper.graph_tools.coordinate_utils import (\n",
" interpolate_data_coords_onto_parallel_coords,\n",
")\n",
"\n",
"node_task_data_mapping = interpolate_data_coords_onto_parallel_coords(\n",
" parallel_coords, ps\n",
")\n",
"\n",
"toolviper.utils.display.DataDict.html(node_task_data_mapping)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "f9b2bdd0",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'dims': ('frequency',),\n",
" 'attrs': {'channel_width': {'attrs': {'type': 'quantity', 'units': 'Hz'},\n",
" 'data': 11231488.981445312,\n",
" 'dims': []},\n",
" 'observer': 'lsrk',\n",
" 'reference_frequency': {'attrs': {'observer': 'lsrk',\n",
" 'type': 'spectral_coord',\n",
" 'units': 'Hz'},\n",
" 'data': 343928096685.9587,\n",
" 'dims': []},\n",
" 'spectral_window_intents': ['UNSPECIFIED'],\n",
" 'spectral_window_name': 'spw_0',\n",
" 'type': 'spectral_coord',\n",
" 'units': 'Hz'},\n",
" 'data': [343928096685.9587,\n",
" 343939328174.9401,\n",
" 343950559663.9216,\n",
" 343961791152.903,\n",
" 343973022641.88446,\n",
" 343984254130.8659,\n",
" 343995485619.84735,\n",
" 344006717108.8288],\n",
" 'coords': {'frequency': {'dims': ('frequency',),\n",
" 'attrs': {'channel_width': {'attrs': {'type': 'quantity', 'units': 'Hz'},\n",
" 'data': 11231488.981445312,\n",
" 'dims': []},\n",
" 'observer': 'lsrk',\n",
" 'reference_frequency': {'attrs': {'observer': 'lsrk',\n",
" 'type': 'spectral_coord',\n",
" 'units': 'Hz'},\n",
" 'data': 343928096685.9587,\n",
" 'dims': []},\n",
" 'spectral_window_intents': ['UNSPECIFIED'],\n",
" 'spectral_window_name': 'spw_0',\n",
" 'type': 'spectral_coord',\n",
" 'units': 'Hz'},\n",
" 'data': [343928096685.9587,\n",
" 343939328174.9401,\n",
" 343950559663.9216,\n",
" 343961791152.903,\n",
" 343973022641.88446,\n",
" 343984254130.8659,\n",
" 343995485619.84735,\n",
" 344006717108.8288]}},\n",
" 'name': 'frequency',\n",
" 'data_chunks': {0: [343928096685.9587,\n",
" 343939328174.9401,\n",
" 343950559663.9216,\n",
" 343961791152.903],\n",
" 1: [343961791152.903,\n",
" 343973022641.88446,\n",
" 343984254130.8659,\n",
" 343995485619.84735],\n",
" 2: [343973022641.88446,\n",
" 343984254130.8659,\n",
" 343995485619.84735,\n",
" 344006717108.8288]},\n",
" 'data_chunks_edges': [343928096685.9587,\n",
" 343961791152.903,\n",
" 343961791152.903,\n",
" 343995485619.84735,\n",
" 343973022641.88446,\n",
" 344006717108.8288]}"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"{'dims': ('frequency',), 'attrs': {'channel_width': {'attrs': {'type': 'quantity', 'units': 'Hz'}, 'data': 11231488.981445312, 'dims': []}, 'observer': 'lsrk', 'reference_frequency': {'attrs': {'observer': 'lsrk', 'type': 'spectral_coord', 'units': 'Hz'}, 'data': 343928096685.9587, 'dims': []}, 'spectral_window_intents': ['UNSPECIFIED'], 'spectral_window_name': 'spw_0', 'type': 'spectral_coord', 'units': 'Hz'}, 'data': [343928096685.9587, 343939328174.9401, 343950559663.9216, 343961791152.903, 343973022641.88446, 343984254130.8659, 343995485619.84735, 344006717108.8288], 'coords': {'frequency': {'dims': ('frequency',), 'attrs': {'channel_width': {'attrs': {'type': 'quantity', 'units': 'Hz'}, 'data': 11231488.981445312, 'dims': []}, 'observer': 'lsrk', 'reference_frequency': {'attrs': {'observer': 'lsrk', 'type': 'spectral_coord', 'units': 'Hz'}, 'data': 343928096685.9587, 'dims': []}, 'spectral_window_intents': ['UNSPECIFIED'], 'spectral_window_name': 'spw_0', 'type': 'spectral_coord', 'units': 'Hz'}, \n",
" 'data': [343928096685.9587, 343939328174.9401, 343950559663.9216, 343961791152.903, 343973022641.88446, 343984254130.8659, 343995485619.84735, 344006717108.8288]}}, 'name': 'frequency', \n",
" 'data_chunks': {0: [343928096685.9587, 343939328174.9401, 343950559663.9216, 343961791152.903], 1: [343961791152.903, 343973022641.88446, 343984254130.8659, 343995485619.84735], 2: [343973022641.88446, 343984254130.8659, 343995485619.84735, 344006717108.8288]}, \n",
" 'data_chunks_edges': [343928096685.9587, 343961791152.903, 343961791152.903, 343995485619.84735, 343973022641.88446, 344006717108.8288]}"
]
},
{
"cell_type": "markdown",
"id": "4660e626-9561-4817-9bd5-cce3b371853e",
"metadata": {},
"source": [
"### Map Graph"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "59d7fd02-63e0-438f-b9a5-dde9789a8ac2",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from graphviper.graph_tools.map import map\n",
"from xradio.measurement_set import open_processing_set\n",
"\n",
"\n",
"def my_func(input_params):\n",
" toolviper.utils.display.DataDict.html(input_params)\n",
"\n",
" print(\"*\" * 30)\n",
" return input_params[\"test_input\"]\n",
"\n",
"\n",
"input_params = {}\n",
"input_params[\"test_input\"] = 42\n",
"\n",
"ps = open_processing_set(\n",
" ps_store=\"Antennae_North.cal.lsrk.split.ps.zarr\",\n",
" scan_intents=[\"OBSERVE_TARGET#ON_SOURCE\"],\n",
")\n",
"\n",
"viper_graph = map(\n",
" input_data=ps,\n",
" node_task_data_mapping=node_task_data_mapping,\n",
" node_task=my_func,\n",
" input_params=input_params,\n",
")\n",
"\n",
"dask_graph = generate_dask_workflow(viper_graph)\n",
"\n",
"dask.visualize(dask_graph, filename=\"map_graph\")"
]
},
{
"cell_type": "markdown",
"id": "1bbbc632-2744-4364-bac0-0c07670ff5d6",
"metadata": {},
"source": [
"### Run Map Graph"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "c08fd267-270e-410b-9a8e-122c351a70c9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"******************************\n",
"******************************\n",
"******************************\n"
]
},
{
"data": {
"text/plain": [
"([42, 42, 42],)"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dask.compute(dask_graph)"
]
},
{
"cell_type": "markdown",
"id": "16514b4c-f138-48db-88e3-7d204747bff7",
"metadata": {},
"source": [
"## Baseline and Frequency Map Reduce"
]
},
{
"cell_type": "markdown",
"id": "e9f98381-34c8-400f-a7c0-b4fba291b330",
"metadata": {},
"source": [
"### Create Parallel Coordinates"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "54625049-166f-4748-ade2-2e0164d253b2",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"baseline_id data: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23\n",
" 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44]
data_chunks 0: [ 0 1 2 3 4 5 6 7 8 9 10 11]
1: [12 13 14 15 16 17 18 19 20 21 22 23]
2: [24 25 26 27 28 29 30 31 32 33 34 35]
3: [36 37 38 39 40 41 42 43 44]
data_chunks_edges: [np.int64(0), np.int64(11), np.int64(12), np.int64(23), np.int64(24), np.int64(35), np.int64(36), np.int64(44)]
data_chunk_slices 0: slice(0, 12, None)
1: slice(12, 24, None)
2: slice(24, 36, None)
3: slice(36, 45, None)
dims: ('baseline_id',)
attrs
frequency data: [3.43928097e+11 3.43939328e+11 3.43950560e+11 3.43961791e+11\n",
" 3.43973023e+11 3.43984254e+11 3.43995486e+11 3.44006717e+11]
data_chunks 0: [3.43928097e+11 3.43939328e+11 3.43950560e+11]
1: [3.43961791e+11 3.43973023e+11 3.43984254e+11]
2: [3.43995486e+11 3.44006717e+11]
data_chunks_edges: [np.float64(343928096685.9587), np.float64(343950559663.9216), np.float64(343961791152.903), np.float64(343984254130.8659), np.float64(343995485619.84735), np.float64(344006717108.8288)]
data_chunk_slices 0: slice(0, 3, None)
1: slice(3, 6, None)
2: slice(6, 8, None)
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
"
],
"text/plain": [
""
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from graphviper.graph_tools.coordinate_utils import make_parallel_coord\n",
"\n",
"dask.config.set(scheduler=\"synchronous\")\n",
"\n",
"from xradio.measurement_set import open_processing_set\n",
"\n",
"intents = [\"OBSERVE_TARGET#ON_SOURCE\"]\n",
"ps = open_processing_set(\n",
" ps_store=\"Antennae_North.cal.lsrk.split.ps.zarr\",\n",
" scan_intents=[\"OBSERVE_TARGET#ON_SOURCE\"],\n",
")\n",
"\n",
"ms_xds = ps[\"Antennae_North.cal.lsrk.split_0\"]\n",
"\n",
"parallel_coords = {}\n",
"\n",
"n_chunks = 4\n",
"parallel_coords[\"baseline_id\"] = make_parallel_coord(\n",
" coord=ms_xds.baseline_id, n_chunks=n_chunks\n",
")\n",
"\n",
"n_chunks = 3\n",
"parallel_coords[\"frequency\"] = make_parallel_coord(\n",
" coord=ms_xds.frequency, n_chunks=n_chunks\n",
")\n",
"\n",
"toolviper.utils.display.DataDict.html(parallel_coords)"
]
},
{
"cell_type": "markdown",
"id": "00419ea6",
"metadata": {},
"source": [
"### Create Node Task Data Mapping"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "b0a04407",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"0 chunk_indices: (np.int64(0), np.int64(0))
parallel_dims: ['baseline_id', 'frequency']
data_selection Antennae_North.cal.lsrk.split_0 baseline_id: slice(np.int64(0), np.int64(12), None)
frequency: slice(np.int64(0), np.int64(3), None)
Antennae_North.cal.lsrk.split_1 baseline_id: slice(np.int64(0), np.int64(12), None)
frequency: slice(np.int64(0), np.int64(3), None)
Antennae_North.cal.lsrk.split_2 baseline_id: slice(np.int64(0), np.int64(12), None)
frequency: slice(np.int64(0), np.int64(3), None)
Antennae_North.cal.lsrk.split_3 baseline_id: slice(np.int64(0), np.int64(12), None)
frequency: slice(np.int64(0), np.int64(3), None)
task_coords baseline_id data: [ 0 1 2 3 4 5 6 7 8 9 10 11]
dims: ('baseline_id',)
attrs
slice: slice(0, 12, None)
frequency data: [3.43928097e+11 3.43939328e+11 3.43950560e+11]
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
slice: slice(0, 3, None)
1 chunk_indices: (np.int64(0), np.int64(1))
parallel_dims: ['baseline_id', 'frequency']
data_selection Antennae_North.cal.lsrk.split_0 baseline_id: slice(np.int64(0), np.int64(12), None)
frequency: slice(np.int64(3), np.int64(6), None)
Antennae_North.cal.lsrk.split_1 baseline_id: slice(np.int64(0), np.int64(12), None)
frequency: slice(np.int64(3), np.int64(6), None)
Antennae_North.cal.lsrk.split_2 baseline_id: slice(np.int64(0), np.int64(12), None)
frequency: slice(np.int64(3), np.int64(6), None)
Antennae_North.cal.lsrk.split_3 baseline_id: slice(np.int64(0), np.int64(12), None)
frequency: slice(np.int64(3), np.int64(6), None)
task_coords baseline_id data: [ 0 1 2 3 4 5 6 7 8 9 10 11]
dims: ('baseline_id',)
attrs
slice: slice(0, 12, None)
frequency data: [3.43961791e+11 3.43973023e+11 3.43984254e+11]
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
slice: slice(3, 6, None)
2 chunk_indices: (np.int64(0), np.int64(2))
parallel_dims: ['baseline_id', 'frequency']
data_selection Antennae_North.cal.lsrk.split_0 baseline_id: slice(np.int64(0), np.int64(12), None)
frequency: slice(np.int64(6), np.int64(8), None)
Antennae_North.cal.lsrk.split_1 baseline_id: slice(np.int64(0), np.int64(12), None)
frequency: slice(np.int64(6), np.int64(8), None)
Antennae_North.cal.lsrk.split_2 baseline_id: slice(np.int64(0), np.int64(12), None)
frequency: slice(np.int64(6), np.int64(8), None)
Antennae_North.cal.lsrk.split_3 baseline_id: slice(np.int64(0), np.int64(12), None)
frequency: slice(np.int64(6), np.int64(8), None)
task_coords baseline_id data: [ 0 1 2 3 4 5 6 7 8 9 10 11]
dims: ('baseline_id',)
attrs
slice: slice(0, 12, None)
frequency data: [3.43995486e+11 3.44006717e+11]
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
slice: slice(6, 8, None)
3 chunk_indices: (np.int64(1), np.int64(0))
parallel_dims: ['baseline_id', 'frequency']
data_selection Antennae_North.cal.lsrk.split_0 baseline_id: slice(np.int64(12), np.int64(24), None)
frequency: slice(np.int64(0), np.int64(3), None)
Antennae_North.cal.lsrk.split_1 baseline_id: slice(np.int64(12), np.int64(24), None)
frequency: slice(np.int64(0), np.int64(3), None)
Antennae_North.cal.lsrk.split_2 baseline_id: slice(np.int64(12), np.int64(24), None)
frequency: slice(np.int64(0), np.int64(3), None)
Antennae_North.cal.lsrk.split_3 baseline_id: slice(np.int64(12), np.int64(24), None)
frequency: slice(np.int64(0), np.int64(3), None)
task_coords baseline_id data: [12 13 14 15 16 17 18 19 20 21 22 23]
dims: ('baseline_id',)
attrs
slice: slice(12, 24, None)
frequency data: [3.43928097e+11 3.43939328e+11 3.43950560e+11]
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
slice: slice(0, 3, None)
4 chunk_indices: (np.int64(1), np.int64(1))
parallel_dims: ['baseline_id', 'frequency']
data_selection Antennae_North.cal.lsrk.split_0 baseline_id: slice(np.int64(12), np.int64(24), None)
frequency: slice(np.int64(3), np.int64(6), None)
Antennae_North.cal.lsrk.split_1 baseline_id: slice(np.int64(12), np.int64(24), None)
frequency: slice(np.int64(3), np.int64(6), None)
Antennae_North.cal.lsrk.split_2 baseline_id: slice(np.int64(12), np.int64(24), None)
frequency: slice(np.int64(3), np.int64(6), None)
Antennae_North.cal.lsrk.split_3 baseline_id: slice(np.int64(12), np.int64(24), None)
frequency: slice(np.int64(3), np.int64(6), None)
task_coords baseline_id data: [12 13 14 15 16 17 18 19 20 21 22 23]
dims: ('baseline_id',)
attrs
slice: slice(12, 24, None)
frequency data: [3.43961791e+11 3.43973023e+11 3.43984254e+11]
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
slice: slice(3, 6, None)
5 chunk_indices: (np.int64(1), np.int64(2))
parallel_dims: ['baseline_id', 'frequency']
data_selection Antennae_North.cal.lsrk.split_0 baseline_id: slice(np.int64(12), np.int64(24), None)
frequency: slice(np.int64(6), np.int64(8), None)
Antennae_North.cal.lsrk.split_1 baseline_id: slice(np.int64(12), np.int64(24), None)
frequency: slice(np.int64(6), np.int64(8), None)
Antennae_North.cal.lsrk.split_2 baseline_id: slice(np.int64(12), np.int64(24), None)
frequency: slice(np.int64(6), np.int64(8), None)
Antennae_North.cal.lsrk.split_3 baseline_id: slice(np.int64(12), np.int64(24), None)
frequency: slice(np.int64(6), np.int64(8), None)
task_coords baseline_id data: [12 13 14 15 16 17 18 19 20 21 22 23]
dims: ('baseline_id',)
attrs
slice: slice(12, 24, None)
frequency data: [3.43995486e+11 3.44006717e+11]
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
slice: slice(6, 8, None)
6 chunk_indices: (np.int64(2), np.int64(0))
parallel_dims: ['baseline_id', 'frequency']
data_selection Antennae_North.cal.lsrk.split_0 baseline_id: slice(np.int64(24), np.int64(36), None)
frequency: slice(np.int64(0), np.int64(3), None)
Antennae_North.cal.lsrk.split_1 baseline_id: slice(np.int64(24), np.int64(36), None)
frequency: slice(np.int64(0), np.int64(3), None)
Antennae_North.cal.lsrk.split_2 baseline_id: slice(np.int64(24), np.int64(36), None)
frequency: slice(np.int64(0), np.int64(3), None)
Antennae_North.cal.lsrk.split_3 baseline_id: slice(np.int64(24), np.int64(36), None)
frequency: slice(np.int64(0), np.int64(3), None)
task_coords baseline_id data: [24 25 26 27 28 29 30 31 32 33 34 35]
dims: ('baseline_id',)
attrs
slice: slice(24, 36, None)
frequency data: [3.43928097e+11 3.43939328e+11 3.43950560e+11]
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
slice: slice(0, 3, None)
7 chunk_indices: (np.int64(2), np.int64(1))
parallel_dims: ['baseline_id', 'frequency']
data_selection Antennae_North.cal.lsrk.split_0 baseline_id: slice(np.int64(24), np.int64(36), None)
frequency: slice(np.int64(3), np.int64(6), None)
Antennae_North.cal.lsrk.split_1 baseline_id: slice(np.int64(24), np.int64(36), None)
frequency: slice(np.int64(3), np.int64(6), None)
Antennae_North.cal.lsrk.split_2 baseline_id: slice(np.int64(24), np.int64(36), None)
frequency: slice(np.int64(3), np.int64(6), None)
Antennae_North.cal.lsrk.split_3 baseline_id: slice(np.int64(24), np.int64(36), None)
frequency: slice(np.int64(3), np.int64(6), None)
task_coords baseline_id data: [24 25 26 27 28 29 30 31 32 33 34 35]
dims: ('baseline_id',)
attrs
slice: slice(24, 36, None)
frequency data: [3.43961791e+11 3.43973023e+11 3.43984254e+11]
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
slice: slice(3, 6, None)
8 chunk_indices: (np.int64(2), np.int64(2))
parallel_dims: ['baseline_id', 'frequency']
data_selection Antennae_North.cal.lsrk.split_0 baseline_id: slice(np.int64(24), np.int64(36), None)
frequency: slice(np.int64(6), np.int64(8), None)
Antennae_North.cal.lsrk.split_1 baseline_id: slice(np.int64(24), np.int64(36), None)
frequency: slice(np.int64(6), np.int64(8), None)
Antennae_North.cal.lsrk.split_2 baseline_id: slice(np.int64(24), np.int64(36), None)
frequency: slice(np.int64(6), np.int64(8), None)
Antennae_North.cal.lsrk.split_3 baseline_id: slice(np.int64(24), np.int64(36), None)
frequency: slice(np.int64(6), np.int64(8), None)
task_coords baseline_id data: [24 25 26 27 28 29 30 31 32 33 34 35]
dims: ('baseline_id',)
attrs
slice: slice(24, 36, None)
frequency data: [3.43995486e+11 3.44006717e+11]
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
slice: slice(6, 8, None)
9 chunk_indices: (np.int64(3), np.int64(0))
parallel_dims: ['baseline_id', 'frequency']
data_selection Antennae_North.cal.lsrk.split_0 baseline_id: slice(np.int64(36), np.int64(45), None)
frequency: slice(np.int64(0), np.int64(3), None)
Antennae_North.cal.lsrk.split_1 baseline_id: slice(np.int64(36), np.int64(45), None)
frequency: slice(np.int64(0), np.int64(3), None)
Antennae_North.cal.lsrk.split_2 baseline_id: slice(np.int64(36), np.int64(45), None)
frequency: slice(np.int64(0), np.int64(3), None)
Antennae_North.cal.lsrk.split_3 baseline_id: slice(np.int64(36), np.int64(45), None)
frequency: slice(np.int64(0), np.int64(3), None)
task_coords baseline_id data: [36 37 38 39 40 41 42 43 44]
dims: ('baseline_id',)
attrs
slice: slice(36, 45, None)
frequency data: [3.43928097e+11 3.43939328e+11 3.43950560e+11]
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
slice: slice(0, 3, None)
10 chunk_indices: (np.int64(3), np.int64(1))
parallel_dims: ['baseline_id', 'frequency']
data_selection Antennae_North.cal.lsrk.split_0 baseline_id: slice(np.int64(36), np.int64(45), None)
frequency: slice(np.int64(3), np.int64(6), None)
Antennae_North.cal.lsrk.split_1 baseline_id: slice(np.int64(36), np.int64(45), None)
frequency: slice(np.int64(3), np.int64(6), None)
Antennae_North.cal.lsrk.split_2 baseline_id: slice(np.int64(36), np.int64(45), None)
frequency: slice(np.int64(3), np.int64(6), None)
Antennae_North.cal.lsrk.split_3 baseline_id: slice(np.int64(36), np.int64(45), None)
frequency: slice(np.int64(3), np.int64(6), None)
task_coords baseline_id data: [36 37 38 39 40 41 42 43 44]
dims: ('baseline_id',)
attrs
slice: slice(36, 45, None)
frequency data: [3.43961791e+11 3.43973023e+11 3.43984254e+11]
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
slice: slice(3, 6, None)
11 chunk_indices: (np.int64(3), np.int64(2))
parallel_dims: ['baseline_id', 'frequency']
data_selection Antennae_North.cal.lsrk.split_0 baseline_id: slice(np.int64(36), np.int64(45), None)
frequency: slice(np.int64(6), np.int64(8), None)
Antennae_North.cal.lsrk.split_1 baseline_id: slice(np.int64(36), np.int64(45), None)
frequency: slice(np.int64(6), np.int64(8), None)
Antennae_North.cal.lsrk.split_2 baseline_id: slice(np.int64(36), np.int64(45), None)
frequency: slice(np.int64(6), np.int64(8), None)
Antennae_North.cal.lsrk.split_3 baseline_id: slice(np.int64(36), np.int64(45), None)
frequency: slice(np.int64(6), np.int64(8), None)
task_coords baseline_id data: [36 37 38 39 40 41 42 43 44]
dims: ('baseline_id',)
attrs
slice: slice(36, 45, None)
frequency data: [3.43995486e+11 3.44006717e+11]
dims: ('frequency',)
attrs channel_width attrs type: quantity
units: Hz
data: 11231488.981445312
dims: []
observer: lsrk
reference_frequency attrs observer: lsrk
type: spectral_coord
units: Hz
data: 343928096685.9587
dims: []
spectral_window_intents: ['UNSPECIFIED']
spectral_window_name: spw_0
type: spectral_coord
units: Hz
slice: slice(6, 8, None)
"
],
"text/plain": [
""
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from graphviper.graph_tools.coordinate_utils import (\n",
" interpolate_data_coords_onto_parallel_coords,\n",
")\n",
"\n",
"node_task_data_mapping = interpolate_data_coords_onto_parallel_coords(\n",
" parallel_coords, ps\n",
")\n",
"\n",
"toolviper.utils.display.DataDict.html(node_task_data_mapping)"
]
},
{
"cell_type": "markdown",
"id": "b9a0e981-da9b-41f0-9b50-59d2731a57ce",
"metadata": {},
"source": [
"### Map Graph"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "4d3e3ec2-fc3b-43c2-a6d3-1d32a966a8e8",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from graphviper.graph_tools.map import map\n",
"\n",
"def my_func(input_params):\n",
" toolviper.utils.display.DataDict.html(input_params)\n",
"\n",
" print(\"*\" * 30)\n",
" return input_params[\"test_input\"]\n",
"\n",
"\n",
"# ['test_input', 'input_data_name', 'viper_local_dir', 'date_time', 'data_sel', 'chunk_coords', 'chunk_indx', 'chunk_id', 'parallel_dims']\n",
"input_params = {}\n",
"input_params[\"test_input\"] = 42\n",
"\n",
"viper_graph = map(\n",
" input_data=ps,\n",
" node_task_data_mapping=node_task_data_mapping,\n",
" node_task=my_func,\n",
" input_params=input_params,\n",
")\n",
"\n",
"dask_graph = generate_dask_workflow(viper_graph)\n",
"dask.visualize(dask_graph, filename=\"map_graph\")"
]
},
{
"cell_type": "markdown",
"id": "5bbe9975-65cb-43ad-859c-72cc35ad0557",
"metadata": {},
"source": [
"### Run Map Graph"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "b1dfee4c-4dcb-4bb9-ba12-2eca07dcea9c",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"******************************\n",
"******************************\n",
"******************************\n",
"******************************\n",
"******************************\n",
"******************************\n",
"******************************\n",
"******************************\n",
"******************************\n",
"******************************\n",
"******************************\n",
"******************************\n"
]
},
{
"data": {
"text/plain": [
"([42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42],)"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dask.compute(dask_graph)"
]
},
{
"cell_type": "markdown",
"id": "f5b7f016-b05e-4773-aa2e-de8b397a0c59",
"metadata": {},
"source": [
"## Time Map Reduce"
]
},
{
"cell_type": "markdown",
"id": "b3a8a9fe-9376-461b-b472-83107d1c1c02",
"metadata": {},
"source": [
"### Create Parallel Coordinates"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "4e4acb1e-4a63-4e73-a342-30eb1013347e",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"data: [1306547230.1759996, 1306547236.224, 1306547242.2720003, 1306547248.3199997, 1306547254.368, 1306547265.4560003, 1306547271.5039997, 1306547277.552, 1306547283.5999994, 1306547289.6479998, 1306547300.736, 1306547306.7840004, 1306547312.8319998, 1306547318.88, 1306547324.9279995, 1306548534.0480003, 1306548540.0959997, 1306548546.144, 1306548552.1919994, 1306548558.2399998, 1306548569.328, 1306548575.3760004, 1306548581.4240007, 1306548587.4720001, 1306548593.5199995, 1306548604.6079998, 1306548610.6560001, 1306548616.7040005, 1306548622.7519999, 1306548628.8000002, 1306549611.8400002, 1306549617.8879995, 1306549623.9359999, 1306549629.9840002, 1306549636.0320005, 1306549647.12, 1306549653.1680002, 1306549659.2159996, 1306549665.264, 1306549671.3120003, 1306549682.4000006, 1306549688.448, 1306549694.4960003, 1306549700.5439997, 1306549706.592, 1306550670.0959997, 1306550676.144, 1306550682.1919994, 1306550688.2399998, 1306550694.288, 1307136638.6879997, 1307136644.736, 1307136650.7839994, 1307136656.8319998, 1307136662.88, 1307136673.9680004, 1307136680.0159998, 1307136686.0640001, 1307136692.1119995, 1307136698.1599998, 1307136709.2480001, 1307136715.2960005, 1307136721.3439999, 1307136727.3920002, 1307136733.4400005, 1307137970.88, 1307137976.9279995, 1307137982.9759998, 1307137989.0240002, 1307137995.0719995, 1307138006.1599998, 1307138012.2080002, 1307138018.2560005, 1307138024.304, 1307138030.3519993, 1307138041.4399996, 1307138047.488, 1307138053.5360003, 1307138059.5840006, 1307138065.632, 1307139057.12, 1307139063.1680002, 1307139069.2159996, 1307139075.264, 1307139081.3119993, 1307139092.3999996, 1307139098.448, 1307139104.4960003, 1307139110.5440006, 1307139116.592, 1307139127.6799994, 1307139133.7279997, 1307139139.776, 1307139145.8240004, 1307139151.8719997, 1307140121.7600002, 1307140127.8079996, 1307140133.856, 1307140139.9039993, 1307140145.9519997, 1307147559.9359999, 1307147565.9840002, 1307147572.0319996, 1307147578.08, 1307147584.1280003, 1307147595.2160006, 1307147601.264, 1307147607.3120003, 1307147613.3600006, 1307147619.408, 1307147630.4960003, 1307147636.5439997, 1307147642.592, 1307147648.6400003, 1307147654.6880007]
data_chunks 0: [1.30654723e+09 1.30654724e+09 1.30654724e+09 1.30654725e+09\n",
" 1.30654725e+09 1.30654727e+09 1.30654727e+09 1.30654728e+09\n",
" 1.30654728e+09 1.30654729e+09 1.30654730e+09 1.30654731e+09\n",
" 1.30654731e+09 1.30654732e+09 1.30654732e+09 1.30654853e+09\n",
" 1.30654854e+09 1.30654855e+09 1.30654855e+09 1.30654856e+09\n",
" 1.30654857e+09 1.30654858e+09 1.30654858e+09 1.30654859e+09\n",
" 1.30654859e+09 1.30654860e+09 1.30654861e+09 1.30654862e+09\n",
" 1.30654862e+09]
1: [1.30654863e+09 1.30654961e+09 1.30654962e+09 1.30654962e+09\n",
" 1.30654963e+09 1.30654964e+09 1.30654965e+09 1.30654965e+09\n",
" 1.30654966e+09 1.30654967e+09 1.30654967e+09 1.30654968e+09\n",
" 1.30654969e+09 1.30654969e+09 1.30654970e+09 1.30654971e+09\n",
" 1.30655067e+09 1.30655068e+09 1.30655068e+09 1.30655069e+09\n",
" 1.30655069e+09 1.30713664e+09 1.30713664e+09 1.30713665e+09\n",
" 1.30713666e+09 1.30713666e+09 1.30713667e+09 1.30713668e+09\n",
" 1.30713669e+09]
2: [1.30713669e+09 1.30713670e+09 1.30713671e+09 1.30713672e+09\n",
" 1.30713672e+09 1.30713673e+09 1.30713673e+09 1.30713797e+09\n",
" 1.30713798e+09 1.30713798e+09 1.30713799e+09 1.30713800e+09\n",
" 1.30713801e+09 1.30713801e+09 1.30713802e+09 1.30713802e+09\n",
" 1.30713803e+09 1.30713804e+09 1.30713805e+09 1.30713805e+09\n",
" 1.30713806e+09 1.30713807e+09 1.30713906e+09 1.30713906e+09\n",
" 1.30713907e+09 1.30713908e+09 1.30713908e+09 1.30713909e+09\n",
" 1.30713910e+09]
3: [1.30713910e+09 1.30713911e+09 1.30713912e+09 1.30713913e+09\n",
" 1.30713913e+09 1.30713914e+09 1.30713915e+09 1.30713915e+09\n",
" 1.30714012e+09 1.30714013e+09 1.30714013e+09 1.30714014e+09\n",
" 1.30714015e+09 1.30714756e+09 1.30714757e+09 1.30714757e+09\n",
" 1.30714758e+09 1.30714758e+09 1.30714760e+09 1.30714760e+09\n",
" 1.30714761e+09 1.30714761e+09 1.30714762e+09 1.30714763e+09\n",
" 1.30714764e+09 1.30714764e+09 1.30714765e+09 1.30714765e+09]
data_chunks_edges: [np.float64(1306547230.1759996), np.float64(1306548622.7519999), np.float64(1306548628.8000002), np.float64(1307136686.0640001), np.float64(1307136692.1119995), np.float64(1307139098.448), np.float64(1307139104.4960003), np.float64(1307147654.6880007)]
data_chunk_slices 0: slice(0, 29, None)
1: slice(29, 58, None)
2: slice(58, 87, None)
3: slice(87, 115, None)
dims: ('time',)
attrs format: unix
integration_time attrs type: quantity
units: s
data: 6.048
dims: []
scale: utc
type: time
units: s
"
],
"text/plain": [
""
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from graphviper.graph_tools.coordinate_utils import make_parallel_coord\n",
"\n",
"dask.config.set(scheduler=\"synchronous\")\n",
"\n",
"from xradio.measurement_set import open_processing_set\n",
"\n",
"intents = [\"OBSERVE_TARGET#ON_SOURCE\"]\n",
"ps = open_processing_set(\n",
" ps_store=\"Antennae_North.cal.lsrk.split.ps.zarr\",\n",
" scan_intents=[\"OBSERVE_TARGET#ON_SOURCE\"],\n",
")\n",
"ms_xds = ps[\"Antennae_North.cal.lsrk.split_0\"]\n",
"\n",
"parallel_coords = {}\n",
"\n",
"import xarray as xr\n",
"import numpy as np\n",
"\n",
"t0, t1, t2 = (ps[\"Antennae_North.cal.lsrk.split_1\"].time, ps[\"Antennae_North.cal.lsrk.split_0\"].time, ps[\"Antennae_North.cal.lsrk.split_2\"].time)\n",
"time_coord = xr.concat([t0, t1, t2], dim=\"time\").sortby(\"time\").to_dict()\n",
"n_chunks = 4\n",
"parallel_coords[\"time\"] = make_parallel_coord(coord=time_coord, n_chunks=n_chunks)\n",
"\n",
"toolviper.utils.display.DataDict.html(parallel_coords[\"time\"])"
]
},
{
"cell_type": "markdown",
"id": "5d2acace",
"metadata": {},
"source": [
"### Create Node Task Data Mapping"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "833a71ad",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"0 chunk_indices: (np.int64(0),)
parallel_dims: ['time']
data_selection Antennae_North.cal.lsrk.split_0 time: slice(np.int64(0), np.int64(29), None)
task_coords time data: [1.30654723e+09 1.30654724e+09 1.30654724e+09 1.30654725e+09\n",
" 1.30654725e+09 1.30654727e+09 1.30654727e+09 1.30654728e+09\n",
" 1.30654728e+09 1.30654729e+09 1.30654730e+09 1.30654731e+09\n",
" 1.30654731e+09 1.30654732e+09 1.30654732e+09 1.30654853e+09\n",
" 1.30654854e+09 1.30654855e+09 1.30654855e+09 1.30654856e+09\n",
" 1.30654857e+09 1.30654858e+09 1.30654858e+09 1.30654859e+09\n",
" 1.30654859e+09 1.30654860e+09 1.30654861e+09 1.30654862e+09\n",
" 1.30654862e+09]
dims: ('time',)
attrs format: unix
integration_time attrs type: quantity
units: s
data: 6.048
dims: []
scale: utc
type: time
units: s
slice: slice(0, 29, None)
1 chunk_indices: (np.int64(1),)
parallel_dims: ['time']
data_selection Antennae_North.cal.lsrk.split_0 time: slice(np.int64(29), np.int64(-1), None)
Antennae_North.cal.lsrk.split_1 time: slice(np.int64(0), np.int64(8), None)
task_coords time data: [1.30654863e+09 1.30654961e+09 1.30654962e+09 1.30654962e+09\n",
" 1.30654963e+09 1.30654964e+09 1.30654965e+09 1.30654965e+09\n",
" 1.30654966e+09 1.30654967e+09 1.30654967e+09 1.30654968e+09\n",
" 1.30654969e+09 1.30654969e+09 1.30654970e+09 1.30654971e+09\n",
" 1.30655067e+09 1.30655068e+09 1.30655068e+09 1.30655069e+09\n",
" 1.30655069e+09 1.30713664e+09 1.30713664e+09 1.30713665e+09\n",
" 1.30713666e+09 1.30713666e+09 1.30713667e+09 1.30713668e+09\n",
" 1.30713669e+09]
dims: ('time',)
attrs format: unix
integration_time attrs type: quantity
units: s
data: 6.048
dims: []
scale: utc
type: time
units: s
slice: slice(29, 58, None)
2 chunk_indices: (np.int64(2),)
parallel_dims: ['time']
data_selection Antennae_North.cal.lsrk.split_1 time: slice(np.int64(8), np.int64(37), None)
task_coords time data: [1.30713669e+09 1.30713670e+09 1.30713671e+09 1.30713672e+09\n",
" 1.30713672e+09 1.30713673e+09 1.30713673e+09 1.30713797e+09\n",
" 1.30713798e+09 1.30713798e+09 1.30713799e+09 1.30713800e+09\n",
" 1.30713801e+09 1.30713801e+09 1.30713802e+09 1.30713802e+09\n",
" 1.30713803e+09 1.30713804e+09 1.30713805e+09 1.30713805e+09\n",
" 1.30713806e+09 1.30713807e+09 1.30713906e+09 1.30713906e+09\n",
" 1.30713907e+09 1.30713908e+09 1.30713908e+09 1.30713909e+09\n",
" 1.30713910e+09]
dims: ('time',)
attrs format: unix
integration_time attrs type: quantity
units: s
data: 6.048
dims: []
scale: utc
type: time
units: s
slice: slice(58, 87, None)
3 chunk_indices: (np.int64(3),)
parallel_dims: ['time']
data_selection Antennae_North.cal.lsrk.split_1 time: slice(np.int64(37), np.int64(-1), None)
Antennae_North.cal.lsrk.split_2 time: slice(np.int64(0), np.int64(15), None)
task_coords time data: [1.30713910e+09 1.30713911e+09 1.30713912e+09 1.30713913e+09\n",
" 1.30713913e+09 1.30713914e+09 1.30713915e+09 1.30713915e+09\n",
" 1.30714012e+09 1.30714013e+09 1.30714013e+09 1.30714014e+09\n",
" 1.30714015e+09 1.30714756e+09 1.30714757e+09 1.30714757e+09\n",
" 1.30714758e+09 1.30714758e+09 1.30714760e+09 1.30714760e+09\n",
" 1.30714761e+09 1.30714761e+09 1.30714762e+09 1.30714763e+09\n",
" 1.30714764e+09 1.30714764e+09 1.30714765e+09 1.30714765e+09]
dims: ('time',)
attrs format: unix
integration_time attrs type: quantity
units: s
data: 6.048
dims: []
scale: utc
type: time
units: s
slice: slice(87, 115, None)
"
],
"text/plain": [
""
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from graphviper.graph_tools.coordinate_utils import (\n",
" interpolate_data_coords_onto_parallel_coords,\n",
")\n",
"\n",
"node_task_data_mapping = interpolate_data_coords_onto_parallel_coords(\n",
" parallel_coords, ps\n",
")\n",
"\n",
"toolviper.utils.display.DataDict.html(node_task_data_mapping)"
]
},
{
"cell_type": "markdown",
"id": "1123fc67-58c1-4786-8546-a0fc47150dc6",
"metadata": {},
"source": [
"### Map Graph"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "d56f58e2-d02c-4950-9eab-9e9190660b0a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import dask\n",
"\n",
"from graphviper.graph_tools.map import map\n",
"\n",
"def my_func(input_params):\n",
" toolviper.utils.display.DataDict.html(input_params)\n",
"\n",
" print(\"*\" * 30)\n",
" return input_params[\"test_input\"]\n",
"\n",
"\n",
"# ['test_input', 'input_data_name', 'viper_local_dir', 'date_time', 'data_sel', 'chunk_coords', 'chunk_indx', 'chunk_id', 'parallel_dims']\n",
"input_params = {}\n",
"input_params[\"test_input\"] = 42\n",
"\n",
"viper_graph = map(\n",
" input_data=ps,\n",
" node_task_data_mapping=node_task_data_mapping,\n",
" node_task=my_func,\n",
" input_params=input_params,\n",
")\n",
"\n",
"dask_graph = generate_dask_workflow(viper_graph)\n",
"dask.visualize(dask_graph, filename=\"map_graph\")"
]
},
{
"cell_type": "markdown",
"id": "c030e0b0-f289-4c16-9c74-35aab1f7b011",
"metadata": {},
"source": [
"### Run Map Graph"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "a02e3704-6a3b-430a-a40a-457d6d751531",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"******************************\n",
"******************************\n",
"******************************\n",
"******************************\n"
]
},
{
"data": {
"text/plain": [
"([42, 42, 42, 42],)"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dask.compute(dask_graph)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "19ac1f1f-4d49-449d-99f6-195e3737a99e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0.1.1'"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"toolviper.__version__"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4874d5a1-d119-42da-873e-e31e5d6ebd3e",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "zinc",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.0"
}
},
"nbformat": 4,
"nbformat_minor": 5
}