Last active
May 22, 2020 13:54
-
-
Save aaronspring/ff8c4b649fbc7230ace98cfc9f1043c8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Number of CPUs: 72, number of threads: 9, number of workers: 8, processes: False\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "from dask.distributed import Client\n", | |
| "\n", | |
| "import multiprocessing\n", | |
| "ncpu = multiprocessing.cpu_count()\n", | |
| "processes = False\n", | |
| "nworker = 8\n", | |
| "threads = ncpu // nworker\n", | |
| "print(\n", | |
| " f\"Number of CPUs: {ncpu}, number of threads: {threads}, number of workers: {nworker}, processes: {processes}\",\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<table style=\"border: 2px solid white;\">\n", | |
| "<tr>\n", | |
| "<td style=\"vertical-align: top; border: 0px solid white\">\n", | |
| "<h3 style=\"text-align: left;\">Client</h3>\n", | |
| "<ul style=\"text-align: left; list-style: none; margin: 0; padding: 0;\">\n", | |
| " <li><b>Scheduler: </b>inproc://10.50.47.252/69776/1</li>\n", | |
| " <li><b>Dashboard: </b><a href='http://localhost:8888/proxy/8787/status' target='_blank'>http://localhost:8888/proxy/8787/status</a></li>\n", | |
| "</ul>\n", | |
| "</td>\n", | |
| "<td style=\"vertical-align: top; border: 0px solid white\">\n", | |
| "<h3 style=\"text-align: left;\">Cluster</h3>\n", | |
| "<ul style=\"text-align: left; list-style:none; margin: 0; padding: 0;\">\n", | |
| " <li><b>Workers: </b>8</li>\n", | |
| " <li><b>Cores: </b>72</li>\n", | |
| " <li><b>Memory: </b>531.50 GB</li>\n", | |
| "</ul>\n", | |
| "</td>\n", | |
| "</tr>\n", | |
| "</table>" | |
| ], | |
| "text/plain": [ | |
| "<Client: 'inproc://10.50.47.252/69776/1' processes=8 threads=72, memory=531.50 GB>" | |
| ] | |
| }, | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "client = Client(\n", | |
| " processes=processes,\n", | |
| " threads_per_worker=threads,\n", | |
| " n_workers=nworker,\n", | |
| " memory_limit=\"256GB\",\n", | |
| " #nanny=False\n", | |
| ")\n", | |
| "\n", | |
| "client" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## alternative dask_jobqueue" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "/work/mh0727/m300524/miniconda3/envs/climpred-dev/lib/python3.6/site-packages/distributed/node.py:244: UserWarning: Port 8787 is already in use.\n", | |
| "Perhaps you already have a cluster running?\n", | |
| "Hosting the HTTP server on port 46662 instead\n", | |
| " http_address[\"port\"], self.http_server.port\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "from dask.distributed import Client\n", | |
| "from dask_jobqueue import SLURMCluster\n", | |
| "import os\n", | |
| "\n", | |
| "cluster = SLURMCluster(\n", | |
| " cores=npcu,\n", | |
| " processes=6,\n", | |
| " memory=\"100GB\",\n", | |
| " shebang='#!/usr/bin/env bash',\n", | |
| " queue=\"compute\",\n", | |
| " walltime=\"00:30:00\",\n", | |
| " local_directory='/work/mh0727/m300524/dask',\n", | |
| " death_timeout=\"15s\",\n", | |
| " interface=\"ib0\",\n", | |
| " project=\"mh0727\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<table style=\"border: 2px solid white;\">\n", | |
| "<tr>\n", | |
| "<td style=\"vertical-align: top; border: 0px solid white\">\n", | |
| "<h3 style=\"text-align: left;\">Client</h3>\n", | |
| "<ul style=\"text-align: left; list-style: none; margin: 0; padding: 0;\">\n", | |
| " <li><b>Scheduler: </b>tcp://10.50.43.35:43153</li>\n", | |
| " <li><b>Dashboard: </b><a href='http://localhost:8888/proxy/46662/status' target='_blank'>http://localhost:8888/proxy/46662/status</a></li>\n", | |
| "</ul>\n", | |
| "</td>\n", | |
| "<td style=\"vertical-align: top; border: 0px solid white\">\n", | |
| "<h3 style=\"text-align: left;\">Cluster</h3>\n", | |
| "<ul style=\"text-align: left; list-style:none; margin: 0; padding: 0;\">\n", | |
| " <li><b>Workers: </b>0</li>\n", | |
| " <li><b>Cores: </b>0</li>\n", | |
| " <li><b>Memory: </b>0 B</li>\n", | |
| "</ul>\n", | |
| "</td>\n", | |
| "</tr>\n", | |
| "</table>" | |
| ], | |
| "text/plain": [ | |
| "<Client: 'tcp://10.50.43.35:43153' processes=0 threads=0, memory=0 B>" | |
| ] | |
| }, | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "client = Client(cluster)\n", | |
| "client" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "cluster.scale(8*12) # scale to 4 _workers_" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "client" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Scaling bootstrap" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "('2.0.0.post78', '0.15.1')" | |
| ] | |
| }, | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "import xarray as xr\n", | |
| "from climpred.tutorial import load_dataset\n", | |
| "from climpred.bootstrap import bootstrap_hindcast, bootstrap_perfect_model\n", | |
| "import dask\n", | |
| "import numpy as np\n", | |
| "import climpred\n", | |
| "climpred.__version__, xr.__version__" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "ds = xr.Dataset()\n", | |
| "control = xr.Dataset()\n", | |
| "nmember = 10\n", | |
| "ninit = 12\n", | |
| "nlead = 5\n", | |
| "nx = 360//5\n", | |
| "ny = 180//5\n", | |
| "control_start = 3000\n", | |
| "control_end = 3300\n", | |
| "ntime = control_end - control_start\n", | |
| " \n", | |
| "times = xr.cftime_range(\n", | |
| " start=str(control_start),\n", | |
| " periods=ntime,\n", | |
| " freq='YS',\n", | |
| " calendar='noleap',\n", | |
| ")\n", | |
| "leads = np.arange(1, 1 + nlead)\n", | |
| "members = np.arange(1, 1 + nmember)\n", | |
| "inits = xr.cftime_range(\n", | |
| " start=str(control_start),\n", | |
| " periods=ninit,\n", | |
| " freq='10YS',\n", | |
| " calendar='noleap',\n", | |
| ")\n", | |
| "\n", | |
| "lons = xr.DataArray(\n", | |
| " np.linspace(0.5, 359.5, nx),\n", | |
| " dims=('lon',),\n", | |
| " attrs={'units': 'degrees east', 'long_name': 'longitude'},\n", | |
| ")\n", | |
| "lats = xr.DataArray(\n", | |
| " np.linspace(-89.5, 89.5, ny),\n", | |
| " dims=('lat',),\n", | |
| " attrs={'units': 'degrees north', 'long_name': 'latitude'},\n", | |
| ")\n", | |
| "ds['var'] = xr.DataArray(\n", | |
| " np.random.random(\n", | |
| " (nmember, ninit, nlead, nx, ny),\n", | |
| " ),\n", | |
| " coords={\n", | |
| " 'member': members,\n", | |
| " 'init': inits,\n", | |
| " 'lon': lons,\n", | |
| " 'lat': lats,\n", | |
| " 'lead': leads,\n", | |
| " },\n", | |
| " dims=('member', 'init', 'lead', 'lon', 'lat'),\n", | |
| " name='var',)\n", | |
| "\n", | |
| "control['var'] = xr.DataArray(\n", | |
| " np.random.random((ntime, nx, ny)),\n", | |
| " coords={'lon': lons, 'lat': lats, 'time': times},\n", | |
| " dims=('time', 'lon', 'lat'),\n", | |
| " name='var',\n", | |
| " attrs={'units': 'var units', 'description': 'a description'},\n", | |
| " )\n", | |
| "control=control['var'].chunk({'time':'auto'})\n", | |
| "\n", | |
| "ds.lead.attrs['units'] = 'years'\n", | |
| "\n", | |
| "ds=ds['var'].chunk({'lon':-1})" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<table>\n", | |
| "<tr>\n", | |
| "<td>\n", | |
| "<table>\n", | |
| " <thead>\n", | |
| " <tr><td> </td><th> Array </th><th> Chunk </th></tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr><th> Bytes </th><td> 12.44 MB </td> <td> 12.44 MB </td></tr>\n", | |
| " <tr><th> Shape </th><td> (10, 12, 5, 72, 36) </td> <td> (10, 12, 5, 72, 36) </td></tr>\n", | |
| " <tr><th> Count </th><td> 1 Tasks </td><td> 1 Chunks </td></tr>\n", | |
| " <tr><th> Type </th><td> float64 </td><td> numpy.ndarray </td></tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</td>\n", | |
| "<td>\n", | |
| "<svg width=\"353\" height=\"191\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"0\" y1=\"0\" x2=\"41\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"0\" y1=\"40\" x2=\"41\" y2=\"40\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"40\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"41\" y1=\"0\" x2=\"41\" y2=\"40\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"0.000000,0.000000 41.203829,0.000000 41.203829,40.328956 0.000000,40.328956\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"20.601915\" y=\"60.328956\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >12</text>\n", | |
| " <text x=\"61.203829\" y=\"20.164478\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,61.203829,20.164478)\">10</text>\n", | |
| "\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"111\" y1=\"0\" x2=\"132\" y2=\"21\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"111\" y1=\"120\" x2=\"132\" y2=\"141\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"111\" y1=\"0\" x2=\"111\" y2=\"120\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"132\" y1=\"21\" x2=\"132\" y2=\"141\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"111.000000,0.000000 132.465818,21.465818 132.465818,141.465818 111.000000,120.000000\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"111\" y1=\"0\" x2=\"171\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"132\" y1=\"21\" x2=\"192\" y2=\"21\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"111\" y1=\"0\" x2=\"132\" y2=\"21\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"171\" y1=\"0\" x2=\"192\" y2=\"21\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"111.000000,0.000000 171.000000,0.000000 192.465818,21.465818 132.465818,21.465818\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"132\" y1=\"21\" x2=\"192\" y2=\"21\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"132\" y1=\"141\" x2=\"192\" y2=\"141\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"132\" y1=\"21\" x2=\"132\" y2=\"141\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"192\" y1=\"21\" x2=\"192\" y2=\"141\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"132.465818,21.465818 192.465818,21.465818 192.465818,141.465818 132.465818,141.465818\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"162.465818\" y=\"161.465818\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >36</text>\n", | |
| " <text x=\"212.465818\" y=\"81.465818\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,212.465818,81.465818)\">72</text>\n", | |
| " <text x=\"111.732909\" y=\"150.732909\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,111.732909,150.732909)\">5</text>\n", | |
| "</svg>\n", | |
| "</td>\n", | |
| "</tr>\n", | |
| "</table>" | |
| ], | |
| "text/plain": [ | |
| "dask.array<xarray-<this-array>, shape=(10, 12, 5, 72, 36), dtype=float64, chunksize=(10, 12, 5, 72, 36), chunktype=numpy.ndarray>" | |
| ] | |
| }, | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "ds.data" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "control.data" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# _resample_iterations\n", | |
| "as before: reshuffle and skill in loop\n", | |
| "\n", | |
| "tasks increase with `iterations`" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "iterations=100" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "from climpred.constants import CONCAT_KWARGS\n", | |
| "def _resample_iterations(init, iterations, dim='member', replace=True):\n", | |
| " if replace:\n", | |
| " idx = np.random.randint(\n", | |
| " 0, init[dim].size, (iterations, init[dim].size))\n", | |
| " elif not replace:\n", | |
| " # create 2d np.arange()\n", | |
| " idx = np.linspace(\n", | |
| " (np.arange(init[dim].size)),\n", | |
| " (np.arange(init[dim].size)),\n", | |
| " iterations,\n", | |
| " dtype='int',\n", | |
| " )\n", | |
| " # shuffle each line\n", | |
| " for ndx in np.arange(iterations):\n", | |
| " np.random.shuffle(idx[ndx])\n", | |
| " idx_da = xr.DataArray(\n", | |
| " idx,\n", | |
| " dims=('iteration', dim),\n", | |
| " coords=({'iteration': range(iterations), dim: init[dim]}),\n", | |
| " )\n", | |
| " init_smp = []\n", | |
| " for i in np.arange(iterations):\n", | |
| " idx = idx_da.sel(iteration=i).data\n", | |
| " init_smp2 = init.isel({dim: idx}).assign_coords({dim: init[dim].data})\n", | |
| " init_smp.append(init_smp2)\n", | |
| " init_smp = xr.concat(init_smp, dim='iteration',**CONCAT_KWARGS)\n", | |
| " return init_smp" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 9, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<table>\n", | |
| "<tr>\n", | |
| "<td>\n", | |
| "<table>\n", | |
| " <thead>\n", | |
| " <tr><td> </td><th> Array </th><th> Chunk </th></tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr><th> Bytes </th><td> 12.44 MB </td> <td> 12.44 MB </td></tr>\n", | |
| " <tr><th> Shape </th><td> (10, 12, 5, 72, 36) </td> <td> (10, 12, 5, 72, 36) </td></tr>\n", | |
| " <tr><th> Count </th><td> 1 Tasks </td><td> 1 Chunks </td></tr>\n", | |
| " <tr><th> Type </th><td> float64 </td><td> numpy.ndarray </td></tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</td>\n", | |
| "<td>\n", | |
| "<svg width=\"353\" height=\"191\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"0\" y1=\"0\" x2=\"41\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"0\" y1=\"40\" x2=\"41\" y2=\"40\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"40\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"41\" y1=\"0\" x2=\"41\" y2=\"40\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"0.000000,0.000000 41.203829,0.000000 41.203829,40.328956 0.000000,40.328956\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"20.601915\" y=\"60.328956\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >12</text>\n", | |
| " <text x=\"61.203829\" y=\"20.164478\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,61.203829,20.164478)\">10</text>\n", | |
| "\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"111\" y1=\"0\" x2=\"132\" y2=\"21\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"111\" y1=\"120\" x2=\"132\" y2=\"141\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"111\" y1=\"0\" x2=\"111\" y2=\"120\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"132\" y1=\"21\" x2=\"132\" y2=\"141\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"111.000000,0.000000 132.465818,21.465818 132.465818,141.465818 111.000000,120.000000\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"111\" y1=\"0\" x2=\"171\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"132\" y1=\"21\" x2=\"192\" y2=\"21\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"111\" y1=\"0\" x2=\"132\" y2=\"21\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"171\" y1=\"0\" x2=\"192\" y2=\"21\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"111.000000,0.000000 171.000000,0.000000 192.465818,21.465818 132.465818,21.465818\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"132\" y1=\"21\" x2=\"192\" y2=\"21\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"132\" y1=\"141\" x2=\"192\" y2=\"141\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"132\" y1=\"21\" x2=\"132\" y2=\"141\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"192\" y1=\"21\" x2=\"192\" y2=\"141\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"132.465818,21.465818 192.465818,21.465818 192.465818,141.465818 132.465818,141.465818\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"162.465818\" y=\"161.465818\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >36</text>\n", | |
| " <text x=\"212.465818\" y=\"81.465818\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,212.465818,81.465818)\">72</text>\n", | |
| " <text x=\"111.732909\" y=\"150.732909\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,111.732909,150.732909)\">5</text>\n", | |
| "</svg>\n", | |
| "</td>\n", | |
| "</tr>\n", | |
| "</table>" | |
| ], | |
| "text/plain": [ | |
| "dask.array<xarray-<this-array>, shape=(10, 12, 5, 72, 36), dtype=float64, chunksize=(10, 12, 5, 72, 36), chunktype=numpy.ndarray>" | |
| ] | |
| }, | |
| "execution_count": 9, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "ds.data" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 10, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<table>\n", | |
| "<tr>\n", | |
| "<td>\n", | |
| "<table>\n", | |
| " <thead>\n", | |
| " <tr><td> </td><th> Array </th><th> Chunk </th></tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr><th> Bytes </th><td> 1.24 GB </td> <td> 12.44 MB </td></tr>\n", | |
| " <tr><th> Shape </th><td> (100, 10, 12, 5, 72, 36) </td> <td> (1, 10, 12, 5, 72, 36) </td></tr>\n", | |
| " <tr><th> Count </th><td> 301 Tasks </td><td> 100 Chunks </td></tr>\n", | |
| " <tr><th> Type </th><td> float64 </td><td> numpy.ndarray </td></tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</td>\n", | |
| "<td>\n", | |
| "<svg width=\"494\" height=\"159\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"80\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"10\" y1=\"38\" x2=\"80\" y2=\"109\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"10\" y2=\"38\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"10\" y2=\"39\" />\n", | |
| " <line x1=\"11\" y1=\"1\" x2=\"11\" y2=\"40\" />\n", | |
| " <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"40\" />\n", | |
| " <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"41\" />\n", | |
| " <line x1=\"13\" y1=\"3\" x2=\"13\" y2=\"42\" />\n", | |
| " <line x1=\"14\" y1=\"4\" x2=\"14\" y2=\"42\" />\n", | |
| " <line x1=\"14\" y1=\"4\" x2=\"14\" y2=\"43\" />\n", | |
| " <line x1=\"15\" y1=\"5\" x2=\"15\" y2=\"44\" />\n", | |
| " <line x1=\"16\" y1=\"6\" x2=\"16\" y2=\"44\" />\n", | |
| " <line x1=\"17\" y1=\"7\" x2=\"17\" y2=\"45\" />\n", | |
| " <line x1=\"17\" y1=\"7\" x2=\"17\" y2=\"46\" />\n", | |
| " <line x1=\"18\" y1=\"8\" x2=\"18\" y2=\"47\" />\n", | |
| " <line x1=\"19\" y1=\"9\" x2=\"19\" y2=\"47\" />\n", | |
| " <line x1=\"19\" y1=\"9\" x2=\"19\" y2=\"48\" />\n", | |
| " <line x1=\"20\" y1=\"10\" x2=\"20\" y2=\"49\" />\n", | |
| " <line x1=\"21\" y1=\"11\" x2=\"21\" y2=\"49\" />\n", | |
| " <line x1=\"22\" y1=\"12\" x2=\"22\" y2=\"50\" />\n", | |
| " <line x1=\"22\" y1=\"12\" x2=\"22\" y2=\"51\" />\n", | |
| " <line x1=\"23\" y1=\"13\" x2=\"23\" y2=\"52\" />\n", | |
| " <line x1=\"24\" y1=\"14\" x2=\"24\" y2=\"52\" />\n", | |
| " <line x1=\"24\" y1=\"14\" x2=\"24\" y2=\"53\" />\n", | |
| " <line x1=\"25\" y1=\"15\" x2=\"25\" y2=\"54\" />\n", | |
| " <line x1=\"26\" y1=\"16\" x2=\"26\" y2=\"54\" />\n", | |
| " <line x1=\"26\" y1=\"16\" x2=\"26\" y2=\"55\" />\n", | |
| " <line x1=\"27\" y1=\"17\" x2=\"27\" y2=\"56\" />\n", | |
| " <line x1=\"28\" y1=\"18\" x2=\"28\" y2=\"56\" />\n", | |
| " <line x1=\"29\" y1=\"19\" x2=\"29\" y2=\"57\" />\n", | |
| " <line x1=\"29\" y1=\"19\" x2=\"29\" y2=\"58\" />\n", | |
| " <line x1=\"30\" y1=\"20\" x2=\"30\" y2=\"59\" />\n", | |
| " <line x1=\"31\" y1=\"21\" x2=\"31\" y2=\"59\" />\n", | |
| " <line x1=\"31\" y1=\"21\" x2=\"31\" y2=\"60\" />\n", | |
| " <line x1=\"32\" y1=\"22\" x2=\"32\" y2=\"61\" />\n", | |
| " <line x1=\"33\" y1=\"23\" x2=\"33\" y2=\"61\" />\n", | |
| " <line x1=\"34\" y1=\"24\" x2=\"34\" y2=\"62\" />\n", | |
| " <line x1=\"34\" y1=\"24\" x2=\"34\" y2=\"63\" />\n", | |
| " <line x1=\"35\" y1=\"25\" x2=\"35\" y2=\"64\" />\n", | |
| " <line x1=\"36\" y1=\"26\" x2=\"36\" y2=\"64\" />\n", | |
| " <line x1=\"36\" y1=\"26\" x2=\"36\" y2=\"65\" />\n", | |
| " <line x1=\"37\" y1=\"27\" x2=\"37\" y2=\"66\" />\n", | |
| " <line x1=\"38\" y1=\"28\" x2=\"38\" y2=\"66\" />\n", | |
| " <line x1=\"38\" y1=\"28\" x2=\"38\" y2=\"67\" />\n", | |
| " <line x1=\"39\" y1=\"29\" x2=\"39\" y2=\"68\" />\n", | |
| " <line x1=\"40\" y1=\"30\" x2=\"40\" y2=\"68\" />\n", | |
| " <line x1=\"41\" y1=\"31\" x2=\"41\" y2=\"69\" />\n", | |
| " <line x1=\"41\" y1=\"31\" x2=\"41\" y2=\"70\" />\n", | |
| " <line x1=\"42\" y1=\"32\" x2=\"42\" y2=\"71\" />\n", | |
| " <line x1=\"43\" y1=\"33\" x2=\"43\" y2=\"71\" />\n", | |
| " <line x1=\"43\" y1=\"33\" x2=\"43\" y2=\"72\" />\n", | |
| " <line x1=\"44\" y1=\"34\" x2=\"44\" y2=\"73\" />\n", | |
| " <line x1=\"45\" y1=\"35\" x2=\"45\" y2=\"73\" />\n", | |
| " <line x1=\"46\" y1=\"36\" x2=\"46\" y2=\"74\" />\n", | |
| " <line x1=\"46\" y1=\"36\" x2=\"46\" y2=\"75\" />\n", | |
| " <line x1=\"47\" y1=\"37\" x2=\"47\" y2=\"76\" />\n", | |
| " <line x1=\"48\" y1=\"38\" x2=\"48\" y2=\"76\" />\n", | |
| " <line x1=\"48\" y1=\"38\" x2=\"48\" y2=\"77\" />\n", | |
| " <line x1=\"49\" y1=\"39\" x2=\"49\" y2=\"78\" />\n", | |
| " <line x1=\"50\" y1=\"40\" x2=\"50\" y2=\"78\" />\n", | |
| " <line x1=\"50\" y1=\"40\" x2=\"50\" y2=\"79\" />\n", | |
| " <line x1=\"51\" y1=\"41\" x2=\"51\" y2=\"80\" />\n", | |
| " <line x1=\"52\" y1=\"42\" x2=\"52\" y2=\"80\" />\n", | |
| " <line x1=\"53\" y1=\"43\" x2=\"53\" y2=\"81\" />\n", | |
| " <line x1=\"53\" y1=\"43\" x2=\"53\" y2=\"82\" />\n", | |
| " <line x1=\"54\" y1=\"44\" x2=\"54\" y2=\"83\" />\n", | |
| " <line x1=\"55\" y1=\"45\" x2=\"55\" y2=\"83\" />\n", | |
| " <line x1=\"55\" y1=\"45\" x2=\"55\" y2=\"84\" />\n", | |
| " <line x1=\"56\" y1=\"46\" x2=\"56\" y2=\"85\" />\n", | |
| " <line x1=\"57\" y1=\"47\" x2=\"57\" y2=\"85\" />\n", | |
| " <line x1=\"58\" y1=\"48\" x2=\"58\" y2=\"86\" />\n", | |
| " <line x1=\"58\" y1=\"48\" x2=\"58\" y2=\"87\" />\n", | |
| " <line x1=\"59\" y1=\"49\" x2=\"59\" y2=\"88\" />\n", | |
| " <line x1=\"60\" y1=\"50\" x2=\"60\" y2=\"88\" />\n", | |
| " <line x1=\"60\" y1=\"50\" x2=\"60\" y2=\"89\" />\n", | |
| " <line x1=\"61\" y1=\"51\" x2=\"61\" y2=\"90\" />\n", | |
| " <line x1=\"62\" y1=\"52\" x2=\"62\" y2=\"90\" />\n", | |
| " <line x1=\"62\" y1=\"52\" x2=\"62\" y2=\"91\" />\n", | |
| " <line x1=\"63\" y1=\"53\" x2=\"63\" y2=\"92\" />\n", | |
| " <line x1=\"64\" y1=\"54\" x2=\"64\" y2=\"92\" />\n", | |
| " <line x1=\"65\" y1=\"55\" x2=\"65\" y2=\"93\" />\n", | |
| " <line x1=\"65\" y1=\"55\" x2=\"65\" y2=\"94\" />\n", | |
| " <line x1=\"66\" y1=\"56\" x2=\"66\" y2=\"95\" />\n", | |
| " <line x1=\"67\" y1=\"57\" x2=\"67\" y2=\"95\" />\n", | |
| " <line x1=\"67\" y1=\"57\" x2=\"67\" y2=\"96\" />\n", | |
| " <line x1=\"68\" y1=\"58\" x2=\"68\" y2=\"97\" />\n", | |
| " <line x1=\"69\" y1=\"59\" x2=\"69\" y2=\"97\" />\n", | |
| " <line x1=\"70\" y1=\"60\" x2=\"70\" y2=\"98\" />\n", | |
| " <line x1=\"70\" y1=\"60\" x2=\"70\" y2=\"99\" />\n", | |
| " <line x1=\"71\" y1=\"61\" x2=\"71\" y2=\"100\" />\n", | |
| " <line x1=\"72\" y1=\"62\" x2=\"72\" y2=\"100\" />\n", | |
| " <line x1=\"72\" y1=\"62\" x2=\"72\" y2=\"101\" />\n", | |
| " <line x1=\"73\" y1=\"63\" x2=\"73\" y2=\"102\" />\n", | |
| " <line x1=\"74\" y1=\"64\" x2=\"74\" y2=\"102\" />\n", | |
| " <line x1=\"74\" y1=\"64\" x2=\"74\" y2=\"103\" />\n", | |
| " <line x1=\"75\" y1=\"65\" x2=\"75\" y2=\"104\" />\n", | |
| " <line x1=\"76\" y1=\"66\" x2=\"76\" y2=\"104\" />\n", | |
| " <line x1=\"77\" y1=\"67\" x2=\"77\" y2=\"105\" />\n", | |
| " <line x1=\"77\" y1=\"67\" x2=\"77\" y2=\"106\" />\n", | |
| " <line x1=\"78\" y1=\"68\" x2=\"78\" y2=\"107\" />\n", | |
| " <line x1=\"79\" y1=\"69\" x2=\"79\" y2=\"107\" />\n", | |
| " <line x1=\"79\" y1=\"69\" x2=\"79\" y2=\"108\" />\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"80\" y2=\"109\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"10.000000,0.000000 80.588235,70.588235 80.588235,109.185098 10.000000,38.596863\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"49\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"50\" y2=\"0\" />\n", | |
| " <line x1=\"11\" y1=\"1\" x2=\"50\" y2=\"1\" />\n", | |
| " <line x1=\"12\" y1=\"2\" x2=\"51\" y2=\"2\" />\n", | |
| " <line x1=\"12\" y1=\"2\" x2=\"52\" y2=\"2\" />\n", | |
| " <line x1=\"13\" y1=\"3\" x2=\"53\" y2=\"3\" />\n", | |
| " <line x1=\"14\" y1=\"4\" x2=\"53\" y2=\"4\" />\n", | |
| " <line x1=\"14\" y1=\"4\" x2=\"54\" y2=\"4\" />\n", | |
| " <line x1=\"15\" y1=\"5\" x2=\"55\" y2=\"5\" />\n", | |
| " <line x1=\"16\" y1=\"6\" x2=\"55\" y2=\"6\" />\n", | |
| " <line x1=\"17\" y1=\"7\" x2=\"56\" y2=\"7\" />\n", | |
| " <line x1=\"17\" y1=\"7\" x2=\"57\" y2=\"7\" />\n", | |
| " <line x1=\"18\" y1=\"8\" x2=\"58\" y2=\"8\" />\n", | |
| " <line x1=\"19\" y1=\"9\" x2=\"58\" y2=\"9\" />\n", | |
| " <line x1=\"19\" y1=\"9\" x2=\"59\" y2=\"9\" />\n", | |
| " <line x1=\"20\" y1=\"10\" x2=\"60\" y2=\"10\" />\n", | |
| " <line x1=\"21\" y1=\"11\" x2=\"60\" y2=\"11\" />\n", | |
| " <line x1=\"22\" y1=\"12\" x2=\"61\" y2=\"12\" />\n", | |
| " <line x1=\"22\" y1=\"12\" x2=\"62\" y2=\"12\" />\n", | |
| " <line x1=\"23\" y1=\"13\" x2=\"62\" y2=\"13\" />\n", | |
| " <line x1=\"24\" y1=\"14\" x2=\"63\" y2=\"14\" />\n", | |
| " <line x1=\"24\" y1=\"14\" x2=\"64\" y2=\"14\" />\n", | |
| " <line x1=\"25\" y1=\"15\" x2=\"65\" y2=\"15\" />\n", | |
| " <line x1=\"26\" y1=\"16\" x2=\"65\" y2=\"16\" />\n", | |
| " <line x1=\"26\" y1=\"16\" x2=\"66\" y2=\"16\" />\n", | |
| " <line x1=\"27\" y1=\"17\" x2=\"67\" y2=\"17\" />\n", | |
| " <line x1=\"28\" y1=\"18\" x2=\"67\" y2=\"18\" />\n", | |
| " <line x1=\"29\" y1=\"19\" x2=\"68\" y2=\"19\" />\n", | |
| " <line x1=\"29\" y1=\"19\" x2=\"69\" y2=\"19\" />\n", | |
| " <line x1=\"30\" y1=\"20\" x2=\"70\" y2=\"20\" />\n", | |
| " <line x1=\"31\" y1=\"21\" x2=\"70\" y2=\"21\" />\n", | |
| " <line x1=\"31\" y1=\"21\" x2=\"71\" y2=\"21\" />\n", | |
| " <line x1=\"32\" y1=\"22\" x2=\"72\" y2=\"22\" />\n", | |
| " <line x1=\"33\" y1=\"23\" x2=\"72\" y2=\"23\" />\n", | |
| " <line x1=\"34\" y1=\"24\" x2=\"73\" y2=\"24\" />\n", | |
| " <line x1=\"34\" y1=\"24\" x2=\"74\" y2=\"24\" />\n", | |
| " <line x1=\"35\" y1=\"25\" x2=\"74\" y2=\"25\" />\n", | |
| " <line x1=\"36\" y1=\"26\" x2=\"75\" y2=\"26\" />\n", | |
| " <line x1=\"36\" y1=\"26\" x2=\"76\" y2=\"26\" />\n", | |
| " <line x1=\"37\" y1=\"27\" x2=\"77\" y2=\"27\" />\n", | |
| " <line x1=\"38\" y1=\"28\" x2=\"77\" y2=\"28\" />\n", | |
| " <line x1=\"38\" y1=\"28\" x2=\"78\" y2=\"28\" />\n", | |
| " <line x1=\"39\" y1=\"29\" x2=\"79\" y2=\"29\" />\n", | |
| " <line x1=\"40\" y1=\"30\" x2=\"79\" y2=\"30\" />\n", | |
| " <line x1=\"41\" y1=\"31\" x2=\"80\" y2=\"31\" />\n", | |
| " <line x1=\"41\" y1=\"31\" x2=\"81\" y2=\"31\" />\n", | |
| " <line x1=\"42\" y1=\"32\" x2=\"82\" y2=\"32\" />\n", | |
| " <line x1=\"43\" y1=\"33\" x2=\"82\" y2=\"33\" />\n", | |
| " <line x1=\"43\" y1=\"33\" x2=\"83\" y2=\"33\" />\n", | |
| " <line x1=\"44\" y1=\"34\" x2=\"84\" y2=\"34\" />\n", | |
| " <line x1=\"45\" y1=\"35\" x2=\"84\" y2=\"35\" />\n", | |
| " <line x1=\"46\" y1=\"36\" x2=\"85\" y2=\"36\" />\n", | |
| " <line x1=\"46\" y1=\"36\" x2=\"86\" y2=\"36\" />\n", | |
| " <line x1=\"47\" y1=\"37\" x2=\"86\" y2=\"37\" />\n", | |
| " <line x1=\"48\" y1=\"38\" x2=\"87\" y2=\"38\" />\n", | |
| " <line x1=\"48\" y1=\"38\" x2=\"88\" y2=\"38\" />\n", | |
| " <line x1=\"49\" y1=\"39\" x2=\"89\" y2=\"39\" />\n", | |
| " <line x1=\"50\" y1=\"40\" x2=\"89\" y2=\"40\" />\n", | |
| " <line x1=\"50\" y1=\"40\" x2=\"90\" y2=\"40\" />\n", | |
| " <line x1=\"51\" y1=\"41\" x2=\"91\" y2=\"41\" />\n", | |
| " <line x1=\"52\" y1=\"42\" x2=\"91\" y2=\"42\" />\n", | |
| " <line x1=\"53\" y1=\"43\" x2=\"92\" y2=\"43\" />\n", | |
| " <line x1=\"53\" y1=\"43\" x2=\"93\" y2=\"43\" />\n", | |
| " <line x1=\"54\" y1=\"44\" x2=\"94\" y2=\"44\" />\n", | |
| " <line x1=\"55\" y1=\"45\" x2=\"94\" y2=\"45\" />\n", | |
| " <line x1=\"55\" y1=\"45\" x2=\"95\" y2=\"45\" />\n", | |
| " <line x1=\"56\" y1=\"46\" x2=\"96\" y2=\"46\" />\n", | |
| " <line x1=\"57\" y1=\"47\" x2=\"96\" y2=\"47\" />\n", | |
| " <line x1=\"58\" y1=\"48\" x2=\"97\" y2=\"48\" />\n", | |
| " <line x1=\"58\" y1=\"48\" x2=\"98\" y2=\"48\" />\n", | |
| " <line x1=\"59\" y1=\"49\" x2=\"98\" y2=\"49\" />\n", | |
| " <line x1=\"60\" y1=\"50\" x2=\"99\" y2=\"50\" />\n", | |
| " <line x1=\"60\" y1=\"50\" x2=\"100\" y2=\"50\" />\n", | |
| " <line x1=\"61\" y1=\"51\" x2=\"101\" y2=\"51\" />\n", | |
| " <line x1=\"62\" y1=\"52\" x2=\"101\" y2=\"52\" />\n", | |
| " <line x1=\"62\" y1=\"52\" x2=\"102\" y2=\"52\" />\n", | |
| " <line x1=\"63\" y1=\"53\" x2=\"103\" y2=\"53\" />\n", | |
| " <line x1=\"64\" y1=\"54\" x2=\"103\" y2=\"54\" />\n", | |
| " <line x1=\"65\" y1=\"55\" x2=\"104\" y2=\"55\" />\n", | |
| " <line x1=\"65\" y1=\"55\" x2=\"105\" y2=\"55\" />\n", | |
| " <line x1=\"66\" y1=\"56\" x2=\"106\" y2=\"56\" />\n", | |
| " <line x1=\"67\" y1=\"57\" x2=\"106\" y2=\"57\" />\n", | |
| " <line x1=\"67\" y1=\"57\" x2=\"107\" y2=\"57\" />\n", | |
| " <line x1=\"68\" y1=\"58\" x2=\"108\" y2=\"58\" />\n", | |
| " <line x1=\"69\" y1=\"59\" x2=\"108\" y2=\"59\" />\n", | |
| " <line x1=\"70\" y1=\"60\" x2=\"109\" y2=\"60\" />\n", | |
| " <line x1=\"70\" y1=\"60\" x2=\"110\" y2=\"60\" />\n", | |
| " <line x1=\"71\" y1=\"61\" x2=\"110\" y2=\"61\" />\n", | |
| " <line x1=\"72\" y1=\"62\" x2=\"111\" y2=\"62\" />\n", | |
| " <line x1=\"72\" y1=\"62\" x2=\"112\" y2=\"62\" />\n", | |
| " <line x1=\"73\" y1=\"63\" x2=\"113\" y2=\"63\" />\n", | |
| " <line x1=\"74\" y1=\"64\" x2=\"113\" y2=\"64\" />\n", | |
| " <line x1=\"74\" y1=\"64\" x2=\"114\" y2=\"64\" />\n", | |
| " <line x1=\"75\" y1=\"65\" x2=\"115\" y2=\"65\" />\n", | |
| " <line x1=\"76\" y1=\"66\" x2=\"115\" y2=\"66\" />\n", | |
| " <line x1=\"77\" y1=\"67\" x2=\"116\" y2=\"67\" />\n", | |
| " <line x1=\"77\" y1=\"67\" x2=\"117\" y2=\"67\" />\n", | |
| " <line x1=\"78\" y1=\"68\" x2=\"118\" y2=\"68\" />\n", | |
| " <line x1=\"79\" y1=\"69\" x2=\"118\" y2=\"69\" />\n", | |
| " <line x1=\"79\" y1=\"69\" x2=\"119\" y2=\"69\" />\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"120\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"80\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"49\" y1=\"0\" x2=\"120\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"10.000000,0.000000 49.581195,0.000000 120.169430,70.588235 80.588235,70.588235\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"120\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"80\" y1=\"109\" x2=\"120\" y2=\"109\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"80\" y2=\"109\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"120\" y1=\"70\" x2=\"120\" y2=\"109\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"80.588235,70.588235 120.169430,70.588235 120.169430,109.185098 80.588235,109.185098\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"100.378833\" y=\"129.185098\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >12</text>\n", | |
| " <text x=\"140.169430\" y=\"89.886667\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,140.169430,89.886667)\">10</text>\n", | |
| " <text x=\"35.294118\" y=\"93.890981\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,35.294118,93.890981)\">100</text>\n", | |
| "\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"190\" y1=\"0\" x2=\"210\" y2=\"20\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"190\" y1=\"86\" x2=\"210\" y2=\"106\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"190\" y1=\"0\" x2=\"190\" y2=\"86\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"210\" y1=\"20\" x2=\"210\" y2=\"106\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"190.000000,0.000000 210.294715,20.294715 210.294715,106.694715 190.000000,86.400000\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"190\" y1=\"0\" x2=\"234\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"210\" y1=\"20\" x2=\"254\" y2=\"20\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"190\" y1=\"0\" x2=\"210\" y2=\"20\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"234\" y1=\"0\" x2=\"254\" y2=\"20\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"190.000000,0.000000 234.120366,0.000000 254.415082,20.294715 210.294715,20.294715\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"210\" y1=\"20\" x2=\"254\" y2=\"20\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"210\" y1=\"106\" x2=\"254\" y2=\"106\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"210\" y1=\"20\" x2=\"210\" y2=\"106\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"254\" y1=\"20\" x2=\"254\" y2=\"106\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"210.294715,20.294715 254.415082,20.294715 254.415082,106.694715 210.294715,106.694715\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"232.354898\" y=\"126.694715\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >36</text>\n", | |
| " <text x=\"274.415082\" y=\"63.494715\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,274.415082,63.494715)\">72</text>\n", | |
| " <text x=\"190.147358\" y=\"116.547358\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,190.147358,116.547358)\">5</text>\n", | |
| "</svg>\n", | |
| "</td>\n", | |
| "</tr>\n", | |
| "</table>" | |
| ], | |
| "text/plain": [ | |
| "dask.array<concatenate, shape=(100, 10, 12, 5, 72, 36), dtype=float64, chunksize=(1, 10, 12, 5, 72, 36), chunktype=numpy.ndarray>" | |
| ] | |
| }, | |
| "execution_count": 10, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "ds2 = _resample_iterations(ds,iterations)\n", | |
| "ds2.data" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 11, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<table>\n", | |
| "<tr>\n", | |
| "<td>\n", | |
| "<table>\n", | |
| " <thead>\n", | |
| " <tr><td> </td><th> Array </th><th> Chunk </th></tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr><th> Bytes </th><td> 1.24 GB </td> <td> 124.42 MB </td></tr>\n", | |
| " <tr><th> Shape </th><td> (100, 10, 12, 5, 72, 36) </td> <td> (10, 10, 12, 5, 72, 36) </td></tr>\n", | |
| " <tr><th> Count </th><td> 311 Tasks </td><td> 10 Chunks </td></tr>\n", | |
| " <tr><th> Type </th><td> float64 </td><td> numpy.ndarray </td></tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</td>\n", | |
| "<td>\n", | |
| "<svg width=\"494\" height=\"159\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"80\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"10\" y1=\"38\" x2=\"80\" y2=\"109\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"10\" y2=\"38\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"17\" y1=\"7\" x2=\"17\" y2=\"45\" />\n", | |
| " <line x1=\"24\" y1=\"14\" x2=\"24\" y2=\"52\" />\n", | |
| " <line x1=\"31\" y1=\"21\" x2=\"31\" y2=\"59\" />\n", | |
| " <line x1=\"38\" y1=\"28\" x2=\"38\" y2=\"66\" />\n", | |
| " <line x1=\"45\" y1=\"35\" x2=\"45\" y2=\"73\" />\n", | |
| " <line x1=\"52\" y1=\"42\" x2=\"52\" y2=\"80\" />\n", | |
| " <line x1=\"59\" y1=\"49\" x2=\"59\" y2=\"88\" />\n", | |
| " <line x1=\"66\" y1=\"56\" x2=\"66\" y2=\"95\" />\n", | |
| " <line x1=\"73\" y1=\"63\" x2=\"73\" y2=\"102\" />\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"80\" y2=\"109\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"10.000000,0.000000 80.588235,70.588235 80.588235,109.185098 10.000000,38.596863\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"49\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"17\" y1=\"7\" x2=\"56\" y2=\"7\" />\n", | |
| " <line x1=\"24\" y1=\"14\" x2=\"63\" y2=\"14\" />\n", | |
| " <line x1=\"31\" y1=\"21\" x2=\"70\" y2=\"21\" />\n", | |
| " <line x1=\"38\" y1=\"28\" x2=\"77\" y2=\"28\" />\n", | |
| " <line x1=\"45\" y1=\"35\" x2=\"84\" y2=\"35\" />\n", | |
| " <line x1=\"52\" y1=\"42\" x2=\"91\" y2=\"42\" />\n", | |
| " <line x1=\"59\" y1=\"49\" x2=\"98\" y2=\"49\" />\n", | |
| " <line x1=\"66\" y1=\"56\" x2=\"106\" y2=\"56\" />\n", | |
| " <line x1=\"73\" y1=\"63\" x2=\"113\" y2=\"63\" />\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"120\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"80\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"49\" y1=\"0\" x2=\"120\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"10.000000,0.000000 49.581195,0.000000 120.169430,70.588235 80.588235,70.588235\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"120\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"80\" y1=\"109\" x2=\"120\" y2=\"109\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"80\" y2=\"109\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"120\" y1=\"70\" x2=\"120\" y2=\"109\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"80.588235,70.588235 120.169430,70.588235 120.169430,109.185098 80.588235,109.185098\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"100.378833\" y=\"129.185098\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >12</text>\n", | |
| " <text x=\"140.169430\" y=\"89.886667\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,140.169430,89.886667)\">10</text>\n", | |
| " <text x=\"35.294118\" y=\"93.890981\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,35.294118,93.890981)\">100</text>\n", | |
| "\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"190\" y1=\"0\" x2=\"210\" y2=\"20\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"190\" y1=\"86\" x2=\"210\" y2=\"106\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"190\" y1=\"0\" x2=\"190\" y2=\"86\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"210\" y1=\"20\" x2=\"210\" y2=\"106\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"190.000000,0.000000 210.294715,20.294715 210.294715,106.694715 190.000000,86.400000\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"190\" y1=\"0\" x2=\"234\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"210\" y1=\"20\" x2=\"254\" y2=\"20\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"190\" y1=\"0\" x2=\"210\" y2=\"20\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"234\" y1=\"0\" x2=\"254\" y2=\"20\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"190.000000,0.000000 234.120366,0.000000 254.415082,20.294715 210.294715,20.294715\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"210\" y1=\"20\" x2=\"254\" y2=\"20\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"210\" y1=\"106\" x2=\"254\" y2=\"106\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"210\" y1=\"20\" x2=\"210\" y2=\"106\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"254\" y1=\"20\" x2=\"254\" y2=\"106\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"210.294715,20.294715 254.415082,20.294715 254.415082,106.694715 210.294715,106.694715\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"232.354898\" y=\"126.694715\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >36</text>\n", | |
| " <text x=\"274.415082\" y=\"63.494715\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,274.415082,63.494715)\">72</text>\n", | |
| " <text x=\"190.147358\" y=\"116.547358\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,190.147358,116.547358)\">5</text>\n", | |
| "</svg>\n", | |
| "</td>\n", | |
| "</tr>\n", | |
| "</table>" | |
| ], | |
| "text/plain": [ | |
| "dask.array<rechunk-merge, shape=(100, 10, 12, 5, 72, 36), dtype=float64, chunksize=(10, 10, 12, 5, 72, 36), chunktype=numpy.ndarray>" | |
| ] | |
| }, | |
| "execution_count": 11, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "ds3 = ds2.chunk({'iteration':'auto'})\n", | |
| "ds3.data" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 12, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<table>\n", | |
| "<tr>\n", | |
| "<td>\n", | |
| "<table>\n", | |
| " <thead>\n", | |
| " <tr><td> </td><th> Array </th><th> Chunk </th></tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr><th> Bytes </th><td> 10.37 MB </td> <td> 1.04 MB </td></tr>\n", | |
| " <tr><th> Shape </th><td> (100, 5, 72, 36) </td> <td> (10, 5, 72, 36) </td></tr>\n", | |
| " <tr><th> Count </th><td> 1362 Tasks </td><td> 10 Chunks </td></tr>\n", | |
| " <tr><th> Type </th><td> float64 </td><td> numpy.ndarray </td></tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</td>\n", | |
| "<td>\n", | |
| "<svg width=\"494\" height=\"156\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"0\" y1=\"0\" x2=\"120\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"0\" y1=\"25\" x2=\"120\" y2=\"25\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"25\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"12\" y1=\"0\" x2=\"12\" y2=\"25\" />\n", | |
| " <line x1=\"24\" y1=\"0\" x2=\"24\" y2=\"25\" />\n", | |
| " <line x1=\"36\" y1=\"0\" x2=\"36\" y2=\"25\" />\n", | |
| " <line x1=\"48\" y1=\"0\" x2=\"48\" y2=\"25\" />\n", | |
| " <line x1=\"60\" y1=\"0\" x2=\"60\" y2=\"25\" />\n", | |
| " <line x1=\"72\" y1=\"0\" x2=\"72\" y2=\"25\" />\n", | |
| " <line x1=\"84\" y1=\"0\" x2=\"84\" y2=\"25\" />\n", | |
| " <line x1=\"96\" y1=\"0\" x2=\"96\" y2=\"25\" />\n", | |
| " <line x1=\"108\" y1=\"0\" x2=\"108\" y2=\"25\" />\n", | |
| " <line x1=\"120\" y1=\"0\" x2=\"120\" y2=\"25\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"0.000000,0.000000 120.000000,0.000000 120.000000,25.412617 0.000000,25.412617\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"60.000000\" y=\"45.412617\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >100</text>\n", | |
| " <text x=\"140.000000\" y=\"12.706308\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,140.000000,12.706308)\">1</text>\n", | |
| "\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"190\" y1=\"0\" x2=\"210\" y2=\"20\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"190\" y1=\"86\" x2=\"210\" y2=\"106\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"190\" y1=\"0\" x2=\"190\" y2=\"86\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"210\" y1=\"20\" x2=\"210\" y2=\"106\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"190.000000,0.000000 210.294715,20.294715 210.294715,106.694715 190.000000,86.400000\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"190\" y1=\"0\" x2=\"234\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"210\" y1=\"20\" x2=\"254\" y2=\"20\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"190\" y1=\"0\" x2=\"210\" y2=\"20\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"234\" y1=\"0\" x2=\"254\" y2=\"20\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"190.000000,0.000000 234.120366,0.000000 254.415082,20.294715 210.294715,20.294715\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"210\" y1=\"20\" x2=\"254\" y2=\"20\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"210\" y1=\"106\" x2=\"254\" y2=\"106\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"210\" y1=\"20\" x2=\"210\" y2=\"106\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"254\" y1=\"20\" x2=\"254\" y2=\"106\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"210.294715,20.294715 254.415082,20.294715 254.415082,106.694715 210.294715,106.694715\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"232.354898\" y=\"126.694715\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >36</text>\n", | |
| " <text x=\"274.415082\" y=\"63.494715\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,274.415082,63.494715)\">72</text>\n", | |
| " <text x=\"190.147358\" y=\"116.547358\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,190.147358,116.547358)\">5</text>\n", | |
| "</svg>\n", | |
| "</td>\n", | |
| "</tr>\n", | |
| "</table>" | |
| ], | |
| "text/plain": [ | |
| "dask.array<mse, shape=(100, 5, 72, 36), dtype=float64, chunksize=(10, 5, 72, 36), chunktype=numpy.ndarray>" | |
| ] | |
| }, | |
| "execution_count": 12, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "skill = climpred.prediction.compute_perfect_model(ds3, control, metric='mse', comparison='m2e')\n", | |
| "skill.data" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 13, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "CPU times: user 26 s, sys: 1min 21s, total: 1min 47s\n", | |
| "Wall time: 6.3 s\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "%time _ = skill.compute()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### _resample_iterations_idx\n", | |
| "\n", | |
| "number of tasks DONT scale with `iteration`\n", | |
| "\n", | |
| "but the chunksize is increasing, therefore try chunking along different dim" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def _resample_iterations_idx(init, iterations, dim='member', replace=True):\n", | |
| " \"\"\"Resample over ``dim`` by index ``iterations`` times.\n", | |
| "\n", | |
| " .. note::\n", | |
| " This is a much faster way to bootstrap than resampling each iteration\n", | |
| " individually and applying the function to it. However, this will create a\n", | |
| " DataArray with dimension ``iteration`` of size ``iterations``. It is probably\n", | |
| " best to do this out-of-memory with ``dask`` if you are doing a large number\n", | |
| " of iterations or using spatial output (i.e., not time series data).\n", | |
| "\n", | |
| " Args:\n", | |
| " init (xr.DataArray, xr.Dataset): Initialized prediction ensemble.\n", | |
| " iterations (int): Number of bootstrapping iterations.\n", | |
| " dim (str): Dimension name to bootstrap over. Defaults to ``'member'``.\n", | |
| " replace (bool): Bootstrapping with or without replacement. Defaults to ``True``.\n", | |
| "\n", | |
| " Returns:\n", | |
| " xr.DataArray, xr.Dataset: Bootstrapped data with additional dim ```iteration```\n", | |
| "\n", | |
| " \"\"\"\n", | |
| " # Aaron added this line because otherwise I get errors after .compute\n", | |
| " if dask.is_dask_collection(init):\n", | |
| " init = init.chunk({'lead':-1,'member':-1})\n", | |
| " init = init.copy(deep=True)\n", | |
| "\n", | |
| " def select_bootstrap_indices_ufunc(x, idx):\n", | |
| " \"\"\"Selects multi-level indices ``idx`` from xarray object ``x`` for all\n", | |
| " iterations.\"\"\"\n", | |
| " # `apply_ufunc` sometimes adds a singleton dimension on the end, so we squeeze\n", | |
| " # it out here. This leverages multi-level indexing from numpy, so we can\n", | |
| " # select a different set of, e.g., ensemble members for each iteration and\n", | |
| " # construct one large DataArray with ``iterations`` as a dimension.\n", | |
| " return np.moveaxis(x.squeeze()[idx.squeeze().transpose()], 0, -1)\n", | |
| "\n", | |
| " # resample with or without replacement\n", | |
| " if replace:\n", | |
| " idx = np.random.randint(\n", | |
| " 0, init[dim].size, (iterations, init[dim].size))\n", | |
| " elif not replace:\n", | |
| " # create 2d np.arange()\n", | |
| " idx = np.linspace(\n", | |
| " (np.arange(init[dim].size)),\n", | |
| " (np.arange(init[dim].size)),\n", | |
| " iterations,\n", | |
| " dtype='int',\n", | |
| " )\n", | |
| " # shuffle each line\n", | |
| " for ndx in np.arange(iterations):\n", | |
| " np.random.shuffle(idx[ndx])\n", | |
| " idx_da = xr.DataArray(\n", | |
| " idx,\n", | |
| " dims=('iteration', dim),\n", | |
| " coords=({'iteration': range(iterations), dim: init[dim]}),\n", | |
| " )\n", | |
| " \n", | |
| " return xr.apply_ufunc(\n", | |
| " select_bootstrap_indices_ufunc,\n", | |
| " init.transpose(dim, ...),# transpose_coords=False),\n", | |
| " idx_da,\n", | |
| " dask='parallelized',\n", | |
| " output_dtypes=[float],\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 9, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def _chunk_before_resample_iteration_idx(ds, iteration, chunking_dim):\n", | |
| " \"\"\"Chunk ds so small that after _resample_iteration_idx chunks have optimal size.\"\"\"\n", | |
| " if isinstance(chunking_dim, str):\n", | |
| " chunking_dim = [chunking_dim]\n", | |
| " # how many times larger than recommended chunksize of 200MB\n", | |
| " optimal_blocksize = 200000000\n", | |
| " # size of CLIMPRED_DIMS\n", | |
| " climpred_dim_chunksize = 8*np.product(np.array([ds[d].size for d in climpred.constants.CLIMPRED_DIMS if d in ds.dims]))\n", | |
| " # remaining blocksize for remaining dims considering iteration\n", | |
| " spatial_dim_blocksize = optimal_blocksize / (climpred_dim_chunksize * iteration)\n", | |
| " # size of remaining dims\n", | |
| " chunking_dim_size = np.product(np.array([ds[d].size for d in ds.dims if d not in climpred.constants.CLIMPRED_DIMS])) # ds.lat.size*ds.lon.size\n", | |
| " # chunks needed to get to optimal blocksize\n", | |
| " chunks_needed = chunking_dim_size / spatial_dim_blocksize\n", | |
| " # get size clon, clat for spatial chunks\n", | |
| " cdim = [1 for i in chunking_dim]\n", | |
| " nchunks = np.product(cdim)\n", | |
| " stepsize=1\n", | |
| " counter = 0\n", | |
| " while nchunks < chunks_needed:\n", | |
| " for i,d in enumerate(chunking_dim):\n", | |
| " c = cdim[i]\n", | |
| " if c <= ds[d].size:\n", | |
| " c = c+stepsize\n", | |
| " cdim[i] = c\n", | |
| " nchunks = np.product(cdim)\n", | |
| " counter+=1\n", | |
| " if counter==100:\n", | |
| " break\n", | |
| " # convert number of chunks to chunksize\n", | |
| " chunks=dict()\n", | |
| " for i,d in enumerate(chunking_dim):\n", | |
| " chunksize = ds[d].size//cdim[i]\n", | |
| " if chunksize < 1:\n", | |
| " chunksize=1\n", | |
| " chunks[d]=chunksize\n", | |
| " ds=ds.chunk(chunks)\n", | |
| " return ds" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 10, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "#iterations=128 works\n", | |
| "iterations=100\n", | |
| "chunking_dims = [d for d in ds.dims if d not in climpred.constants.CLIMPRED_DIMS]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## rebuild init" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 18, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<table>\n", | |
| "<tr>\n", | |
| "<td>\n", | |
| "<table>\n", | |
| " <thead>\n", | |
| " <tr><td> </td><th> Array </th><th> Chunk </th></tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr><th> Bytes </th><td> 12.44 MB </td> <td> 1.38 MB </td></tr>\n", | |
| " <tr><th> Shape </th><td> (10, 12, 5, 72, 36) </td> <td> (10, 12, 5, 24, 12) </td></tr>\n", | |
| " <tr><th> Count </th><td> 20 Tasks </td><td> 9 Chunks </td></tr>\n", | |
| " <tr><th> Type </th><td> float64 </td><td> numpy.ndarray </td></tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</td>\n", | |
| "<td>\n", | |
| "<svg width=\"353\" height=\"191\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"0\" y1=\"0\" x2=\"41\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"0\" y1=\"40\" x2=\"41\" y2=\"40\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"40\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"41\" y1=\"0\" x2=\"41\" y2=\"40\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"0.000000,0.000000 41.203829,0.000000 41.203829,40.328956 0.000000,40.328956\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"20.601915\" y=\"60.328956\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >12</text>\n", | |
| " <text x=\"61.203829\" y=\"20.164478\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,61.203829,20.164478)\">10</text>\n", | |
| "\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"111\" y1=\"0\" x2=\"132\" y2=\"21\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"111\" y1=\"40\" x2=\"132\" y2=\"61\" />\n", | |
| " <line x1=\"111\" y1=\"80\" x2=\"132\" y2=\"101\" />\n", | |
| " <line x1=\"111\" y1=\"120\" x2=\"132\" y2=\"141\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"111\" y1=\"0\" x2=\"111\" y2=\"120\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"132\" y1=\"21\" x2=\"132\" y2=\"141\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"111.000000,0.000000 132.465818,21.465818 132.465818,141.465818 111.000000,120.000000\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"111\" y1=\"0\" x2=\"171\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"132\" y1=\"21\" x2=\"192\" y2=\"21\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"111\" y1=\"0\" x2=\"132\" y2=\"21\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"131\" y1=\"0\" x2=\"152\" y2=\"21\" />\n", | |
| " <line x1=\"151\" y1=\"0\" x2=\"172\" y2=\"21\" />\n", | |
| " <line x1=\"171\" y1=\"0\" x2=\"192\" y2=\"21\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"111.000000,0.000000 171.000000,0.000000 192.465818,21.465818 132.465818,21.465818\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"132\" y1=\"21\" x2=\"192\" y2=\"21\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"132\" y1=\"61\" x2=\"192\" y2=\"61\" />\n", | |
| " <line x1=\"132\" y1=\"101\" x2=\"192\" y2=\"101\" />\n", | |
| " <line x1=\"132\" y1=\"141\" x2=\"192\" y2=\"141\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"132\" y1=\"21\" x2=\"132\" y2=\"141\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"152\" y1=\"21\" x2=\"152\" y2=\"141\" />\n", | |
| " <line x1=\"172\" y1=\"21\" x2=\"172\" y2=\"141\" />\n", | |
| " <line x1=\"192\" y1=\"21\" x2=\"192\" y2=\"141\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"132.465818,21.465818 192.465818,21.465818 192.465818,141.465818 132.465818,141.465818\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"162.465818\" y=\"161.465818\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >36</text>\n", | |
| " <text x=\"212.465818\" y=\"81.465818\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,212.465818,81.465818)\">72</text>\n", | |
| " <text x=\"111.732909\" y=\"150.732909\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,111.732909,150.732909)\">5</text>\n", | |
| "</svg>\n", | |
| "</td>\n", | |
| "</tr>\n", | |
| "</table>" | |
| ], | |
| "text/plain": [ | |
| "dask.array<rechunk-merge, shape=(10, 12, 5, 72, 36), dtype=float64, chunksize=(10, 12, 5, 24, 12), chunktype=numpy.ndarray>" | |
| ] | |
| }, | |
| "execution_count": 18, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "ds2=_chunk_before_resample_iteration_idx(ds,iterations,chunking_dims)\n", | |
| "ds2.data" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 19, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<table>\n", | |
| "<tr>\n", | |
| "<td>\n", | |
| "<table>\n", | |
| " <thead>\n", | |
| " <tr><td> </td><th> Array </th><th> Chunk </th></tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr><th> Bytes </th><td> 1.24 GB </td> <td> 138.24 MB </td></tr>\n", | |
| " <tr><th> Shape </th><td> (10, 12, 5, 72, 36, 100) </td> <td> (10, 12, 5, 24, 12, 100) </td></tr>\n", | |
| " <tr><th> Count </th><td> 39 Tasks </td><td> 9 Chunks </td></tr>\n", | |
| " <tr><th> Type </th><td> float64 </td><td> numpy.ndarray </td></tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</td>\n", | |
| "<td>\n", | |
| "<svg width=\"494\" height=\"144\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"32\" y2=\"22\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"10\" y1=\"39\" x2=\"32\" y2=\"62\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"10\" y2=\"39\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"32\" y1=\"22\" x2=\"32\" y2=\"62\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"10.000000,0.000000 32.704037,22.704037 32.704037,62.285232 10.000000,39.581195\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"44\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"32\" y1=\"22\" x2=\"67\" y2=\"22\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"32\" y2=\"22\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"44\" y1=\"0\" x2=\"67\" y2=\"22\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"10.000000,0.000000 44.501016,0.000000 67.205053,22.704037 32.704037,22.704037\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"32\" y1=\"22\" x2=\"67\" y2=\"22\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"32\" y1=\"62\" x2=\"67\" y2=\"62\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"32\" y1=\"22\" x2=\"32\" y2=\"62\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"67\" y1=\"22\" x2=\"67\" y2=\"62\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"32.704037,22.704037 67.205053,22.704037 67.205053,62.285232 32.704037,62.285232\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"49.954545\" y=\"82.285232\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >5</text>\n", | |
| " <text x=\"87.205053\" y=\"42.494635\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,87.205053,42.494635)\">12</text>\n", | |
| " <text x=\"11.352019\" y=\"70.933214\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,11.352019,70.933214)\">10</text>\n", | |
| "\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"137\" y1=\"0\" x2=\"187\" y2=\"50\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"137\" y1=\"14\" x2=\"187\" y2=\"65\" />\n", | |
| " <line x1=\"137\" y1=\"29\" x2=\"187\" y2=\"80\" />\n", | |
| " <line x1=\"137\" y1=\"44\" x2=\"187\" y2=\"94\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"137\" y1=\"0\" x2=\"137\" y2=\"44\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"153\" y1=\"16\" x2=\"153\" y2=\"61\" />\n", | |
| " <line x1=\"170\" y1=\"33\" x2=\"170\" y2=\"78\" />\n", | |
| " <line x1=\"187\" y1=\"50\" x2=\"187\" y2=\"94\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"137.000000,0.000000 187.823529,50.823529 187.823529,94.943896 137.000000,44.120366\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"137\" y1=\"0\" x2=\"257\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"153\" y1=\"16\" x2=\"273\" y2=\"16\" />\n", | |
| " <line x1=\"170\" y1=\"33\" x2=\"290\" y2=\"33\" />\n", | |
| " <line x1=\"187\" y1=\"50\" x2=\"307\" y2=\"50\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"137\" y1=\"0\" x2=\"187\" y2=\"50\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"257\" y1=\"0\" x2=\"307\" y2=\"50\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"137.000000,0.000000 257.000000,0.000000 307.823529,50.823529 187.823529,50.823529\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"187\" y1=\"50\" x2=\"307\" y2=\"50\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"187\" y1=\"65\" x2=\"307\" y2=\"65\" />\n", | |
| " <line x1=\"187\" y1=\"80\" x2=\"307\" y2=\"80\" />\n", | |
| " <line x1=\"187\" y1=\"94\" x2=\"307\" y2=\"94\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"187\" y1=\"50\" x2=\"187\" y2=\"94\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"307\" y1=\"50\" x2=\"307\" y2=\"94\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"187.823529,50.823529 307.823529,50.823529 307.823529,94.943896 187.823529,94.943896\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"247.823529\" y=\"114.943896\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >100</text>\n", | |
| " <text x=\"327.823529\" y=\"72.883712\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,327.823529,72.883712)\">36</text>\n", | |
| " <text x=\"152.411765\" y=\"89.532131\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,152.411765,89.532131)\">72</text>\n", | |
| "</svg>\n", | |
| "</td>\n", | |
| "</tr>\n", | |
| "</table>" | |
| ], | |
| "text/plain": [ | |
| "dask.array<select_bootstrap_indices_ufunc, shape=(10, 12, 5, 72, 36, 100), dtype=float64, chunksize=(10, 12, 5, 24, 12, 100), chunktype=numpy.ndarray>" | |
| ] | |
| }, | |
| "execution_count": 19, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "ds3 = _resample_iterations_idx(ds2,iterations)\n", | |
| "ds3.data" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 119, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "#ds3.compute()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 20, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<table>\n", | |
| "<tr>\n", | |
| "<td>\n", | |
| "<table>\n", | |
| " <thead>\n", | |
| " <tr><td> </td><th> Array </th><th> Chunk </th></tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr><th> Bytes </th><td> 10.37 MB </td> <td> 1.15 MB </td></tr>\n", | |
| " <tr><th> Shape </th><td> (5, 72, 36, 100) </td> <td> (5, 24, 12, 100) </td></tr>\n", | |
| " <tr><th> Count </th><td> 805 Tasks </td><td> 9 Chunks </td></tr>\n", | |
| " <tr><th> Type </th><td> float64 </td><td> numpy.ndarray </td></tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</td>\n", | |
| "<td>\n", | |
| "<svg width=\"428\" height=\"144\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"0\" y1=\"0\" x2=\"34\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"0\" y1=\"25\" x2=\"34\" y2=\"25\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"25\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"34\" y1=\"0\" x2=\"34\" y2=\"25\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"0.000000,0.000000 34.501016,0.000000 34.501016,25.412617 0.000000,25.412617\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"17.250508\" y=\"45.412617\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >5</text>\n", | |
| " <text x=\"54.501016\" y=\"12.706308\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,54.501016,12.706308)\">1</text>\n", | |
| "\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"104\" y1=\"0\" x2=\"154\" y2=\"50\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"104\" y1=\"14\" x2=\"154\" y2=\"65\" />\n", | |
| " <line x1=\"104\" y1=\"29\" x2=\"154\" y2=\"80\" />\n", | |
| " <line x1=\"104\" y1=\"44\" x2=\"154\" y2=\"94\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"104\" y1=\"0\" x2=\"104\" y2=\"44\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"120\" y1=\"16\" x2=\"120\" y2=\"61\" />\n", | |
| " <line x1=\"137\" y1=\"33\" x2=\"137\" y2=\"78\" />\n", | |
| " <line x1=\"154\" y1=\"50\" x2=\"154\" y2=\"94\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"104.000000,0.000000 154.823529,50.823529 154.823529,94.943896 104.000000,44.120366\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"104\" y1=\"0\" x2=\"224\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"120\" y1=\"16\" x2=\"240\" y2=\"16\" />\n", | |
| " <line x1=\"137\" y1=\"33\" x2=\"257\" y2=\"33\" />\n", | |
| " <line x1=\"154\" y1=\"50\" x2=\"274\" y2=\"50\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"104\" y1=\"0\" x2=\"154\" y2=\"50\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"224\" y1=\"0\" x2=\"274\" y2=\"50\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"104.000000,0.000000 224.000000,0.000000 274.823529,50.823529 154.823529,50.823529\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"154\" y1=\"50\" x2=\"274\" y2=\"50\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"154\" y1=\"65\" x2=\"274\" y2=\"65\" />\n", | |
| " <line x1=\"154\" y1=\"80\" x2=\"274\" y2=\"80\" />\n", | |
| " <line x1=\"154\" y1=\"94\" x2=\"274\" y2=\"94\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"154\" y1=\"50\" x2=\"154\" y2=\"94\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"274\" y1=\"50\" x2=\"274\" y2=\"94\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"154.823529,50.823529 274.823529,50.823529 274.823529,94.943896 154.823529,94.943896\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"214.823529\" y=\"114.943896\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >100</text>\n", | |
| " <text x=\"294.823529\" y=\"72.883712\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,294.823529,72.883712)\">36</text>\n", | |
| " <text x=\"119.411765\" y=\"89.532131\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,119.411765,89.532131)\">72</text>\n", | |
| "</svg>\n", | |
| "</td>\n", | |
| "</tr>\n", | |
| "</table>" | |
| ], | |
| "text/plain": [ | |
| "dask.array<mse, shape=(5, 72, 36, 100), dtype=float64, chunksize=(5, 24, 12, 100), chunktype=numpy.ndarray>" | |
| ] | |
| }, | |
| "execution_count": 20, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "init_skill = climpred.prediction.compute_perfect_model(ds3, control, metric='mse', comparison='m2e')\n", | |
| "init_skill.data" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 21, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "CPU times: user 31.6 s, sys: 1min 22s, total: 1min 53s\n", | |
| "Wall time: 5.71 s\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "%time _ = init_skill.compute()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "29332 Tasks \t324 Chunks \n", | |
| "lead: 5 lon: 360 lat: 180 iteration: 100\n", | |
| "CPU times: user 12min 5s, sys: 33min 49s, total: 45min 55s\n", | |
| "Wall time: 2min 16s" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "1428 Tasks \t16 Chunks\n", | |
| "lead: 5 lon: 72 lat: 36 iteration: 100\n", | |
| "CPU times: user 28.3 s, sys: 1min 4s, total: 1min 32s\n", | |
| "Wall time: 5.7 s " | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "12868 Tasks \t144 Chunks\n", | |
| "lead: 5 lon: 72 lat: 36 iteration: 1000\n", | |
| "CPU times: user 5min 17s, sys: 12min 17s, total: 17min 34s\n", | |
| "Wall time: 56.9 s" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## performance comparison" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 114, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "import time\n", | |
| "\n", | |
| "def performance_comparison(ds, runs=7, compute=True, display_data=False):\n", | |
| " iterationsl = [2**n for n in range(1,runs)]\n", | |
| " times = np.zeros((2,runs-1))\n", | |
| " for i, iterations in enumerate(iterationsl):\n", | |
| " print('iterations =',iterations)\n", | |
| " print('resample_iterations')\n", | |
| " tic = time.perf_counter()\n", | |
| " ds2 = _resample_iterations(ds,iterations).chunk({'iteration':'auto'}).squeeze()\n", | |
| " skill = climpred.prediction.compute_perfect_model(ds2, control, metric='mse', comparison='m2e')\n", | |
| " if dask.is_dask_collection(skill) and len(ds.dims) > 3 and display_data:\n", | |
| " display(skill.data)\n", | |
| " if compute:\n", | |
| " _ = skill.compute()\n", | |
| " toc = time.perf_counter()\n", | |
| " times[0,i]=toc - tic\n", | |
| "\n", | |
| " print('resample_iterations_idx')\n", | |
| " tic = time.perf_counter()\n", | |
| " if 'lat' in ds.dims:\n", | |
| " ds2=_chunk_before_resample_iteration_idx(ds,iterations,chunking_dims)\n", | |
| " else:\n", | |
| " ds2=ds\n", | |
| " ds3 = _resample_iterations_idx(ds2,iterations).chunk({'iteration':'auto'})\n", | |
| " skill = climpred.prediction.compute_perfect_model(ds3, control, metric='mse', comparison='m2e')\n", | |
| " if dask.is_dask_collection(skill) and len(ds.dims) > 3 and display_data:\n", | |
| " display(skill.data)\n", | |
| " if compute:\n", | |
| " _ = skill.compute()\n", | |
| " toc = time.perf_counter()\n", | |
| " times[1,i]=toc - tic\n", | |
| "\n", | |
| " return times" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 115, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "import matplotlib.pyplot as plt\n", | |
| "def plot_perf(times, runs, compute, loglog=False):\n", | |
| " iterationsl = [2**n for n in range(1,runs)]\n", | |
| " plt.plot(iterationsl,times[0], label='resample_iterations')\n", | |
| " plt.plot(iterationsl,times[1], label='resample_iterations_idx')\n", | |
| " plt.ylabel('Time elapsed [s]')\n", | |
| " plt.xlabel('Iterations')\n", | |
| " titlestr = 'Graph Building and Compute' if compute else 'Graph Building only'\n", | |
| " plt.title(titlestr)\n", | |
| " if loglog:\n", | |
| " plt.xscale('log')\n", | |
| " plt.xscale('log')\n", | |
| " plt.legend()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## 3D" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 127, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "iterations = 2\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 4\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 8\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 16\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 32\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 64\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 128\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 256\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 512\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 1024\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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07z44ouF3m7ixInMmDEDgGnTpnHgwAWP/njOokWLWLHil7FovI9ljPm1fcdTuWHCCr7adIgnrmnDn/u38stx7IrAD1QVVSUsrHTm2TFjxpybnjZtGu3ataNevXr5bPFrWVlZRETk/qe1aNEiKlWqRM+ePX9zLGPML37YeYx7Z68mK9vDtLu60qdlrt0EFYmgSwTPfLKRTQdOFuk+L6pXmaeua5vvOrt372bAgAH069eP77//noceeoiJEyeSnp5Os2bNePvtt6lUqRKPPfYYCxYsICIigquuuooXX3yRTz75hGeffZaMjAxq1KjB7NmzqV27Nk8//TS7du3i4MGDbNu2jZdeeomVK1fyxRdfUL9+fT755BMiIyOJiYnhlltuYeHChQC88847NG/e/Ffx7dixg7Fjx3L06FEqVKjA5MmTad26da5lefrpp6lUqdK5fp1uu+02ypcvz/fff8+mTZt45JFHOHXqFNHR0UybNo26devSt29fevbsyfLlyxk0aBAtW7b8TZnOnDnDxIkTCQ8PZ9asWbz22mt8++23VKpUiUcffZSEhATGjBlDamoqzZo146233qJatWr07duXbt26sXDhQk6cOMHUqVPp3bs3Gzdu5K677iIjIwOPx8MHH3xAixYtiuYf3ZgAmv3DHp6av5FGNSowZUQsTWtW8uvxSudP1hJq69atjBgxgq+//pqpU6fyzTffsHr1amJjY3nppZc4fvw4H330ERs3bmTdunU88cQTAFx66aWsXLmSNWvWMHToUF544YVz+9yxYwefffYZ8+fPZ/jw4fTr14/169dTvnx5Pvvss3PrVa5cmVWrVjFu3Dgeeuih38Q2evRoXnvtNeLj43nxxRe57777CizPjTfeSGxsLLNnzyYhIYGIiAjuv/9+5s2bR3x8PHfffTePP/74ufVPnDjB4sWL+eMf/5hrmWJiYhgzZgwPP/wwCQkJ9O7d+1fHGzFiBP/6179Yt24d7du355lnnjm3LCsri1WrVvHKK6+cmz9x4kQefPBBEhISiIuLo0GDBj7+SxlTMmVme/jbxxt4/KMNXNoimo/H9vJ7EoAgvCIo6Je7PzVu3Jju3bvz6aefsmnTJnr16gVARkYGPXr0oHLlypQrV46RI0dyzTXXcO211wJOg7hbbrmFgwcPkpGR8asGSwMGDCAyMpL27duTnZ3N1Vdf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\n", | |
| "text/plain": [ | |
| "<Figure size 432x288 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "needs_background": "light" | |
| }, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "runs=11\n", | |
| "compute=False\n", | |
| "times = performance_comparison(ds, runs=runs, compute=compute, display_data=False)\n", | |
| "plot_perf(times, runs=runs, compute=compute)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 128, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "iterations = 2\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 4\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 8\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 16\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 32\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 64\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 128\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 256\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 512\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n", | |
| "iterations = 1024\n", | |
| "resample_iterations\n", | |
| "resample_iterations_idx\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "compute=True\n", | |
| "times = performance_comparison(ds, runs=runs, compute=compute)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 132, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "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qPtsWbsC/7y2Va7r7Nq1i379+tGrVy9++eUXRo0axYQJE0hNTaVRo0Z8/PHHhISEMHr0aObNm0fp0qW58sorGTduHF9//TUvv/wyaWlpVK1alSlTplCzZk3GjBnDzp07iYuLY8uWLbz55pv8+uuvfPvtt9SpU4evv/6awMBAIiIiGDp0KEuWLAHgiy++oHHjxn+Kb/v27Tz44IPEx8dTrlw5PvjgA5o3b57juYwZM4aQkJCzdZFuueUWypYtyy+//EJsbCyPP/44SUlJVKtWjU8++YSwsDB69uxJ9+7d+fnnnxkwYABNmzb9yzmdPn2aCRMmEBAQwOeff867777LokWLCAkJ4cknnyQqKoqRI0eSnJxMo0aN+Oijj6hcuTI9e/akS5cuLFmyhOPHjzNp0iQuvfRSYmJiuPPOO0lLSyMrK4vZs2fTpEmTwvmlG+MFqsrUlXt5aX4swYGlmHBrJ65qndf89AVTMpunxcjmzZu5/fbb+f7775k0aRI//PADa9asITIykjfffJOjR48yZ84cYmJiWL9+Pc8++ywAl1xyCb/++itr167lpptu4vXXXz+7z+3bt7NgwQLmzp3LrbfeSq9evYiOjqZs2bIsWLDg7HoVKlRg5cqVPPTQQ4waNeovsY0YMYJ3332X1atXM27cOB544IE8z2fQoEFERkYyZcoUoqKiKF26NA8//DCzZs1i9erV3HXXXfzjH/84u/7x48dZtmwZTzzxRI7nFBERwciRI3nssceIiori0ksv/dPxbr/9dl577TXWr19PmzZteOGFF86+l5GRwcqVKxk/fvzZ5RMmTODRRx8lKiqKVatWUbeuzf5nSq6EpFRGfLaaZ+ZEExlRme9G9fB40gcfafHn1TL3pPr169O1a1fmz59PbGwsF198MQBpaWl069aNChUqEBwczD333MM111xD//79AecGtKFDhxIXF0daWtqfbhDq168fgYGBtGnThszMTK666ioA2rRpw65du86uN2zYsLOPjz322J/iSkpKYsWKFQwe/Mf9camp55sT/Pw2b97Mhg0b6NOnDwCZmZmEhYWdfX/o0KFnn+d2TjlJTEzk+PHjXHbZZQDccccdf4r3hhtuAKBTp05nz7tbt26MHTuWffv2ccMNN1hr35RYy7bE8+TMdSQmp/Nc/5bc2T2CUqWKZviwTyR+bypfvjzgfF3r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\n", | |
| "text/plain": [ | |
| "<Figure size 432x288 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "needs_background": "light" | |
| }, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "plot_perf(times, runs=runs, compute=compute)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "`resample_iterations_idx` only faster for graph building, which becomes relatively less compared to computation time\n", | |
| "\n", | |
| "I get issues (memory, transpose, etc) in `resample_iterations_idx` for more than 127 iterations. Computation time identical." | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## 1D data" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 40, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<Figure size 432x288 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "needs_background": "light" | |
| }, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "runs=10\n", | |
| "compute=True\n", | |
| "times = performance_comparison(ds.isel(lon=2,lat=2), runs=runs, compute=compute)\n", | |
| "plot_perf(times, runs=runs, compute=compute)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 36, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3dd3gU1frA8e9LCARIaKETQu9VjTQVEUHF3hGxF8R61etVvDb04u+q12tFRUQBFUUFuaCAjSJI7wmhhh4ILUAogdT398dMcIlJWEI2m+y+n+fZJ7szZ2bfs0nm3Tlz5hxRVYwxxgSvMv4OwBhjjH9ZIjDGmCBnicAYY4KcJQJjjAlylgiMMSbIWSIwxpggZ4nAFAsRGSIiXxbTe0WLyBERCXFfzxKR+/Ip20hEVETKuq+nicidxRHnmRCRLSLS299xmMBgiSBIicgtIrJQRI6KyB73+UMiIv6ODcA9OB91D+j7RORrEanqzbaquk1Vw1U163TfV1X7quqY04+4ZBGRziIyVUQOish+EVkkInf7O67c3N9zM3/HEewsEQQhEfk78C7wH6AOUBsYBJwHlMtnm5BiC/BPHVU1HGgCVAOG+CGGUkdEugEzgN+BZkAk8CDQ159xmZLLEkGQEZEqwCvAQ6o6XlUPq2O5qg5Q1TS33GgR+cj9VnkUuEhErhCR5SJySES2i8gQj/3mNLEMFJGdIpLkJhxP5UTkcxE5LCLxIhLjTcyqegiYDLTxeL+TmkY8m55yN/fkqn+IiLzpnmVsAq7Itf5EM5KI3CUif7jlD4jIZhHp61G2sYjMduvzm4h8kF/zl4hUE5EfRWSvu68fRSQq1/v+S0Tmuvv7RURqeKy/XUS2ikiyiDx3io/sP8AYVX1dVfe5v9+lqnqzx/7uF5EE92xhsojU81in7tnhBjeWf4lIUxGZ7/7uvxWRcm7ZniKSKCL/dD/TLSIyIK/P0/MzdZ/PdhevdM/8+rnLrxSRFe7ZzDwR6XCK+pozZIkg+HQDygOTvCh7K/AqEAH8ARwF7gCq4hxAHxSRa3NtcxHQHLgEGJyrHftqYJy7/WRgmDcBi0g14FpggTflT+F+4ErgLCAGuPEU5bsA64AawBvApx7NZ18Bi3C+cQ8Bbi9gP2WAUUBDIBo4xl/rfytwN1AL58zsKQARaQN85O6/nvt+UeRBRCri/I7H5xeIiPQC/g3cDNQFtuL8XjxdBpwDdAWeBkYAA4AGQDugv0fZOjifT33gTmCEiLTM7/1zqGoP92lHtynvGxE5G/gMeMCt58fAZBEpf6r9mcKzRBB8agD7VDUzZ4H7reugiBwTkR4eZSep6lxVzVbV46o6S1Xj3NexwNfAhbn2/7KqHlXVOJwDn+cB4w9Vneq23X8BdDxFrMtE5CCwD+fg+XHhqnySm4F3VHW7qu7HOSAWZKuqfuLGPAbnwFlbRKKBc4EXVTVdVf/ASW55UtVkVZ2gqqmqehgnweb+7Eap6npVPQZ8C3Ryl98I/Kiqs90ztheA7HzeqhrO/3VSAXUaAHymqsvc/T0LdBORRh5lXlfVQ6oaD6wCflHVTaqaAkzDSaSeXlDVNFX9HZiC8zkXxv3Ax6q6UFWz3Os1aTgJyfiIJYLgkwzU8Gw2UdXuqlrVXef5N7Hdc0MR6SIiM93mjRSc6wo1OJnnNltxvsHm2OXxPBUIy6v5xsPZblxhON+I54hIWMHVO6V6ecRYkBMxq2qq+zTc3c9+j2Xk2u9JRKSiiHzsNu8cAmYDVeXkay+5P5/wvGJW1aM4v6u8HMBJEnULqFM9POqtqkfc/dX3KLPb4/mxPF6He7w+4MaUI/fv/XQ0BP7ufjE56H4RaHAG+zNesEQQfObjfMO6xouyuYem/QrnW28DVa0CDAdy9zJq4PE8GthZyDj/DEI1AxgJNMZplgCnmaqiR7E6Xu4uKY8YCyMJqO42xeRokF9h4O9AS6CLqlYGcs68vOmldVLM7ntG5lXQTUzzgRsK2N9OnANuzv4qufvb4UUseanm7iOH5+/9dH9P24FXVbWqx6Oiqn5dyNiMFywRBBlVPQi8DHwoIjeKSLiIlBGRTkClU2wegfMt+LiIdMZp087tBffbb1uc9u5vzjRm91vz3TjfRDe5i1cAt4hIqHvR+VRt/Tm+BR4TkSj32sPgwsSkqluBJcAQESknTk+dqwrYJMKN/6CIVAdeOo23Gw9cKSLnuxdpX6Hg/92ngbtE5B8iEgkgIh1FJOc6wFfA3SLSyW17/z9goapuOY2YcnvZ/RwuwLkG8527fAVwvfs30Qy4N9d2u3F6heX4BBjknn2KiFQSp5NCxBnEZk7BEkEQUtU3gCdxDhh7cP4ZPwaeAeYVsOlDwCsichh4EeegmtvvQAIwHXhTVX85g1BXisgRnOaOO4Hr3HZ9cNrJm7rrXsY5uHnjE+BnYCWwDPj+DOIbgHNhNhkYipP00vIp+w5QAed6xwLgJ2/fxG2nfxinjkk4dU4soPw8oJf72CQi+3Eu9k5110/H+fwmuPtrCtzibTx52OXGtBMYCwxS1bXuureBdJy/sTHuek9DgDFuM9DNqroE5zrBMHefCcBdZxCb8YLYxDSmKLgXGjcDoZ4XooOJiHwDrFXV0/m2X6qJSE/gS1XNsxeTKR3sjMCYQhKRc93+9WVE5DKc6y7/83dcxpyugnpsGGMKVgenaSkSp6nmQVVd7t+QjDl91jRkjDFBzpqGjDEmyJW6pqEaNWpoo0aN/B2GMcaUKkuXLt2nqjXzWlfqEkGjRo1YsmSJv8MwxphSRUTyvYvemoaMMSbIWSIwxpggZ4nAGGOCXKm7RpCXjIwMEhMTOX78uL9DMQEsLCyMqKgoQkND/R2KMUUqIBJBYmIiERERNGrUCCkZU+6aAKOqJCcnk5iYSOPGjf0djjFFKiCaho4fP05kZKQlAeMzIkJkZKSddZqAFBCJALAkYHzO/sZMoAqYRGCMMYEqIyubD2YmsHL7QZ/sPyCuERhjTKBatSOFp8fHsjrpEEfSMunYoGqRv4edEQSwIUOG8Oabb572dsOHD+fzzz8HYPTo0ezcecazTZ4wa9Ys5s37c+4bz/cyxvzpeEYW/562hms+mMveI2kMv+0cnrmslU/ey84IfEBVUVXKlCmdeXbQoEEnno8ePZp27dpRr573c4dnZmZStmzef1qzZs0iPDyc7t27/+W9jDGOBZuSefb7ODbvO0q/mAb88/LWVKnou27LAZcIXv4hntU7DxXpPtvUq8xLV7UtsMyWLVvo27cvF110EfPnz+fxxx9n+PDhpKWl0bRpU0aNGkV4eDiDBw9m8uTJlC1blksuuYQ333yTH374gaFDh5Kenk5kZCRjx46ldu3aDBkyhM2bN5OUlMT69et56623WLBgAdOmTaN+/fr88MMPhIaG0qhRI/r168fMmTMB+Oqrr2jWrNlJ8W3cuJGHH36YvXv3UrFiRT755BNatcr728WQIUMIDw8/Ma7TgAEDqFChAvPnz2f16tU8+eSTHDlyhBo1ajB69Gjq1q1Lz5496d69O3PnzuXqq6+mRYsWf6nTsWPHGD58OCEhIXz55Ze8//77TJ8+nfDwcJ566ilWrFjBoEGDSE1NpWnTpnz22WdUq1aNnj170qVLF2bOnMnBgwf59NNPueCCC4iPj+fuu+8mPT2d7OxsJkyYQPPmzYvml26MHxw6nsFr09by1cJtRFevyNj7unBesxo+f9/S+ZW1hFq3bh133HEHv/76K59++im//fYby5YtIyYmhrfeeov9+/czceJE4uPjiY2N5fnnnwfg/PPPZ8GCBSxfvpxbbrmFN95448Q+N27cyJQpU5g0aRK33XYbF110EXFxcVSoUIEpU6acKFe5cmUWLVrEI488wuOPP/6X2AYOHMj777/P0qVLefPNN3nooYdOWZ8bb7yRmJgYxo4dy4oVKyhbtiyPPvoo48ePZ+nSpdxzzz0899xzJ8ofPHiQ33//nb///e951qlRo0YMGjSIJ554ghUrVnDBBRec9H533HEHr7/+OrGxsbRv356XX375xLrMzEwWLVrEO++8c2L58OHD+dvf/saKFStYsmQJUVE2W6IpvX5dvZs+b/3OuEXbuP+Cxvz8eI9iSQIQgGcEp/rm7ksNGzaka9eu/Pjjj6xevZrzzjsPgPT0dLp160blypUJCwvjvvvu44orruDKK68EnBvi+vXrR1JSEunp6SfdsNS3b19CQ0Np3749WVlZXHbZZQC0b9+eLVu2nCjXv3//Ez+feOKJk+I6cuQI8+bN46abbjqxLC0tvznW87du3TpWrVpFnz59AMjKyqJu3bon1vfr1+/E84LqlJeUlBQOHjzIhRdeCMCdd955UrzXX389AOecc86Jenfr1o1XX32VxMRErr/+ejsbMKXSviNpDJkcz4+xSbSqE8GI22N8ckG4IAGXCPypUqVKgHONoE+fPnz99dd/KbNo0SKmT5/OuHHjGDZsGDNmzODRRx/lySef5Oqrr2bWrFkMGTLkRPny5csDUKZMGUJDQ0/0ZS9TpgyZmX/OEe/Zxz13f/fs7GyqVq3KihUrzqh+qkrbtm2ZP39+nutz6g8UWKfCyPkcQkJCTtT71ltvpUuXLkyZMoVLL72UkSNH0qtXrzN6H2OKi6oycfkOXvlxNalpWfy9TwseuLAp5coWf0ONNQ35QNeuXZk7dy4JCQkApKamsn79eo4cOUJKSgqXX34577zzzokDc0pKCvXr1wdgzJgxhXrPb7755sTPbt26nbSucuXKNG7cmO+++w5w/gBXrlzp1X4jIiI4fPgwAC1btmTv3r0nEkFGRgbx8fF5bpdfnTz356lKlSpUq1aNOXPmAPDFF1+cODvIz6ZNm2jSpAmPPfYYV199NbGxsV7VyRh/SzyQyp2jFvPktytpWjOcqX87n0cvbu6XJAB2RuATNWvWZPTo0fTv3/9EE8zQoUOJiIjgmmuu4fjx46gqb7/9NuBcnL3pppuoX78+Xbt2ZfPmzaf9nmlpaXTp0oXs7Ow8z0TGjh3Lgw8+yNChQ8nIyOCWW26hY8eOp9zvXXfdxaBBg05cLB4/fjyPPfYYKSkpZGZm8vjjj9O27V+b4/Kr01VXXcWNN97IpEmTeP/990/aZsyYMScuFjdp0oRRo0YVGNs333zDl19+SWhoKHXq1OHFF188ZX2M8aesbOWL+Vt44+d1CPDy1W25vWtDypTx713rpW7y+piYGM09Q9maNWto3bq1nyLyv5zePTVqFM+FpWAW7H9rpvA27D7MMxNiWbbtIBe2qMmr17UjqlrFYnt/EVmqqjF5rbMzAmOM8aH0zGyG/76RYTMSqFg+hLf7deTaTvVL1NhVlggCgGfvodPx6quvnrhukOOmm246qUuoMabwVmw/yOAJsazddZirOtbjpavaUCO8vL/D+gtLBEHsueees4O+MT6Qmp7JW7+s57O5m6kVEcbIO2Lo3aa2v8PKlyUCY4wpQnMT9jH4+1i27z/GgC7RPNO3FZXDSvasdpYIjDGmCKSkZvDq1NV8uySRxjUqMW5gV7o2ifR3WF7xWSIQkc+AK4E9qtouj/UDgGfcl0eAB1XVu87txhhTgvy0KokXJsWz/2g6gy5syuO9mxMWGuLvsLzmyzOC0cAwIL8xhjcDF6rqARHpC4wAuvgwHmOMKVJ7Dh/npUnxTFu1izZ1KzPqrnNpV7+Kv8M6bT67jU1VZwP7C1g/T1UPuC8XADZiWBGz+Qj+lDPsdW533XUX48eP9/n7m8Ciqny7eDu9//s709fu4enLWjLpkfNKZRKAknON4F5gWn4rRWQgMBAgOjq6uGIqNJuPoOTNR+CZfIw5E9uSU/nnxDj+SNhH58bVee369jSpGe7vsM6I3xOBiFyEkwjOz6+Mqo7AaToiJiam4Fuhpw2GXXFFGSLUaQ99XyuwiM1HULLnIwgPD+fIkSOoKo8++igzZsygcePG5NxZn5KSQufOnZk8eTItW7akf//+9OrVi/vvv/90/1pMgMrKVkbN3cx/f1lPSBlh6LXtuLVztN+HhygKfv3KKiIdgJHANaqa7M9YioLNR1Dy5yOYOHEi69atIy4ujk8++eTEmUKVKlUYNmwYd911F+PGjePAgQOWBMwJa3cd4vqP5jF0yhq6N43k1yd7cFsJGCOoqPjtjEBEooHvgdtVdX2R7fgU39x9yeYjKPnzEcyePZv+/fsTEhJCvXr1Thq2uk+fPnz33Xc8/PDDXo/OagJbWmYWH8zcyIczE6hSIZT3+p/FVR3qlqjhIYqCL7uPfg30BGqISCLwEhAKoKrDgReBSOBD90PNzG9ApNLC5iMoHfMR5PdPnJ2dzZo1a6hQoQL79++3Gc+C3NKtB3hmQiwJe45w3Vn1eeHKNlSvVM7fYfmEL3sN9VfVuqoaqqpRqvqpqg53kwCqep+qVlPVTu6jVCcBTzYfQcmdj6BHjx6MGzeOrKwskpKSTlxXAXj77bdp3bo1X3/9Nffccw8ZGRmn3J8JPEfTMhkyOZ4bh88jNS2TUXefy9v9OgVsEoAScLE4ENl8BCV3PoLrrruOGTNm0L59e1q0aHEi2axfv56RI0eyaNEiIiIi6NGjB0OHDj3pOoUJfL+v38s/v49jZ8ox7ujakH9c1orw8oF/mLT5CAKAzUdQfIL9by1QHTiazr+mrOb7ZTtoWrMSr9/QgZhG1f0dVpGy+QiMMSYPqsqUuCSGTI7nYGoGj/ZqxsMXNStVw0MUBUsEAcDmI3AkJydz8cUX/2X59OnTiYwsHYN/meKzK+U4z/9vFb+t2U2HqCp8cW8XWtet7O+w/CJgmoZatWoVcF26TMmiqqxdu9aahkq57Gxl3OLt/HvqGjKys/l7n5bcfV4jyoaUzpEAvBXwTUNhYWEkJycTGRlpycD4hKqSnJxMWFiYv0MxZ2DzvqMMnhDLws376dYkktduaE/DyEqn3jDABUQiiIqKIjExkb179/o7FBPAwsLC7N6CUiozK5uRf2zm7V/XU65sGV6/oT03xzSwL46ugEgEoaGhp7xz1RgTnOJ3pvDMhFhW7TjEJW1q869r21G7sp3ZeQqIRGCMMbkdz8jivekb+Hj2JqpVLMeHA86mb7s6dhaQB0sExpiAs2jzfgZPiGXTvqPceE4Uz1/RmqoVA/fO4DNlicAYEzAOH8/gjZ/W8cWCrURVq8AX93bmguY1/R1WiWeJwBgTEGas3c1zE1ex69Bx7jmvMU9d2oKK5ewQ5w37lIwxpVrykTRe+XE1k1bspEXtcD4Y0J2zo6v5O6xSxRKBMaZUUlUmrdjJKz+u5vDxDB7v3ZyHejajXNnAvjHMFywRGGNKnZ0Hj/HcxDhmrtvLWdFVef2GDrSoHeHvsEotSwTGmFIjO1sZu3Arr01bS7bCi1e24c7ujQgJkCkj/cUSgTGmVNi49wiDJ8SyeMsBLmheg/+7rj0Nqlf0d1gBwRKBMaZEy8jKZsTsTbw7fQMVQkN486aO3HB2fbsxrAhZIjDGlFhxiSk8PSGWNUmHuKJ9XYZc3ZaaEeX9HVbAsURgjClxjqVn8c5v6/lkziZqhJfn49vP4dK2dfwdVsCyRGCMKVHmb0zm2e9j2ZKcSv/ODRjctzVVKoT6O6yAZonAGFMipBzL4LVpa/h60XYaRlbkq/u70L2pzcNdHCwRGGP87pf4XbwwaRV7D6fxQI8mPN67BRXKBde8wf7ks0QgIp8BVwJ7VLVdHusFeBe4HEgF7lLVZb6KxxhT8uw9nMaQH+KZEptEqzoRfHJHDB2iqvo7rKDjyzOC0cAw4PN81vcFmruPLsBH7k9jTIBTVb5ftoNXflzNsfQsnrqkBQ9c2JTQAJ83uKTyWSJQ1dki0qiAItcAn6uqAgtEpKqI1FXVJF/FZIzxv+37U/nnxDjmbNhHTMNqvHZDB5rVCvd3WEHNn9cI6gPbPV4nusv+kghEZCAwECA6OrpYgjPGFK2sbGXMvC28+cs6BHjlmrbc1qUhZWx4CL/zZyLI67eveRVU1RHACICYmJg8yxhjSq4Nuw/z9IRYlm87SM+WNXn1uvbUr1rB32EZlz8TQSLQwON1FLDTT7EYY3wgPTObj2ZtZNjMDYSXL8s7/TpxTad6NjxECePPRDAZeERExuFcJE6x6wPGBI4V2w/yzPhY1u0+zNUd6/HSVW2IDLfhIUoiX3Yf/RroCdQQkUTgJSAUQFWHA1Nxuo4m4HQfvdtXsRhjik9qeib//WU9o+ZupnblMD69M4aLW9f2d1imAL7sNdT/FOsVeNhX72+MKX5/bNjHsxNj2b7/GLd1jeaZy1oREWbDQ5R0dmexMeaMpaRmMHTKar5bmkiTGpX4ZmBXujSJ9HdYxkuWCIwxZ2RaXBIvTo5n/9F0HurZlMcubk5YqA0PUZpYIjDGFMqeQ8d5YdIqfo7fTbv6lRl117m0q1/F32GZQsg3EYjI9V5sf1xVpxZhPMaYEk5V+XbJdoZOWUN6ZjaD+7bivvMbU9aGhyi1Cjoj+ASYRN43fuXogdP7xxgTBLYmH+XZ7+OYtzGZLo2r89oNHWhco5K/wzJnqKBEME1V7yloYxH5sojjMcaUQFnZymd/bOa/v64jtEwZXr2uHf3PjbbhIQJEvolAVW871cbelDHGlG5rkg4xeEIsKxNT6N26NkOvbUedKmH+DssUoVNeLBaRm4CfVPWwiDwPnA0MtbkDjAlsaZlZDJuRwEezNlKlQijDbj2LK9rXteEhApA3vYZeUNXvROR84FLgTWzuAGMC2tKt+3lmQhwJe45w/dn1eeGKNlSrVM7fYRkf8SYRZLk/rwA+UtVJIjLEdyEZY/zlaFom//l5HWPmb6FelQqMvvtceras5e+wjI95kwh2iMjHQG/gdREpD1g/MWMCzKx1e3hu4ip2phzjzm6NeOrSloSXt1uNgoE3v+WbgcuAN1X1oIjUBf7h27CMMcXlwNF0/vXjar5fvoNmtcIZP6g75zSs5u+wTDE6ZSJQ1VTge4/XSeQxi5gxpnRRVX6MTWLI5HhSjmXwWK9mPNyrGeXL2vAQwaagO4uXqerZBW3sTRljTMmTlHKMF/63it/W7KFjVBW+vK8LretW9ndYxk8KOiNoLSKxBawXwAYWMaYUyc5Wvl68jdemriUjO5vnr2jN3ec1JsRuDAtqBSWCVl5sn3XqIsaYkmDT3iM8+30cCzfvp3vTSF67vgPRkRX9HZYpAQq6s3hrcQZijPGNzKxsPpmzmbd/W0/5smV444YO3BQTZTeGmROsb5gxAWzVjhSemRBL/M5DXNa2Dq9c05ZalW14CHMySwTGBKDjGVm8O30DI2Zvonqlcnw04Gz6tq/r77BMCWWJwJgAs3BTMs9+H8emfUe5OSaK5y5vQ5WKNm+wyV9B3UcPA5rfelW1vmbGlCCHj2fw2rS1jF24jQbVK/DlvV04v3kNf4dlSoGCLhZHAIjIK8Au4AucLqMDgIhiic4Y45Xpa3bz/P9WsfvQce47vzFPXtKCiuXshN94x5u/lEtV1XOk0Y9EZCHwho9iMsZ4KflIGi//sJrJK3fSsnYEH912Dp0aVPV3WKaU8WbwuCwRGSAiISJSRkQG4OX9AyJymYisE5EEERmcx/oqIvKDiKwUkXgRuft0K2BMMFJVJi5PpPdbvzNtVRJP9mnBD4+eb0nAFIo3ZwS3Au+6DwXmussKJCIhwAdAHyARWCwik1V1tUexh4HVqnqViNQE1onIWFVNP816GBM0dhw8xnMT45i1bi9nR1fl9Rs60Ly2tdaawvNm0LktwDWF2HdnIEFVNwGIyDh3P56JQIEIce5sCQf2A5mFeC9jAl52tvLlwq28Pm0tCrx0VRvu6NbIhocwZ8ybqSpb4MxIVltV24lIB+BqVR16ik3rA9s9Xify11nNhgGTgZ04F6D7qWq2t8EbEywS9hxh8IRYlmw9QI8WNXn12nY0qG7DQ5ii4c01gk+AZ4EMAFWNBW7xYru8vqbk7o56KbACqAd0AoaJyF+6pYrIQBFZIiJL9u7d68VbGxMYMrKyGTZjA5e/O4eEvUd46+aOjLn7XEsCpkh5c42goqouyjUuiTfNN4lAA4/XUTjf/D3dDbymqgokiMhmnMHuFnkWUtURwAiAmJiYfO9tMCaQxCYe5OnxsazddZgrO9TlpavaUjOivL/DMgHIm0SwT0Sa4n6bF5Eb8W5imsVAcxFpDOzAOYvIfZF5G3AxMEdEagMtgU1exm5MQDqWnsXbv61n5JxN1Iwozyd3xNCnTW1/h2UCmDeJ4GGcb+OtRGQHsBm47VQbqWqmiDwC/AyEAJ+paryIDHLXDwf+BYwWkTicpqRnVHVf4apiTOk3b+M+nv0+jq3JqfTvHM2zl7eicpgND2F8S5xWGS8KilQCyqjqYd+GVLCYmBhdsmSJP0MwpsilHMvg31PXMG7xdhpFVuTf13egW9NIf4dlAoiILFXVmLzWedNr6G/AKOAw8ImInA0MVtVfijZMY4LTz/G7eOF/q0g+ms4DFzbhid4tCAu1eYNN8fGmaegeVX1XRC4FauFc4B0FWCIw5gzsOXycIZPjmRq3i9Z1K/PpnefSPspmfzXFz5tEkNNd6HJglKquFJvayJhCU1XGL01k6JQ1HMvI4h+XtmRgjyaEhnjTm9uYoudNIlgqIr8AjYFnRSQCsJu+jCmE7ftT+efEOOZs2Me5jarx2g0daFoz3N9hmSDnTSK4F+dmr02qmioikTjNQ8YYL2VlK6PnbeHNn9dRRuBf17ZjQOdoytjwEKYE8GasoWwRaQTcJiIK/KGqE30dmDGBYv3uwzw9PpYV2w/Sq1Uthl7bjnpVK/g7LGNO8KbX0IdAM+Brd9EDItJbVR/2aWTGlHLpmdl8OCuBD2YmEBEWyru3dOLqjvWwS2ympPGmaehCoJ07DAQiMgaI82lUxpRyy7cd4JkJsazffYRrO9XjhSvbEBluw0OYksmbRLAOiAa2uq8bALE+i8iYUiw1PZM3f17PqHmbqVs5jFF3nctFrWr5OyxjCuRNIogE1ohIzkBw5wLzRWQygKpe7avgjClN5mzYy7Pfx5F44Bh3dGvI05e1IjbojlMAABnlSURBVLy8zRtsSj5v/kpf9HkUxpRiCXsO8+70BH5YuZMmNSvx3aBunNuour/DMsZr3vQa+r04AjGmtFm36zDvz9jAlLgkKoSG8GivZjx8UTMbHsKUOt70GuoKvA+0BsrhjCR6VFX/MoGMMcEgfmcKw2YkMG3VLsLLl+Whnk259/wmVK9Uzt+hGVMo3jQNDcOZS+A7IAa4A2juy6CMKYliEw/y3vQEfluzm4iwsjx2cXPuOa8RVStaAjClm1dXslQ1QURCVDULGCUi83wclzElxvJtB3hv+gZmrttLlQqhPNmnBXd2b0SVCjZPgAkM3iSCVBEpB6wQkTdwZier5NuwjPG/JVv28+70DczZsI9qFUP5x6UtuaNbQyJsohgTYLxJBLfjXBd4BHgC5z6CG3wZlDH+tGBTMu9N38C8jclEVirHs31bcVvXhlSyrqAmQHnTayjnRrJjwMu+DccY/1BV5m1M5t3pG1i0eT81I8rz/BWtGdClIRXKWS8gE9jyTQTuPML5zmOpqh18EpExxUhVmb1hH+9N38DSrQeoUzmMIVe14ZbO0dYN1ASNgs4Iriy2KIwpZqrKjLV7eG/6BlYmplC/agWGXtuOm2KiKF/WEoAJLvkmAo8mIUSkIdBcVX8TkQoFbWdMSZadrfy6ZjfvTd9A/M5DNKhegdeub8/1Z0dRrqzNEGaCkzc3lN0PDASqA02BKGA4cLFvQzOm6GRnKz/F7+K96RtYu+swjSIr8p8bO3DtWfVtikgT9Lz5Zv8w0BlYCKCqG0TEhlM0pUJWtjIlLon3p29gw54jNKlZibf7deSqDvUoawnAGMC7RJCmquk5k2mISFkKuIhsTEmQmZXND7E7eX9GApv2HqV5rXDe638WV7SvS4hND2nMSbxJBL+LyD+BCiLSB3gI+MGbnYvIZcC7OPchjFTV1/Io0xN4BwgF9qnqhV7GbsxfZGRlM3H5Dj6YmcDW5FRa1YngwwFnc1nbOjY/sDH58CYRDMaZwD4OeACYCow81UYiEgJ8APQBEoHFIjJZVVd7lKkKfAhcpqrbrMnJFFZ6ZjYTliXywcwEEg8co139yoy4/Rx6t65tCcCYU/Bq8nrgE/dxOjoDCaq6CUBExgHXAKs9ytwKfK+q29z32nOa72GCXFpmFt8uSeSjmQnsTDlOxwZVeeWatlzUspbNDWyMl3zZDbQ+sN3jdSLQJVeZFkCoiMwCIoB3VfXz3DsSkYE4PZeIjo72SbCmdDmekcW4RdsY/vsmdh06ztnRVfn3DR3o0byGJQBjTpMvE0Fe/425LzKXBc7B6YpaAWcKzAWquv6kjVRHACMAYmJi7EJ1EDuWnsXYhVv5ePYm9h5Oo3Pj6vz35o50bxppCcCYQvI6EYhIJVU9ehr7TsQZoC5HFLAzjzL73P0eFZHZQEdgPcZ4OJqWyZcLtvLJnE3sO5JO96aRvN//LLo2ifR3aMaUet7cUNYd5+JwOBAtIh2BB1T1oVNsuhhoLiKNgR04k9vcmqvMJGCY2yW1HE7T0dunVwUTyA4fz+Dz+VsZOWcTB1Iz6NGiJo/1akaMzQlsTJHx5ozgbeBSYDKAqq4UkR6n2khVM0XkEeBnnO6jn6lqvIgMctcPV9U1IvITEAtk43QxXVXIupgAknIsg9Fzt/DZ3M2kHMugV6taPNqrGWdFV/N3aMYEHG9nKNueq/01y8vtpuJ0N/VcNjzX6/8A//FmfybwHUxN57M/NjNq7hYOp2XSp01tHuvVnPZRVfwdmjEBy5tEsN1tHlJ3prLHgDW+DcsEm/1H0xk5ZxNj5m3haHoWfdvV4ZFezWhbzxKAMb7mTSIYhHN3cH2ci7u/4Iw/ZMwZ23s4jZFzNvHFgq0cy8jiivZ1ebRXc1rWifB3aMYEDW9uKNsHDCiGWEwQ2XPoOB/P3sTYhVtJz8zm6o71eKRXM5rVsgRgTHHzptdQY+BRoJFneVW92ndhmUCVlHKM4bM28vXi7WRlK9d2qs8jvZrRuEYlf4dmTNDypmnof8CnOAPNZfs2HBOoEg+k8tGsjXy3JJFsVW48J4qHejYjOrKiv0MzJuh5kwiOq+p7Po/EBKRtyal8OCuB8UsTEYGbYxrwYM+mRFWzBGBMSeFNInhXRF7CuUiclrNQVZf5LCpT6m3ed5QPZiYwcfkOQsoIA7pE88CFTalXtYK/QzPG5OJNImgP3A704s+mIXVfG3OShD1H+GBmApNW7CA0pAx3dmvEAxc2oXblMH+HZozJhzeJ4Dqgiaqm+zoYU3qt332Y92ck8GPsTsLKhnDfBU2474LG1IqwBGBMSedNIlgJVAVsrgDzF6t3HuL9GRuYtmoXlcqF8OCFTbn3/MZEhpf3d2jGGC95kwhqA2tFZDEnXyOw7qNBLC4xhfdmbODX1buJKF+Wx3o14+7zGlOtUjl/h2aMOU3eJIKXfB6FKTWWbzvA+zMSmLF2D5XDyvJE7xbcdV4jqlQI9XdoxphC8ubO4t+LIxBTsi3dup93pycwe/1eqlYM5R+XtuSObg2JCLMEYExpl28iEJE/VPV8ETnMyTOLCaCqWtnn0Rm/W7gpmfdmbGBuQjKRlcoxuG8rbuvakPDyvpzczhhTnAr6b64EoKo2+EuQyc5W5m7cx7AZCSzcvJ8a4eV5/orW3NolmorlLAEYE2gK+q+2uYGDSFa2smTLfqat2sW0VUnsPpRG7crleemqNvTvHE1YaIi/QzTG+EhBiaCWiDyZ30pVfcsH8ZhilJWtLNq8n2mrkpi2ahd7D6dRvmwZerasyeXt63Jp2zqWAIwJAgUlghCceYqlgDKmlMnMymbR5v1MXZXET6t2s+9IGmGhZbioZS0ub1+XXq1qUcna/40JKgX9xyep6ivFFonxmcysbBZs2s+UuCR+id9F8tF0KoSG0KuVc/C/qFVNa/s3JogV9N9vZwKlWEZWNvM3JjM1Lomf43dxIDWDiuWcg/8V7evSs2UtKpSzZh9jTMGJ4OJii8IUifTMbOZt3MfUuCR+Wb2bg6kZVCoXQu82tenbri49W9a0Nn9jzF/kmwhUdX9xBmIKJz0zm7kJ+5gSl8Svq3eTciyDiPJl3YN/HXq0sIO/MaZg1jBcCqVlZjFn/T6mrnIO/oePZxIRVpY+bWpzRfu6nN+8BuXL2sHfGOMdnyYCEbkMeBenB9JIVX0tn3LnAguAfqo63pcxlVbHM7KYvX4v01bt4rfVuzmclknlsLJc2rYOV7SvS/dmkXbwN8YUis8SgYiEAB8AfYBEYLGITFbV1XmUex342VexlFbHM7KYtW4v01YlMX3NHo6kZVK1Yih929fh8vZ16d60BuXKlvF3mMaYUs6XZwSdgQRV3QQgIuOAa4DVuco9CkwAzvVhLKXGsfQsZq3bw5S4JGas3UNqehbVKoZyZYe6XN6+Lt2aRhIaYgd/Y0zR8WUiqA9s93idCHTxLCAi9XFmQOtFAYlARAYCAwGio6OLPFB/S03PZObavUx1D/7HMrKoXqkc13SqzxXt69K1SXXK2sHfGOMjvkwEed2HkHv8oneAZ1Q1SyT/2xZUdQQwAiAmJiZgxkDavO8o//l5LTPW7uF4RjY1wstx/dnOwb9zYzv4G2OKhy8TQSLQwON1FLAzV5kYYJybBGoAl4tIpqr+z4dxlQg/x+/iqW9XIgI3ndOAy92Df0gZu4/PGFO8fJkIFgPNRaQxsAO4BbjVs4CqNs55LiKjgR8DPQlkZmXz31/X89GsjXSIqsJHt51D/aoV/B2WMSaI+SwRqGqmiDyC0xsoBPhMVeNFZJC7friv3ruk2nckjce+Xs68jcn07xzNS1e1sZu9jDF+59P7CFR1KjA117I8E4Cq3uXLWPxt+bYDPDR2GfuPpvPGjR24OabBqTcyxphiYHcW+5iqMnbhNl7+IZ46VcKY8GB32tWv4u+wjDHmBEsEPnQsPYvn/hfH98t20LNlTd7p14mqFcv5OyxjjDmJJQIf2Zp8lEFfLmPtrkM83rs5j/VqThnrEWSMKYEsEfjAjLW7eXzcCkSEz+46l4ta1vJ3SMYYky9LBEUoK1t5d/oG3pu+gbb1KjP8tnNoUL2iv8MyxpgCWSIoIgeOpvO3b1Ywe/1ebjwniqHXtrOuocaYUsESQRGIS0xh0JdL2Xs4jf+7rj39OzegoCEzjDGmJLFEcIa+Xbyd5yetokalcnw3qBsdG1T1d0jGGHNaLBEU0vGMLF7+IZ6vF23n/GY1eK//WVSvZF1DjTGljyWCQkg8kMqDXy4jbkcKD1/UlCf7tLTB4owxpVbQJYKlWw/QMapKoYd4XrgpmQe+XEpWljLi9nO4pG2dIo7QGGOKV1ANeL81+Sg3fDSPz+dvLdT2M9ft4Y7PFhFZqRyTHz3fkoAxJiAEVSLYtPcoABOX7zjtbafGJTHw8yU0qxXOtw90o3GNSkUdnjHG+EVQJYLtB1IBiNuRQsKeI15vN35pIo98tYwOUVX56v6uRIaX91WIxhhT7IIrEexPJTREKCMwaYV3ZwWfz9/CU9+tpFvTSL64tzNVKoT6NkhjjClmQZYIjhFdvSLnNavB/1bsQLXg6Y8/nJXAi5Pi6dOmNp/eeS4VywXdtXVjTBAIrkRwIJUG1Stybaf6bN9/jGXbDuRZTlV546e1vPHTOq7pVI8PB5xtw0UYYwJWcCWC/ak0qFaRS9vVISy0DB/M3EhSyrGTymRnKy//sJoPZ22kf+do3rq5E6GF7GpqjDGlQdAc4VKOZXDoeCYNqlcgvHxZBvZoysx1ezj/9Zk8+OVS5m9MJjMrm6cnxDJ63hbuv6Ax/3ddO7tRzBgT8IKm0Xv7fqfHUINqzrDQT/ZpwU3nRPHlwq18s3g701btonqlcuw/ms7jvZvzt4ub28BxxpigEDSJINHtOuo5P0CD6hV5tm9rnujdgskrdzJ+SSJ9e9Xh7vMa+ytMY4wpdkGTCFrXrcxLV7WhUR43goWFhnBzTANujmngh8iMMca/giYRNIysZN/0jTEmD0FzsdgYY0zefJoIROQyEVknIgkiMjiP9QNEJNZ9zBORjr6MxxhjzF/5LBGISAjwAdAXaAP0F5E2uYptBi5U1Q7Av4ARvorHGGNM3nx5jaAzkKCqmwBEZBxwDbA6p4CqzvMovwCI8mE8/peeCrtXwc7lfz4OboMGnaFZH2jeB2q0AOu2aowpRr5MBPWB7R6vE4EuBZS/F5iW1woRGQgMBIiOji6q+HwrMy3XQX8F7FkDmuWsD68N9c6GhufB1rnwy3POo0o0NO/tJIbGPaB8uH/rYYwJeL5MBHl9rc1zlDcRuQgnEZyf13pVHYHbbBQTE1PwSHH+kJXhHORPHPSXwe7VkJ3hrK8YCfXOgpZ9nYN/vbOgct2T93FwGyT8Bht+g5XfwJLPIKQcRHdzzhSaX2JnC8YYn/BlIkgEPDvmRwE7cxcSkQ7ASKCvqib7MJ6ioQp718KOZX8e+HfFQVaas758FajXCbo/4hzw650FVRqc+gBeNRpi7nEememwbT5s+MVJDr887zyqREOzi53E0PhCO1swxhQJOdVQzIXesUhZYD1wMbADWAzcqqrxHmWigRnAHbmuF+QrJiZGlyxZ4oOIvbB3PUx5ErbMcV6XC4e6nZwDf85Bv3qTov/WfnA7JPzqnC1s/h3Sj0CZUGjY3UkKzfpAzZZ2tmCMyZeILFXVmDzX+SoRuG98OfAOEAJ8pqqvisggAFUdLiIjgRuAnEmEM/MLNIdfEkHGMZjzX/jjHShXES58Bpr1hsjmUKaYb8XIOVvISQx71zjLqzRwYrKzBWNMHvyWCHyh2BPBht9g6t/hwBbo0A8uGQrhtYrv/U/l4Han+SjhN9g0y+NsodufPZFqtrKzBWOCnCWCwji0E34aDKsnOd/8r/gvNLnQ9+97JjLTYfsC2PCrkxj2uD11qzRwri006+PUoXyEf+M0xhQ7SwSnIysTFn8CM4ZCdib0eAq6PwZlS+GE9SmJbk+kX2HT75B+2DlbiO7657WFWq3tbMGYIGCJwFuJS+HHvzm9gJr1hsv/41z8DQSZ6bB94Z89kXLOFipH/dkTqUlPO1soaVRBs//8icdr8lqnBazLbztOsc/c6/AyFs91yl/jzC5EHfLbDi/2mZ1PHbzZDi/26fn6dD+jvPafx3btboBz7izUn1JBiSBoRh89pfiJMOF+qFQDbhoDba4JrG/KZctB4wucxyX/OvlsYdX3sGwMlCnr3LfQrDc07QUVqjp/gNlZ7h+i5/Ms97k6z0+s83yuHuWyc63Lb3/ZRfxeeb3vqfaXnUdMp9pfdsEHiMIcRE3xkjKAOD9FTn5+0joKWJd7u5zXeZQ78Tr38/zWlXFaKXxRdTsjAJaOgR8fhwZdoP845wAYTHLOFnJ6Iu2JP/U2/iYhzj9GGfenhDg9uHKee7UuxPlHO6lczvMyucqVOXmd5zY5rz3/cQv6Zz7xmtM4QLgHoFPuU3Lt39tYPA5CXsVyioNckRxEc9XhtA++3m6Xs01gszOCgsx737lZq1kfuPlzp3tosPE8W+jzCqTscIa9yEzLdSD0OJj+5UB4ugfgMt6vy+u9jDFFJngTgapzQXjOm9D2OrhuhHNANFClPnS42d9RGGOKSfAmgl+eh/nD4Ow74Mp33FN7Y4wJPsF5jr3wYycJdB4IV71nScAYE9SCLxGs/8W5Uazl5XDZa0FxkcgYYwoSXIlg63wYfzfUbgfXf2JnAsYYQzAlgo0z4YvrIKIu3PqNDcpmjDGu4EkEVaKcYZvvngaV6/k7GmOMKTGCp9dQjeZw+/f+jsIYY0qc4DkjMMYYkydLBMYYE+QsERhjTJCzRGCMMUHOEoExxgQ5SwTGGBPkLBEYY0yQs0RgjDFBrtTNUCYie4Gthdi0BrCviMMpyay+gSuY6gpW36LSUFVr5rWi1CWCwhKRJflN0xaIrL6BK5jqClbf4mBNQ8YYE+QsERhjTJALpkQwwt8BFDOrb+AKprqC1dfnguYagTHGmLwF0xmBMcaYPFgiMMaYIBcUiUBELhORdSKSICKD/R3PmRKRz0Rkj4is8lhWXUR+FZEN7s9qHuuedeu+TkQu9U/UhSciDURkpoisEZF4Efmbuzzg6iwiYSKySERWunV92V0ecHX1JCIhIrJcRH50XwdsfUVki4jEicgKEVniLvNvfVU1oB9ACLARaAKUA1YCbfwd1xnWqQdwNrDKY9kbwGD3+WDgdfd5G7fO5YHG7mcR4u86nGZ96wJnu88jgPVuvQKuzoAA4e7zUGAh0DUQ65qr3k8CXwE/uq8Dtr7AFqBGrmV+rW8wnBF0BhJUdZOqpgPjgGv8HNMZUdXZwP5ci68BxrjPxwDXeiwfp6ppqroZSMD5TEoNVU1S1WXu88PAGqA+AVhndRxxX4a6DyUA65pDRKKAK4CRHosDtr758Gt9gyER1Ae2e7xOdJcFmtqqmgTOgROo5S4PqPqLSCPgLJxvygFZZ7eZZAWwB/hVVQO2rq53gKeBbI9lgVxfBX4RkaUiMtBd5tf6BsPk9ZLHsmDqMxsw9ReRcGAC8LiqHhLJq2pO0TyWlZo6q2oW0ElEqgITRaRdAcVLdV1F5Epgj6ouFZGe3mySx7JSU1/Xeaq6U0RqAb+KyNoCyhZLfYPhjCARaODxOgrY6adYfGm3iNQFcH/ucZcHRP1FJBQnCYxV1e/dxQFdZ1U9CMwCLiNw63oecLWIbMFptu0lIl8SuPVFVXe6P/cAE3Gaevxa32BIBIuB5iLSWETKAbcAk/0cky9MBu50n98JTPJYfouIlBeRxkBzYJEf4is0cb76fwqsUdW3PFYFXJ1FpKZ7JoCIVAB6A2sJwLoCqOqzqhqlqo1w/jdnqOptBGh9RaSSiETkPAcuAVbh7/r6+wp6MV2lvxynp8lG4Dl/x1ME9fkaSAIycL4x3AtEAtOBDe7P6h7ln3Prvg7o6+/4C1Hf83FOh2OBFe7j8kCsM9ABWO7WdRXwors84OqaR9178mevoYCsL07vxZXuIz7neOTv+toQE8YYE+SCoWnIGGNMASwRGGNMkLNEYIwxQc4SgTHGBDlLBMYYE+QsEZigIyJH3J+NROTWIt73P3O9nleU+zfGFywRmGDWCDitRCAiIacoclIiUNXupxmTMcXOEoEJZq8BF7jjwj/hDvb2HxFZLCKxIvIAgIj0dOdD+AqIc5f9zx00LD5n4DAReQ2o4O5vrLss5+xD3H2vcsei7+ex71kiMl5E1orIWPdOakTkNRFZ7cbyZrF/OiZoBMOgc8bkZzDwlKpeCeAe0FNU9VwRKQ/MFZFf3LKdgXbqDAUMcI+q7neHgVgsIhNUdbCIPKKqnfJ4r+uBTkBHoIa7zWx33VlAW5wxZOYC54nIauA6oJWqas6wE8b4gp0RGPOnS4A73CGgF+Lc9t/cXbfIIwkAPCYiK4EFOIOCNadg5wNfq2qWqu4GfgfO9dh3oqpm4wyf0Qg4BBwHRorI9UDqGdfOmHxYIjDmTwI8qqqd3EdjVc05Izh6opAzXHJvoJuqdsQZGyjMi33nJ83jeRZQVlUzcc5CJuBMUvLTadXEmNNgicAEs8M4U1/m+Bl40B3yGhFp4Y4QmVsV4ICqpopIK5ypJHNk5Gyfy2ygn3sdoibOdKP5jiLpzr1QRVWnAo/jNCsZ4xN2jcAEs1gg023iGQ28i9Mss8y9YLuXP6cM9PQTMEhEYnFGhFzgsW4EECsiy1R1gMfyiUA3nFEnFXhaVXe5iSQvEcAkEQnDOZt4onBVNObUbPRRY4wJctY0ZIwxQc4SgTHGBDlLBMYYE+QsERhjTJCzRGCMMUHOEoExxgQ5SwTGGBPk/h9nLDhdydQeJwAAAABJRU5ErkJggg==\n", | |
| "text/plain": [ | |
| "<Figure size 432x288 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "needs_background": "light" | |
| }, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "runs=10\n", | |
| "compute=True\n", | |
| "times = performance_comparison(ds.isel(lon=2,lat=2).compute(), runs=runs, compute=compute)\n", | |
| "plot_perf(times, runs=runs, compute=compute)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "I propose to have:\n", | |
| " \n", | |
| "- `resample_iterations_idx` for small data (1D, maybe 2D) (encouraging eager=non-lazy) \n", | |
| "- `resample_iterations_idx` for larger data (3D, size > 5MB (to be discussed))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python [conda env:climpred-dev]", | |
| "language": "python", | |
| "name": "conda-env-climpred-dev-py" | |
| }, | |
| "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.6.10" | |
| }, | |
| "varInspector": { | |
| "cols": { | |
| "lenName": 16, | |
| "lenType": 16, | |
| "lenVar": 40 | |
| }, | |
| "kernels_config": { | |
| "python": { | |
| "delete_cmd_postfix": "", | |
| "delete_cmd_prefix": "del ", | |
| "library": "var_list.py", | |
| "varRefreshCmd": "print(var_dic_list())" | |
| }, | |
| "r": { | |
| "delete_cmd_postfix": ") ", | |
| "delete_cmd_prefix": "rm(", | |
| "library": "var_list.r", | |
| "varRefreshCmd": "cat(var_dic_list()) " | |
| } | |
| }, | |
| "types_to_exclude": [ | |
| "module", | |
| "function", | |
| "builtin_function_or_method", | |
| "instance", | |
| "_Feature" | |
| ], | |
| "window_display": false | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 4 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment