From 45376b4747b72a4eaea2879604f610637ad2318d Mon Sep 17 00:00:00 2001 From: kayibal Date: Mon, 17 Apr 2017 16:34:14 +0200 Subject: [PATCH 01/76] add groupby_agg method --- sparsity/sparse_frame.py | 49 +++++++++++++++++++++--------- sparsity/test/test_sparse_frame.py | 29 +++++++++++++++--- 2 files changed, 59 insertions(+), 19 deletions(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index d9479e9..5612e7d 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -146,9 +146,6 @@ def sum(self, *args, **kwargs): def mean(self, *args, **kwargs): return self.data.mean(*args, **kwargs) - def std(self, *args, **kwargs): - return self.data.std(*args, **kwargs) - def max(self, *args, **kwargs): return self.data.max(*args, **kwargs) @@ -196,9 +193,19 @@ def data(self): def groupby(self, by=None, level=0): return self.groupby_sum(by, level) + def groupby_agg(self, by=None, level=None, agg_func=None): + by = self._get_groupby_col(by, level) + groups = pd.Index(np.arange(self.shape[0])).groupby(by) + res = sparse.csr_matrix((len(groups), self.shape[1])) + new_idx = [] + for i, (name, indizes) in enumerate(groups.items()): + new_idx.append(self.index.values[indizes[0]]) + res[i] = agg_func(self.data[indizes.values,:]) + return SparseFrame(res, index=new_idx) + def groupby_sum(self, by=None, level=0): """ - Sparse groupby sum aggregation. + Optimized sparse groupby sum aggregation. Simple operation using sparse matrix multiplication. Expects result to be sparse aswell. @@ -212,23 +219,37 @@ def groupby_sum(self, by=None, level=0): Returns ------- - df: sparcity.SparseFrame + df: sparsity.SparseFrame Grouped by and summed SparseFrame. """ - if by is not None and by is not "index": - assert len(by) == self.data.shape[0] - by = np.array(by) + by = self._get_groupby_col(by, level) + group_idx = by.argsort() + gm = _create_group_matrix(by[group_idx]) + grouped_data = self._data[group_idx, :].T.dot(gm).T + return SparseFrame(grouped_data, index=np.unique(by), columns=self._columns) + + + def _get_groupby_col(self, by, level): + if by is None and level is None: + raise ValueError("You have to supply one of 'by' and 'level'") + if by is not None: + try: + if by in self._columns: + by = self[by].toarray() + except TypeError: + assert len(by) == self.data.shape[0] + by = np.array(by) else: if level and isinstance(self._index, pd.MultiIndex): by = self.index.get_level_values(level).values - elif level: - raise ValueError("Connot use level in a non MultiIndex Frame") + elif level == 0: + by = np.asarray(self._index) + elif level > 0: + raise ValueError( + "Connot use level > 0 in a non MultiIndex Frame") else: by = self.index.values - group_idx = by.argsort() - gm = _create_group_matrix(by[group_idx]) - grouped_data = self._data[group_idx, :].T.dot(gm).T - return SparseFrame(grouped_data, index=np.unique(by), columns=self._columns) + return by def join(self, other, axis=1, how='outer', level=None): """ diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 8e196cc..65499d7 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -30,6 +30,14 @@ def gendata(n): return gendata +@pytest.fixture() +def groupby_frame(): + shuffle_idx = np.random.permutation(np.arange(100)) + index = np.tile(np.arange(10), 10) + data = np.vstack([np.identity(10) for _ in range(10)]) + t = SparseFrame(data[shuffle_idx, :], index=index[shuffle_idx]) + return t + @pytest.fixture() def sf_midx(): @@ -47,11 +55,8 @@ def test_empty_init(): assert sf.data.shape == (0, 2) -def test_groupby(): - shuffle_idx = np.random.permutation(np.arange(100)) - index = np.tile(np.arange(10), 10) - data = np.vstack([np.identity(10) for _ in range(10)]) - t = SparseFrame(data[shuffle_idx, :], index=index[shuffle_idx]) +def test_groupby(groupby_frame): + t = groupby_frame res = t.groupby_sum().data.todense() assert np.all(res == (np.identity(10) * 10)) @@ -523,6 +528,20 @@ def test_repr(): assert isinstance(res, str) +def test_groupby_agg(groupby_frame): + res = groupby_frame.groupby_agg( + level=0, + agg_func=lambda x: x.sum(axis=0) + ).data.todense() + assert np.all(res == (np.identity(10) * 10)) + + res = groupby_frame.groupby_agg( + level=0, + agg_func=lambda x: x.mean(axis=0) + ).data.todense() + assert np.all(res.round() == np.identity(10)) + + def test_init_with_pandas(): df = pd.DataFrame(np.identity(5), index=[ From 4c3eec2d9b55feb3926be45ebb4faf4855d35950 Mon Sep 17 00:00:00 2001 From: kayibal Date: Mon, 17 Apr 2017 16:35:15 +0200 Subject: [PATCH 02/76] read version from a single location --- setup.py | 8 +++++++- sparsity/VERSION | 1 + sparsity/__init__.py | 4 ++++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 sparsity/VERSION diff --git a/setup.py b/setup.py index be9ee18..613488d 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,4 @@ +import os from distutils.core import setup, Extension from setuptools import find_packages @@ -15,9 +16,14 @@ ext_modules = cythonize([ext]) except (ImportError, OSError): ext_modules = None + +root = os.path.dirname(__file__) +VERSION = open(os.path.join(root, 'sparsity', 'VERSION'))\ + .read().strip() + setup( name='sparsity', - version='0.5.1', + version=VERSION, ext_modules = ext_modules, author='Alan Hoeng', author_email='alan.f.hoeng@gmail.com', diff --git a/sparsity/VERSION b/sparsity/VERSION new file mode 100644 index 0000000..09a3acf --- /dev/null +++ b/sparsity/VERSION @@ -0,0 +1 @@ +0.6.0 \ No newline at end of file diff --git a/sparsity/__init__.py b/sparsity/__init__.py index 7983873..08f7066 100644 --- a/sparsity/__init__.py +++ b/sparsity/__init__.py @@ -1 +1,5 @@ +import os + from sparsity.sparse_frame import SparseFrame, sparse_one_hot +root = os.path.dirname(__file__) +__version__ = open(os.path.join(root, 'VERSION')).read().strip() \ No newline at end of file From eb745aa158afef8e47fab331cc91f9bc7a1582d8 Mon Sep 17 00:00:00 2001 From: kayibal Date: Tue, 18 Apr 2017 11:28:13 +0200 Subject: [PATCH 03/76] Add package_data to include VERSION file in distribution --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 613488d..057a6e1 100644 --- a/setup.py +++ b/setup.py @@ -28,6 +28,7 @@ author='Alan Hoeng', author_email='alan.f.hoeng@gmail.com', packages=find_packages(), + package_data={'sparsity': 'VERSION'}, install_requires=[ 'pandas>=0.19.2', 'scipy>=0.18.1', From e33905249ff0703edffb9d50697d0c63e825bd97 Mon Sep 17 00:00:00 2001 From: kayibal Date: Tue, 18 Apr 2017 11:32:07 +0200 Subject: [PATCH 04/76] Fix package data values must be iterables --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 057a6e1..8aea8de 100644 --- a/setup.py +++ b/setup.py @@ -28,7 +28,7 @@ author='Alan Hoeng', author_email='alan.f.hoeng@gmail.com', packages=find_packages(), - package_data={'sparsity': 'VERSION'}, + package_data={'sparsity': ['VERSION']}, install_requires=[ 'pandas>=0.19.2', 'scipy>=0.18.1', From 60e83d8f56ae56694e5dbbdec6517580282336aa Mon Sep 17 00:00:00 2001 From: kayibal Date: Tue, 18 Apr 2017 12:15:27 +0200 Subject: [PATCH 05/76] Add installtion test to sparsity --- circle.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/circle.yml b/circle.yml index c86a9a2..6406013 100644 --- a/circle.yml +++ b/circle.yml @@ -14,7 +14,8 @@ dependencies: - pip install dask[dataframe] test: override: - - pip install -e . + - pip install git+https://github.com/datarevenue-berlin/sparsity.git + - python -c 'import sparsity' - py.test --cov sparsity --cov-report xml sparsity/test post: - bash <(curl -s https://codecov.io/bash) \ No newline at end of file From 3f54e0dfdf15717a79623ff4124fe6c19b6803a4 Mon Sep 17 00:00:00 2001 From: Talmaj Marinc Date: Fri, 21 Apr 2017 18:33:41 +0200 Subject: [PATCH 06/76] Added test_assign_column for dask.SparsedFrame --- sparsity/test/test_dask_sparse_frame.py | 27 +++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index 4487307..01e1457 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -1,17 +1,16 @@ +import os import shutil import tempfile -import os from contextlib import contextmanager import dask +import dask.dataframe as dd +import numpy as np +import pandas as pd import pytest import sparsity as sp import sparsity.dask as dsp -import pandas as pd -import numpy as np -import dask.dataframe as dd - from sparsity.dask.reshape import one_hot_encode dask.context.set_options(get=dask.async.get_sync) @@ -28,6 +27,10 @@ def tmpdir(dir=None): shutil.rmtree(dirname, ignore_errors=True) +@pytest.fixture +def dsf(): + return dsp.from_pandas(pd.DataFrame(np.random.rand(10,2)), + npartitions=3) def test_from_pandas(): dsf = dsp.from_pandas(pd.DataFrame(np.random.rand(10,2)), @@ -95,4 +98,16 @@ def test_read_npz(): dsf = dsp.read_npz(os.path.join(tmp, '*.npz')) sf = dsf.compute() - assert np.all(sf.data.toarray() == np.identity(100)) \ No newline at end of file + assert np.all(sf.data.toarray() == np.identity(100)) + + +def test_assign_column(): + s = pd.Series(np.arange(10)) + ds = dd.from_pandas(s, npartitions=2) + + f = pd.DataFrame(np.random.rand(10, 2), columns=['a', 'b']) + dsf = dsp.from_pandas(f, npartitions=2) + + dsf = dsf.assign(new=ds) + sf = dsf.compute() + assert np.all(sf.todense() == f.assign(new=s)) \ No newline at end of file From 176228beefde651f0134b2f3b93ff99cc34f2125 Mon Sep 17 00:00:00 2001 From: Talmaj Marinc Date: Fri, 21 Apr 2017 18:37:49 +0200 Subject: [PATCH 07/76] Added working assign column for dask.SparseFrame --- sparsity/dask/core.py | 99 ++++++++++++++++++++++++++++++++++++++++-- sparsity/dask/multi.py | 80 ++++++++++++++++++++++++++++++++++ 2 files changed, 175 insertions(+), 4 deletions(-) create mode 100644 sparsity/dask/multi.py diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index 617e5df..036506e 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -1,13 +1,19 @@ -from scipy import sparse - import dask +import dask.dataframe as dd +import numpy as np import pandas as pd from dask import threaded from dask.base import normalize_token, tokenize -from dask.dataframe.utils import make_meta as dd_make_meta, _nonempty_index +from dask.dataframe import methods +from dask.dataframe.core import (Scalar, Series, _emulate, _extract_meta, + _Frame, _maybe_from_pandas, apply, funcname, + no_default, partial, partial_by_order) +from dask.dataframe.utils import make_meta as dd_make_meta +from dask.dataframe.utils import _nonempty_index from dask.delayed import Delayed from dask.optimize import cull -from toolz import merge +from scipy import sparse +from toolz import merge, remove import sparsity as sp from sparsity.dask.indexing import _LocIndexer @@ -71,6 +77,18 @@ def map_partitions(self, func, meta, *args, **kwargs): def to_delayed(self): return [Delayed(k, self.dask) for k in self._keys()] + def assign(self, **kwargs): + for k, v in kwargs.items(): + if not (isinstance(v, (Series, Scalar, pd.Series)) or + np.isscalar(v)): + raise TypeError("Column assignment doesn't support type " + "{0}".format(type(v).__name__)) + pairs = list(sum(kwargs.items(), ())) + + # Figure out columns of the output + df2 = self._meta.assign(**_extract_meta(kwargs)) + return elemwise(methods.assign, self, *pairs, meta=df2) + def _keys(self): return [(self._name, i) for i in range(self.npartitions)] @@ -110,6 +128,79 @@ def __repr__(self): ) +def is_broadcastable(dfs, s): + """ + This Series is broadcastable against another dataframe in the sequence + """ + return (isinstance(s, Series) and + s.npartitions == 1 and + s.known_divisions and + any(s.divisions == (min(df.columns), max(df.columns)) + for df in dfs if isinstance(df, (SparseFrame, dd.DataFrame)))) + + +def elemwise(op, *args, **kwargs): + """ Elementwise operation for dask.Sparseframes + + Parameters + ---------- + op: function + Function that takes as first parameter the underlying df + args: + Contains Dataframes + kwargs: + Contains meta. + """ + meta = kwargs.pop('meta', no_default) + + _name = funcname(op) + '-' + tokenize(op, kwargs, *args) + + # if pd.Series or pd.DataFrame change to dd.DataFrame + args = _maybe_from_pandas(args) + + # Align DataFrame blocks if divisions are different. + from .multi import _maybe_align_partitions # to avoid cyclical import + args = _maybe_align_partitions(args) + + # extract all dask instances + dasks = [arg for arg in args if isinstance(arg, (SparseFrame, _Frame, + Scalar))] + # extract all dask frames + dfs = [df for df in dasks if isinstance(df, (_Frame, SparseFrame))] + + # We take divisions from the first dask frame + divisions = dfs[0].divisions + + _is_broadcastable = partial(is_broadcastable, dfs) + dfs = list(remove(_is_broadcastable, dfs)) + n = len(divisions) - 1 + + other = [(i, arg) for i, arg in enumerate(args) + if not isinstance(arg, (_Frame, Scalar, SparseFrame))] + + # Get dsks graph tuple keys and adjust the key length of Scalar + keys = [d._keys() * n if isinstance(d, Scalar) or _is_broadcastable(d) + else d._keys() for d in dasks] + + if other: + dsk = {(_name, i): + (apply, partial_by_order, list(frs), + {'function': op, 'other': other}) + for i, frs in enumerate(zip(*keys))} + else: + dsk = {(_name, i): (op,) + frs for i, frs in enumerate(zip(*keys))} + dsk = merge(dsk, *[d.dask for d in dasks]) + + if meta is no_default: + if len(dfs) >= 2 and len(dasks) != len(dfs): + # should not occur in current funcs + msg = 'elemwise with 2 or more DataFrames and Scalar is not supported' + raise NotImplementedError(msg) + meta = _emulate(op, *args, **kwargs) + + return SparseFrame(dsk, _name, meta, divisions) + + def map_partitions(func, ddf, meta, **kwargs): dsk = {} name = func.__name__ diff --git a/sparsity/dask/multi.py b/sparsity/dask/multi.py new file mode 100644 index 0000000..fde6e04 --- /dev/null +++ b/sparsity/dask/multi.py @@ -0,0 +1,80 @@ +from sparsity.dask.core import SparseFrame +from functools import partial +from dask.dataframe.core import is_broadcastable, _Frame +from toolz import unique, merge_sorted + + +def align_partitions(*dfs): + """ Mutually partition and align DataFrame blocks + + This serves as precursor to multi-dataframe operations like join, concat, + or merge. + + Parameters + ---------- + dfs: sequence of dd.DataFrame, dd.Series and dd.base.Scalar + Sequence of dataframes to be aligned on their index + + Returns + ------- + dfs: sequence of dd.DataFrame, dd.Series and dd.base.Scalar + These must have consistent divisions with each other + divisions: tuple + Full divisions sequence of the entire result + result: list + A list of lists of keys that show which data exist on which + divisions + """ + _is_broadcastable = partial(is_broadcastable, dfs) + dfs1 = [df for df in dfs + if isinstance(df, (_Frame, SparseFrame)) and + not _is_broadcastable(df)] + if len(dfs) == 0: + raise ValueError("dfs contains no DataFrame and Series") + if not all(df.known_divisions for df in dfs1): + raise ValueError("Not all divisions are known, can't align " + "partitions. Please use `set_index` or " + "`set_partition` to set the index.") + + divisions = list(unique(merge_sorted(*[df.divisions for df in dfs1]))) + dfs2 = [df.repartition(divisions, force=True) + if isinstance(df, (_Frame, SparseFrame)) else df for df in dfs] + + result = list() + inds = [0 for df in dfs] + for d in divisions[:-1]: + L = list() + for i, df in enumerate(dfs2): + if isinstance(df, (_Frame, SparseFrame)): + j = inds[i] + divs = df.divisions + if j < len(divs) - 1 and divs[j] == d: + L.append((df._name, inds[i])) + inds[i] += 1 + else: + L.append(None) + else: # Scalar has no divisions + L.append(None) + result.append(L) + return dfs2, tuple(divisions), result + + +def _maybe_align_partitions(args): + """Align DataFrame blocks if divisions are different. + + Note that if all divisions are unknown, but have equal npartitions, then + they will be passed through unchanged. This is different than + `align_partitions`, which will fail if divisions aren't all known""" + _is_broadcastable = partial(is_broadcastable, args) + dfs = [df for df in args + if isinstance(df, (_Frame, SparseFrame)) and + not _is_broadcastable(df)] + if not dfs: + return args + + divisions = dfs[0].divisions + if not all(df.divisions == divisions for df in dfs): + dfs2 = iter(align_partitions(*dfs)[0]) + return [a if not isinstance(a, (_Frame, SparseFrame)) + else next(dfs2) for a in args] + return args \ No newline at end of file From 1da4035654a3a72c7a1b814f31ab64ff258f4195 Mon Sep 17 00:00:00 2001 From: kayibal Date: Mon, 24 Apr 2017 11:39:30 +0200 Subject: [PATCH 08/76] Increase version number: distributed assign support --- sparsity/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sparsity/VERSION b/sparsity/VERSION index 09a3acf..bcaffe1 100644 --- a/sparsity/VERSION +++ b/sparsity/VERSION @@ -1 +1 @@ -0.6.0 \ No newline at end of file +0.7.0 \ No newline at end of file From f4602d0172f5ce562e06febd2c8c32545234319e Mon Sep 17 00:00:00 2001 From: Talmaj Marinc Date: Mon, 24 Apr 2017 21:39:53 +0200 Subject: [PATCH 09/76] Added property columns and index to dask.SparseFrame --- sparsity/dask/core.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index 036506e..74fa235 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -71,6 +71,14 @@ def npartitions(self): def _meta_nonempty(self): return _meta_nonempty(self._meta) + @property + def columns(self): + return self._meta.columns + + @property + def index(self): + return self._meta.index + def map_partitions(self, func, meta, *args, **kwargs): return map_partitions(func, self, meta, *args, **kwargs) From 9e33ab37e39fdeb9cf64330cace2b25688b9441e Mon Sep 17 00:00:00 2001 From: Talmaj Marinc Date: Tue, 25 Apr 2017 14:03:38 +0200 Subject: [PATCH 10/76] Increase version, add *.egg-info to .gitignore --- .gitignore | 1 + sparsity/VERSION | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ed66943..da4c630 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ build/ *.so traildb_sparse.c __pycache__ +*.egg-info diff --git a/sparsity/VERSION b/sparsity/VERSION index bcaffe1..8adc70f 100644 --- a/sparsity/VERSION +++ b/sparsity/VERSION @@ -1 +1 @@ -0.7.0 \ No newline at end of file +0.8.0 \ No newline at end of file From c77643675535995c83f710b7d084091232dc6374 Mon Sep 17 00:00:00 2001 From: Talmaj Marinc Date: Tue, 25 Apr 2017 18:12:55 +0200 Subject: [PATCH 11/76] Add multiply method to SparseFrame and its test. --- sparsity/sparse_frame.py | 11 +++++++++++ sparsity/test/test_sparse_frame.py | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 5612e7d..1c8b2cd 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -156,6 +156,17 @@ def copy(self, *args, **kwargs): return SparseFrame(self.data.copy(*args, **kwargs), self.index.copy(*args, **kwargs), self.columns.copy(*args, **kwargs)) + + def multiply(self, other): + """ + To multiply row-wise 'other' should be of shape: (self.shape[0], 1) + To multiply col-wise 'other should be of shape: (1, self.shape[1]) + """ + data = self.data.multiply(other) + assert data.shape == self.data.shape, \ + "Data shapes miss-match: {}, {}".format(data.shape,self.data.shape) + return SparseFrame(data, self.index, self.columns) + def nnz(self): return self.data.nnz diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 65499d7..9761e21 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -563,3 +563,22 @@ def test_init_with_pandas(): df['A'] = 'bla' with pytest.raises(TypeError): sf = SparseFrame(df) + + +def test_multiply(): + sf = SparseFrame(np.ones(5)) + other = np.arange(5) + with pytest.raises(AssertionError): + sf.multiply(other) + + sf = SparseFrame(np.ones((5, 5))) + + other = other.reshape(5, 1) + res = sf.multiply(other) + assert np.all(res.sum(axis=1) == 5 * other), "Row wise " \ + "multiplication failed" + + other = other.reshape(1, 5) + res = sf.multiply(other) + assert np.all(res.sum(axis=0) == 5 * other), "Col wise " \ + "multiplication failed" \ No newline at end of file From 98007fd6d3fbcf8ecc4ed5dc1201a1843951a51e Mon Sep 17 00:00:00 2001 From: Talmaj Marinc Date: Thu, 27 Apr 2017 16:29:46 +0200 Subject: [PATCH 12/76] Fixed ci on a branch. --- circle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circle.yml b/circle.yml index 6406013..c20fc0c 100644 --- a/circle.yml +++ b/circle.yml @@ -14,7 +14,7 @@ dependencies: - pip install dask[dataframe] test: override: - - pip install git+https://github.com/datarevenue-berlin/sparsity.git + - pip install . - python -c 'import sparsity' - py.test --cov sparsity --cov-report xml sparsity/test post: From 77ceb6b9e0457c4f42a8c6d76b3de9c8bcfa7774 Mon Sep 17 00:00:00 2001 From: Talmaj Marinc Date: Thu, 27 Apr 2017 17:06:53 +0200 Subject: [PATCH 13/76] Change toarray() for 1 dimensional SparseFrames, add tests for multiply method for various data types --- sparsity/sparse_frame.py | 7 +++-- sparsity/test/test_sparse_frame.py | 44 ++++++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 1c8b2cd..2a528d5 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -108,9 +108,10 @@ def todense(self, pandas=True): else: dense = np.empty(shape=(0, len(self.columns))) - if self.shape[0] == 1 or self.shape[1] == 1: - dense = dense.reshape(-1) - if pandas == True: + if pandas: + if self.shape[0] == 1 or self.shape[1] == 1: + dense = dense.reshape(-1) + if self.empty: dense = pd.DataFrame([], columns=self.columns, index=self._index[:0]) diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 9761e21..5ead341 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -137,7 +137,7 @@ def test__array___(): assert isinstance(res, np.ndarray) res = np.asarray(sf['A']) - assert len(res.shape) == 1 + assert res.shape[1] == 1 def test_iloc(): @@ -565,20 +565,52 @@ def test_init_with_pandas(): sf = SparseFrame(df) -def test_multiply(): +def test_multiply_assertion(): sf = SparseFrame(np.ones(5)) other = np.arange(5) with pytest.raises(AssertionError): sf.multiply(other) + +def test_multiply_rowwise(): + # Row wise multiplication with different types sf = SparseFrame(np.ones((5, 5))) + other = np.arange(5) + msg = "Row wise multiplication failed" + # nd.array other = other.reshape(5, 1) res = sf.multiply(other) - assert np.all(res.sum(axis=1) == 5 * other), "Row wise " \ - "multiplication failed" + assert np.all(res.sum(axis=1) == 5 * other), msg + + # SparseFrame + _other = SparseFrame(other) + res = sf.multiply(_other) + assert np.all(res.sum(axis=1) == 5 * other), msg + + # csr_matrix + _other = _other.data + res = sf.multiply(_other) + assert np.all(res.sum(axis=1) == 5 * other), msg + +def test_multiply_colwise(): + # Column wise multiplication with different types + sf = SparseFrame(np.ones((5, 5))) + other = np.arange(5) + msg = "Column wise multiplication failed" + + # nd.array other = other.reshape(1, 5) res = sf.multiply(other) - assert np.all(res.sum(axis=0) == 5 * other), "Col wise " \ - "multiplication failed" \ No newline at end of file + assert np.all(res.sum(axis=0) == 5 * other), msg + + # SparseFrame + _other = SparseFrame(other) + res = sf.multiply(_other) + assert np.all(res.sum(axis=0) == 5 * other), msg + + # csr_matrix + _other = _other.data + res = sf.multiply(_other) + assert np.all(res.sum(axis=0) == 5 * other), msg \ No newline at end of file From 9b4740bd6228f61ed9bb0a89c769e31b08154b0a Mon Sep 17 00:00:00 2001 From: Talmaj Marinc Date: Tue, 2 May 2017 19:24:16 +0200 Subject: [PATCH 14/76] Change back to_array functionality and mimic pd.DataFrame.multiply method. --- sparsity/sparse_frame.py | 20 ++++++++++++---- sparsity/test/test_sparse_frame.py | 38 +++++++++++++----------------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 2a528d5..dc89841 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -108,10 +108,10 @@ def todense(self, pandas=True): else: dense = np.empty(shape=(0, len(self.columns))) - if pandas: - if self.shape[0] == 1 or self.shape[1] == 1: - dense = dense.reshape(-1) + if self.shape[0] == 1 or self.shape[1] == 1: + dense = dense.reshape(-1) + if pandas: if self.empty: dense = pd.DataFrame([], columns=self.columns, index=self._index[:0]) @@ -158,11 +158,21 @@ def copy(self, *args, **kwargs): self.index.copy(*args, **kwargs), self.columns.copy(*args, **kwargs)) - def multiply(self, other): + def multiply(self, other, axis='columns'): """ To multiply row-wise 'other' should be of shape: (self.shape[0], 1) To multiply col-wise 'other should be of shape: (1, self.shape[1]) """ + try: + other = other.toarray() + except AttributeError: + pass + + if axis in [0, 'index']: + other = np.asarray(other).reshape(1, -1) + else: + other = np.asarray(other).reshape(-1, 1) + data = self.data.multiply(other) assert data.shape == self.data.shape, \ "Data shapes miss-match: {}, {}".format(data.shape,self.data.shape) @@ -284,7 +294,7 @@ def join(self, other, axis=1, how='outer', level=None): """ if isinstance(self._index, pd.MultiIndex)\ or isinstance(other._index, pd.MultiIndex): - raise NotImplementedError() + raise NotImplementedError('MultiIndex not supported.') if not isinstance(other, SparseFrame): other = SparseFrame(other) if axis not in set([0, 1]): diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 5ead341..d86a211 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -137,7 +137,7 @@ def test__array___(): assert isinstance(res, np.ndarray) res = np.asarray(sf['A']) - assert res.shape[1] == 1 + assert len(res.shape) == 1 def test_iloc(): @@ -565,13 +565,6 @@ def test_init_with_pandas(): sf = SparseFrame(df) -def test_multiply_assertion(): - sf = SparseFrame(np.ones(5)) - other = np.arange(5) - with pytest.raises(AssertionError): - sf.multiply(other) - - def test_multiply_rowwise(): # Row wise multiplication with different types sf = SparseFrame(np.ones((5, 5))) @@ -579,19 +572,19 @@ def test_multiply_rowwise(): msg = "Row wise multiplication failed" # nd.array - other = other.reshape(5, 1) - res = sf.multiply(other) - assert np.all(res.sum(axis=1) == 5 * other), msg + other = other.reshape(1, -1) + res = sf.multiply(other, axis=0) + assert np.all(res.sum(axis=0) == 5 * other), msg # SparseFrame _other = SparseFrame(other) - res = sf.multiply(_other) - assert np.all(res.sum(axis=1) == 5 * other), msg + res = sf.multiply(_other, axis=0) + assert np.all(res.sum(axis=0) == 5 * other), msg # csr_matrix _other = _other.data - res = sf.multiply(_other) - assert np.all(res.sum(axis=1) == 5 * other), msg + res = sf.multiply(_other, axis=0) + assert np.all(res.sum(axis=0) == 5 * other), msg def test_multiply_colwise(): @@ -601,16 +594,17 @@ def test_multiply_colwise(): msg = "Column wise multiplication failed" # nd.array - other = other.reshape(1, 5) - res = sf.multiply(other) - assert np.all(res.sum(axis=0) == 5 * other), msg + other = other.reshape(-1, 1) + res = sf.multiply(other, axis=1) + assert np.all(res.sum(axis=1) == 5 * other), msg # SparseFrame _other = SparseFrame(other) - res = sf.multiply(_other) - assert np.all(res.sum(axis=0) == 5 * other), msg + res = sf.multiply(_other, axis=1) + assert np.all(res.sum(axis=1) == 5 * other), msg # csr_matrix _other = _other.data - res = sf.multiply(_other) - assert np.all(res.sum(axis=0) == 5 * other), msg \ No newline at end of file + _other.toarray() + res = sf.multiply(_other, axis=1) + assert np.all(res.sum(axis=1) == 5 * other), msg From 2a701bb70473554a1583f3a14f3ea1acc9b6f5e4 Mon Sep 17 00:00:00 2001 From: kayibal Date: Wed, 3 May 2017 12:06:55 +0200 Subject: [PATCH 15/76] bump version --- sparsity/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sparsity/VERSION b/sparsity/VERSION index 8adc70f..899f24f 100644 --- a/sparsity/VERSION +++ b/sparsity/VERSION @@ -1 +1 @@ -0.8.0 \ No newline at end of file +0.9.0 \ No newline at end of file From 21dfe7ca6d6c9474a517a6c761deac513818381c Mon Sep 17 00:00:00 2001 From: kayibal Date: Fri, 5 May 2017 11:08:03 +0200 Subject: [PATCH 16/76] Hotfix pandas-0.20.0 breaks backwards compatibility with internal modules downgrade to 0.19 until dask releases patch --- setup.py | 2 +- sparsity/VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 8aea8de..1f21859 100644 --- a/setup.py +++ b/setup.py @@ -30,7 +30,7 @@ packages=find_packages(), package_data={'sparsity': ['VERSION']}, install_requires=[ - 'pandas>=0.19.2', + 'pandas==0.19.*', 'scipy>=0.18.1', 'numpy>=1.12.0' ], diff --git a/sparsity/VERSION b/sparsity/VERSION index 899f24f..f514a2f 100644 --- a/sparsity/VERSION +++ b/sparsity/VERSION @@ -1 +1 @@ -0.9.0 \ No newline at end of file +0.9.1 \ No newline at end of file From 69a48b578fd235802ec48feb17f3d1f33a59a242 Mon Sep 17 00:00:00 2001 From: kayibal Date: Fri, 5 May 2017 11:16:06 +0200 Subject: [PATCH 17/76] adds support to pandas>=0.20 --- sparsity/dask/reshape.py | 1 - sparsity/sparse_frame.py | 5 +++- sparsity/test/test_dask_sparse_frame.py | 31 ++++++++++++++++++++++++ sparsity/test/test_sparse_frame.py | 32 +------------------------ 4 files changed, 36 insertions(+), 33 deletions(-) diff --git a/sparsity/dask/reshape.py b/sparsity/dask/reshape.py index 9c5a5ef..7de0848 100644 --- a/sparsity/dask/reshape.py +++ b/sparsity/dask/reshape.py @@ -1,7 +1,6 @@ import sparsity as sp from sparsity import sparse_one_hot from sparsity.dask import SparseFrame -import pandas as pd import numpy as np def one_hot_encode(ddf, column, diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index dc89841..9c59b02 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -9,7 +9,10 @@ from pandas.core.common import _default_index from pandas.api import types -from pandas.indexes.base import _ensure_index +try: + from pandas.indexes.base import _ensure_index +except ImportError: + from pandas.core.indexes.base import _ensure_index from sparsity.io import to_npz, read_npz from scipy import sparse diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index 01e1457..84f0776 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -1,3 +1,4 @@ +import datetime as dt import os import shutil import tempfile @@ -8,9 +9,11 @@ import numpy as np import pandas as pd import pytest +from dask.async import get_sync import sparsity as sp import sparsity.dask as dsp +from sparsity import sparse_one_hot from sparsity.dask.reshape import one_hot_encode dask.context.set_options(get=dask.async.get_sync) @@ -67,6 +70,34 @@ def test_loc(iindexer, correct_shape): assert isinstance(res, sp.SparseFrame) assert res.shape == correct_shape +def test_dask_loc(clickstream): + sf = dd.from_pandas(clickstream, npartitions=10) \ + .map_partitions( + sparse_one_hot, + column='page_id', + categories=list('ABCDE'), + meta=list + ) + + res = sf.loc['2016-01-15':'2016-02-15'] + res = sp.SparseFrame.concat(res.compute(get=get_sync).tolist()) + assert res.index.date.max() == dt.date(2016, 2, 15) + assert res.index.date.min() == dt.date(2016, 1, 15) + + +def test_dask_multi_index_loc(clickstream): + sf = dd.from_pandas(clickstream, npartitions=10) \ + .map_partitions( + sparse_one_hot, + column='page_id', + index_col=['index', 'id'], + categories=list('ABCDE'), + meta=list + ) + res = sf.loc['2016-01-15':'2016-02-15'] + res = sp.SparseFrame.vstack(res.compute(get=get_sync).tolist()) + assert res.index.get_level_values(0).date.min() == dt.date(2016, 1, 15) + assert res.index.get_level_values(0).date.max() == dt.date(2016, 2, 15) def test_repr(): dsf = dsp.from_pandas(pd.DataFrame(np.random.rand(10, 2)), diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index d86a211..ba734ee 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -3,7 +3,7 @@ import datetime as dt import pandas as pd -import dask.dataframe as dd +#import dask.dataframe as dd import numpy as np import pytest from dask.async import get_sync @@ -448,36 +448,6 @@ def test_boolean_indexing(): assert res.index.tolist() == [3, 4] -def test_dask_loc(clickstream): - sf = dd.from_pandas(clickstream, npartitions=10) \ - .map_partitions( - sparse_one_hot, - column='page_id', - categories=list('ABCDE'), - meta=list - ) - - res = sf.loc['2016-01-15':'2016-02-15'] - res = SparseFrame.concat(res.compute(get=get_sync).tolist()) - assert res.index.date.max() == dt.date(2016, 2, 15) - assert res.index.date.min() == dt.date(2016, 1, 15) - - -def test_dask_multi_index_loc(clickstream): - sf = dd.from_pandas(clickstream, npartitions=10) \ - .map_partitions( - sparse_one_hot, - column='page_id', - index_col=['index', 'id'], - categories=list('ABCDE'), - meta=list - ) - res = sf.loc['2016-01-15':'2016-02-15'] - res = SparseFrame.vstack(res.compute(get=get_sync).tolist()) - assert res.index.get_level_values(0).date.min() == dt.date(2016, 1, 15) - assert res.index.get_level_values(0).date.max() == dt.date(2016, 2, 15) - - def test_rename(): old_names = list('ABCDE') func = lambda x: x + '_new' From a4bba4a2f397e17e9c2927368417b43c0769e496 Mon Sep 17 00:00:00 2001 From: kayibal Date: Fri, 5 May 2017 11:17:12 +0200 Subject: [PATCH 18/76] Adjust pandas dependency on setup.py --- setup.py | 2 +- sparsity/VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 1f21859..bc7580f 100644 --- a/setup.py +++ b/setup.py @@ -30,7 +30,7 @@ packages=find_packages(), package_data={'sparsity': ['VERSION']}, install_requires=[ - 'pandas==0.19.*', + 'pandas>=0.19.0', 'scipy>=0.18.1', 'numpy>=1.12.0' ], diff --git a/sparsity/VERSION b/sparsity/VERSION index f514a2f..f76f913 100644 --- a/sparsity/VERSION +++ b/sparsity/VERSION @@ -1 +1 @@ -0.9.1 \ No newline at end of file +0.9.2 \ No newline at end of file From 71dbd6be4bbe0fd5bc21a203cb7764cb3ae6ca2f Mon Sep 17 00:00:00 2001 From: kayibal Date: Thu, 18 May 2017 11:31:37 +0200 Subject: [PATCH 19/76] Hotfix: Accept kwargs in SparseFrame.add for congruency with pandas.DataFrame --- sparsity/sparse_frame.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 9c59b02..e92f4fa 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -362,7 +362,7 @@ def sort_index(self): index = self._index[passive_sort_idx] return SparseFrame(data, index=index) - def add(self, other, how='outer'): + def add(self, other, how='outer', **kwargs): """ Aligned addition. Adds two tables by aligning them first. From f8fc1490e51ea885832b35ca6bcaa1bd8cb197d7 Mon Sep 17 00:00:00 2001 From: kayibal Date: Thu, 18 May 2017 11:32:09 +0200 Subject: [PATCH 20/76] Version 0.9.3 --- sparsity/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sparsity/VERSION b/sparsity/VERSION index f76f913..b3ec163 100644 --- a/sparsity/VERSION +++ b/sparsity/VERSION @@ -1 +1 @@ -0.9.2 \ No newline at end of file +0.9.3 \ No newline at end of file From fe0ff68d526e2f703bfd27b0bf153d1bb08d58d5 Mon Sep 17 00:00:00 2001 From: michcio1234 Date: Thu, 18 May 2017 14:09:05 +0200 Subject: [PATCH 21/76] Added fillna method --- sparsity/sparse_frame.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index e92f4fa..bb17eee 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -362,6 +362,13 @@ def sort_index(self): index = self._index[passive_sort_idx] return SparseFrame(data, index=index) + def fillna(self, value): + """Replace NaN values in explicitly stored data with `value`.""" + _data = self._data.copy() + _data.data[np.isnan(self._data.data)] = value + return SparseFrame(data=_data[:-1, :], + index=self.index, columns=self.columns) + def add(self, other, how='outer', **kwargs): """ Aligned addition. Adds two tables by aligning them first. From e83b1e854d51be30c299c53f763deb4739b4c01d Mon Sep 17 00:00:00 2001 From: michcio1234 Date: Thu, 18 May 2017 16:26:43 +0200 Subject: [PATCH 22/76] Version bump to 0.10.0 --- sparsity/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sparsity/VERSION b/sparsity/VERSION index b3ec163..2774f85 100644 --- a/sparsity/VERSION +++ b/sparsity/VERSION @@ -1 +1 @@ -0.9.3 \ No newline at end of file +0.10.0 \ No newline at end of file From 8763fefbb5e3b72bda26c0971669177545bc0cb9 Mon Sep 17 00:00:00 2001 From: kayibal Date: Fri, 16 Jun 2017 18:34:25 +0200 Subject: [PATCH 23/76] Add reading categories from path This is useful mainly to avoid dask processes sharing really big arrays in case the categories get really big --- sparsity/dask/reshape.py | 11 ++++++++- sparsity/io.py | 12 +++++++++- sparsity/sparse_frame.py | 15 ++++++------ sparsity/test/__init__.py | 0 sparsity/test/conftest.py | 17 +++++++++++++- sparsity/test/test_dask_sparse_frame.py | 31 +++++++++++++------------ sparsity/test/test_sparse_frame.py | 18 +++++++++++--- 7 files changed, 76 insertions(+), 28 deletions(-) create mode 100644 sparsity/test/__init__.py diff --git a/sparsity/dask/reshape.py b/sparsity/dask/reshape.py index 7de0848..c47f80b 100644 --- a/sparsity/dask/reshape.py +++ b/sparsity/dask/reshape.py @@ -3,6 +3,9 @@ from sparsity.dask import SparseFrame import numpy as np +from sparsity.io import _just_read_array + + def one_hot_encode(ddf, column, categories, index_col): """ @@ -28,7 +31,13 @@ def one_hot_encode(ddf, column, """ idx_meta = ddf._meta.reset_index().set_index(index_col).index[:0] \ if index_col else ddf._meta.index - meta = sp.SparseFrame(np.array([]), columns=categories, + + if isinstance(categories, str): + columns = _just_read_array(categories) + else: + columns = categories + + meta = sp.SparseFrame(np.array([]), columns=columns, index=idx_meta) dsf = ddf.map_partitions(sparse_one_hot, diff --git a/sparsity/io.py b/sparsity/io.py index 35d8fb7..bd4f585 100644 --- a/sparsity/io.py +++ b/sparsity/io.py @@ -1,4 +1,5 @@ import numpy as np +import pandas as pd from scipy import sparse try: @@ -44,4 +45,13 @@ def _load_csr(loader): return sparse.csr_matrix((loader['data'], loader['indices'], loader['indptr']), - shape=loader['shape']) \ No newline at end of file + shape=loader['shape']) + + +def _just_read_array(path): + if path.endswith('hdf') or path.endswith('hdf5'): + return pd.read_hdf(path, '/df').values + elif path.endswith('csv'): + return pd.read_csv(path).values + elif path.endswith('pickle'): + return pd.read_pickle(path).values \ No newline at end of file diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index bb17eee..c688702 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -1,19 +1,18 @@ # coding=utf-8 import traceback -from functools import partial - -import pandas as pd -import numpy as np import uuid -from functools import reduce +from functools import partial, reduce -from pandas.core.common import _default_index +import numpy as np +import pandas as pd from pandas.api import types +from pandas.core.common import _default_index + try: from pandas.indexes.base import _ensure_index except ImportError: from pandas.core.indexes.base import _ensure_index -from sparsity.io import to_npz, read_npz +from sparsity.io import to_npz, read_npz, _just_read_array from scipy import sparse try: @@ -622,6 +621,8 @@ def sparse_one_hot(df, column, categories, dtype='f8', index_col=None): One-hot encode a single column of a pandas.DataFrame. Returns a SparseFrame. """ + if isinstance(categories, str): + categories = _just_read_array(categories) cols, csr = _one_hot_series_csr(categories, dtype, df[column]) if not isinstance(index_col, list): diff --git a/sparsity/test/__init__.py b/sparsity/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sparsity/test/conftest.py b/sparsity/test/conftest.py index 165ac2b..731b35e 100644 --- a/sparsity/test/conftest.py +++ b/sparsity/test/conftest.py @@ -1,4 +1,8 @@ import os +import shutil +import tempfile +from contextlib import contextmanager + import pytest import numpy as np @@ -19,4 +23,15 @@ def clickstream(): id=np.random.choice([1,2,3,4,5,6,7,8,9], size=100) ), index=pd.date_range("2016-01-01", periods=100)) - return df \ No newline at end of file + return df + + +@contextmanager +def tmpdir(dir=None): + dirname = tempfile.mkdtemp(dir=dir) + + try: + yield dirname + finally: + if os.path.exists(dirname): + shutil.rmtree(dirname, ignore_errors=True) \ No newline at end of file diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index 84f0776..f0787ca 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -1,8 +1,5 @@ import datetime as dt import os -import shutil -import tempfile -from contextlib import contextmanager import dask import dask.dataframe as dd @@ -16,18 +13,9 @@ from sparsity import sparse_one_hot from sparsity.dask.reshape import one_hot_encode -dask.context.set_options(get=dask.async.get_sync) - +from .conftest import tmpdir -@contextmanager -def tmpdir(dir=None): - dirname = tempfile.mkdtemp(dir=dir) - - try: - yield dirname - finally: - if os.path.exists(dirname): - shutil.rmtree(dirname, ignore_errors=True) +dask.context.set_options(get=dask.async.get_sync) @pytest.fixture @@ -119,6 +107,19 @@ def test_one_hot(clickstream): assert isinstance(sf.index, pd.MultiIndex) +def test_one_hot_disk_categories(clickstream): + with tmpdir() as tmp: + cat_path = os.path.join(tmp, 'cat.pickle') + pd.Series(list('ABCDE')).to_pickle(cat_path) + ddf = dd.from_pandas(clickstream, npartitions=10) + dsf = one_hot_encode(ddf, column='page_id', + categories=cat_path, + index_col=['index', 'id']) + sf = dsf.compute() + assert sf.shape == (100, 5) + assert isinstance(sf.index, pd.MultiIndex) + + def test_read_npz(): sf = sp.SparseFrame(np.identity(100)) with tmpdir() as tmp: @@ -141,4 +142,4 @@ def test_assign_column(): dsf = dsf.assign(new=ds) sf = dsf.compute() - assert np.all(sf.todense() == f.assign(new=s)) \ No newline at end of file + assert np.all(sf.todense() == f.assign(new=s)) diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index ba734ee..25654ad 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -1,16 +1,17 @@ # coding=utf-8 -import os import datetime as dt -import pandas as pd +import os #import dask.dataframe as dd import numpy as np +import pandas as pd import pytest -from dask.async import get_sync from scipy import sparse from sparsity import SparseFrame, sparse_one_hot +from .conftest import tmpdir + try: import traildb except (ImportError, OSError): @@ -347,6 +348,17 @@ def test_add_no_overlap(complex_example): assert np.all(res.data.todense() == correct) +def test_csr_one_hot_series_disk_categories(sampledata): + with tmpdir() as tmp: + categories = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', + 'Thursday', 'Friday', 'Saturday'] + cat_path = os.path.join(tmp, 'bla.pickle') + pd.Series(categories).to_pickle(cat_path) + sparse_frame = sparse_one_hot(sampledata(49), 'weekday', cat_path) + res = sparse_frame.groupby_sum(np.tile(np.arange(7), 7)).data.todense() + assert np.all(res == np.identity(7) * 7) + + def test_csr_one_hot_series(sampledata): categories = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] From 54bd77830e43e88443b4a2f896fa9412723c5f1e Mon Sep 17 00:00:00 2001 From: kayibal Date: Mon, 19 Jun 2017 11:05:17 +0200 Subject: [PATCH 24/76] Bump version to 0.11.0 and remove test from setup.py packages --- setup.py | 5 ++++- sparsity/VERSION | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index bc7580f..3da87d8 100644 --- a/setup.py +++ b/setup.py @@ -21,13 +21,16 @@ VERSION = open(os.path.join(root, 'sparsity', 'VERSION'))\ .read().strip() +packages = find_packages() +packages.remove('sparsity.test') + setup( name='sparsity', version=VERSION, ext_modules = ext_modules, author='Alan Hoeng', author_email='alan.f.hoeng@gmail.com', - packages=find_packages(), + packages=packages, package_data={'sparsity': ['VERSION']}, install_requires=[ 'pandas>=0.19.0', diff --git a/sparsity/VERSION b/sparsity/VERSION index 2774f85..142464b 100644 --- a/sparsity/VERSION +++ b/sparsity/VERSION @@ -1 +1 @@ -0.10.0 \ No newline at end of file +0.11.0 \ No newline at end of file From e2408fa37c23eb482e6933e36a6c74e0a12b7296 Mon Sep 17 00:00:00 2001 From: kayibal Date: Mon, 19 Jun 2017 11:11:58 +0200 Subject: [PATCH 25/76] Fix CodeCov reports on project coverage --- circle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circle.yml b/circle.yml index c20fc0c..02d8cb8 100644 --- a/circle.yml +++ b/circle.yml @@ -16,6 +16,6 @@ test: override: - pip install . - python -c 'import sparsity' - - py.test --cov sparsity --cov-report xml sparsity/test + - py.test --cov sparsity --cov-report xml sparsity post: - bash <(curl -s https://codecov.io/bash) \ No newline at end of file From ed6ae45679573f9080cf091895f3198f708ec0ac Mon Sep 17 00:00:00 2001 From: kayibal Date: Mon, 10 Jul 2017 19:43:44 +0200 Subject: [PATCH 26/76] Fix multiindex loc indexer (#11) was broken if loc returned a single location or integers were used as indexers --- sparsity/sparse_frame.py | 10 ++++++++-- sparsity/test/test_sparse_frame.py | 15 ++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index c688702..d2308c5 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -117,11 +117,17 @@ def todense(self, pandas=True): if self.empty: dense = pd.DataFrame([], columns=self.columns, index=self._index[:0]) - elif len(dense.shape) == 1: + elif len(dense.shape) == 1 and \ + self.data.shape[1] == 1: dense = pd.Series(dense, index=self.index, name=self.columns[0]) + elif len(dense.shape) == 1 and \ + self.data.shape[1] > 1: + dense = pd.DataFrame(dense.reshape(1, -1), index=self.index, + columns=self.columns) else: - dense = pd.DataFrame(dense, index=self.index, + idx = np.broadcast_to(self.index, dense.shape[0]) + dense = pd.DataFrame(dense, index=idx, columns=self.columns) return dense diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 25654ad..eb37ce1 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -50,6 +50,16 @@ def sf_midx(): sf = SparseFrame(np.identity(5), index=midx, columns=cols) return sf +@pytest.fixture() +def sf_midx_int(): + midx = pd.MultiIndex.from_arrays( + [np.concatenate([np.ones(4), np.zeros(1)]), + pd.date_range("2016-10-01", periods=5)] + ) + cols = list('ABCDE') + sf = SparseFrame(np.identity(5), index=midx, columns=cols) + return sf + def test_empty_init(): sf = SparseFrame(np.array([]), index=[], columns=['A', 'B']) @@ -177,7 +187,7 @@ def test_loc(): np.identity(5)[:3]) -def test_loc_multi_index(sf_midx): +def test_loc_multi_index(sf_midx, sf_midx_int): assert sf_midx.loc['2016-10-01'].data[0, 0] == 1 @@ -193,6 +203,9 @@ def test_loc_multi_index(sf_midx): assert np.all(sf_midx.loc[dt_slice].data.todense() == np.identity(5)[:3]) + assert np.all(sf_midx_int.loc[1].todense() == sf_midx.data[:4,:]) + assert np.all(sf_midx_int.loc[0].todense() == sf_midx.data[4, :]) + def test_set_index(sf_midx): sf = sf_midx.set_index(level=1) From 1c10beddb3570432b10d6a693df29879ec951afe Mon Sep 17 00:00:00 2001 From: kayibal Date: Tue, 11 Jul 2017 11:37:53 +0200 Subject: [PATCH 27/76] Fix to_npz (#12) if multiindex is contained it is restored when loading. This requires saving of metadata. In case metadata is not available because the file was saved with a previous version the index class is inferred by the array values. --- sparsity/io.py | 17 ++++++++++++++++- sparsity/test/test_sparse_frame.py | 21 +++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/sparsity/io.py b/sparsity/io.py index bd4f585..6f5c0d0 100644 --- a/sparsity/io.py +++ b/sparsity/io.py @@ -26,17 +26,21 @@ def traildb_to_coo(db, fieldname): def to_npz(sf, filename): data = _csr_to_dict(sf.data) + data['metadata'] = \ + {'multiindex': True if isinstance(sf.index, pd.MultiIndex) else False} data['frame_index'] = sf.index.values data['frame_columns'] = sf.columns.values np.savez(filename, **data) + def read_npz(filename): loader = np.load(filename) csr_mat = _load_csr(loader) - idx = loader['frame_index'] + idx = _load_idx_from_npz(loader) cols = loader['frame_columns'] return (csr_mat, idx, cols) + def _csr_to_dict(array): return dict(data = array.data ,indices=array.indices, indptr =array.indptr, shape=array.shape) @@ -48,6 +52,17 @@ def _load_csr(loader): shape=loader['shape']) +def _load_idx_from_npz(loader): + idx = loader['frame_index'] + try: + if loader['metadata'][()]['multiindex']: + idx = pd.MultiIndex.from_tuples(idx) + except KeyError: + if all(map(lambda x: isinstance(x, tuple), idx)): + idx = pd.MultiIndex.from_tuples(idx) + return idx + + def _just_read_array(path): if path.endswith('hdf') or path.endswith('hdf5'): return pd.read_hdf(path, '/df').values diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index eb37ce1..d961f92 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -9,6 +9,7 @@ from scipy import sparse from sparsity import SparseFrame, sparse_one_hot +from sparsity.io import _csr_to_dict from .conftest import tmpdir @@ -230,6 +231,26 @@ def test_set_index(sf_midx): # assert np.all(sf.loc[[4, 5]].data.todense() == np.identity(5)[[3, 4]]) +def test_save_load_multiindex(sf_midx): + with tmpdir() as tmp: + # test new + path = os.path.join(tmp, 'sf.npz') + sf_midx.to_npz(path) + res = SparseFrame.read_npz(path) + assert isinstance(res.index, pd.MultiIndex) + + # test backwards compatibility + def _to_npz_legacy(sf, filename): + data = _csr_to_dict(sf.data) + data['frame_index'] = sf.index.values + data['frame_columns'] = sf.columns.values + np.savez(filename, **data) + + _to_npz_legacy(sf_midx, path) + res = SparseFrame.read_npz(path) + assert isinstance(res.index, pd.MultiIndex) + + def test_new_column_assign_array(): sf = SparseFrame(np.identity(5)) sf[6] = np.ones(5) From 9d09f2f2fdfc01f172fe1c1ebe635ce6d3401edc Mon Sep 17 00:00:00 2001 From: kayibal Date: Tue, 11 Jul 2017 15:16:16 +0200 Subject: [PATCH 28/76] Fix/empty attribute (#13) * Fix empty attribute of sparsity.SparseFrame __init__ method did not initialize empty attribute correctly leading to errors when using the dask datastructure. This commit fixes this and adds corresponding tests. * Adjust _is_empty method. if data.nnz == 0 doesn't mean the array is empty it could be an array of purely zeros. replaced this check with a check for zero dimension which clearly indicates an empty frame. --- sparsity/dask/core.py | 2 ++ sparsity/sparse_frame.py | 3 ++- sparsity/test/test_dask_sparse_frame.py | 7 ++++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index 74fa235..7d7c07b 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -20,6 +20,8 @@ def _make_meta(inp): + if isinstance(inp, sp.SparseFrame) and inp.empty: + return inp if isinstance(inp, sp.SparseFrame): return inp.iloc[:0] else: diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index d2308c5..72064c2 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -25,7 +25,7 @@ def _is_empty(data): try: - if data.nnz == 0: + if any(map(lambda x: x== 0, data.shape)): return True else: return False @@ -79,6 +79,7 @@ def __init__(self, data, index=None, columns=None, **kwargs): "\nThe error described above occurred while " "converting data to sparse matrix.") else: + self.empty = True if _is_empty(data) else False self._init_csr(data) # register indexers diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index f0787ca..92a762d 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -53,7 +53,9 @@ def test_loc(iindexer, correct_shape): df = pd.DataFrame(np.random.rand(10, 2), index=list('ABCDEFGHIJ')) dsf = dsp.from_pandas(df, npartitions=2) - res = dsf.loc[iindexer].compute() + fut = dsf.loc[iindexer] + assert fut._meta.empty + res = fut.compute() assert isinstance(res, sp.SparseFrame) assert res.shape == correct_shape @@ -102,6 +104,7 @@ def test_one_hot(clickstream): dsf = one_hot_encode(ddf, column='page_id', categories=list('ABCDE'), index_col=['index', 'id']) + assert dsf._meta.empty sf = dsf.compute() assert sf.shape == (100, 5) assert isinstance(sf.index, pd.MultiIndex) @@ -115,6 +118,7 @@ def test_one_hot_disk_categories(clickstream): dsf = one_hot_encode(ddf, column='page_id', categories=cat_path, index_col=['index', 'id']) + assert dsf._meta.empty sf = dsf.compute() assert sf.shape == (100, 5) assert isinstance(sf.index, pd.MultiIndex) @@ -141,5 +145,6 @@ def test_assign_column(): dsf = dsp.from_pandas(f, npartitions=2) dsf = dsf.assign(new=ds) + assert dsf._meta.empty sf = dsf.compute() assert np.all(sf.todense() == f.assign(new=s)) From 5234740a3ddd5a497ee63749c3d191f7f4d12970 Mon Sep 17 00:00:00 2001 From: kayibal Date: Tue, 11 Jul 2017 15:17:22 +0200 Subject: [PATCH 29/76] Bum version to 0.11.1 --- sparsity/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sparsity/VERSION b/sparsity/VERSION index 142464b..027934e 100644 --- a/sparsity/VERSION +++ b/sparsity/VERSION @@ -1 +1 @@ -0.11.0 \ No newline at end of file +0.11.1 \ No newline at end of file From 4acf01668a7a8655f7b1e833eaee54c97b61113e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D?= Date: Fri, 21 Jul 2017 11:53:57 +0200 Subject: [PATCH 30/76] One-hot encode multiple columns (#16) * Possibility to one-hot encode multiple columns. `one_hot_encode` signature significantly changed! * Bump version to 0.12.0 * Fix docstring. * Small refactoring. * Added backward compatibility. * Small bugfix. * Changed interfaces to be (ugly but) consistent with previous version, so that backward compatibility is cleaner. * Use warnings module not to depend on drtools. * Adding prefixes to one-hot-encoded column names. When one-hot-encoding columns that contain same categories, resulting columns must have different names. This feature automatically adds original column name to resulting column name. (See docstrings.) --- sparsity/VERSION | 2 +- sparsity/dask/reshape.py | 77 ++++++++++++----- sparsity/sparse_frame.py | 57 +++++++++++-- sparsity/test/conftest.py | 7 +- sparsity/test/test_dask_sparse_frame.py | 80 +++++++++++++++--- sparsity/test/test_sparse_frame.py | 108 +++++++++++++++++++++--- 6 files changed, 275 insertions(+), 56 deletions(-) diff --git a/sparsity/VERSION b/sparsity/VERSION index 027934e..d33c3a2 100644 --- a/sparsity/VERSION +++ b/sparsity/VERSION @@ -1 +1 @@ -0.11.1 \ No newline at end of file +0.12.0 \ No newline at end of file diff --git a/sparsity/dask/reshape.py b/sparsity/dask/reshape.py index c47f80b..bfb686c 100644 --- a/sparsity/dask/reshape.py +++ b/sparsity/dask/reshape.py @@ -1,49 +1,84 @@ +import warnings +from collections import OrderedDict + +import numpy as np + import sparsity as sp from sparsity import sparse_one_hot from sparsity.dask import SparseFrame -import numpy as np - -from sparsity.io import _just_read_array -def one_hot_encode(ddf, column, - categories, index_col): +def one_hot_encode(ddf, column=None, categories=None, index_col=None, + order=None, prefixes=False): """ - Sparse one hot encoding of dask.DataFrame + Sparse one hot encoding of dask.DataFrame. - Convert a dask.DataFrame into a series of SparseFrames. By one hot - encoding a single column + Convert a dask.DataFrame into a series of SparseFrames by one-hot + encoding specified columns. Parameters ---------- ddf: dask.DataFrame e.g. the clickstream - column: str - column name to one hot encode in with SparseFrame - categories: iterable - possible category values - index_col: str, iterable + categories: dict + Maps column name -> iterable of possible category values. + See description of `order`. + index_col: str | iterable which columns to use as index + order: iterable + Specify order in which one-hot encoded columns should be aligned. + + If `order = [col_name1, col_name2]` + and `categories = {col_name1: ['A', 'B'], col_name2: ['C', 'D']}`, + then the resulting SparseFrame will have columns + `['A', 'B', 'C', 'D']`. + + If you don't specify order, then output columns' order depends on + iteration over `categories` dictionary. You can pass `categories` + as an OrderedDict instead of providing `order` explicitly. + prefixes: bool + If False, column names will be the same as categories, + so that new columns will be named like: + [cat11, cat12, cat21, cat22, ...]. + + If True, original column name followed by an underscore will be added + in front of each category name, so that new columns will be named like: + [col1_cat11, col1_cat12, col2_cat21, col2_cat22, ...]. + column: DEPRECATED + Kept only for backward compatibility. Returns ------- - sparse_one_hot: dask.Series + sparse_one_hot: sparsity.dask.SparseFrame """ + if column is not None: + warnings.warn( + '`column` argument of sparsity.dask.reshape.one_hot_encode ' + 'function is deprecated.' + ) + if order is not None: + raise ValueError('`order` and `column` arguments cannot be used ' + 'together.') + categories = {column: categories} + idx_meta = ddf._meta.reset_index().set_index(index_col).index[:0] \ if index_col else ddf._meta.index - if isinstance(categories, str): - columns = _just_read_array(categories) - else: - columns = categories + if order is not None: + categories = OrderedDict([(column, categories[column]) + for column in order]) + columns = sparse_one_hot(ddf._meta, + categories=categories, + index_col=index_col, + prefixes=prefixes).columns meta = sp.SparseFrame(np.array([]), columns=columns, - index=idx_meta) + index=idx_meta) dsf = ddf.map_partitions(sparse_one_hot, - column=column, categories=categories, index_col=index_col, + prefixes=prefixes, meta=object) - return SparseFrame(dsf.dask, dsf._name, meta, dsf.divisions) \ No newline at end of file + return SparseFrame(dsf.dask, dsf._name, meta, dsf.divisions) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 72064c2..dff1e15 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -1,6 +1,8 @@ # coding=utf-8 import traceback import uuid +import warnings +from collections import OrderedDict from functools import partial, reduce import numpy as np @@ -220,7 +222,7 @@ def data(self): return self._data return self._data[:-1,:] - # backwards comptability + # backwards compatibility def groupby(self, by=None, level=0): return self.groupby_sum(by, level) @@ -623,21 +625,60 @@ def _create_group_matrix(group_idx, dtype='f8'): dtype=dtype).tocsr() -def sparse_one_hot(df, column, categories, dtype='f8', index_col=None): +def _parse_legacy_soh_interface(categories, order): """ - One-hot encode a single column of a pandas.DataFrame. + Old interface was + sparse_one_hot(df, column, categories, dtype='f8', index_col=None). + """ + new_order = None + new_categories = {categories: order} + return new_categories, new_order + + +def sparse_one_hot(df, column=None, categories=None, dtype='f8', + index_col=None, order=None, prefixes=False): + """ + One-hot encode specified columns of a pandas.DataFrame. Returns a SparseFrame. + + See the documentation of :func:`sparsity.dask.reshape.one_hot_encode`. """ - if isinstance(categories, str): - categories = _just_read_array(categories) - cols, csr = _one_hot_series_csr(categories, dtype, df[column]) + if column is not None: + warnings.warn( + '`column` argument of sparsity.sparse_frame.sparse_one_hot ' + 'function is deprecated.' + ) + if order is not None: + raise ValueError('`order` and `column` arguments cannot be used ' + 'together.') + categories = {column: categories} + + if order is not None: + categories = OrderedDict([(column, categories[column]) + for column in order]) + + new_cols = [] + csrs = [] + for column, column_cat in categories.items(): + if isinstance(column_cat, str): + column_cat = _just_read_array(column_cat) + cols, csr = _one_hot_series_csr(column_cat, dtype, df[column]) + if prefixes: + cols = list(map(lambda x: '{}_{}'.format(column, x), cols)) + new_cols.extend(cols) + csrs.append(csr) + if len(set(new_cols)) < len(new_cols): + raise ValueError('Different columns have same categories. This would ' + 'result in duplicated column names. ' + 'Set `prefix` to True to manage this situation.') + new_data = sparse.hstack(csrs, format='csr') if not isinstance(index_col, list): new_index = df[index_col] if index_col else df.index else: df = df.reset_index() new_index = pd.MultiIndex.from_arrays(df[index_col].values.T) - return SparseFrame(csr, index=new_index, columns=cols) + return SparseFrame(new_data, index=new_index, columns=new_cols) def _one_hot_series_csr(categories, dtype, oh_col): @@ -659,4 +700,4 @@ def _one_hot_series_csr(categories, dtype, oh_col): data = sparse.coo_matrix((data, (row_indices, col_indices)), shape=(n_samples, n_features), dtype=dtype).tocsr() - return cat.categories.values, data \ No newline at end of file + return cat.categories.values, data diff --git a/sparsity/test/conftest.py b/sparsity/test/conftest.py index 731b35e..9752d7f 100644 --- a/sparsity/test/conftest.py +++ b/sparsity/test/conftest.py @@ -3,11 +3,9 @@ import tempfile from contextlib import contextmanager -import pytest - import numpy as np import pandas as pd - +import pytest import sparsity @@ -20,6 +18,7 @@ def testdb(): def clickstream(): df = pd.DataFrame(dict( page_id=np.random.choice(list('ABCDE'), size=100), + other_categorical=np.random.choice(list('FGHIJ'), size=100), id=np.random.choice([1,2,3,4,5,6,7,8,9], size=100) ), index=pd.date_range("2016-01-01", periods=100)) @@ -34,4 +33,4 @@ def tmpdir(dir=None): yield dirname finally: if os.path.exists(dirname): - shutil.rmtree(dirname, ignore_errors=True) \ No newline at end of file + shutil.rmtree(dirname, ignore_errors=True) diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index 92a762d..efb167d 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -6,10 +6,9 @@ import numpy as np import pandas as pd import pytest -from dask.async import get_sync - import sparsity as sp import sparsity.dask as dsp +from dask.async import get_sync from sparsity import sparse_one_hot from sparsity.dask.reshape import one_hot_encode @@ -64,8 +63,7 @@ def test_dask_loc(clickstream): sf = dd.from_pandas(clickstream, npartitions=10) \ .map_partitions( sparse_one_hot, - column='page_id', - categories=list('ABCDE'), + categories={'page_id': list('ABCDE')}, meta=list ) @@ -79,9 +77,8 @@ def test_dask_multi_index_loc(clickstream): sf = dd.from_pandas(clickstream, npartitions=10) \ .map_partitions( sparse_one_hot, - column='page_id', index_col=['index', 'id'], - categories=list('ABCDE'), + categories={'page_id': list('ABCDE')}, meta=list ) res = sf.loc['2016-01-15':'2016-02-15'] @@ -99,24 +96,83 @@ def test_repr(): assert isinstance(dsf.__repr__(), str) -def test_one_hot(clickstream): +def test_one_hot_legacy(clickstream): ddf = dd.from_pandas(clickstream, npartitions=10) - dsf = one_hot_encode(ddf, column='page_id', - categories=list('ABCDE'), - index_col=['index', 'id']) + dsf = one_hot_encode(ddf, 'page_id', list('ABCDE'), ['index', 'id']) assert dsf._meta.empty sf = dsf.compute() assert sf.shape == (100, 5) assert isinstance(sf.index, pd.MultiIndex) +def test_one_hot_no_order(clickstream): + ddf = dd.from_pandas(clickstream, npartitions=10) + dsf = one_hot_encode(ddf, + categories={'page_id': list('ABCDE'), + 'other_categorical': list('FGHIJ')}, + index_col=['index', 'id']) + assert dsf._meta.empty + assert sorted(dsf.columns) == list('ABCDEFGHIJ') + sf = dsf.compute() + assert sf.shape == (100, 10) + assert isinstance(sf.index, pd.MultiIndex) + assert sorted(sf.columns) == list('ABCDEFGHIJ') + + +def test_one_hot_prefixes(clickstream): + ddf = dd.from_pandas(clickstream, npartitions=10) + dsf = one_hot_encode(ddf, + categories={'page_id': list('ABCDE'), + 'other_categorical': list('FGHIJ')}, + index_col=['index', 'id'], + prefixes=True) + correct_columns = list(map(lambda x: 'page_id_' + x, list('ABCDE'))) \ + + list(map(lambda x: 'other_categorical_' + x, list('FGHIJ'))) + assert dsf._meta.empty + assert sorted(dsf.columns) == sorted(correct_columns) + sf = dsf.compute() + assert sf.shape == (100, 10) + assert isinstance(sf.index, pd.MultiIndex) + assert sorted(sf.columns) == sorted(correct_columns) + + +def test_one_hot_order1(clickstream): + ddf = dd.from_pandas(clickstream, npartitions=10) + dsf = one_hot_encode(ddf, + categories={'page_id': list('ABCDE'), + 'other_categorical': list('FGHIJ')}, + order=['page_id', 'other_categorical'], + index_col=['index', 'id']) + assert dsf._meta.empty + assert all(dsf.columns == list('ABCDEFGHIJ')) + sf = dsf.compute() + assert sf.shape == (100, 10) + assert isinstance(sf.index, pd.MultiIndex) + assert all(sf.columns == list('ABCDEFGHIJ')) + + +def test_one_hot_order2(clickstream): + ddf = dd.from_pandas(clickstream, npartitions=10) + dsf = one_hot_encode(ddf, + categories={'page_id': list('ABCDE'), + 'other_categorical': list('FGHIJ')}, + order=['other_categorical', 'page_id'], + index_col=['index', 'id']) + assert dsf._meta.empty + assert all(dsf.columns == list('FGHIJABCDE')) + sf = dsf.compute() + assert sf.shape == (100, 10) + assert isinstance(sf.index, pd.MultiIndex) + assert all(sf.columns == list('FGHIJABCDE')) + + def test_one_hot_disk_categories(clickstream): with tmpdir() as tmp: cat_path = os.path.join(tmp, 'cat.pickle') pd.Series(list('ABCDE')).to_pickle(cat_path) ddf = dd.from_pandas(clickstream, npartitions=10) - dsf = one_hot_encode(ddf, column='page_id', - categories=cat_path, + dsf = one_hot_encode(ddf, + categories={'page_id': cat_path}, index_col=['index', 'id']) assert dsf._meta.empty sf = dsf.compute() diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index d961f92..ddbb801 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -2,12 +2,10 @@ import datetime as dt import os -#import dask.dataframe as dd import numpy as np import pandas as pd import pytest from scipy import sparse - from sparsity import SparseFrame, sparse_one_hot from sparsity.io import _csr_to_dict @@ -26,12 +24,26 @@ def gendata(n): sample_data = pd.DataFrame( dict(date=pd.date_range("2017-01-01", periods=n))) sample_data["weekday"] = sample_data.date.dt.weekday_name + sample_data["weekday_abbr"] = sample_data.weekday.apply( + lambda x: x[:3]) sample_data["id"] = np.tile(np.arange(7), len(sample_data) // 7 + 1)[ :len(sample_data)] return sample_data return gendata + +@pytest.fixture() +def weekdays(): + return ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', + 'Friday', 'Saturday'] + + +@pytest.fixture() +def weekdays_abbr(weekdays): + return list(map(lambda x: x[:3], weekdays)) + + @pytest.fixture() def groupby_frame(): shuffle_idx = np.random.permutation(np.arange(100)) @@ -388,12 +400,13 @@ def test_csr_one_hot_series_disk_categories(sampledata): 'Thursday', 'Friday', 'Saturday'] cat_path = os.path.join(tmp, 'bla.pickle') pd.Series(categories).to_pickle(cat_path) - sparse_frame = sparse_one_hot(sampledata(49), 'weekday', cat_path) + sparse_frame = sparse_one_hot(sampledata(49), + categories={'weekday': cat_path}) res = sparse_frame.groupby_sum(np.tile(np.arange(7), 7)).data.todense() assert np.all(res == np.identity(7) * 7) -def test_csr_one_hot_series(sampledata): +def test_csr_one_hot_series_legacy(sampledata): categories = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] sparse_frame = sparse_one_hot(sampledata(49), 'weekday', categories) @@ -401,10 +414,87 @@ def test_csr_one_hot_series(sampledata): assert np.all(res == np.identity(7) * 7) +def test_csr_one_hot_series(sampledata, weekdays, weekdays_abbr): + correct = np.hstack((np.identity(7) * 7, + np.identity(7) * 7)) + + categories = {'weekday': weekdays, + 'weekday_abbr': weekdays_abbr} + + sparse_frame = sparse_one_hot(sampledata(49), categories=categories, + order=['weekday', 'weekday_abbr']) + + res = sparse_frame.groupby_sum(np.tile(np.arange(7), 7)).data.todense() + assert np.all(res == correct) + assert all(sparse_frame.columns == (weekdays + weekdays_abbr)) + + +def test_csr_one_hot_series_other_order(sampledata, weekdays, weekdays_abbr): + + categories = {'weekday': weekdays, + 'weekday_abbr': weekdays_abbr} + + sparse_frame = sparse_one_hot(sampledata(49), categories=categories, + order=['weekday_abbr', 'weekday']) + + assert all(sparse_frame.columns == (weekdays_abbr + weekdays)) + + +def test_csr_one_hot_series_no_order(sampledata, weekdays, weekdays_abbr): + + categories = {'weekday': weekdays, + 'weekday_abbr': weekdays_abbr} + + sparse_frame = sparse_one_hot(sampledata(49), categories=categories) + + assert sorted(sparse_frame.columns) == sorted(weekdays_abbr + weekdays) + + +def test_csr_one_hot_series_prefixes(sampledata, weekdays, weekdays_abbr): + correct = np.hstack((np.identity(7) * 7, + np.identity(7) * 7)) + + categories = {'weekday': weekdays, + 'weekday_abbr': weekdays_abbr} + + sparse_frame = sparse_one_hot(sampledata(49), categories=categories, + order=['weekday', 'weekday_abbr'], + prefixes=True) + + res = sparse_frame.groupby_sum(np.tile(np.arange(7), 7)).data.todense() + assert np.all(res == correct) + correct_columns = list(map(lambda x: 'weekday_' + x, weekdays)) \ + + list(map(lambda x: 'weekday_abbr_' + x, weekdays_abbr)) + assert all(sparse_frame.columns == correct_columns) + + +def test_csr_one_hot_series_same_categories(weekdays): + sample_data = pd.DataFrame( + dict(date=pd.date_range("2017-01-01", periods=7))) + sample_data["weekday"] = sample_data.date.dt.weekday_name + sample_data["weekday2"] = sample_data.date.dt.weekday_name + + categories = {'weekday': weekdays, + 'weekday2': weekdays} + + with pytest.raises(ValueError): + sparse_one_hot(sample_data, categories=categories, + order=['weekday', 'weekday2']) + + sparse_frame = sparse_one_hot(sample_data, categories=categories, + order=['weekday', 'weekday2'], + prefixes=True) + + correct_columns = list(map(lambda x: 'weekday_' + x, weekdays)) \ + + list(map(lambda x: 'weekday2_' + x, weekdays)) + assert all(sparse_frame.columns == correct_columns) + + def test_csr_one_hot_series_too_much_categories(sampledata): categories = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Yesterday', 'Saturday', 'Birthday'] - sparse_frame = sparse_one_hot(sampledata(49), 'weekday', categories) + sparse_frame = sparse_one_hot(sampledata(49), + categories={'weekday': categories}) res = sparse_frame.groupby_sum(np.tile(np.arange(7), 7)).data.todense() correct = np.identity(7) * 7 @@ -418,7 +508,7 @@ def test_csr_one_hot_series_too_little_categories(sampledata): categories = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] with pytest.raises(ValueError): - sparse_one_hot(sampledata(49), 'weekday', categories) + sparse_one_hot(sampledata(49), categories={'weekday': categories}) @pytest.mark.skipif(traildb is False, reason="TrailDB not installed") @@ -475,12 +565,10 @@ def test_vstack_multi_index(clickstream): df_0 = clickstream.iloc[:len(clickstream) // 2] df_1 = clickstream.iloc[len(clickstream) // 2:] sf_0 = sparse_one_hot(df_0, - categories=list('ABCDE'), - column='page_id', + categories={'page_id': list('ABCDE')}, index_col=['index', 'id']) sf_1 = sparse_one_hot(df_1, - categories=list('ABCDE'), - column='page_id', + categories={'page_id': list('ABCDE')}, index_col=['index', 'id']) res = SparseFrame.vstack([sf_0, sf_1]) assert isinstance(res.index, pd.MultiIndex) From e3a09e6dfc803fcba6e9db5df59c37ae3127e023 Mon Sep 17 00:00:00 2001 From: michcio1234 Date: Fri, 21 Jul 2017 15:19:04 +0200 Subject: [PATCH 31/76] Added possibility to drop single or multiple columns. --- sparsity/sparse_frame.py | 12 ++++++++++++ sparsity/test/test_sparse_frame.py | 20 ++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index dff1e15..499907f 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -512,6 +512,18 @@ def _single_assign(self, key, value): new_cols, new_data = self._add_col(key, value) return SparseFrame(new_data, index=self.index, columns=new_cols) + def drop(self, labels, axis=0): + """Drop label(s) from given axis. Currently works only for columns. + """ + if not isinstance(labels, (list, tuple, set)): + labels = [labels] + if axis == 1: + mask = np.logical_not(self.columns.isin(labels)) + sf = self[self.columns[mask].tolist()] + else: + raise NotImplementedError + return sf + def drop_duplicate_idx(self, **kwargs): """Drop rows with duplicated index.""" mask = ~self.index.duplicated(**kwargs) diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index ddbb801..17469d4 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -712,3 +712,23 @@ def test_multiply_colwise(): _other.toarray() res = sf.multiply(_other, axis=1) assert np.all(res.sum(axis=1) == 5 * other), msg + + +def test_drop_single_label(): + old_names = list('ABCDE') + sf = SparseFrame(np.identity(5), columns=old_names) + sf = sf.drop('A', axis=1) + + correct = np.identity(5)[:, 1:] + assert sf.columns.tolist() == list('BCDE') + np.testing.assert_array_equal(sf.data.todense(), correct) + + +def test_drop_multiple_labels(): + old_names = list('ABCDE') + sf = SparseFrame(np.identity(5), columns=old_names) + sf = sf.drop(['A', 'C'], axis=1) + + correct = np.identity(5)[:, [1, 3, 4]] + assert sf.columns.tolist() == list('BDE') + np.testing.assert_array_equal(sf.data.todense(), correct) From 9b8ffc20081c5890a29a9bbe2efe9d5e76f3220b Mon Sep 17 00:00:00 2001 From: michcio1234 Date: Fri, 21 Jul 2017 15:43:40 +0200 Subject: [PATCH 32/76] Remove unused code. --- sparsity/sparse_frame.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 499907f..84f5fd4 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -637,16 +637,6 @@ def _create_group_matrix(group_idx, dtype='f8'): dtype=dtype).tocsr() -def _parse_legacy_soh_interface(categories, order): - """ - Old interface was - sparse_one_hot(df, column, categories, dtype='f8', index_col=None). - """ - new_order = None - new_categories = {categories: order} - return new_categories, new_order - - def sparse_one_hot(df, column=None, categories=None, dtype='f8', index_col=None, order=None, prefixes=False): """ From 9ee76a64a238aaa1bd3e7cf6689c9fb550df7f21 Mon Sep 17 00:00:00 2001 From: kayibal Date: Fri, 21 Jul 2017 15:49:33 +0200 Subject: [PATCH 33/76] User versioneer for dynamic versionstrings (#17) * Use versioneer to create version strings --- .coveragerc | 2 +- .gitattributes | 1 + MANIFEST.in | 2 + setup.cfg | 6 + setup.py | 9 +- sparsity/VERSION | 1 - sparsity/__init__.py | 7 +- sparsity/_version.py | 520 ++++++++++++ versioneer.py | 1822 ++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 2358 insertions(+), 12 deletions(-) create mode 100644 .gitattributes create mode 100644 MANIFEST.in create mode 100644 setup.cfg delete mode 100644 sparsity/VERSION create mode 100644 sparsity/_version.py create mode 100644 versioneer.py diff --git a/.coveragerc b/.coveragerc index 3f381eb..468c02e 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,2 +1,2 @@ [run] -omit = sparsity/test/*, */__init__.py \ No newline at end of file +omit = sparsity/test/*, */__init__.py, */_version.py \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..e678b57 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +sparsity/_version.py export-subst diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..54be32b --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,2 @@ +include versioneer.py +include sparsity/_version.py diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..275e8e5 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,6 @@ +[versioneer] +VCS=git +style=pep440 +versionfile_source=sparsity/_version.py +versionfile_build=sparsity/_version.py +tag_prefix=v diff --git a/setup.py b/setup.py index 3da87d8..5d70bc8 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,5 @@ import os +import versioneer from distutils.core import setup, Extension from setuptools import find_packages @@ -17,21 +18,17 @@ except (ImportError, OSError): ext_modules = None -root = os.path.dirname(__file__) -VERSION = open(os.path.join(root, 'sparsity', 'VERSION'))\ - .read().strip() - packages = find_packages() packages.remove('sparsity.test') setup( name='sparsity', - version=VERSION, + version=versioneer.get_version(), ext_modules = ext_modules, author='Alan Hoeng', author_email='alan.f.hoeng@gmail.com', packages=packages, - package_data={'sparsity': ['VERSION']}, + cmdclass=versioneer.get_cmdclass(), install_requires=[ 'pandas>=0.19.0', 'scipy>=0.18.1', diff --git a/sparsity/VERSION b/sparsity/VERSION deleted file mode 100644 index d33c3a2..0000000 --- a/sparsity/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.12.0 \ No newline at end of file diff --git a/sparsity/__init__.py b/sparsity/__init__.py index 08f7066..280cc31 100644 --- a/sparsity/__init__.py +++ b/sparsity/__init__.py @@ -1,5 +1,4 @@ -import os - from sparsity.sparse_frame import SparseFrame, sparse_one_hot -root = os.path.dirname(__file__) -__version__ = open(os.path.join(root, 'VERSION')).read().strip() \ No newline at end of file +from ._version import get_versions +__version__ = get_versions()['version'] +del get_versions diff --git a/sparsity/_version.py b/sparsity/_version.py new file mode 100644 index 0000000..0f6e225 --- /dev/null +++ b/sparsity/_version.py @@ -0,0 +1,520 @@ + +# This file helps to compute a version number in source trees obtained from +# git-archive tarball (such as those provided by githubs download-from-tag +# feature). Distribution tarballs (built by setup.py sdist) and build +# directories (produced by setup.py build) will contain a much shorter file +# that just contains the computed version number. + +# This file is released into the public domain. Generated by +# versioneer-0.18 (https://github.com/warner/python-versioneer) + +"""Git implementation of _version.py.""" + +import errno +import os +import re +import subprocess +import sys + + +def get_keywords(): + """Get the keywords needed to look up the version information.""" + # these strings will be replaced by git during git-archive. + # setup.py/versioneer.py will grep for the variable names, so they must + # each be defined on a line of their own. _version.py will just call + # get_keywords(). + git_refnames = "$Format:%d$" + git_full = "$Format:%H$" + git_date = "$Format:%ci$" + keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} + return keywords + + +class VersioneerConfig: + """Container for Versioneer configuration parameters.""" + + +def get_config(): + """Create, populate and return the VersioneerConfig() object.""" + # these strings are filled in when 'setup.py versioneer' creates + # _version.py + cfg = VersioneerConfig() + cfg.VCS = "git" + cfg.style = "pep440" + cfg.tag_prefix = "v" + cfg.parentdir_prefix = "None" + cfg.versionfile_source = "sparsity/_version.py" + cfg.verbose = False + return cfg + + +class NotThisMethod(Exception): + """Exception raised if a method is not valid for the current scenario.""" + + +LONG_VERSION_PY = {} +HANDLERS = {} + + +def register_vcs_handler(vcs, method): # decorator + """Decorator to mark a method as the handler for a particular VCS.""" + def decorate(f): + """Store f in HANDLERS[vcs][method].""" + if vcs not in HANDLERS: + HANDLERS[vcs] = {} + HANDLERS[vcs][method] = f + return f + return decorate + + +def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, + env=None): + """Call the given command(s).""" + assert isinstance(commands, list) + p = None + for c in commands: + try: + dispcmd = str([c] + args) + # remember shell=False, so use git.cmd on windows, not just git + p = subprocess.Popen([c] + args, cwd=cwd, env=env, + stdout=subprocess.PIPE, + stderr=(subprocess.PIPE if hide_stderr + else None)) + break + except EnvironmentError: + e = sys.exc_info()[1] + if e.errno == errno.ENOENT: + continue + if verbose: + print("unable to run %s" % dispcmd) + print(e) + return None, None + else: + if verbose: + print("unable to find command, tried %s" % (commands,)) + return None, None + stdout = p.communicate()[0].strip() + if sys.version_info[0] >= 3: + stdout = stdout.decode() + if p.returncode != 0: + if verbose: + print("unable to run %s (error)" % dispcmd) + print("stdout was %s" % stdout) + return None, p.returncode + return stdout, p.returncode + + +def versions_from_parentdir(parentdir_prefix, root, verbose): + """Try to determine the version from the parent directory name. + + Source tarballs conventionally unpack into a directory that includes both + the project name and a version string. We will also support searching up + two directory levels for an appropriately named parent directory + """ + rootdirs = [] + + for i in range(3): + dirname = os.path.basename(root) + if dirname.startswith(parentdir_prefix): + return {"version": dirname[len(parentdir_prefix):], + "full-revisionid": None, + "dirty": False, "error": None, "date": None} + else: + rootdirs.append(root) + root = os.path.dirname(root) # up a level + + if verbose: + print("Tried directories %s but none started with prefix %s" % + (str(rootdirs), parentdir_prefix)) + raise NotThisMethod("rootdir doesn't start with parentdir_prefix") + + +@register_vcs_handler("git", "get_keywords") +def git_get_keywords(versionfile_abs): + """Extract version information from the given file.""" + # the code embedded in _version.py can just fetch the value of these + # keywords. When used from setup.py, we don't want to import _version.py, + # so we do it with a regexp instead. This function is not used from + # _version.py. + keywords = {} + try: + f = open(versionfile_abs, "r") + for line in f.readlines(): + if line.strip().startswith("git_refnames ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["refnames"] = mo.group(1) + if line.strip().startswith("git_full ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["full"] = mo.group(1) + if line.strip().startswith("git_date ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["date"] = mo.group(1) + f.close() + except EnvironmentError: + pass + return keywords + + +@register_vcs_handler("git", "keywords") +def git_versions_from_keywords(keywords, tag_prefix, verbose): + """Get version information from git keywords.""" + if not keywords: + raise NotThisMethod("no keywords at all, weird") + date = keywords.get("date") + if date is not None: + # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant + # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 + # -like" string, which we must then edit to make compliant), because + # it's been around since git-1.5.3, and it's too difficult to + # discover which version we're using, or to work around using an + # older one. + date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + refnames = keywords["refnames"].strip() + if refnames.startswith("$Format"): + if verbose: + print("keywords are unexpanded, not using") + raise NotThisMethod("unexpanded keywords, not a git-archive tarball") + refs = set([r.strip() for r in refnames.strip("()").split(",")]) + # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of + # just "foo-1.0". If we see a "tag: " prefix, prefer those. + TAG = "tag: " + tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) + if not tags: + # Either we're using git < 1.8.3, or there really are no tags. We use + # a heuristic: assume all version tags have a digit. The old git %d + # expansion behaves like git log --decorate=short and strips out the + # refs/heads/ and refs/tags/ prefixes that would let us distinguish + # between branches and tags. By ignoring refnames without digits, we + # filter out many common branch names like "release" and + # "stabilization", as well as "HEAD" and "master". + tags = set([r for r in refs if re.search(r'\d', r)]) + if verbose: + print("discarding '%s', no digits" % ",".join(refs - tags)) + if verbose: + print("likely tags: %s" % ",".join(sorted(tags))) + for ref in sorted(tags): + # sorting will prefer e.g. "2.0" over "2.0rc1" + if ref.startswith(tag_prefix): + r = ref[len(tag_prefix):] + if verbose: + print("picking %s" % r) + return {"version": r, + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": None, + "date": date} + # no suitable tags, so version is "0+unknown", but full hex is still there + if verbose: + print("no suitable tags, using unknown + full revision id") + return {"version": "0+unknown", + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": "no suitable tags", "date": None} + + +@register_vcs_handler("git", "pieces_from_vcs") +def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + """Get version from 'git describe' in the root of the source tree. + + This only gets called if the git-archive 'subst' keywords were *not* + expanded, and _version.py hasn't already been rewritten with a short + version string, meaning we're inside a checked out source tree. + """ + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] + + out, rc = run_command(GITS, ["rev-parse", "--git-dir"], cwd=root, + hide_stderr=True) + if rc != 0: + if verbose: + print("Directory %s not under git control" % root) + raise NotThisMethod("'git rev-parse --git-dir' returned error") + + # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] + # if there isn't one, this yields HEX[-dirty] (no NUM) + describe_out, rc = run_command(GITS, ["describe", "--tags", "--dirty", + "--always", "--long", + "--match", "%s*" % tag_prefix], + cwd=root) + # --long was added in git-1.5.5 + if describe_out is None: + raise NotThisMethod("'git describe' failed") + describe_out = describe_out.strip() + full_out, rc = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) + if full_out is None: + raise NotThisMethod("'git rev-parse' failed") + full_out = full_out.strip() + + pieces = {} + pieces["long"] = full_out + pieces["short"] = full_out[:7] # maybe improved later + pieces["error"] = None + + # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] + # TAG might have hyphens. + git_describe = describe_out + + # look for -dirty suffix + dirty = git_describe.endswith("-dirty") + pieces["dirty"] = dirty + if dirty: + git_describe = git_describe[:git_describe.rindex("-dirty")] + + # now we have TAG-NUM-gHEX or HEX + + if "-" in git_describe: + # TAG-NUM-gHEX + mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) + if not mo: + # unparseable. Maybe git-describe is misbehaving? + pieces["error"] = ("unable to parse git-describe output: '%s'" + % describe_out) + return pieces + + # tag + full_tag = mo.group(1) + if not full_tag.startswith(tag_prefix): + if verbose: + fmt = "tag '%s' doesn't start with prefix '%s'" + print(fmt % (full_tag, tag_prefix)) + pieces["error"] = ("tag '%s' doesn't start with prefix '%s'" + % (full_tag, tag_prefix)) + return pieces + pieces["closest-tag"] = full_tag[len(tag_prefix):] + + # distance: number of commits since tag + pieces["distance"] = int(mo.group(2)) + + # commit: short hex revision ID + pieces["short"] = mo.group(3) + + else: + # HEX: no tags + pieces["closest-tag"] = None + count_out, rc = run_command(GITS, ["rev-list", "HEAD", "--count"], + cwd=root) + pieces["distance"] = int(count_out) # total number of commits + + # commit date: see ISO-8601 comment in git_versions_from_keywords() + date = run_command(GITS, ["show", "-s", "--format=%ci", "HEAD"], + cwd=root)[0].strip() + pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + + return pieces + + +def plus_or_dot(pieces): + """Return a + if we don't already have one, else return a .""" + if "+" in pieces.get("closest-tag", ""): + return "." + return "+" + + +def render_pep440(pieces): + """Build up version string, with post-release "local version identifier". + + Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you + get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty + + Exceptions: + 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += plus_or_dot(pieces) + rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0+untagged.%d.g%s" % (pieces["distance"], + pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + +def render_pep440_pre(pieces): + """TAG[.post.devDISTANCE] -- No -dirty. + + Exceptions: + 1: no tags. 0.post.devDISTANCE + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += ".post.dev%d" % pieces["distance"] + else: + # exception #1 + rendered = "0.post.dev%d" % pieces["distance"] + return rendered + + +def render_pep440_post(pieces): + """TAG[.postDISTANCE[.dev0]+gHEX] . + + The ".dev0" means dirty. Note that .dev0 sorts backwards + (a dirty tree will appear "older" than the corresponding clean one), + but you shouldn't be releasing software with -dirty anyways. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "g%s" % pieces["short"] + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += "+g%s" % pieces["short"] + return rendered + + +def render_pep440_old(pieces): + """TAG[.postDISTANCE[.dev0]] . + + The ".dev0" means dirty. + + Eexceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + return rendered + + +def render_git_describe(pieces): + """TAG[-DISTANCE-gHEX][-dirty]. + + Like 'git describe --tags --dirty --always'. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render_git_describe_long(pieces): + """TAG-DISTANCE-gHEX[-dirty]. + + Like 'git describe --tags --dirty --always -long'. + The distance/hash is unconditional. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render(pieces, style): + """Render the given version pieces into the requested style.""" + if pieces["error"]: + return {"version": "unknown", + "full-revisionid": pieces.get("long"), + "dirty": None, + "error": pieces["error"], + "date": None} + + if not style or style == "default": + style = "pep440" # the default + + if style == "pep440": + rendered = render_pep440(pieces) + elif style == "pep440-pre": + rendered = render_pep440_pre(pieces) + elif style == "pep440-post": + rendered = render_pep440_post(pieces) + elif style == "pep440-old": + rendered = render_pep440_old(pieces) + elif style == "git-describe": + rendered = render_git_describe(pieces) + elif style == "git-describe-long": + rendered = render_git_describe_long(pieces) + else: + raise ValueError("unknown style '%s'" % style) + + return {"version": rendered, "full-revisionid": pieces["long"], + "dirty": pieces["dirty"], "error": None, + "date": pieces.get("date")} + + +def get_versions(): + """Get version information or return default if unable to do so.""" + # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have + # __file__, we can work backwards from there to the root. Some + # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which + # case we can only use expanded keywords. + + cfg = get_config() + verbose = cfg.verbose + + try: + return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, + verbose) + except NotThisMethod: + pass + + try: + root = os.path.realpath(__file__) + # versionfile_source is the relative path from the top of the source + # tree (where the .git directory might live) to this file. Invert + # this to find the root from __file__. + for i in cfg.versionfile_source.split('/'): + root = os.path.dirname(root) + except NameError: + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, + "error": "unable to find root of source tree", + "date": None} + + try: + pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) + return render(pieces, cfg.style) + except NotThisMethod: + pass + + try: + if cfg.parentdir_prefix: + return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) + except NotThisMethod: + pass + + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, + "error": "unable to compute version", "date": None} diff --git a/versioneer.py b/versioneer.py new file mode 100644 index 0000000..64fea1c --- /dev/null +++ b/versioneer.py @@ -0,0 +1,1822 @@ + +# Version: 0.18 + +"""The Versioneer - like a rocketeer, but for versions. + +The Versioneer +============== + +* like a rocketeer, but for versions! +* https://github.com/warner/python-versioneer +* Brian Warner +* License: Public Domain +* Compatible With: python2.6, 2.7, 3.2, 3.3, 3.4, 3.5, 3.6, and pypy +* [![Latest Version] +(https://pypip.in/version/versioneer/badge.svg?style=flat) +](https://pypi.python.org/pypi/versioneer/) +* [![Build Status] +(https://travis-ci.org/warner/python-versioneer.png?branch=master) +](https://travis-ci.org/warner/python-versioneer) + +This is a tool for managing a recorded version number in distutils-based +python projects. The goal is to remove the tedious and error-prone "update +the embedded version string" step from your release process. Making a new +release should be as easy as recording a new tag in your version-control +system, and maybe making new tarballs. + + +## Quick Install + +* `pip install versioneer` to somewhere to your $PATH +* add a `[versioneer]` section to your setup.cfg (see below) +* run `versioneer install` in your source tree, commit the results + +## Version Identifiers + +Source trees come from a variety of places: + +* a version-control system checkout (mostly used by developers) +* a nightly tarball, produced by build automation +* a snapshot tarball, produced by a web-based VCS browser, like github's + "tarball from tag" feature +* a release tarball, produced by "setup.py sdist", distributed through PyPI + +Within each source tree, the version identifier (either a string or a number, +this tool is format-agnostic) can come from a variety of places: + +* ask the VCS tool itself, e.g. "git describe" (for checkouts), which knows + about recent "tags" and an absolute revision-id +* the name of the directory into which the tarball was unpacked +* an expanded VCS keyword ($Id$, etc) +* a `_version.py` created by some earlier build step + +For released software, the version identifier is closely related to a VCS +tag. Some projects use tag names that include more than just the version +string (e.g. "myproject-1.2" instead of just "1.2"), in which case the tool +needs to strip the tag prefix to extract the version identifier. For +unreleased software (between tags), the version identifier should provide +enough information to help developers recreate the same tree, while also +giving them an idea of roughly how old the tree is (after version 1.2, before +version 1.3). Many VCS systems can report a description that captures this, +for example `git describe --tags --dirty --always` reports things like +"0.7-1-g574ab98-dirty" to indicate that the checkout is one revision past the +0.7 tag, has a unique revision id of "574ab98", and is "dirty" (it has +uncommitted changes. + +The version identifier is used for multiple purposes: + +* to allow the module to self-identify its version: `myproject.__version__` +* to choose a name and prefix for a 'setup.py sdist' tarball + +## Theory of Operation + +Versioneer works by adding a special `_version.py` file into your source +tree, where your `__init__.py` can import it. This `_version.py` knows how to +dynamically ask the VCS tool for version information at import time. + +`_version.py` also contains `$Revision$` markers, and the installation +process marks `_version.py` to have this marker rewritten with a tag name +during the `git archive` command. As a result, generated tarballs will +contain enough information to get the proper version. + +To allow `setup.py` to compute a version too, a `versioneer.py` is added to +the top level of your source tree, next to `setup.py` and the `setup.cfg` +that configures it. This overrides several distutils/setuptools commands to +compute the version when invoked, and changes `setup.py build` and `setup.py +sdist` to replace `_version.py` with a small static file that contains just +the generated version data. + +## Installation + +See [INSTALL.md](./INSTALL.md) for detailed installation instructions. + +## Version-String Flavors + +Code which uses Versioneer can learn about its version string at runtime by +importing `_version` from your main `__init__.py` file and running the +`get_versions()` function. From the "outside" (e.g. in `setup.py`), you can +import the top-level `versioneer.py` and run `get_versions()`. + +Both functions return a dictionary with different flavors of version +information: + +* `['version']`: A condensed version string, rendered using the selected + style. This is the most commonly used value for the project's version + string. The default "pep440" style yields strings like `0.11`, + `0.11+2.g1076c97`, or `0.11+2.g1076c97.dirty`. See the "Styles" section + below for alternative styles. + +* `['full-revisionid']`: detailed revision identifier. For Git, this is the + full SHA1 commit id, e.g. "1076c978a8d3cfc70f408fe5974aa6c092c949ac". + +* `['date']`: Date and time of the latest `HEAD` commit. For Git, it is the + commit date in ISO 8601 format. This will be None if the date is not + available. + +* `['dirty']`: a boolean, True if the tree has uncommitted changes. Note that + this is only accurate if run in a VCS checkout, otherwise it is likely to + be False or None + +* `['error']`: if the version string could not be computed, this will be set + to a string describing the problem, otherwise it will be None. It may be + useful to throw an exception in setup.py if this is set, to avoid e.g. + creating tarballs with a version string of "unknown". + +Some variants are more useful than others. Including `full-revisionid` in a +bug report should allow developers to reconstruct the exact code being tested +(or indicate the presence of local changes that should be shared with the +developers). `version` is suitable for display in an "about" box or a CLI +`--version` output: it can be easily compared against release notes and lists +of bugs fixed in various releases. + +The installer adds the following text to your `__init__.py` to place a basic +version in `YOURPROJECT.__version__`: + + from ._version import get_versions + __version__ = get_versions()['version'] + del get_versions + +## Styles + +The setup.cfg `style=` configuration controls how the VCS information is +rendered into a version string. + +The default style, "pep440", produces a PEP440-compliant string, equal to the +un-prefixed tag name for actual releases, and containing an additional "local +version" section with more detail for in-between builds. For Git, this is +TAG[+DISTANCE.gHEX[.dirty]] , using information from `git describe --tags +--dirty --always`. For example "0.11+2.g1076c97.dirty" indicates that the +tree is like the "1076c97" commit but has uncommitted changes (".dirty"), and +that this commit is two revisions ("+2") beyond the "0.11" tag. For released +software (exactly equal to a known tag), the identifier will only contain the +stripped tag, e.g. "0.11". + +Other styles are available. See [details.md](details.md) in the Versioneer +source tree for descriptions. + +## Debugging + +Versioneer tries to avoid fatal errors: if something goes wrong, it will tend +to return a version of "0+unknown". To investigate the problem, run `setup.py +version`, which will run the version-lookup code in a verbose mode, and will +display the full contents of `get_versions()` (including the `error` string, +which may help identify what went wrong). + +## Known Limitations + +Some situations are known to cause problems for Versioneer. This details the +most significant ones. More can be found on Github +[issues page](https://github.com/warner/python-versioneer/issues). + +### Subprojects + +Versioneer has limited support for source trees in which `setup.py` is not in +the root directory (e.g. `setup.py` and `.git/` are *not* siblings). The are +two common reasons why `setup.py` might not be in the root: + +* Source trees which contain multiple subprojects, such as + [Buildbot](https://github.com/buildbot/buildbot), which contains both + "master" and "slave" subprojects, each with their own `setup.py`, + `setup.cfg`, and `tox.ini`. Projects like these produce multiple PyPI + distributions (and upload multiple independently-installable tarballs). +* Source trees whose main purpose is to contain a C library, but which also + provide bindings to Python (and perhaps other langauges) in subdirectories. + +Versioneer will look for `.git` in parent directories, and most operations +should get the right version string. However `pip` and `setuptools` have bugs +and implementation details which frequently cause `pip install .` from a +subproject directory to fail to find a correct version string (so it usually +defaults to `0+unknown`). + +`pip install --editable .` should work correctly. `setup.py install` might +work too. + +Pip-8.1.1 is known to have this problem, but hopefully it will get fixed in +some later version. + +[Bug #38](https://github.com/warner/python-versioneer/issues/38) is tracking +this issue. The discussion in +[PR #61](https://github.com/warner/python-versioneer/pull/61) describes the +issue from the Versioneer side in more detail. +[pip PR#3176](https://github.com/pypa/pip/pull/3176) and +[pip PR#3615](https://github.com/pypa/pip/pull/3615) contain work to improve +pip to let Versioneer work correctly. + +Versioneer-0.16 and earlier only looked for a `.git` directory next to the +`setup.cfg`, so subprojects were completely unsupported with those releases. + +### Editable installs with setuptools <= 18.5 + +`setup.py develop` and `pip install --editable .` allow you to install a +project into a virtualenv once, then continue editing the source code (and +test) without re-installing after every change. + +"Entry-point scripts" (`setup(entry_points={"console_scripts": ..})`) are a +convenient way to specify executable scripts that should be installed along +with the python package. + +These both work as expected when using modern setuptools. When using +setuptools-18.5 or earlier, however, certain operations will cause +`pkg_resources.DistributionNotFound` errors when running the entrypoint +script, which must be resolved by re-installing the package. This happens +when the install happens with one version, then the egg_info data is +regenerated while a different version is checked out. Many setup.py commands +cause egg_info to be rebuilt (including `sdist`, `wheel`, and installing into +a different virtualenv), so this can be surprising. + +[Bug #83](https://github.com/warner/python-versioneer/issues/83) describes +this one, but upgrading to a newer version of setuptools should probably +resolve it. + +### Unicode version strings + +While Versioneer works (and is continually tested) with both Python 2 and +Python 3, it is not entirely consistent with bytes-vs-unicode distinctions. +Newer releases probably generate unicode version strings on py2. It's not +clear that this is wrong, but it may be surprising for applications when then +write these strings to a network connection or include them in bytes-oriented +APIs like cryptographic checksums. + +[Bug #71](https://github.com/warner/python-versioneer/issues/71) investigates +this question. + + +## Updating Versioneer + +To upgrade your project to a new release of Versioneer, do the following: + +* install the new Versioneer (`pip install -U versioneer` or equivalent) +* edit `setup.cfg`, if necessary, to include any new configuration settings + indicated by the release notes. See [UPGRADING](./UPGRADING.md) for details. +* re-run `versioneer install` in your source tree, to replace + `SRC/_version.py` +* commit any changed files + +## Future Directions + +This tool is designed to make it easily extended to other version-control +systems: all VCS-specific components are in separate directories like +src/git/ . The top-level `versioneer.py` script is assembled from these +components by running make-versioneer.py . In the future, make-versioneer.py +will take a VCS name as an argument, and will construct a version of +`versioneer.py` that is specific to the given VCS. It might also take the +configuration arguments that are currently provided manually during +installation by editing setup.py . Alternatively, it might go the other +direction and include code from all supported VCS systems, reducing the +number of intermediate scripts. + + +## License + +To make Versioneer easier to embed, all its code is dedicated to the public +domain. The `_version.py` that it creates is also in the public domain. +Specifically, both are released under the Creative Commons "Public Domain +Dedication" license (CC0-1.0), as described in +https://creativecommons.org/publicdomain/zero/1.0/ . + +""" + +from __future__ import print_function +try: + import configparser +except ImportError: + import ConfigParser as configparser +import errno +import json +import os +import re +import subprocess +import sys + + +class VersioneerConfig: + """Container for Versioneer configuration parameters.""" + + +def get_root(): + """Get the project root directory. + + We require that all commands are run from the project root, i.e. the + directory that contains setup.py, setup.cfg, and versioneer.py . + """ + root = os.path.realpath(os.path.abspath(os.getcwd())) + setup_py = os.path.join(root, "setup.py") + versioneer_py = os.path.join(root, "versioneer.py") + if not (os.path.exists(setup_py) or os.path.exists(versioneer_py)): + # allow 'python path/to/setup.py COMMAND' + root = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0]))) + setup_py = os.path.join(root, "setup.py") + versioneer_py = os.path.join(root, "versioneer.py") + if not (os.path.exists(setup_py) or os.path.exists(versioneer_py)): + err = ("Versioneer was unable to run the project root directory. " + "Versioneer requires setup.py to be executed from " + "its immediate directory (like 'python setup.py COMMAND'), " + "or in a way that lets it use sys.argv[0] to find the root " + "(like 'python path/to/setup.py COMMAND').") + raise VersioneerBadRootError(err) + try: + # Certain runtime workflows (setup.py install/develop in a setuptools + # tree) execute all dependencies in a single python process, so + # "versioneer" may be imported multiple times, and python's shared + # module-import table will cache the first one. So we can't use + # os.path.dirname(__file__), as that will find whichever + # versioneer.py was first imported, even in later projects. + me = os.path.realpath(os.path.abspath(__file__)) + me_dir = os.path.normcase(os.path.splitext(me)[0]) + vsr_dir = os.path.normcase(os.path.splitext(versioneer_py)[0]) + if me_dir != vsr_dir: + print("Warning: build in %s is using versioneer.py from %s" + % (os.path.dirname(me), versioneer_py)) + except NameError: + pass + return root + + +def get_config_from_root(root): + """Read the project setup.cfg file to determine Versioneer config.""" + # This might raise EnvironmentError (if setup.cfg is missing), or + # configparser.NoSectionError (if it lacks a [versioneer] section), or + # configparser.NoOptionError (if it lacks "VCS="). See the docstring at + # the top of versioneer.py for instructions on writing your setup.cfg . + setup_cfg = os.path.join(root, "setup.cfg") + parser = configparser.SafeConfigParser() + with open(setup_cfg, "r") as f: + parser.readfp(f) + VCS = parser.get("versioneer", "VCS") # mandatory + + def get(parser, name): + if parser.has_option("versioneer", name): + return parser.get("versioneer", name) + return None + cfg = VersioneerConfig() + cfg.VCS = VCS + cfg.style = get(parser, "style") or "" + cfg.versionfile_source = get(parser, "versionfile_source") + cfg.versionfile_build = get(parser, "versionfile_build") + cfg.tag_prefix = get(parser, "tag_prefix") + if cfg.tag_prefix in ("''", '""'): + cfg.tag_prefix = "" + cfg.parentdir_prefix = get(parser, "parentdir_prefix") + cfg.verbose = get(parser, "verbose") + return cfg + + +class NotThisMethod(Exception): + """Exception raised if a method is not valid for the current scenario.""" + + +# these dictionaries contain VCS-specific tools +LONG_VERSION_PY = {} +HANDLERS = {} + + +def register_vcs_handler(vcs, method): # decorator + """Decorator to mark a method as the handler for a particular VCS.""" + def decorate(f): + """Store f in HANDLERS[vcs][method].""" + if vcs not in HANDLERS: + HANDLERS[vcs] = {} + HANDLERS[vcs][method] = f + return f + return decorate + + +def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, + env=None): + """Call the given command(s).""" + assert isinstance(commands, list) + p = None + for c in commands: + try: + dispcmd = str([c] + args) + # remember shell=False, so use git.cmd on windows, not just git + p = subprocess.Popen([c] + args, cwd=cwd, env=env, + stdout=subprocess.PIPE, + stderr=(subprocess.PIPE if hide_stderr + else None)) + break + except EnvironmentError: + e = sys.exc_info()[1] + if e.errno == errno.ENOENT: + continue + if verbose: + print("unable to run %s" % dispcmd) + print(e) + return None, None + else: + if verbose: + print("unable to find command, tried %s" % (commands,)) + return None, None + stdout = p.communicate()[0].strip() + if sys.version_info[0] >= 3: + stdout = stdout.decode() + if p.returncode != 0: + if verbose: + print("unable to run %s (error)" % dispcmd) + print("stdout was %s" % stdout) + return None, p.returncode + return stdout, p.returncode + + +LONG_VERSION_PY['git'] = ''' +# This file helps to compute a version number in source trees obtained from +# git-archive tarball (such as those provided by githubs download-from-tag +# feature). Distribution tarballs (built by setup.py sdist) and build +# directories (produced by setup.py build) will contain a much shorter file +# that just contains the computed version number. + +# This file is released into the public domain. Generated by +# versioneer-0.18 (https://github.com/warner/python-versioneer) + +"""Git implementation of _version.py.""" + +import errno +import os +import re +import subprocess +import sys + + +def get_keywords(): + """Get the keywords needed to look up the version information.""" + # these strings will be replaced by git during git-archive. + # setup.py/versioneer.py will grep for the variable names, so they must + # each be defined on a line of their own. _version.py will just call + # get_keywords(). + git_refnames = "%(DOLLAR)sFormat:%%d%(DOLLAR)s" + git_full = "%(DOLLAR)sFormat:%%H%(DOLLAR)s" + git_date = "%(DOLLAR)sFormat:%%ci%(DOLLAR)s" + keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} + return keywords + + +class VersioneerConfig: + """Container for Versioneer configuration parameters.""" + + +def get_config(): + """Create, populate and return the VersioneerConfig() object.""" + # these strings are filled in when 'setup.py versioneer' creates + # _version.py + cfg = VersioneerConfig() + cfg.VCS = "git" + cfg.style = "%(STYLE)s" + cfg.tag_prefix = "%(TAG_PREFIX)s" + cfg.parentdir_prefix = "%(PARENTDIR_PREFIX)s" + cfg.versionfile_source = "%(VERSIONFILE_SOURCE)s" + cfg.verbose = False + return cfg + + +class NotThisMethod(Exception): + """Exception raised if a method is not valid for the current scenario.""" + + +LONG_VERSION_PY = {} +HANDLERS = {} + + +def register_vcs_handler(vcs, method): # decorator + """Decorator to mark a method as the handler for a particular VCS.""" + def decorate(f): + """Store f in HANDLERS[vcs][method].""" + if vcs not in HANDLERS: + HANDLERS[vcs] = {} + HANDLERS[vcs][method] = f + return f + return decorate + + +def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, + env=None): + """Call the given command(s).""" + assert isinstance(commands, list) + p = None + for c in commands: + try: + dispcmd = str([c] + args) + # remember shell=False, so use git.cmd on windows, not just git + p = subprocess.Popen([c] + args, cwd=cwd, env=env, + stdout=subprocess.PIPE, + stderr=(subprocess.PIPE if hide_stderr + else None)) + break + except EnvironmentError: + e = sys.exc_info()[1] + if e.errno == errno.ENOENT: + continue + if verbose: + print("unable to run %%s" %% dispcmd) + print(e) + return None, None + else: + if verbose: + print("unable to find command, tried %%s" %% (commands,)) + return None, None + stdout = p.communicate()[0].strip() + if sys.version_info[0] >= 3: + stdout = stdout.decode() + if p.returncode != 0: + if verbose: + print("unable to run %%s (error)" %% dispcmd) + print("stdout was %%s" %% stdout) + return None, p.returncode + return stdout, p.returncode + + +def versions_from_parentdir(parentdir_prefix, root, verbose): + """Try to determine the version from the parent directory name. + + Source tarballs conventionally unpack into a directory that includes both + the project name and a version string. We will also support searching up + two directory levels for an appropriately named parent directory + """ + rootdirs = [] + + for i in range(3): + dirname = os.path.basename(root) + if dirname.startswith(parentdir_prefix): + return {"version": dirname[len(parentdir_prefix):], + "full-revisionid": None, + "dirty": False, "error": None, "date": None} + else: + rootdirs.append(root) + root = os.path.dirname(root) # up a level + + if verbose: + print("Tried directories %%s but none started with prefix %%s" %% + (str(rootdirs), parentdir_prefix)) + raise NotThisMethod("rootdir doesn't start with parentdir_prefix") + + +@register_vcs_handler("git", "get_keywords") +def git_get_keywords(versionfile_abs): + """Extract version information from the given file.""" + # the code embedded in _version.py can just fetch the value of these + # keywords. When used from setup.py, we don't want to import _version.py, + # so we do it with a regexp instead. This function is not used from + # _version.py. + keywords = {} + try: + f = open(versionfile_abs, "r") + for line in f.readlines(): + if line.strip().startswith("git_refnames ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["refnames"] = mo.group(1) + if line.strip().startswith("git_full ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["full"] = mo.group(1) + if line.strip().startswith("git_date ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["date"] = mo.group(1) + f.close() + except EnvironmentError: + pass + return keywords + + +@register_vcs_handler("git", "keywords") +def git_versions_from_keywords(keywords, tag_prefix, verbose): + """Get version information from git keywords.""" + if not keywords: + raise NotThisMethod("no keywords at all, weird") + date = keywords.get("date") + if date is not None: + # git-2.2.0 added "%%cI", which expands to an ISO-8601 -compliant + # datestamp. However we prefer "%%ci" (which expands to an "ISO-8601 + # -like" string, which we must then edit to make compliant), because + # it's been around since git-1.5.3, and it's too difficult to + # discover which version we're using, or to work around using an + # older one. + date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + refnames = keywords["refnames"].strip() + if refnames.startswith("$Format"): + if verbose: + print("keywords are unexpanded, not using") + raise NotThisMethod("unexpanded keywords, not a git-archive tarball") + refs = set([r.strip() for r in refnames.strip("()").split(",")]) + # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of + # just "foo-1.0". If we see a "tag: " prefix, prefer those. + TAG = "tag: " + tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) + if not tags: + # Either we're using git < 1.8.3, or there really are no tags. We use + # a heuristic: assume all version tags have a digit. The old git %%d + # expansion behaves like git log --decorate=short and strips out the + # refs/heads/ and refs/tags/ prefixes that would let us distinguish + # between branches and tags. By ignoring refnames without digits, we + # filter out many common branch names like "release" and + # "stabilization", as well as "HEAD" and "master". + tags = set([r for r in refs if re.search(r'\d', r)]) + if verbose: + print("discarding '%%s', no digits" %% ",".join(refs - tags)) + if verbose: + print("likely tags: %%s" %% ",".join(sorted(tags))) + for ref in sorted(tags): + # sorting will prefer e.g. "2.0" over "2.0rc1" + if ref.startswith(tag_prefix): + r = ref[len(tag_prefix):] + if verbose: + print("picking %%s" %% r) + return {"version": r, + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": None, + "date": date} + # no suitable tags, so version is "0+unknown", but full hex is still there + if verbose: + print("no suitable tags, using unknown + full revision id") + return {"version": "0+unknown", + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": "no suitable tags", "date": None} + + +@register_vcs_handler("git", "pieces_from_vcs") +def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + """Get version from 'git describe' in the root of the source tree. + + This only gets called if the git-archive 'subst' keywords were *not* + expanded, and _version.py hasn't already been rewritten with a short + version string, meaning we're inside a checked out source tree. + """ + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] + + out, rc = run_command(GITS, ["rev-parse", "--git-dir"], cwd=root, + hide_stderr=True) + if rc != 0: + if verbose: + print("Directory %%s not under git control" %% root) + raise NotThisMethod("'git rev-parse --git-dir' returned error") + + # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] + # if there isn't one, this yields HEX[-dirty] (no NUM) + describe_out, rc = run_command(GITS, ["describe", "--tags", "--dirty", + "--always", "--long", + "--match", "%%s*" %% tag_prefix], + cwd=root) + # --long was added in git-1.5.5 + if describe_out is None: + raise NotThisMethod("'git describe' failed") + describe_out = describe_out.strip() + full_out, rc = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) + if full_out is None: + raise NotThisMethod("'git rev-parse' failed") + full_out = full_out.strip() + + pieces = {} + pieces["long"] = full_out + pieces["short"] = full_out[:7] # maybe improved later + pieces["error"] = None + + # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] + # TAG might have hyphens. + git_describe = describe_out + + # look for -dirty suffix + dirty = git_describe.endswith("-dirty") + pieces["dirty"] = dirty + if dirty: + git_describe = git_describe[:git_describe.rindex("-dirty")] + + # now we have TAG-NUM-gHEX or HEX + + if "-" in git_describe: + # TAG-NUM-gHEX + mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) + if not mo: + # unparseable. Maybe git-describe is misbehaving? + pieces["error"] = ("unable to parse git-describe output: '%%s'" + %% describe_out) + return pieces + + # tag + full_tag = mo.group(1) + if not full_tag.startswith(tag_prefix): + if verbose: + fmt = "tag '%%s' doesn't start with prefix '%%s'" + print(fmt %% (full_tag, tag_prefix)) + pieces["error"] = ("tag '%%s' doesn't start with prefix '%%s'" + %% (full_tag, tag_prefix)) + return pieces + pieces["closest-tag"] = full_tag[len(tag_prefix):] + + # distance: number of commits since tag + pieces["distance"] = int(mo.group(2)) + + # commit: short hex revision ID + pieces["short"] = mo.group(3) + + else: + # HEX: no tags + pieces["closest-tag"] = None + count_out, rc = run_command(GITS, ["rev-list", "HEAD", "--count"], + cwd=root) + pieces["distance"] = int(count_out) # total number of commits + + # commit date: see ISO-8601 comment in git_versions_from_keywords() + date = run_command(GITS, ["show", "-s", "--format=%%ci", "HEAD"], + cwd=root)[0].strip() + pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + + return pieces + + +def plus_or_dot(pieces): + """Return a + if we don't already have one, else return a .""" + if "+" in pieces.get("closest-tag", ""): + return "." + return "+" + + +def render_pep440(pieces): + """Build up version string, with post-release "local version identifier". + + Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you + get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty + + Exceptions: + 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += plus_or_dot(pieces) + rendered += "%%d.g%%s" %% (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0+untagged.%%d.g%%s" %% (pieces["distance"], + pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + +def render_pep440_pre(pieces): + """TAG[.post.devDISTANCE] -- No -dirty. + + Exceptions: + 1: no tags. 0.post.devDISTANCE + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += ".post.dev%%d" %% pieces["distance"] + else: + # exception #1 + rendered = "0.post.dev%%d" %% pieces["distance"] + return rendered + + +def render_pep440_post(pieces): + """TAG[.postDISTANCE[.dev0]+gHEX] . + + The ".dev0" means dirty. Note that .dev0 sorts backwards + (a dirty tree will appear "older" than the corresponding clean one), + but you shouldn't be releasing software with -dirty anyways. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%%d" %% pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "g%%s" %% pieces["short"] + else: + # exception #1 + rendered = "0.post%%d" %% pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += "+g%%s" %% pieces["short"] + return rendered + + +def render_pep440_old(pieces): + """TAG[.postDISTANCE[.dev0]] . + + The ".dev0" means dirty. + + Eexceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%%d" %% pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + else: + # exception #1 + rendered = "0.post%%d" %% pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + return rendered + + +def render_git_describe(pieces): + """TAG[-DISTANCE-gHEX][-dirty]. + + Like 'git describe --tags --dirty --always'. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += "-%%d-g%%s" %% (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render_git_describe_long(pieces): + """TAG-DISTANCE-gHEX[-dirty]. + + Like 'git describe --tags --dirty --always -long'. + The distance/hash is unconditional. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + rendered += "-%%d-g%%s" %% (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render(pieces, style): + """Render the given version pieces into the requested style.""" + if pieces["error"]: + return {"version": "unknown", + "full-revisionid": pieces.get("long"), + "dirty": None, + "error": pieces["error"], + "date": None} + + if not style or style == "default": + style = "pep440" # the default + + if style == "pep440": + rendered = render_pep440(pieces) + elif style == "pep440-pre": + rendered = render_pep440_pre(pieces) + elif style == "pep440-post": + rendered = render_pep440_post(pieces) + elif style == "pep440-old": + rendered = render_pep440_old(pieces) + elif style == "git-describe": + rendered = render_git_describe(pieces) + elif style == "git-describe-long": + rendered = render_git_describe_long(pieces) + else: + raise ValueError("unknown style '%%s'" %% style) + + return {"version": rendered, "full-revisionid": pieces["long"], + "dirty": pieces["dirty"], "error": None, + "date": pieces.get("date")} + + +def get_versions(): + """Get version information or return default if unable to do so.""" + # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have + # __file__, we can work backwards from there to the root. Some + # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which + # case we can only use expanded keywords. + + cfg = get_config() + verbose = cfg.verbose + + try: + return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, + verbose) + except NotThisMethod: + pass + + try: + root = os.path.realpath(__file__) + # versionfile_source is the relative path from the top of the source + # tree (where the .git directory might live) to this file. Invert + # this to find the root from __file__. + for i in cfg.versionfile_source.split('/'): + root = os.path.dirname(root) + except NameError: + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, + "error": "unable to find root of source tree", + "date": None} + + try: + pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) + return render(pieces, cfg.style) + except NotThisMethod: + pass + + try: + if cfg.parentdir_prefix: + return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) + except NotThisMethod: + pass + + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, + "error": "unable to compute version", "date": None} +''' + + +@register_vcs_handler("git", "get_keywords") +def git_get_keywords(versionfile_abs): + """Extract version information from the given file.""" + # the code embedded in _version.py can just fetch the value of these + # keywords. When used from setup.py, we don't want to import _version.py, + # so we do it with a regexp instead. This function is not used from + # _version.py. + keywords = {} + try: + f = open(versionfile_abs, "r") + for line in f.readlines(): + if line.strip().startswith("git_refnames ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["refnames"] = mo.group(1) + if line.strip().startswith("git_full ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["full"] = mo.group(1) + if line.strip().startswith("git_date ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["date"] = mo.group(1) + f.close() + except EnvironmentError: + pass + return keywords + + +@register_vcs_handler("git", "keywords") +def git_versions_from_keywords(keywords, tag_prefix, verbose): + """Get version information from git keywords.""" + if not keywords: + raise NotThisMethod("no keywords at all, weird") + date = keywords.get("date") + if date is not None: + # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant + # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 + # -like" string, which we must then edit to make compliant), because + # it's been around since git-1.5.3, and it's too difficult to + # discover which version we're using, or to work around using an + # older one. + date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + refnames = keywords["refnames"].strip() + if refnames.startswith("$Format"): + if verbose: + print("keywords are unexpanded, not using") + raise NotThisMethod("unexpanded keywords, not a git-archive tarball") + refs = set([r.strip() for r in refnames.strip("()").split(",")]) + # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of + # just "foo-1.0". If we see a "tag: " prefix, prefer those. + TAG = "tag: " + tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) + if not tags: + # Either we're using git < 1.8.3, or there really are no tags. We use + # a heuristic: assume all version tags have a digit. The old git %d + # expansion behaves like git log --decorate=short and strips out the + # refs/heads/ and refs/tags/ prefixes that would let us distinguish + # between branches and tags. By ignoring refnames without digits, we + # filter out many common branch names like "release" and + # "stabilization", as well as "HEAD" and "master". + tags = set([r for r in refs if re.search(r'\d', r)]) + if verbose: + print("discarding '%s', no digits" % ",".join(refs - tags)) + if verbose: + print("likely tags: %s" % ",".join(sorted(tags))) + for ref in sorted(tags): + # sorting will prefer e.g. "2.0" over "2.0rc1" + if ref.startswith(tag_prefix): + r = ref[len(tag_prefix):] + if verbose: + print("picking %s" % r) + return {"version": r, + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": None, + "date": date} + # no suitable tags, so version is "0+unknown", but full hex is still there + if verbose: + print("no suitable tags, using unknown + full revision id") + return {"version": "0+unknown", + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": "no suitable tags", "date": None} + + +@register_vcs_handler("git", "pieces_from_vcs") +def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + """Get version from 'git describe' in the root of the source tree. + + This only gets called if the git-archive 'subst' keywords were *not* + expanded, and _version.py hasn't already been rewritten with a short + version string, meaning we're inside a checked out source tree. + """ + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] + + out, rc = run_command(GITS, ["rev-parse", "--git-dir"], cwd=root, + hide_stderr=True) + if rc != 0: + if verbose: + print("Directory %s not under git control" % root) + raise NotThisMethod("'git rev-parse --git-dir' returned error") + + # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] + # if there isn't one, this yields HEX[-dirty] (no NUM) + describe_out, rc = run_command(GITS, ["describe", "--tags", "--dirty", + "--always", "--long", + "--match", "%s*" % tag_prefix], + cwd=root) + # --long was added in git-1.5.5 + if describe_out is None: + raise NotThisMethod("'git describe' failed") + describe_out = describe_out.strip() + full_out, rc = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) + if full_out is None: + raise NotThisMethod("'git rev-parse' failed") + full_out = full_out.strip() + + pieces = {} + pieces["long"] = full_out + pieces["short"] = full_out[:7] # maybe improved later + pieces["error"] = None + + # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] + # TAG might have hyphens. + git_describe = describe_out + + # look for -dirty suffix + dirty = git_describe.endswith("-dirty") + pieces["dirty"] = dirty + if dirty: + git_describe = git_describe[:git_describe.rindex("-dirty")] + + # now we have TAG-NUM-gHEX or HEX + + if "-" in git_describe: + # TAG-NUM-gHEX + mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) + if not mo: + # unparseable. Maybe git-describe is misbehaving? + pieces["error"] = ("unable to parse git-describe output: '%s'" + % describe_out) + return pieces + + # tag + full_tag = mo.group(1) + if not full_tag.startswith(tag_prefix): + if verbose: + fmt = "tag '%s' doesn't start with prefix '%s'" + print(fmt % (full_tag, tag_prefix)) + pieces["error"] = ("tag '%s' doesn't start with prefix '%s'" + % (full_tag, tag_prefix)) + return pieces + pieces["closest-tag"] = full_tag[len(tag_prefix):] + + # distance: number of commits since tag + pieces["distance"] = int(mo.group(2)) + + # commit: short hex revision ID + pieces["short"] = mo.group(3) + + else: + # HEX: no tags + pieces["closest-tag"] = None + count_out, rc = run_command(GITS, ["rev-list", "HEAD", "--count"], + cwd=root) + pieces["distance"] = int(count_out) # total number of commits + + # commit date: see ISO-8601 comment in git_versions_from_keywords() + date = run_command(GITS, ["show", "-s", "--format=%ci", "HEAD"], + cwd=root)[0].strip() + pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + + return pieces + + +def do_vcs_install(manifest_in, versionfile_source, ipy): + """Git-specific installation logic for Versioneer. + + For Git, this means creating/changing .gitattributes to mark _version.py + for export-subst keyword substitution. + """ + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] + files = [manifest_in, versionfile_source] + if ipy: + files.append(ipy) + try: + me = __file__ + if me.endswith(".pyc") or me.endswith(".pyo"): + me = os.path.splitext(me)[0] + ".py" + versioneer_file = os.path.relpath(me) + except NameError: + versioneer_file = "versioneer.py" + files.append(versioneer_file) + present = False + try: + f = open(".gitattributes", "r") + for line in f.readlines(): + if line.strip().startswith(versionfile_source): + if "export-subst" in line.strip().split()[1:]: + present = True + f.close() + except EnvironmentError: + pass + if not present: + f = open(".gitattributes", "a+") + f.write("%s export-subst\n" % versionfile_source) + f.close() + files.append(".gitattributes") + run_command(GITS, ["add", "--"] + files) + + +def versions_from_parentdir(parentdir_prefix, root, verbose): + """Try to determine the version from the parent directory name. + + Source tarballs conventionally unpack into a directory that includes both + the project name and a version string. We will also support searching up + two directory levels for an appropriately named parent directory + """ + rootdirs = [] + + for i in range(3): + dirname = os.path.basename(root) + if dirname.startswith(parentdir_prefix): + return {"version": dirname[len(parentdir_prefix):], + "full-revisionid": None, + "dirty": False, "error": None, "date": None} + else: + rootdirs.append(root) + root = os.path.dirname(root) # up a level + + if verbose: + print("Tried directories %s but none started with prefix %s" % + (str(rootdirs), parentdir_prefix)) + raise NotThisMethod("rootdir doesn't start with parentdir_prefix") + + +SHORT_VERSION_PY = """ +# This file was generated by 'versioneer.py' (0.18) from +# revision-control system data, or from the parent directory name of an +# unpacked source archive. Distribution tarballs contain a pre-generated copy +# of this file. + +import json + +version_json = ''' +%s +''' # END VERSION_JSON + + +def get_versions(): + return json.loads(version_json) +""" + + +def versions_from_file(filename): + """Try to determine the version from _version.py if present.""" + try: + with open(filename) as f: + contents = f.read() + except EnvironmentError: + raise NotThisMethod("unable to read _version.py") + mo = re.search(r"version_json = '''\n(.*)''' # END VERSION_JSON", + contents, re.M | re.S) + if not mo: + mo = re.search(r"version_json = '''\r\n(.*)''' # END VERSION_JSON", + contents, re.M | re.S) + if not mo: + raise NotThisMethod("no version_json in _version.py") + return json.loads(mo.group(1)) + + +def write_to_version_file(filename, versions): + """Write the given version number to the given _version.py file.""" + os.unlink(filename) + contents = json.dumps(versions, sort_keys=True, + indent=1, separators=(",", ": ")) + with open(filename, "w") as f: + f.write(SHORT_VERSION_PY % contents) + + print("set %s to '%s'" % (filename, versions["version"])) + + +def plus_or_dot(pieces): + """Return a + if we don't already have one, else return a .""" + if "+" in pieces.get("closest-tag", ""): + return "." + return "+" + + +def render_pep440(pieces): + """Build up version string, with post-release "local version identifier". + + Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you + get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty + + Exceptions: + 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += plus_or_dot(pieces) + rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0+untagged.%d.g%s" % (pieces["distance"], + pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + +def render_pep440_pre(pieces): + """TAG[.post.devDISTANCE] -- No -dirty. + + Exceptions: + 1: no tags. 0.post.devDISTANCE + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += ".post.dev%d" % pieces["distance"] + else: + # exception #1 + rendered = "0.post.dev%d" % pieces["distance"] + return rendered + + +def render_pep440_post(pieces): + """TAG[.postDISTANCE[.dev0]+gHEX] . + + The ".dev0" means dirty. Note that .dev0 sorts backwards + (a dirty tree will appear "older" than the corresponding clean one), + but you shouldn't be releasing software with -dirty anyways. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "g%s" % pieces["short"] + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += "+g%s" % pieces["short"] + return rendered + + +def render_pep440_old(pieces): + """TAG[.postDISTANCE[.dev0]] . + + The ".dev0" means dirty. + + Eexceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + return rendered + + +def render_git_describe(pieces): + """TAG[-DISTANCE-gHEX][-dirty]. + + Like 'git describe --tags --dirty --always'. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render_git_describe_long(pieces): + """TAG-DISTANCE-gHEX[-dirty]. + + Like 'git describe --tags --dirty --always -long'. + The distance/hash is unconditional. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render(pieces, style): + """Render the given version pieces into the requested style.""" + if pieces["error"]: + return {"version": "unknown", + "full-revisionid": pieces.get("long"), + "dirty": None, + "error": pieces["error"], + "date": None} + + if not style or style == "default": + style = "pep440" # the default + + if style == "pep440": + rendered = render_pep440(pieces) + elif style == "pep440-pre": + rendered = render_pep440_pre(pieces) + elif style == "pep440-post": + rendered = render_pep440_post(pieces) + elif style == "pep440-old": + rendered = render_pep440_old(pieces) + elif style == "git-describe": + rendered = render_git_describe(pieces) + elif style == "git-describe-long": + rendered = render_git_describe_long(pieces) + else: + raise ValueError("unknown style '%s'" % style) + + return {"version": rendered, "full-revisionid": pieces["long"], + "dirty": pieces["dirty"], "error": None, + "date": pieces.get("date")} + + +class VersioneerBadRootError(Exception): + """The project root directory is unknown or missing key files.""" + + +def get_versions(verbose=False): + """Get the project version from whatever source is available. + + Returns dict with two keys: 'version' and 'full'. + """ + if "versioneer" in sys.modules: + # see the discussion in cmdclass.py:get_cmdclass() + del sys.modules["versioneer"] + + root = get_root() + cfg = get_config_from_root(root) + + assert cfg.VCS is not None, "please set [versioneer]VCS= in setup.cfg" + handlers = HANDLERS.get(cfg.VCS) + assert handlers, "unrecognized VCS '%s'" % cfg.VCS + verbose = verbose or cfg.verbose + assert cfg.versionfile_source is not None, \ + "please set versioneer.versionfile_source" + assert cfg.tag_prefix is not None, "please set versioneer.tag_prefix" + + versionfile_abs = os.path.join(root, cfg.versionfile_source) + + # extract version from first of: _version.py, VCS command (e.g. 'git + # describe'), parentdir. This is meant to work for developers using a + # source checkout, for users of a tarball created by 'setup.py sdist', + # and for users of a tarball/zipball created by 'git archive' or github's + # download-from-tag feature or the equivalent in other VCSes. + + get_keywords_f = handlers.get("get_keywords") + from_keywords_f = handlers.get("keywords") + if get_keywords_f and from_keywords_f: + try: + keywords = get_keywords_f(versionfile_abs) + ver = from_keywords_f(keywords, cfg.tag_prefix, verbose) + if verbose: + print("got version from expanded keyword %s" % ver) + return ver + except NotThisMethod: + pass + + try: + ver = versions_from_file(versionfile_abs) + if verbose: + print("got version from file %s %s" % (versionfile_abs, ver)) + return ver + except NotThisMethod: + pass + + from_vcs_f = handlers.get("pieces_from_vcs") + if from_vcs_f: + try: + pieces = from_vcs_f(cfg.tag_prefix, root, verbose) + ver = render(pieces, cfg.style) + if verbose: + print("got version from VCS %s" % ver) + return ver + except NotThisMethod: + pass + + try: + if cfg.parentdir_prefix: + ver = versions_from_parentdir(cfg.parentdir_prefix, root, verbose) + if verbose: + print("got version from parentdir %s" % ver) + return ver + except NotThisMethod: + pass + + if verbose: + print("unable to compute version") + + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, "error": "unable to compute version", + "date": None} + + +def get_version(): + """Get the short version string for this project.""" + return get_versions()["version"] + + +def get_cmdclass(): + """Get the custom setuptools/distutils subclasses used by Versioneer.""" + if "versioneer" in sys.modules: + del sys.modules["versioneer"] + # this fixes the "python setup.py develop" case (also 'install' and + # 'easy_install .'), in which subdependencies of the main project are + # built (using setup.py bdist_egg) in the same python process. Assume + # a main project A and a dependency B, which use different versions + # of Versioneer. A's setup.py imports A's Versioneer, leaving it in + # sys.modules by the time B's setup.py is executed, causing B to run + # with the wrong versioneer. Setuptools wraps the sub-dep builds in a + # sandbox that restores sys.modules to it's pre-build state, so the + # parent is protected against the child's "import versioneer". By + # removing ourselves from sys.modules here, before the child build + # happens, we protect the child from the parent's versioneer too. + # Also see https://github.com/warner/python-versioneer/issues/52 + + cmds = {} + + # we add "version" to both distutils and setuptools + from distutils.core import Command + + class cmd_version(Command): + description = "report generated version string" + user_options = [] + boolean_options = [] + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + vers = get_versions(verbose=True) + print("Version: %s" % vers["version"]) + print(" full-revisionid: %s" % vers.get("full-revisionid")) + print(" dirty: %s" % vers.get("dirty")) + print(" date: %s" % vers.get("date")) + if vers["error"]: + print(" error: %s" % vers["error"]) + cmds["version"] = cmd_version + + # we override "build_py" in both distutils and setuptools + # + # most invocation pathways end up running build_py: + # distutils/build -> build_py + # distutils/install -> distutils/build ->.. + # setuptools/bdist_wheel -> distutils/install ->.. + # setuptools/bdist_egg -> distutils/install_lib -> build_py + # setuptools/install -> bdist_egg ->.. + # setuptools/develop -> ? + # pip install: + # copies source tree to a tempdir before running egg_info/etc + # if .git isn't copied too, 'git describe' will fail + # then does setup.py bdist_wheel, or sometimes setup.py install + # setup.py egg_info -> ? + + # we override different "build_py" commands for both environments + if "setuptools" in sys.modules: + from setuptools.command.build_py import build_py as _build_py + else: + from distutils.command.build_py import build_py as _build_py + + class cmd_build_py(_build_py): + def run(self): + root = get_root() + cfg = get_config_from_root(root) + versions = get_versions() + _build_py.run(self) + # now locate _version.py in the new build/ directory and replace + # it with an updated value + if cfg.versionfile_build: + target_versionfile = os.path.join(self.build_lib, + cfg.versionfile_build) + print("UPDATING %s" % target_versionfile) + write_to_version_file(target_versionfile, versions) + cmds["build_py"] = cmd_build_py + + if "cx_Freeze" in sys.modules: # cx_freeze enabled? + from cx_Freeze.dist import build_exe as _build_exe + # nczeczulin reports that py2exe won't like the pep440-style string + # as FILEVERSION, but it can be used for PRODUCTVERSION, e.g. + # setup(console=[{ + # "version": versioneer.get_version().split("+", 1)[0], # FILEVERSION + # "product_version": versioneer.get_version(), + # ... + + class cmd_build_exe(_build_exe): + def run(self): + root = get_root() + cfg = get_config_from_root(root) + versions = get_versions() + target_versionfile = cfg.versionfile_source + print("UPDATING %s" % target_versionfile) + write_to_version_file(target_versionfile, versions) + + _build_exe.run(self) + os.unlink(target_versionfile) + with open(cfg.versionfile_source, "w") as f: + LONG = LONG_VERSION_PY[cfg.VCS] + f.write(LONG % + {"DOLLAR": "$", + "STYLE": cfg.style, + "TAG_PREFIX": cfg.tag_prefix, + "PARENTDIR_PREFIX": cfg.parentdir_prefix, + "VERSIONFILE_SOURCE": cfg.versionfile_source, + }) + cmds["build_exe"] = cmd_build_exe + del cmds["build_py"] + + if 'py2exe' in sys.modules: # py2exe enabled? + try: + from py2exe.distutils_buildexe import py2exe as _py2exe # py3 + except ImportError: + from py2exe.build_exe import py2exe as _py2exe # py2 + + class cmd_py2exe(_py2exe): + def run(self): + root = get_root() + cfg = get_config_from_root(root) + versions = get_versions() + target_versionfile = cfg.versionfile_source + print("UPDATING %s" % target_versionfile) + write_to_version_file(target_versionfile, versions) + + _py2exe.run(self) + os.unlink(target_versionfile) + with open(cfg.versionfile_source, "w") as f: + LONG = LONG_VERSION_PY[cfg.VCS] + f.write(LONG % + {"DOLLAR": "$", + "STYLE": cfg.style, + "TAG_PREFIX": cfg.tag_prefix, + "PARENTDIR_PREFIX": cfg.parentdir_prefix, + "VERSIONFILE_SOURCE": cfg.versionfile_source, + }) + cmds["py2exe"] = cmd_py2exe + + # we override different "sdist" commands for both environments + if "setuptools" in sys.modules: + from setuptools.command.sdist import sdist as _sdist + else: + from distutils.command.sdist import sdist as _sdist + + class cmd_sdist(_sdist): + def run(self): + versions = get_versions() + self._versioneer_generated_versions = versions + # unless we update this, the command will keep using the old + # version + self.distribution.metadata.version = versions["version"] + return _sdist.run(self) + + def make_release_tree(self, base_dir, files): + root = get_root() + cfg = get_config_from_root(root) + _sdist.make_release_tree(self, base_dir, files) + # now locate _version.py in the new base_dir directory + # (remembering that it may be a hardlink) and replace it with an + # updated value + target_versionfile = os.path.join(base_dir, cfg.versionfile_source) + print("UPDATING %s" % target_versionfile) + write_to_version_file(target_versionfile, + self._versioneer_generated_versions) + cmds["sdist"] = cmd_sdist + + return cmds + + +CONFIG_ERROR = """ +setup.cfg is missing the necessary Versioneer configuration. You need +a section like: + + [versioneer] + VCS = git + style = pep440 + versionfile_source = src/myproject/_version.py + versionfile_build = myproject/_version.py + tag_prefix = + parentdir_prefix = myproject- + +You will also need to edit your setup.py to use the results: + + import versioneer + setup(version=versioneer.get_version(), + cmdclass=versioneer.get_cmdclass(), ...) + +Please read the docstring in ./versioneer.py for configuration instructions, +edit setup.cfg, and re-run the installer or 'python versioneer.py setup'. +""" + +SAMPLE_CONFIG = """ +# See the docstring in versioneer.py for instructions. Note that you must +# re-run 'versioneer.py setup' after changing this section, and commit the +# resulting files. + +[versioneer] +#VCS = git +#style = pep440 +#versionfile_source = +#versionfile_build = +#tag_prefix = +#parentdir_prefix = + +""" + +INIT_PY_SNIPPET = """ +from ._version import get_versions +__version__ = get_versions()['version'] +del get_versions +""" + + +def do_setup(): + """Main VCS-independent setup function for installing Versioneer.""" + root = get_root() + try: + cfg = get_config_from_root(root) + except (EnvironmentError, configparser.NoSectionError, + configparser.NoOptionError) as e: + if isinstance(e, (EnvironmentError, configparser.NoSectionError)): + print("Adding sample versioneer config to setup.cfg", + file=sys.stderr) + with open(os.path.join(root, "setup.cfg"), "a") as f: + f.write(SAMPLE_CONFIG) + print(CONFIG_ERROR, file=sys.stderr) + return 1 + + print(" creating %s" % cfg.versionfile_source) + with open(cfg.versionfile_source, "w") as f: + LONG = LONG_VERSION_PY[cfg.VCS] + f.write(LONG % {"DOLLAR": "$", + "STYLE": cfg.style, + "TAG_PREFIX": cfg.tag_prefix, + "PARENTDIR_PREFIX": cfg.parentdir_prefix, + "VERSIONFILE_SOURCE": cfg.versionfile_source, + }) + + ipy = os.path.join(os.path.dirname(cfg.versionfile_source), + "__init__.py") + if os.path.exists(ipy): + try: + with open(ipy, "r") as f: + old = f.read() + except EnvironmentError: + old = "" + if INIT_PY_SNIPPET not in old: + print(" appending to %s" % ipy) + with open(ipy, "a") as f: + f.write(INIT_PY_SNIPPET) + else: + print(" %s unmodified" % ipy) + else: + print(" %s doesn't exist, ok" % ipy) + ipy = None + + # Make sure both the top-level "versioneer.py" and versionfile_source + # (PKG/_version.py, used by runtime code) are in MANIFEST.in, so + # they'll be copied into source distributions. Pip won't be able to + # install the package without this. + manifest_in = os.path.join(root, "MANIFEST.in") + simple_includes = set() + try: + with open(manifest_in, "r") as f: + for line in f: + if line.startswith("include "): + for include in line.split()[1:]: + simple_includes.add(include) + except EnvironmentError: + pass + # That doesn't cover everything MANIFEST.in can do + # (http://docs.python.org/2/distutils/sourcedist.html#commands), so + # it might give some false negatives. Appending redundant 'include' + # lines is safe, though. + if "versioneer.py" not in simple_includes: + print(" appending 'versioneer.py' to MANIFEST.in") + with open(manifest_in, "a") as f: + f.write("include versioneer.py\n") + else: + print(" 'versioneer.py' already in MANIFEST.in") + if cfg.versionfile_source not in simple_includes: + print(" appending versionfile_source ('%s') to MANIFEST.in" % + cfg.versionfile_source) + with open(manifest_in, "a") as f: + f.write("include %s\n" % cfg.versionfile_source) + else: + print(" versionfile_source already in MANIFEST.in") + + # Make VCS-specific changes. For git, this means creating/changing + # .gitattributes to mark _version.py for export-subst keyword + # substitution. + do_vcs_install(manifest_in, cfg.versionfile_source, ipy) + return 0 + + +def scan_setup_py(): + """Validate the contents of setup.py against Versioneer's expectations.""" + found = set() + setters = False + errors = 0 + with open("setup.py", "r") as f: + for line in f.readlines(): + if "import versioneer" in line: + found.add("import") + if "versioneer.get_cmdclass()" in line: + found.add("cmdclass") + if "versioneer.get_version()" in line: + found.add("get_version") + if "versioneer.VCS" in line: + setters = True + if "versioneer.versionfile_source" in line: + setters = True + if len(found) != 3: + print("") + print("Your setup.py appears to be missing some important items") + print("(but I might be wrong). Please make sure it has something") + print("roughly like the following:") + print("") + print(" import versioneer") + print(" setup( version=versioneer.get_version(),") + print(" cmdclass=versioneer.get_cmdclass(), ...)") + print("") + errors += 1 + if setters: + print("You should remove lines like 'versioneer.VCS = ' and") + print("'versioneer.versionfile_source = ' . This configuration") + print("now lives in setup.cfg, and should be removed from setup.py") + print("") + errors += 1 + return errors + + +if __name__ == "__main__": + cmd = sys.argv[1] + if cmd == "setup": + errors = do_setup() + errors += scan_setup_py() + if errors: + sys.exit(1) From 5b1d05f2e1776073d5baa941fb3ad63edc4c0d8f Mon Sep 17 00:00:00 2001 From: kayibal Date: Tue, 25 Jul 2017 15:18:36 +0200 Subject: [PATCH 34/76] Add support to save npz files on s3 (#15) * Add support to save npz files on s3 * fix ci * fix ci * fix to_npz * Add mock_s3_fs docstring --- circle.yml | 2 +- setup.py | 6 +++- sparsity/io.py | 27 ++++++++++++++-- sparsity/test/test_sparse_frame.py | 49 ++++++++++++++++++++++++++++++ 4 files changed, 80 insertions(+), 4 deletions(-) diff --git a/circle.yml b/circle.yml index 02d8cb8..8cfa0ac 100644 --- a/circle.yml +++ b/circle.yml @@ -11,7 +11,7 @@ dependencies: - pip install numpy cython 2>&1 - pip install pytest pytest-cov - pip install -v scipy pandas - - pip install dask[dataframe] + - pip install dask[dataframe] moto test: override: - pip install . diff --git a/setup.py b/setup.py index 5d70bc8..7ffa576 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,11 @@ install_requires=[ 'pandas>=0.19.0', 'scipy>=0.18.1', - 'numpy>=1.12.0' + 'numpy>=1.12.0', + 's3fs>=0.1.0' ], + test_requires=[ + 'moto' + ], zip_safe=False ) \ No newline at end of file diff --git a/sparsity/io.py b/sparsity/io.py index 6f5c0d0..83d07d3 100644 --- a/sparsity/io.py +++ b/sparsity/io.py @@ -1,5 +1,8 @@ +from io import BytesIO + import numpy as np import pandas as pd +from s3fs import S3FileSystem from scipy import sparse try: @@ -24,17 +27,37 @@ def traildb_to_coo(db, fieldname): return uuids, timestamps, cols,\ sparse.coo_matrix((np.ones(num_events), (r_idx, c_idx))) + def to_npz(sf, filename): data = _csr_to_dict(sf.data) data['metadata'] = \ {'multiindex': True if isinstance(sf.index, pd.MultiIndex) else False} data['frame_index'] = sf.index.values data['frame_columns'] = sf.columns.values - np.savez(filename, **data) + if not filename.endswith('.npz'): + filename += '.npz' + if not filename.startswith('s3://'): + fp = open(filename, 'wb') + np.savez(fp, **data) + else: + _save_npz_s3(data, filename) + + +def _save_npz_s3(data, filename): + buffer = BytesIO() + np.savez(buffer, **data) + buffer.seek(0) + fs = S3FileSystem() + fp = fs.open(filename, 'wb') + fp.write(buffer.read()) def read_npz(filename): - loader = np.load(filename) + open_f = open if not filename.startswith('s3://') \ + else S3FileSystem().open + fp = open_f(filename, 'rb') + + loader = np.load(fp) csr_mat = _load_csr(loader) idx = _load_idx_from_npz(loader) cols = loader['frame_columns'] diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 17469d4..61e150c 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -2,9 +2,13 @@ import datetime as dt import os +#import dask.dataframe as dd +from contextlib import contextmanager + import numpy as np import pandas as pd import pytest +from moto import mock_s3 from scipy import sparse from sparsity import SparseFrame, sparse_one_hot from sparsity.io import _csr_to_dict @@ -17,6 +21,41 @@ traildb = False +@contextmanager +def mock_s3_fs(bucket, data=None): + """Mocks an s3 bucket + + Parameters + ---------- + bucket: str + bucket name + data: dict + dictionary with paths relative to bucket and + bytestrings as values. Will mock data in bucket + if supplied. + + Returns + ------- + """ + try: + m = mock_s3() + m.start() + import boto3 + import s3fs + client = boto3.client('s3', region_name='eu-west-1') + client.create_bucket(Bucket=bucket) + if data is not None: + data = data.copy() + for key, value in data.items(): + client.put_object(Bucket=bucket, Key=key, Body=value) + yield + finally: + if data is not None: + for key in data.keys(): + client.delete_object(Bucket=bucket, Key=key) + m.stop() + + # 2017 starts with a sunday @pytest.fixture() def sampledata(): @@ -534,6 +573,16 @@ def test_npz_io(complex_example): os.remove('/tmp/sparse.npz') +def test_npz_io_s3(complex_example): + with mock_s3_fs('sparsity'): + sf, second, third = complex_example + sf.to_npz('s3://sparsity/sparse.npz') + loaded = SparseFrame.read_npz('s3://sparsity/sparse.npz') + assert np.all(loaded.data.todense() == sf.data.todense()) + assert np.all(loaded.index == sf.index) + assert np.all(loaded.columns == sf.columns) + + def test_getitem(): sf = SparseFrame(np.identity(10), columns=list('abcdefghij')) assert sf['a'].data.todense()[0] == 1 From a5a713b018e312c5a7efade19185cdab3750528d Mon Sep 17 00:00:00 2001 From: michcio1234 Date: Wed, 25 Oct 2017 13:41:30 +0200 Subject: [PATCH 35/76] Bugfix: one-hot encoding column of category dtype --- sparsity/sparse_frame.py | 2 +- sparsity/test/test_dask_sparse_frame.py | 16 ++++++++++++++++ sparsity/test/test_sparse_frame.py | 25 ++++++++++++++++++++++++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 84f5fd4..e90c5c4 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -685,7 +685,7 @@ def sparse_one_hot(df, column=None, categories=None, dtype='f8', def _one_hot_series_csr(categories, dtype, oh_col): if types.is_categorical_dtype(oh_col): - cat = oh_col + cat = oh_col.cat else: s = oh_col cat = pd.Categorical(s, np.asarray(categories)) diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index efb167d..592bcd7 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -119,6 +119,22 @@ def test_one_hot_no_order(clickstream): assert sorted(sf.columns) == list('ABCDEFGHIJ') +def test_one_hot_no_order_categorical(clickstream): + clickstream['other_categorical'] = clickstream['other_categorical'] \ + .astype('category') + ddf = dd.from_pandas(clickstream, npartitions=10) + dsf = one_hot_encode(ddf, + categories={'page_id': list('ABCDE'), + 'other_categorical': list('FGHIJ')}, + index_col=['index', 'id']) + assert dsf._meta.empty + assert sorted(dsf.columns) == list('ABCDEFGHIJ') + sf = dsf.compute() + assert sf.shape == (100, 10) + assert isinstance(sf.index, pd.MultiIndex) + assert sorted(sf.columns) == list('ABCDEFGHIJ') + + def test_one_hot_prefixes(clickstream): ddf = dd.from_pandas(clickstream, npartitions=10) dsf = one_hot_encode(ddf, diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 61e150c..3cb9cf5 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -59,12 +59,18 @@ def mock_s3_fs(bucket, data=None): # 2017 starts with a sunday @pytest.fixture() def sampledata(): - def gendata(n): + def gendata(n, categorical=False): sample_data = pd.DataFrame( dict(date=pd.date_range("2017-01-01", periods=n))) sample_data["weekday"] = sample_data.date.dt.weekday_name sample_data["weekday_abbr"] = sample_data.weekday.apply( lambda x: x[:3]) + + if categorical: + sample_data['weekday'] = sample_data['weekday'].astype('category') + sample_data['weekday_abbr'] = sample_data['weekday_abbr'] \ + .astype('category') + sample_data["id"] = np.tile(np.arange(7), len(sample_data) // 7 + 1)[ :len(sample_data)] return sample_data @@ -468,6 +474,23 @@ def test_csr_one_hot_series(sampledata, weekdays, weekdays_abbr): assert all(sparse_frame.columns == (weekdays + weekdays_abbr)) +def test_csr_one_hot_series_categorical(sampledata, weekdays, weekdays_abbr): + correct = np.hstack((np.identity(7) * 7, + np.identity(7) * 7)) + + categories = {'weekday': weekdays, + 'weekday_abbr': weekdays_abbr} + + sparse_frame = sparse_one_hot(sampledata(49, categorical=True), + categories=categories, + order=['weekday', 'weekday_abbr']) + + res = sparse_frame.groupby_sum(np.tile(np.arange(7), 7)).data.todense() + assert np.all(res == correct) + assert all(sparse_frame.columns == (weekdays + weekdays_abbr)) + + + def test_csr_one_hot_series_other_order(sampledata, weekdays, weekdays_abbr): categories = {'weekday': weekdays, From a62753dfd89bf67dd419906b7436f8e9d569580d Mon Sep 17 00:00:00 2001 From: michcio1234 Date: Thu, 2 Nov 2017 16:17:55 +0100 Subject: [PATCH 36/76] It's possible to raise an exception or to ignore the situation when given categories' order doesn't match categorical column's categories order. --- sparsity/dask/reshape.py | 9 ++++++-- sparsity/sparse_frame.py | 34 +++++++++++++++++++++++++++--- sparsity/test/test_sparse_frame.py | 15 +++++++++---- 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/sparsity/dask/reshape.py b/sparsity/dask/reshape.py index bfb686c..1ad4422 100644 --- a/sparsity/dask/reshape.py +++ b/sparsity/dask/reshape.py @@ -9,7 +9,8 @@ def one_hot_encode(ddf, column=None, categories=None, index_col=None, - order=None, prefixes=False): + order=None, prefixes=False, + ignore_cat_order_mismatch=False): """ Sparse one hot encoding of dask.DataFrame. @@ -46,6 +47,7 @@ def one_hot_encode(ddf, column=None, categories=None, index_col=None, [col1_cat11, col1_cat12, col2_cat21, col2_cat22, ...]. column: DEPRECATED Kept only for backward compatibility. + ignore_cat_order_mismatch: str, 'raise' or 'ignore' Returns ------- @@ -71,7 +73,9 @@ def one_hot_encode(ddf, column=None, categories=None, index_col=None, columns = sparse_one_hot(ddf._meta, categories=categories, index_col=index_col, - prefixes=prefixes).columns + prefixes=prefixes, + ignore_cat_order_mismatch=ignore_cat_order_mismatch + ).columns meta = sp.SparseFrame(np.array([]), columns=columns, index=idx_meta) @@ -79,6 +83,7 @@ def one_hot_encode(ddf, column=None, categories=None, index_col=None, categories=categories, index_col=index_col, prefixes=prefixes, + ignore_cat_order_mismatch=ignore_cat_order_mismatch, meta=object) return SparseFrame(dsf.dask, dsf._name, meta, dsf.divisions) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index e90c5c4..d677477 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -638,7 +638,8 @@ def _create_group_matrix(group_idx, dtype='f8'): def sparse_one_hot(df, column=None, categories=None, dtype='f8', - index_col=None, order=None, prefixes=False): + index_col=None, order=None, prefixes=False, + ignore_cat_order_mismatch=False): """ One-hot encode specified columns of a pandas.DataFrame. Returns a SparseFrame. @@ -664,7 +665,10 @@ def sparse_one_hot(df, column=None, categories=None, dtype='f8', for column, column_cat in categories.items(): if isinstance(column_cat, str): column_cat = _just_read_array(column_cat) - cols, csr = _one_hot_series_csr(column_cat, dtype, df[column]) + cols, csr = _one_hot_series_csr( + column_cat, dtype, df[column], + ignore_cat_order_mismatch=ignore_cat_order_mismatch + ) if prefixes: cols = list(map(lambda x: '{}_{}'.format(column, x), cols)) new_cols.extend(cols) @@ -683,9 +687,13 @@ def sparse_one_hot(df, column=None, categories=None, dtype='f8', return SparseFrame(new_data, index=new_index, columns=new_cols) -def _one_hot_series_csr(categories, dtype, oh_col): +def _one_hot_series_csr(categories, dtype, oh_col, + ignore_cat_order_mismatch=False): if types.is_categorical_dtype(oh_col): cat = oh_col.cat + _check_categories_order(cat, categories, oh_col, + ignore_cat_order_mismatch) + else: s = oh_col cat = pd.Categorical(s, np.asarray(categories)) @@ -703,3 +711,23 @@ def _one_hot_series_csr(categories, dtype, oh_col): shape=(n_samples, n_features), dtype=dtype).tocsr() return cat.categories.values, data + + +def _check_categories_order(cat, categories, oh_col, + ignore_cat_order_mismatch): + + if list(categories) == list(cat.categories): + return + + if set(categories) != set(cat.categories) \ + or not ignore_cat_order_mismatch: + + mismatch_type = 'order' if set(categories) == set(cat.categories) \ + else 'set' + + raise ValueError( + "Got categorical column {column_name} whose categories " + "{mismatch_type} doesn't match categories {mismatch_type} " + "given as argument to this function.".format( + column_name=oh_col.name, mismatch_type=mismatch_type + )) diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 3cb9cf5..1e56024 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -481,14 +481,21 @@ def test_csr_one_hot_series_categorical(sampledata, weekdays, weekdays_abbr): categories = {'weekday': weekdays, 'weekday_abbr': weekdays_abbr} + with pytest.raises(ValueError): + sparse_frame = sparse_one_hot(sampledata(49, categorical=True), + categories=categories, + order=['weekday', 'weekday_abbr'], + ignore_cat_order_mismatch=False) + sparse_frame = sparse_one_hot(sampledata(49, categorical=True), categories=categories, - order=['weekday', 'weekday_abbr']) + order=['weekday', 'weekday_abbr'], + ignore_cat_order_mismatch=True) - res = sparse_frame.groupby_sum(np.tile(np.arange(7), 7)).data.todense() + res = sparse_frame.groupby_sum(np.tile(np.arange(7), 7)) \ + .todense()[weekdays + weekdays_abbr].values assert np.all(res == correct) - assert all(sparse_frame.columns == (weekdays + weekdays_abbr)) - + assert set(sparse_frame.columns) == set(weekdays + weekdays_abbr) def test_csr_one_hot_series_other_order(sampledata, weekdays, weekdays_abbr): From 0e0ec7662678cd8921205902c9c743c9f19bbc54 Mon Sep 17 00:00:00 2001 From: kayibal Date: Mon, 6 Nov 2017 11:33:21 +0100 Subject: [PATCH 37/76] add private take method to support indexing in pandas 0.21.0 (#20) --- sparsity/sparse_frame.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 84f5fd4..2576aaa 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -203,6 +203,15 @@ def take(self, idx, axis=0, **kwargs): index=self.index, columns=self.columns[idx]) + def _take(self, *args, **kwargs): + """ + This function is to mimic pandas api (0.21.0) + and support indexing. + + See https://github.com/pandas-dev/pandas/commit/458c1dc81b7e6f90180b06179ac91d9ed868cb05 + """ + return self.take(*args, **kwargs) + def _xs(self, key, *args, **kwargs): """Used for label based indexing.""" loc = self.index.get_loc(key) @@ -537,7 +546,7 @@ def __getitem__(self, item): for key in item: idx.append(self.columns.get_loc(key)) return SparseFrame(self.data[:,idx], index=self.index, - columns=[item]) + columns=item) def dropna(self): """Drop nans from index.""" From 5c3ceb3a75b8e55a70ec461a233f232c263795c9 Mon Sep 17 00:00:00 2001 From: michcio1234 Date: Wed, 8 Nov 2017 16:29:55 +0100 Subject: [PATCH 38/76] Cleaner code, better documentation and more tests. --- sparsity/dask/reshape.py | 18 ++++++-- sparsity/sparse_frame.py | 25 ++++++---- sparsity/test/test_sparse_frame.py | 74 ++++++++++++++++++++++++++++-- 3 files changed, 99 insertions(+), 18 deletions(-) diff --git a/sparsity/dask/reshape.py b/sparsity/dask/reshape.py index 1ad4422..3bc0d68 100644 --- a/sparsity/dask/reshape.py +++ b/sparsity/dask/reshape.py @@ -22,8 +22,11 @@ def one_hot_encode(ddf, column=None, categories=None, index_col=None, ddf: dask.DataFrame e.g. the clickstream categories: dict - Maps column name -> iterable of possible category values. - See description of `order`. + Maps ``column name`` -> ``iterable of possible category values``. + Can be also ``column name`` -> ``None`` if this column is already + of categorical dtype. + This argument decides which column(s) will be encoded. + See description of `order` and `ignore_cat_order_mismatch`. index_col: str | iterable which columns to use as index order: iterable @@ -47,7 +50,16 @@ def one_hot_encode(ddf, column=None, categories=None, index_col=None, [col1_cat11, col1_cat12, col2_cat21, col2_cat22, ...]. column: DEPRECATED Kept only for backward compatibility. - ignore_cat_order_mismatch: str, 'raise' or 'ignore' + ignore_cat_order_mismatch: bool + If a column being one-hot encoded is of categorical dtype, it has + its categories already predefined, so we don't need to explicitly pass + them in `categories` argument (see this argument's description). + However, if we pass them, they may be different than ones defined in + column.cat.categories. In such a situation, a ValueError will be + raised. However, if only orders of categories are different (but sets + of elements are same), you may specify ignore_cat_order_mismatch=True + to suppress this error. In such a situation, column's predefined + categories will be used. Returns ------- diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index d677477..908f097 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -691,7 +691,7 @@ def _one_hot_series_csr(categories, dtype, oh_col, ignore_cat_order_mismatch=False): if types.is_categorical_dtype(oh_col): cat = oh_col.cat - _check_categories_order(cat, categories, oh_col, + _check_categories_order(cat.categories, categories, oh_col.name, ignore_cat_order_mismatch) else: @@ -713,21 +713,26 @@ def _one_hot_series_csr(categories, dtype, oh_col, return cat.categories.values, data -def _check_categories_order(cat, categories, oh_col, +def _check_categories_order(categories1, categories2, categorical_column_name, ignore_cat_order_mismatch): + """Check if two lists of categories differ. If they have different + elements, raise an exception. If they differ only by order of elements, + raise an issue unless ignore_cat_order_mismatch is set.""" - if list(categories) == list(cat.categories): + if categories2 is None or list(categories2) == list(categories1): return - if set(categories) != set(cat.categories) \ - or not ignore_cat_order_mismatch: - - mismatch_type = 'order' if set(categories) == set(cat.categories) \ - else 'set' + if set(categories2) == set(categories1): + mismatch_type = 'order' + else: + mismatch_type = 'set' + if mismatch_type == 'set' or not ignore_cat_order_mismatch: raise ValueError( "Got categorical column {column_name} whose categories " "{mismatch_type} doesn't match categories {mismatch_type} " "given as argument to this function.".format( - column_name=oh_col.name, mismatch_type=mismatch_type - )) + column_name=categorical_column_name, + mismatch_type=mismatch_type + ) + ) diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 1e56024..6a48149 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -474,20 +474,84 @@ def test_csr_one_hot_series(sampledata, weekdays, weekdays_abbr): assert all(sparse_frame.columns == (weekdays + weekdays_abbr)) -def test_csr_one_hot_series_categorical(sampledata, weekdays, weekdays_abbr): +def test_csr_one_hot_series_categorical_same_order(sampledata, weekdays, + weekdays_abbr): correct = np.hstack((np.identity(7) * 7, np.identity(7) * 7)) - categories = {'weekday': weekdays, - 'weekday_abbr': weekdays_abbr} + data = sampledata(49, categorical=True) + + categories = {'weekday': data['weekday'].cat.categories.tolist(), + 'weekday_abbr': data['weekday_abbr'].cat.categories.tolist()} + + sparse_frame = sparse_one_hot(data, + categories=categories, + order=['weekday', 'weekday_abbr'], + ignore_cat_order_mismatch=False) + + res = sparse_frame.groupby_sum(np.tile(np.arange(7), 7)) \ + .todense()[weekdays + weekdays_abbr].values + assert np.all(res == correct) + assert set(sparse_frame.columns) == set(weekdays + weekdays_abbr) + + +def test_csr_one_hot_series_categorical_different_order(sampledata, weekdays, + weekdays_abbr): + correct = np.hstack((np.identity(7) * 7, + np.identity(7) * 7)) + + data = sampledata(49, categorical=True) + + categories = { + 'weekday': data['weekday'].cat.categories.tolist()[::-1], + 'weekday_abbr': data['weekday_abbr'].cat.categories.tolist()[::-1] + } with pytest.raises(ValueError): - sparse_frame = sparse_one_hot(sampledata(49, categorical=True), + sparse_frame = sparse_one_hot(data, categories=categories, order=['weekday', 'weekday_abbr'], ignore_cat_order_mismatch=False) - sparse_frame = sparse_one_hot(sampledata(49, categorical=True), + +def test_csr_one_hot_series_categorical_different_order_ignore( + sampledata, weekdays, weekdays_abbr): + + correct = np.hstack((np.identity(7) * 7, + np.identity(7) * 7)) + + data = sampledata(49, categorical=True) + + categories = { + 'weekday': data['weekday'].cat.categories.tolist()[::-1], + 'weekday_abbr': data['weekday_abbr'].cat.categories.tolist()[::-1] + } + + sparse_frame = sparse_one_hot(data, + categories=categories, + order=['weekday', 'weekday_abbr'], + ignore_cat_order_mismatch=True) + + res = sparse_frame.groupby_sum(np.tile(np.arange(7), 7)) \ + .todense()[weekdays + weekdays_abbr].values + assert np.all(res == correct) + assert set(sparse_frame.columns) == set(weekdays + weekdays_abbr) + + +def test_csr_one_hot_series_categorical_no_categories( + sampledata, weekdays, weekdays_abbr): + + correct = np.hstack((np.identity(7) * 7, + np.identity(7) * 7)) + + data = sampledata(49, categorical=True) + + categories = { + 'weekday': None, + 'weekday_abbr': None + } + + sparse_frame = sparse_one_hot(data, categories=categories, order=['weekday', 'weekday_abbr'], ignore_cat_order_mismatch=True) From 060d09fff96426867a67ff00494ea7faf262c9ca Mon Sep 17 00:00:00 2001 From: kayibal Date: Tue, 14 Nov 2017 10:39:33 +0100 Subject: [PATCH 39/76] Implement multipart upload with default block_size=100MB (#23) * implement multipart upload with default block_size=100MB * fix get_sync imports --- sparsity/io.py | 17 +++++++++++------ sparsity/sparse_frame.py | 19 ++++++++++++++++--- sparsity/test/test_dask_sparse_frame.py | 4 ++-- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/sparsity/io.py b/sparsity/io.py index 83d07d3..0dcbc9c 100644 --- a/sparsity/io.py +++ b/sparsity/io.py @@ -28,7 +28,7 @@ def traildb_to_coo(db, fieldname): sparse.coo_matrix((np.ones(num_events), (r_idx, c_idx))) -def to_npz(sf, filename): +def to_npz(sf, filename, block_size=None): data = _csr_to_dict(sf.data) data['metadata'] = \ {'multiindex': True if isinstance(sf.index, pd.MultiIndex) else False} @@ -40,17 +40,22 @@ def to_npz(sf, filename): fp = open(filename, 'wb') np.savez(fp, **data) else: - _save_npz_s3(data, filename) + _save_npz_s3(data, filename, block_size) -def _save_npz_s3(data, filename): +def _save_npz_s3(data, filename, block_size=None): + if block_size is None: + block_size = 2**20 * 100 # 100 MB buffer = BytesIO() np.savez(buffer, **data) buffer.seek(0) fs = S3FileSystem() - fp = fs.open(filename, 'wb') - fp.write(buffer.read()) - + with fs.open(filename, 'wb', block_size) as s3f: + while True: + data = buffer.read(block_size) + if len(data) == 0: + break + s3f.write(data) def read_npz(filename): open_f = open if not filename.startswith('s3://') \ diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 5d9fc9a..89debe9 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -593,9 +593,22 @@ def read_npz(cls, filename): """"Read from numpy npz format.""" return cls(*read_npz(filename)) - def to_npz(self, filename): - """Save to numpy npz format.""" - to_npz(self, filename) + def to_npz(self, filename, block_size=None): + """Save to numpy npz format. + + Parameters + ---------- + filename: str + path to local file ot s3 path starting with `s3://` + block_size: int + block size in bytes only has effect if uploading to s3 + if set to None default block will be 100MB + + Returns + ------- + None + """ + to_npz(self, filename, block_size) def _aligned_csr_elop(a, b, a_idx, b_idx, op='_plus_', how='outer'): diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index 592bcd7..f3ec155 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -8,13 +8,13 @@ import pytest import sparsity as sp import sparsity.dask as dsp -from dask.async import get_sync +from dask.local import get_sync from sparsity import sparse_one_hot from sparsity.dask.reshape import one_hot_encode from .conftest import tmpdir -dask.context.set_options(get=dask.async.get_sync) +dask.context.set_options(get=dask.local.get_sync) @pytest.fixture From 660bbb0b66af099675961eebdacb52b33d153cf0 Mon Sep 17 00:00:00 2001 From: kayibal Date: Tue, 28 Nov 2017 15:47:16 +0100 Subject: [PATCH 40/76] support empty frames in elemntwise operations (#21) --- sparsity/sparse_frame.py | 21 ++++++++++++++++++++- sparsity/test/test_sparse_frame.py | 14 ++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 89debe9..954eaa3 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -386,18 +386,25 @@ def fillna(self, value): return SparseFrame(data=_data[:-1, :], index=self.index, columns=self.columns) - def add(self, other, how='outer', **kwargs): + def add(self, other, how='outer', fill_value=0, **kwargs): """ Aligned addition. Adds two tables by aligning them first. Parameters ---------- other: sparsity.SparseFrame + fill_value: float + fill value if other frame is not exactly the same shape + for sparse data the only sensible fill value is 0 passing + any other value will result in a ValueError Returns ------- added: sparsity.SparseFrame """ + if fill_value != 0: + raise ValueError("Only 0 is accepted as fill_value " + "for sparse data.") assert np.all(self._columns == other.columns) data, new_idx = _aligned_csr_elop(self._data, other._data, self.index, other.index, @@ -611,8 +618,20 @@ def to_npz(self, filename, block_size=None): to_npz(self, filename, block_size) +def _axis_is_empty(csr, axis=0): + return csr.shape[axis] == 0 + + def _aligned_csr_elop(a, b, a_idx, b_idx, op='_plus_', how='outer'): """Assume data == 0 at loc[-1]""" + + # handle emtpy cases + if _axis_is_empty(a): + return b[:-1,:], b_idx + + if _axis_is_empty(b): + return a[:-1,:], a_idx + join_idx, lidx, ridx = a_idx.join(b_idx, return_indexers=True, how=how) if lidx is None: diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 6a48149..1d0ee8d 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -875,3 +875,17 @@ def test_drop_multiple_labels(): correct = np.identity(5)[:, [1, 3, 4]] assert sf.columns.tolist() == list('BDE') np.testing.assert_array_equal(sf.data.todense(), correct) + + +def test_empty_elemwise(): + sf_empty = SparseFrame(np.array([]), columns=['A', 'B']) + sf = SparseFrame(np.identity(2), columns=['A', 'B']) + + res = sf_empty.add(sf).data.todense() + assert np.all(res == sf.data.todense()) + + res = sf.add(sf_empty).data.todense() + assert np.all(res == sf.data.todense()) + + with pytest.raises(ValueError): + res = sf.add(sf_empty, fill_value=None) From e61fa5fe4c6895500b9e2303a6886d7e8fc0e763 Mon Sep 17 00:00:00 2001 From: kayibal Date: Tue, 28 Nov 2017 16:02:42 +0100 Subject: [PATCH 41/76] add support for arbritary remote storages (#24) --- setup.py | 1 - sparsity/io.py | 86 +++++++++++++++++++++++++++++----------- sparsity/sparse_frame.py | 24 ++++++----- 3 files changed, 77 insertions(+), 34 deletions(-) diff --git a/setup.py b/setup.py index 7ffa576..b09dac8 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,3 @@ -import os import versioneer from distutils.core import setup, Extension from setuptools import find_packages diff --git a/sparsity/io.py b/sparsity/io.py index 0dcbc9c..0953a53 100644 --- a/sparsity/io.py +++ b/sparsity/io.py @@ -1,8 +1,8 @@ from io import BytesIO +from urllib.parse import urlparse import numpy as np import pandas as pd -from s3fs import S3FileSystem from scipy import sparse try: @@ -11,6 +11,32 @@ except (ImportError, OSError): TrailDB = False +_filesystems = {} + +try: + from dask.bytes.local import LocalFileSystem +except ImportError: + + class LocalFileSystem: + open = open + +_filesystems[''] = LocalFileSystem +_filesystems['file'] = LocalFileSystem + +try: + import s3fs + _filesystems['s3'] = s3fs.S3FileSystem +except ImportError: + pass + +try: + import gcsfs + _filesystems['gs'] = gcsfs.GCSFileSystem + _filesystems['gcs'] = gcsfs.GCSFileSystem +except ImportError: + pass + + def traildb_to_coo(db, fieldname): if not TrailDB: raise ImportError("Could not find traildb") @@ -28,7 +54,7 @@ def traildb_to_coo(db, fieldname): sparse.coo_matrix((np.ones(num_events), (r_idx, c_idx))) -def to_npz(sf, filename, block_size=None): +def to_npz(sf, filename, block_size=None, storage_options=None): data = _csr_to_dict(sf.data) data['metadata'] = \ {'multiindex': True if isinstance(sf.index, pd.MultiIndex) else False} @@ -36,43 +62,55 @@ def to_npz(sf, filename, block_size=None): data['frame_columns'] = sf.columns.values if not filename.endswith('.npz'): filename += '.npz' - if not filename.startswith('s3://'): - fp = open(filename, 'wb') - np.savez(fp, **data) - else: - _save_npz_s3(data, filename, block_size) - -def _save_npz_s3(data, filename, block_size=None): - if block_size is None: - block_size = 2**20 * 100 # 100 MB - buffer = BytesIO() - np.savez(buffer, **data) - buffer.seek(0) - fs = S3FileSystem() - with fs.open(filename, 'wb', block_size) as s3f: + protocol = urlparse(filename).scheme or 'file' + if protocol == 'file': + with open(filename, 'wb') as fp: + np.savez(fp, **data) + else: + if block_size is None: + block_size = 2 ** 20 * 100 # 100 MB + buffer = BytesIO() + np.savez(buffer, **data) + buffer.seek(0) + _save_remote(buffer, filename, block_size, storage_options) + + +def _save_remote(buffer, filename, block_size=None, storage_options=None): + if storage_options is None: + storage_options = {} + protocol = urlparse(filename).scheme + fs = _filesystems[protocol](**storage_options) + with fs.open(filename, 'wb', block_size) as remote_f: while True: data = buffer.read(block_size) if len(data) == 0: break - s3f.write(data) + remote_f.write(data) + -def read_npz(filename): - open_f = open if not filename.startswith('s3://') \ - else S3FileSystem().open +def read_npz(filename, storage_options=None): + if storage_options is None: + storage_options = {} + protocol = urlparse(filename).scheme or 'file' + open_f = _filesystems[protocol](**storage_options).open fp = open_f(filename, 'rb') loader = np.load(fp) - csr_mat = _load_csr(loader) - idx = _load_idx_from_npz(loader) - cols = loader['frame_columns'] - return (csr_mat, idx, cols) + try: + csr_mat = _load_csr(loader) + idx = _load_idx_from_npz(loader) + cols = loader['frame_columns'] + finally: + loader.close() + return csr_mat, idx, cols def _csr_to_dict(array): return dict(data = array.data ,indices=array.indices, indptr =array.indptr, shape=array.shape) + def _load_csr(loader): return sparse.csr_matrix((loader['data'], loader['indices'], diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 954eaa3..cbc8a9d 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -377,7 +377,7 @@ def sort_index(self): passive_sort_idx = np.argsort(self._index) data = self._data[passive_sort_idx] index = self._index[passive_sort_idx] - return SparseFrame(data, index=index) + return SparseFrame(data, index=index, columns=self.columns) def fillna(self, value): """Replace NaN values in explicitly stored data with `value`.""" @@ -551,7 +551,11 @@ def __getitem__(self, item): item = [item] idx = [] for key in item: - idx.append(self.columns.get_loc(key)) + loc = self.columns.get_loc(key) + # weired error appears here with movielens dataset + if not isinstance(loc, int): + loc = self.columns.tolist().index(key) + idx.append(loc) return SparseFrame(self.data[:,idx], index=self.index, columns=item) @@ -596,11 +600,11 @@ def vstack(cls, frames): columns=frames[0].columns) @classmethod - def read_npz(cls, filename): + def read_npz(cls, filename, storage_options=None): """"Read from numpy npz format.""" - return cls(*read_npz(filename)) + return cls(*read_npz(filename, storage_options)) - def to_npz(self, filename, block_size=None): + def to_npz(self, filename, block_size=None, storage_options=None): """Save to numpy npz format. Parameters @@ -608,14 +612,16 @@ def to_npz(self, filename, block_size=None): filename: str path to local file ot s3 path starting with `s3://` block_size: int - block size in bytes only has effect if uploading to s3 - if set to None default block will be 100MB - + block size in bytes only has effect if writing to remote storage + if set to None defaults to 100MB + storage_options: dict + additional parameters to pass to FileSystem class + only useful when writing to remote storages. Returns ------- None """ - to_npz(self, filename, block_size) + to_npz(self, filename, block_size, storage_options) def _axis_is_empty(csr, axis=0): From 8fafddc7cccbefa32f4e7b5446c9a4e7e2665dab Mon Sep 17 00:00:00 2001 From: kayibal Date: Thu, 30 Nov 2017 14:30:23 +0100 Subject: [PATCH 42/76] Support list like label based indexing (#27) --- sparsity/sparse_frame.py | 114 ++++++++++++++++++++++++++--- sparsity/test/test_sparse_frame.py | 73 +++++++++++++++++- 2 files changed, 177 insertions(+), 10 deletions(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index cbc8a9d..acb7922 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -549,15 +549,7 @@ def drop_duplicate_idx(self, **kwargs): def __getitem__(self, item): if not isinstance(item, (tuple, list)): item = [item] - idx = [] - for key in item: - loc = self.columns.get_loc(key) - # weired error appears here with movielens dataset - if not isinstance(loc, int): - loc = self.columns.tolist().index(key) - idx.append(loc) - return SparseFrame(self.data[:,idx], index=self.index, - columns=item) + return self.reindex_axis(item, axis=1) def dropna(self): """Drop nans from index.""" @@ -604,6 +596,110 @@ def read_npz(cls, filename, storage_options=None): """"Read from numpy npz format.""" return cls(*read_npz(filename, storage_options)) + @property + def axes(self): + return [self.index, self.columns] + + def _get_axis_name(self, axis): + try: + return ['index', 'columns'][axis] + except IndexError: + raise ValueError('No axis named {} for {}' + .format(axis, self.__class__)) + + def reindex(self, labels=None, index=None, columns=None, axis=None, + *args, **kwargs): + """Conform SparseFrame to new index. + + Missing values will be filled with zeroes. + + Parameters + ---------- + labels: array-like + New labels / index to conform the axis specified by ‘axis’ to. + index, columns : array-like, optional + New labels / index to conform to. Preferably an Index object to + avoid duplicating data + axis: int + Axis to target. Can be either (0, 1). + args + kwargs + + Returns + ------- + reindexed: SparseFrame + """ + + if labels is not None and index is None and columns is None: + if axis is None: + axis = 0 + return self.reindex_axis(labels, axis=axis, *args, **kwargs) + elif columns is not None and index is None: + return self.reindex_axis(columns, axis=1, *args, **kwargs) + elif columns is None and index is not None: + return self.reindex_axis(index, axis=0, *args, **kwargs) + elif columns is not None and index is not None: + obj = self.reindex_axis(columns, axis=1, *args, **kwargs) + return obj.reindex_axis(index, axis=0, *args, **kwargs) + else: + raise ValueError('Label parameter is mutually exclusive ' + 'with both index or columns') + + def reindex_axis(self, labels, axis=0, method=None, + level=None, copy=True, limit=None, fill_value=0): + """Conform SparseFrame to new index. + + Missing values will be filled with zeroes. + + Parameters + ---------- + labels: array-like + New labels / index to conform the axis specified by ‘axis’ to. + axis: int + Axis to target. Can be either (0, 1). + method: None + unsupported + level: None + unsupported + copy: None + unsupported + limit: None + unsupported + fill_value: None + unsupported + + Returns + ------- + reindexed: SparseFrame + """ + if method is not None \ + or not copy \ + or level is not None \ + or fill_value != 0 \ + or limit is not None: + raise NotImplementedError( + 'Error only labels, index, columns and/or axis are supported') + if axis == 0: + self.index._can_reindex(labels) + reindex_axis = 'index' + other_axis = 'columns' + new_index, idx = self.index.reindex(labels) + new_data = self._data[idx] + elif axis == 1: + self.columns._can_reindex(labels) + reindex_axis = 'columns' + other_axis = 'index' + new_index, idx = self.columns.reindex(labels) + # we have a hidden zero column to replace missing indices (-1) + new_data = self._data.T[idx].T[:-1] + else: + raise ValueError("Only two dimensional data supported.") + + kwargs = {reindex_axis: new_index, + other_axis: getattr(self, other_axis)} + + return SparseFrame(new_data, **kwargs) + def to_npz(self, filename, block_size=None, storage_options=None): """Save to numpy npz format. diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 1d0ee8d..08a9c6a 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -78,6 +78,12 @@ def gendata(n, categorical=False): return gendata +@pytest.fixture() +def sample_frame_labels(): + return SparseFrame(np.identity(5), + columns = list('ABCDE'), + index = list('VWXYZ')) + @pytest.fixture() def weekdays(): return ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', @@ -877,6 +883,71 @@ def test_drop_multiple_labels(): np.testing.assert_array_equal(sf.data.todense(), correct) +def test_label_based_indexing_col(sample_frame_labels): + key = ['A', 'B'] + results = [ + sample_frame_labels[key], + sample_frame_labels.loc[:, key], + sample_frame_labels.reindex(columns=key) + ] + for res in results: + np.testing.assert_array_equal( + res.data.todense(), np.identity(5)[:, :2]) + assert (res.index == pd.Index(list('VWXYZ'))).all() + assert (res.columns == pd.Index(list('AB'))).all() + + +def test_label_based_indexing_idx(sample_frame_labels): + key = ['X', 'Y', 'Z'] + results = [ + sample_frame_labels.loc[key], + sample_frame_labels.loc[key, :], + sample_frame_labels.reindex(labels=key, axis=0), + sample_frame_labels.reindex(index=key) + ] + for res in results: + np.testing.assert_array_equal( + res.data.todense(), np.identity(5)[2:, :]) + assert (res.index == pd.Index(['X', 'Y', 'Z'])).all() + assert (res.columns == pd.Index(list('ABCDE'))).all() + + +def test_label_based_col_and_idx(sample_frame_labels): + key = ['V', 'W'], ['A', 'B'] + results = [ + sample_frame_labels.loc[key], + sample_frame_labels.loc[['V', 'W'], ['A', 'B']], + sample_frame_labels.reindex(index=key[0], columns=key[1]) + ] + for res in results: + np.testing.assert_array_equal( + res.data.todense(), np.identity(2)) + assert (res.index == pd.Index(list('VW'))).all() + assert (res.columns == pd.Index(list('AB'))).all() + + +def test_indexing_boolean_label_col_and_idx(sample_frame_labels): + res = sample_frame_labels.loc[[True, True, False, False, False], ['A', 'B']] + np.testing.assert_array_equal( + res.data.todense(), np.identity(2)) + assert (res.index == pd.Index(list('VW'))).all() + assert (res.columns == pd.Index(list('AB'))).all() + + res = sample_frame_labels.loc[['V', 'W'], [True, True, False, False, False]] + np.testing.assert_array_equal( + res.data.todense(), np.identity(2)) + assert (res.index == pd.Index(list('VW'))).all() + assert (res.columns == pd.Index(list('AB'))).all() + + +def test_error_reindex_duplicate_axis(): + sf = SparseFrame(np.identity(5), + columns = list('ABCDE'), + index = list('UUXYZ')) + with pytest.raises(ValueError): + sf.reindex(['U', 'V']) + + def test_empty_elemwise(): sf_empty = SparseFrame(np.array([]), columns=['A', 'B']) sf = SparseFrame(np.identity(2), columns=['A', 'B']) @@ -888,4 +959,4 @@ def test_empty_elemwise(): assert np.all(res == sf.data.todense()) with pytest.raises(ValueError): - res = sf.add(sf_empty, fill_value=None) + res = sf.add(sf_empty, fill_value=None) \ No newline at end of file From d6d30b825532f93b4c14a00425a81b2f6f0d0f47 Mon Sep 17 00:00:00 2001 From: kayibal Date: Fri, 22 Dec 2017 15:05:01 +0100 Subject: [PATCH 43/76] Add support for new dask custom collection interface. (#29) --- sparsity/dask/core.py | 23 +++++++++++++++++++---- sparsity/sparse_frame.py | 13 +++++++++---- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index 7d7c07b..4eab6b8 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -43,11 +43,8 @@ def finalize(results): results = [r for r in results if not r.empty] return sp.SparseFrame.vstack(results) -class SparseFrame(dask.base.Base): - _optimize = staticmethod(optimize) - _default_get = staticmethod(threaded.get) - _finalize = staticmethod(finalize) +class SparseFrame(dask.base.DaskMethodsMixin): def __init__(self, dsk, name, meta, divisions=None): self.dask = dsk @@ -64,6 +61,24 @@ def __init__(self, dsk, name, meta, divisions=None): self.loc = _LocIndexer(self) + def __dask_graph__(self): + return self.dask + + def __dask_keys__(self): + return self._keys() + + __dask_scheduler__ = staticmethod(dask.threaded.get) + + @staticmethod + def __dask_optimize__(dsk, keys, **kwargs): + # We cull unnecessary tasks here. Note that this isn't necessary, + # dask will do this automatically, this just shows one optimization + # you could do. + dsk2 = optimize(dsk, keys) + return dsk2 + + def __dask_postcompute__(self): + return finalize, () @property def npartitions(self): diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index acb7922..88ba345 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -164,10 +164,15 @@ def max(self, *args, **kwargs): def min(self, *args, **kwargs): return self.data.min(*args, **kwargs) - def copy(self, *args, **kwargs): - return SparseFrame(self.data.copy(*args, **kwargs), - self.index.copy(*args, **kwargs), - self.columns.copy(*args, **kwargs)) + def copy(self, *args, deep=True, **kwargs): + if deep: + return SparseFrame(self.data.copy(*args, **kwargs), + self.index.copy(*args, **kwargs), + self.columns.copy(*args, **kwargs)) + else: + return SparseFrame(self.data, + self.index.copy(*args, **kwargs), + self.columns.copy(*args, **kwargs)) def multiply(self, other, axis='columns'): """ From f10254f7197dac8f5aa14155232b6e0281985f19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D?= Date: Wed, 27 Dec 2017 17:04:08 +0100 Subject: [PATCH 44/76] Getitem and loc failed when all labels were requested. (#28) * Getitem and loc failed when all labels were requested. * Added tests for loc[:,:] and loc[:] --- sparsity/sparse_frame.py | 4 ++++ sparsity/test/test_sparse_frame.py | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 88ba345..c56ce5b 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -689,12 +689,16 @@ def reindex_axis(self, labels, axis=0, method=None, reindex_axis = 'index' other_axis = 'columns' new_index, idx = self.index.reindex(labels) + if idx is None: + return self.copy() new_data = self._data[idx] elif axis == 1: self.columns._can_reindex(labels) reindex_axis = 'columns' other_axis = 'index' new_index, idx = self.columns.reindex(labels) + if idx is None: + return self.copy() # we have a hidden zero column to replace missing indices (-1) new_data = self._data.T[idx].T[:-1] else: diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 08a9c6a..097bc68 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -235,6 +235,10 @@ def test_loc(): # test slices assert np.all(sf.loc[:'B'].data.todense() == np.identity(5)[:2]) + # test all + assert np.all(sf.loc[list("ABCDE")].data.todense() == np.identity(5)) + assert np.all(sf.loc[:, :].data.todense() == np.identity(5)) + assert np.all(sf.loc[:].data.todense() == np.identity(5)) sf = SparseFrame(np.identity(5), pd.date_range("2016-10-01", periods=5)) @@ -690,6 +694,7 @@ def test_getitem(): tmp = sf[['j', 'a']].data.todense() assert tmp[9, 0] == 1 assert tmp[0, 1] == 1 + assert (sf[list('abcdefghij')].data.todense() == np.identity(10)).all() def test_vstack(): From 01328dece6b428c08280013f06fff80f1a9f0bd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D?= Date: Thu, 4 Jan 2018 17:16:45 +0100 Subject: [PATCH 45/76] Elementwise comparison for arrays with different length is deprecated (#30) --- sparsity/sparse_frame.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index c56ce5b..1f4e30a 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -325,7 +325,7 @@ def join(self, other, axis=1, how='outer', level=None): if axis not in set([0, 1]): raise ValueError("axis mut be either 0 or 1") if axis == 0: - if np.all(other._columns.values == self._columns.values): + if np.array_equal(other._columns.values, self._columns.values): # take short path if join axes are identical data = sparse.vstack([self.data, other.data]) index = np.hstack([self.index, other.index]) @@ -341,7 +341,7 @@ def join(self, other, axis=1, how='outer', level=None): index=np.concatenate([self.index, other.index]), columns=new_index) elif axis == 1: - if np.all(self.index.values == other.index.values): + if np.array_equal(self.index.values, other.index.values): # take short path if join axes are identical data = sparse.hstack([self.data, other.data]) columns = np.hstack([self._columns, other._columns]) From c0c76711f72cbafc9add17aaed5cc58338f412d1 Mon Sep 17 00:00:00 2001 From: kayibal Date: Thu, 15 Feb 2018 09:42:01 -0300 Subject: [PATCH 46/76] Distributed join (#34) * implement repartition * implement distributed join --- sparsity/dask/core.py | 269 +++++++++++++++++++++++- sparsity/dask/multi.py | 34 ++- sparsity/sparse_frame.py | 15 +- sparsity/test/test_dask_sparse_frame.py | 52 +++++ 4 files changed, 365 insertions(+), 5 deletions(-) diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index 4eab6b8..7dcb484 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -1,3 +1,6 @@ +from operator import getitem +from pprint import pformat + import dask import dask.dataframe as dd import numpy as np @@ -7,9 +10,10 @@ from dask.dataframe import methods from dask.dataframe.core import (Scalar, Series, _emulate, _extract_meta, _Frame, _maybe_from_pandas, apply, funcname, - no_default, partial, partial_by_order) -from dask.dataframe.utils import make_meta as dd_make_meta + no_default, partial, partial_by_order, + split_evenly, check_divisions) from dask.dataframe.utils import _nonempty_index +from dask.dataframe.utils import make_meta as dd_make_meta from dask.delayed import Delayed from dask.optimize import cull from scipy import sparse @@ -18,7 +22,6 @@ import sparsity as sp from sparsity.dask.indexing import _LocIndexer - def _make_meta(inp): if isinstance(inp, sp.SparseFrame) and inp.empty: return inp @@ -139,6 +142,23 @@ def _repr_data(self): data = [['...'] * len(cols)] * len(index) return pd.DataFrame(data, columns=cols, index=index) + def repartition(self, divisions=None, npartitions=None, force=False): + if divisions is not None: + return repartition(self, divisions, force) + elif npartitions is not None: + return repartition_npartitions(self, npartitions) + raise ValueError('Either divisions or npartitions must be supplied') + + def join(self, other, on=None, how='left', lsuffix='', + rsuffix='', npartitions=None): + from .multi import join_indexed_sparseframes + + if not isinstance(other, (SparseFrame)): + raise ValueError('other must be SparseFrame') + + return join_indexed_sparseframes( + self, other, how=how) + def __repr__(self): return \ """ @@ -153,6 +173,249 @@ def __repr__(self): ) +required = {'left': [0], 'right': [1], 'inner': [0, 1], 'outer': []} + + +def repartition(df, divisions=None, force=False): + """ Repartition dataframe along new divisions + Dask.DataFrame objects are partitioned along their index. Often when + multiple dataframes interact we need to align these partitionings. The + ``repartition`` function constructs a new DataFrame object holding the same + data but partitioned on different values. It does this by performing a + sequence of ``loc`` and ``concat`` calls to split and merge the previous + generation of partitions. + Parameters + ---------- + divisions : list + List of partitions to be used + force : bool, default False + Allows the expansion of the existing divisions. + If False then the new divisions lower and upper bounds must be + the same as the old divisions. + Examples + -------- + >>> sf = sf.repartition([0, 5, 10, 20]) # doctest: +SKIP + """ + + token = tokenize(df, divisions) + if isinstance(df, SparseFrame): + tmp = 'repartition-split-' + token + out = 'repartition-merge-' + token + dsk = repartition_divisions(df.divisions, divisions, + df._name, tmp, out, force=force) + return SparseFrame(merge(df.dask, dsk), out, + df._meta, divisions) + raise ValueError('Data must be DataFrame or Series') + + +def repartition_divisions(a, b, name, out1, out2, force=False): + """ dask graph to repartition dataframe by new divisions + + Parameters + ---------- + a : tuple + old divisions + b : tuple, list + new divisions + name : str + name of old dataframe + out1 : str + name of temporary splits + out2 : str + name of new dataframe + force : bool, default False + Allows the expansion of the existing divisions. + If False then the new divisions lower and upper bounds must be + the same as the old divisions. + + Examples + -------- + >>> repartition_divisions([1, 3, 7], [1, 4, 6, 7], 'a', 'b', 'c') # doctest: +SKIP + {('b', 0): (, ('a', 0), 1, 3, False), + ('b', 1): (, ('a', 1), 3, 4, False), + ('b', 2): (, ('a', 1), 4, 6, False), + ('b', 3): (, ('a', 1), 6, 7, False) + ('c', 0): (, + (, [('b', 0), ('b', 1)])), + ('c', 1): ('b', 2), + ('c', 2): ('b', 3)} + """ + check_divisions(b) + + if len(b) < 2: + # minimum division is 2 elements, like [0, 0] + raise ValueError('New division must be longer than 2 elements') + + if force: + if a[0] < b[0]: + msg = ('left side of the new division must be equal or smaller ' + 'than old division') + raise ValueError(msg) + if a[-1] > b[-1]: + msg = ('right side of the new division must be equal or larger ' + 'than old division') + raise ValueError(msg) + else: + if a[0] != b[0]: + msg = 'left side of old and new divisions are different' + raise ValueError(msg) + if a[-1] != b[-1]: + msg = 'right side of old and new divisions are different' + raise ValueError(msg) + + def _is_single_last_div(x): + """Whether last division only contains single label""" + return len(x) >= 2 and x[-1] == x[-2] + + c = [a[0]] + d = dict() + low = a[0] + + i, j = 1, 1 # indices for old/new divisions + k = 0 # index for temp divisions + + last_elem = _is_single_last_div(a) + + # process through old division + # left part of new division can be processed in this loop + while (i < len(a) and j < len(b)): + if a[i] < b[j]: + # tuple is something like: + # (methods.boundary_slice, ('from_pandas-#', 0), 3, 4, False)) + d[(out1, k)] = (methods.boundary_slice, (name, i - 1), low, a[i], False) + low = a[i] + i += 1 + elif a[i] > b[j]: + d[(out1, k)] = (methods.boundary_slice, (name, i - 1), low, b[j], False) + low = b[j] + j += 1 + else: + d[(out1, k)] = (methods.boundary_slice, (name, i - 1), low, b[j], False) + low = b[j] + i += 1 + j += 1 + c.append(low) + k += 1 + + # right part of new division can remain + if a[-1] < b[-1] or b[-1] == b[-2]: + for _j in range(j, len(b)): + # always use right-most of old division + # because it may contain last element + m = len(a) - 2 + d[(out1, k)] = (methods.boundary_slice, (name, m), low, b[_j], False) + low = b[_j] + c.append(low) + k += 1 + else: + # even if new division is processed through, + # right-most element of old division can remain + if last_elem and i < len(a): + d[(out1, k)] = (methods.boundary_slice, (name, i - 1), a[i], a[i], False) + k += 1 + c.append(a[-1]) + + # replace last element of tuple with True + d[(out1, k - 1)] = d[(out1, k - 1)][:-1] + (True,) + + i, j = 0, 1 + + last_elem = _is_single_last_div(c) + + while j < len(b): + tmp = [] + while c[i] < b[j]: + tmp.append((out1, i)) + i += 1 + if last_elem and c[i] == b[-1] and (b[-1] != b[-2] or j == len(b) - 1) and i < k: + # append if last split is not included + tmp.append((out1, i)) + i += 1 + if len(tmp) == 0: + # dummy slice to return empty DataFrame or Series, + # which retain original data attributes (columns / name) + d[(out2, j - 1)] = (methods.boundary_slice, (name, 0), a[0], a[0], False) + elif len(tmp) == 1: + d[(out2, j - 1)] = tmp[0] + else: + if not tmp: + raise ValueError('check for duplicate partitions\nold:\n%s\n\n' + 'new:\n%s\n\ncombined:\n%s' + % (pformat(a), pformat(b), pformat(c))) + d[(out2, j - 1)] = (sp.SparseFrame.vstack, tmp) + j += 1 + return d + + +def repartition_npartitions(df, npartitions): + """ Repartition dataframe to a smaller number of partitions """ + new_name = 'repartition-%d-%s' % (npartitions, tokenize(df)) + if df.npartitions == npartitions: + return df + elif df.npartitions > npartitions: + npartitions_ratio = df.npartitions / npartitions + new_partitions_boundaries = [int(new_partition_index * npartitions_ratio) + for new_partition_index in range(npartitions + 1)] + dsk = {} + for new_partition_index in range(npartitions): + value = (sp.SparseFrame.vstack, + [(df._name, old_partition_index) for old_partition_index in + range(new_partitions_boundaries[new_partition_index], + new_partitions_boundaries[new_partition_index + 1])]) + dsk[new_name, new_partition_index] = value + divisions = [df.divisions[new_partition_index] + for new_partition_index in new_partitions_boundaries] + return SparseFrame(merge(df.dask, dsk), new_name, df._meta, divisions) + else: + original_divisions = divisions = pd.Series(df.divisions) + if (df.known_divisions and (np.issubdtype(divisions.dtype, np.datetime64) or + np.issubdtype(divisions.dtype, np.number))): + if np.issubdtype(divisions.dtype, np.datetime64): + divisions = divisions.values.astype('float64') + + if isinstance(divisions, pd.Series): + divisions = divisions.values + + n = len(divisions) + divisions = np.interp(x=np.linspace(0, n, npartitions + 1), + xp=np.linspace(0, n, n), + fp=divisions) + if np.issubdtype(original_divisions.dtype, np.datetime64): + divisions = pd.Series(divisions).astype(original_divisions.dtype).tolist() + elif np.issubdtype(original_divisions.dtype, np.integer): + divisions = divisions.astype(original_divisions.dtype) + + if isinstance(divisions, np.ndarray): + divisions = divisions.tolist() + + divisions = list(divisions) + divisions[0] = df.divisions[0] + divisions[-1] = df.divisions[-1] + + return df.repartition(divisions=divisions) + else: + ratio = npartitions / df.npartitions + split_name = 'split-%s' % tokenize(df, npartitions) + dsk = {} + last = 0 + j = 0 + for i in range(df.npartitions): + new = last + ratio + if i == df.npartitions - 1: + k = npartitions - j + else: + k = int(new - last) + dsk[(split_name, i)] = (split_evenly, (df._name, i), k) + for jj in range(k): + dsk[(new_name, j)] = (getitem, (split_name, i), jj) + j += 1 + last = new + + divisions = [None] * (npartitions + 1) + return SparseFrame(merge(df.dask, dsk), new_name, df._meta, divisions) + + + def is_broadcastable(dfs, s): """ This Series is broadcastable against another dataframe in the sequence diff --git a/sparsity/dask/multi.py b/sparsity/dask/multi.py index fde6e04..15a67cb 100644 --- a/sparsity/dask/multi.py +++ b/sparsity/dask/multi.py @@ -1,9 +1,41 @@ +import toolz +from dask.base import tokenize + +import sparsity.sparse_frame as sp +import pandas as pd +from dask.dataframe.multi import require, required from sparsity.dask.core import SparseFrame from functools import partial from dask.dataframe.core import is_broadcastable, _Frame from toolz import unique, merge_sorted + +def join_indexed_sparseframes(lhs, rhs, how='left'): + """ Join two partitioned sparseframes along their index """ + + (lhs, rhs), divisions, parts = align_partitions(lhs, rhs) + divisions, parts = require(divisions, parts, required[how]) + + left_empty = lhs._meta + right_empty = rhs._meta + + name = 'join-indexed-' + tokenize(lhs, rhs, how) + + dsk = dict() + for i, (a, b) in enumerate(parts): + if a is None and how in ('right', 'outer'): + a = left_empty + if b is None and how in ('left', 'outer'): + b = right_empty + + dsk[(name, i)] = (sp.SparseFrame.join, a, b, 1, how) + + meta = sp.SparseFrame.join(lhs._meta_nonempty, rhs._meta_nonempty, how=how) + return SparseFrame(toolz.merge(lhs.dask, rhs.dask, dsk), + name, meta, divisions) + + def align_partitions(*dfs): """ Mutually partition and align DataFrame blocks @@ -38,7 +70,7 @@ def align_partitions(*dfs): divisions = list(unique(merge_sorted(*[df.divisions for df in dfs1]))) dfs2 = [df.repartition(divisions, force=True) - if isinstance(df, (_Frame, SparseFrame)) else df for df in dfs] + if isinstance(df, (SparseFrame)) else df for df in dfs] result = list() inds = [0 for df in dfs] diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 1f4e30a..7c638c0 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -317,6 +317,7 @@ def join(self, other, axis=1, how='outer', level=None): ------- joined: sparsity.SparseFrame """ + if isinstance(self._index, pd.MultiIndex)\ or isinstance(other._index, pd.MultiIndex): raise NotImplementedError('MultiIndex not supported.') @@ -347,7 +348,19 @@ def join(self, other, axis=1, how='outer', level=None): columns = np.hstack([self._columns, other._columns]) res = SparseFrame(data, index=self.index, columns=columns) else: - data, new_index = _matrix_join(self._data, other._data, + if other.empty: + other_data = sparse.csr_matrix((1, other.shape[1]), + dtype=other.data.dtype) + else: + other_data = other._data + + if self.empty: + self_data = sparse.csr_matrix((1, self.shape[1]), + dtype=self.data.dtype) + else: + self_data = self._data + + data, new_index = _matrix_join(self_data, other_data, self.index, other.index, how=how) res = SparseFrame(data, diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index f3ec155..2fd435f 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -11,6 +11,7 @@ from dask.local import get_sync from sparsity import sparse_one_hot from sparsity.dask.reshape import one_hot_encode +import pandas.util.testing as pdt from .conftest import tmpdir @@ -220,3 +221,54 @@ def test_assign_column(): assert dsf._meta.empty sf = dsf.compute() assert np.all(sf.todense() == f.assign(new=s)) + + +def test_repartition_divisions(): + df = pd.DataFrame(np.identity(10)) + dsf = dsp.from_pandas(df, npartitions=2) + + dsf2 = dsf.repartition(divisions=[0,3,5,7,9]) + + assert isinstance(dsf2, dsp.SparseFrame) + assert dsf2.divisions == (0, 3, 5, 7, 9) + + df2 = dsf2.compute().todense() + pdt.assert_frame_equal(df, df2) + + +@pytest.mark.parametrize('start_part, end_part', [ + (2, 4), + (3, 2), + (3, 3), +]) +def test_repartition_n_divisions(start_part, end_part): + df = pd.DataFrame(np.identity(10)) + dsf = dsp.from_pandas(df, npartitions=start_part) + + dsf2 = dsf.repartition(npartitions=end_part) + + assert isinstance(dsf2, dsp.SparseFrame) + assert dsf2.npartitions == end_part + + df2 = dsf2.compute().todense() + pdt.assert_frame_equal(df, df2) + + +@pytest.mark.parametrize('how', ['left', 'right', 'inner', 'outer']) +def test_distributed_join(how): + left = pd.DataFrame(np.identity(10), + index=np.arange(10), + columns=list('ABCDEFGHIJ')) + right = pd.DataFrame(np.identity(10), + index=np.arange(5, 15), + columns=list('KLMNOPQRST')) + correct = left.join(right, how=how).fillna(0) + + d_left = dsp.from_pandas(left, npartitions=2) + d_right = dsp.from_pandas(right, npartitions=2) + + joined = d_left.join(d_right, how=how) + + res = joined.compute().todense() + + pdt.assert_frame_equal(correct, res) From 6de787c895f0795408f4921150806fd2f10aa608 Mon Sep 17 00:00:00 2001 From: kayibal Date: Sat, 17 Feb 2018 12:20:10 -0300 Subject: [PATCH 47/76] add from_ddf method (#32) * add from_ddf method to easily switch from dask dataframe collection to dask sparsity collection. * make from_ddf available from parent module * add tests and check dtypes for from_ddf --- sparsity/dask/__init__.py | 2 +- sparsity/dask/io.py | 23 +++++++++++++++++++++++ sparsity/test/test_dask_sparse_frame.py | 19 +++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/sparsity/dask/__init__.py b/sparsity/dask/__init__.py index fa98a41..9689a24 100644 --- a/sparsity/dask/__init__.py +++ b/sparsity/dask/__init__.py @@ -4,7 +4,7 @@ import sparsity as sp from .core import SparseFrame -from .io import from_pandas, read_npz +from .io import from_pandas, read_npz, from_ddf from .reshape import one_hot_encode diff --git a/sparsity/dask/io.py b/sparsity/dask/io.py index 3b3a21c..403402b 100644 --- a/sparsity/dask/io.py +++ b/sparsity/dask/io.py @@ -12,6 +12,29 @@ _sorted = sorted +def from_ddf(ddf): + """Convert a dask.dataframe.DataFrame to a sparsity.dask.SparseFrame. + + Parameters + ---------- + ddf: dask.dataframe.DataFrame + + Returns + ------- + dsf: sparsity.dask.SparseFrame + a sparse dataframe collection + """ + if not all(np.issubdtype(dtype, np.number) for + dtype in ddf.dtypes.tolist()): + raise ValueError('Cannot create a sparse frame ' + 'of not numerical type') + + tmp = ddf.map_partitions(sp.SparseFrame, meta=object) + dsf = SparseFrame(tmp.dask, tmp._name, ddf._meta, + divisions=tmp.divisions) + return dsf + + def from_pandas(df, npartitions=None, chunksize=None, name=None): """ Parameters diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index 2fd435f..eaf38ce 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -272,3 +272,22 @@ def test_distributed_join(how): res = joined.compute().todense() pdt.assert_frame_equal(correct, res) + + +def test_from_ddf(): + ddf = dd.from_pandas( + pd.DataFrame(np.random.rand(20, 4), + columns=list('ABCD')), + npartitions=4 + ) + correct = ddf.compute() + + dsf = dsp.from_ddf(ddf) + + res = dsf.compute().todense() + + pdt.assert_frame_equal(correct, res) + + with pytest.raises(ValueError): + ddf = ddf.assign(A="some str value") + dsf = dsp.from_ddf(ddf) From 87f9928981c32fac2f0b7b34d890a3d1bd4cda08 Mon Sep 17 00:00:00 2001 From: kayibal Date: Mon, 19 Mar 2018 16:50:08 -0600 Subject: [PATCH 48/76] Distributed groupby sum operation (#35) * Implement distributed groupby sum and apply_concat_apply function for SparseFrame * update comments * add test for different index datatypes --- sparsity/dask/core.py | 188 +++++++++++++++++++++++- sparsity/dask/multi.py | 3 +- sparsity/sparse_frame.py | 4 +- sparsity/test/test_dask_sparse_frame.py | 22 +++ 4 files changed, 211 insertions(+), 6 deletions(-) diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index 7dcb484..f5f08c4 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -11,13 +11,14 @@ from dask.dataframe.core import (Scalar, Series, _emulate, _extract_meta, _Frame, _maybe_from_pandas, apply, funcname, no_default, partial, partial_by_order, - split_evenly, check_divisions) -from dask.dataframe.utils import _nonempty_index + split_evenly, check_divisions, hash_shard, split_out_on_index) +from dask.dataframe.groupby import _apply_chunk +from dask.dataframe.utils import _nonempty_index, make_meta from dask.dataframe.utils import make_meta as dd_make_meta from dask.delayed import Delayed from dask.optimize import cull from scipy import sparse -from toolz import merge, remove +from toolz import merge, remove, partition_all import sparsity as sp from sparsity.dask.indexing import _LocIndexer @@ -159,6 +160,15 @@ def join(self, other, on=None, how='left', lsuffix='', return join_indexed_sparseframes( self, other, how=how) + def groupby_sum(self, split_out=1, split_every=8): + meta = self._meta + token = 'groupby_sum' + return apply_concat_apply(self, + chunk=sp.SparseFrame.groupby_sum, + aggregate=sp.SparseFrame.groupby_sum, + meta=meta, token=token, split_every=split_every, + split_out=split_out, split_out_setup=split_out_on_index) + def __repr__(self): return \ """ @@ -518,4 +528,176 @@ def apply_and_enforce(func, arg, kwargs, meta): return sf +def apply_concat_apply(args, chunk=None, aggregate=None, combine=None, + meta=no_default, token=None, chunk_kwargs=None, + aggregate_kwargs=None, combine_kwargs=None, + split_every=None, split_out=None, split_out_setup=None, + split_out_setup_kwargs=None, **kwargs): + """Apply a function to blocks, then concat, then apply again + + Parameters + ---------- + args : + Positional arguments for the `chunk` function. All `dask.dataframe` + objects should be partitioned and indexed equivalently. + chunk : function [block-per-arg] -> block + Function to operate on each block of data + aggregate : function concatenated-block -> block + Function to operate on the concatenated result of chunk + combine : function concatenated-block -> block, optional + Function to operate on intermediate concatenated results of chunk + in a tree-reduction. If not provided, defaults to aggregate. + token : str, optional + The name to use for the output keys. + chunk_kwargs : dict, optional + Keywords for the chunk function only. + aggregate_kwargs : dict, optional + Keywords for the aggregate function only. + combine_kwargs : dict, optional + Keywords for the combine function only. + split_every : int, optional + Group partitions into groups of this size while performing a + tree-reduction. If set to False, no tree-reduction will be used, + and all intermediates will be concatenated and passed to ``aggregate``. + Default is 8. + split_out : int, optional + Number of output partitions. Split occurs after first chunk reduction. + split_out_setup : callable, optional + If provided, this function is called on each chunk before performing + the hash-split. It should return a pandas object, where each row + (excluding the index) is hashed. If not provided, the chunk is hashed + as is. + split_out_setup_kwargs : dict, optional + Keywords for the `split_out_setup` function only. + kwargs : + All remaining keywords will be passed to ``chunk``, ``aggregate``, and + ``combine``. + + Examples + -------- + >>> def chunk(a_block, b_block): + ... pass + + >>> def agg(df): + ... pass + + >>> apply_concat_apply([a, b], chunk=chunk, aggregate=agg) # doctest: +SKIP + """ + if chunk_kwargs is None: + chunk_kwargs = dict() + if aggregate_kwargs is None: + aggregate_kwargs = dict() + chunk_kwargs.update(kwargs) + aggregate_kwargs.update(kwargs) + + if combine is None: + if combine_kwargs: + raise ValueError("`combine_kwargs` provided with no `combine`") + combine = aggregate + combine_kwargs = aggregate_kwargs + else: + if combine_kwargs is None: + combine_kwargs = dict() + combine_kwargs.update(kwargs) + + if not isinstance(args, (tuple, list)): + args = [args] + + npartitions = set(arg.npartitions for arg in args + if isinstance(arg, SparseFrame)) + if len(npartitions) > 1: + raise ValueError("All arguments must have same number of partitions") + npartitions = npartitions.pop() + + if split_every is None: + split_every = 8 + elif split_every is False: + split_every = npartitions + elif split_every < 2 or not isinstance(split_every, int): + raise ValueError("split_every must be an integer >= 2") + + token_key = tokenize(token or (chunk, aggregate), meta, args, + chunk_kwargs, aggregate_kwargs, combine_kwargs, + split_every, split_out, split_out_setup, + split_out_setup_kwargs) + + # Chunk + a = '{0}-chunk-{1}'.format(token or funcname(chunk), token_key) + if len(args) == 1 and isinstance(args[0], SparseFrame) and not chunk_kwargs: + dsk = {(a, 0, i, 0): (chunk, key) + for i, key in enumerate(args[0].__dask_keys__())} + else: + dsk = {(a, 0, i, 0): (apply, chunk, + [(x._name, i) if isinstance(x, SparseFrame) + else x for x in args], chunk_kwargs) + for i in range(args[0].npartitions)} + + # Split + # this splits the blocks (usually) by their index and + # basically performs a task sort such that the next tree + # aggregation will result in the desired number of partitions + # given by the split_out parameter + if split_out and split_out > 1: + split_prefix = 'split-%s' % token_key + shard_prefix = 'shard-%s' % token_key + for i in range(args[0].npartitions): + # For now we assume that split_out_setup selects the index + # as we will only support index groupbys for now. So we can + # use the function provided by dask. + dsk[(split_prefix, i)] = (hash_shard, (a, 0, i, 0), split_out, + split_out_setup, split_out_setup_kwargs) + # At this point we have dictionaries of dataframes. The dictionary keys + # correspond to the hashed index value. Such that rows with the same index + # have the same dictionary key. + # The next line unpacks this dictionaries into pure dataframes again + # now with the correct dask key for their partition. So at this point + # we might have shards of a single row in the next step they are combined again. + for j in range(split_out): + dsk[(shard_prefix, 0, i, j)] = (getitem, (split_prefix, i), j) + a = shard_prefix + else: + split_out = 1 + + # Combine + b = '{0}-combine-{1}'.format(token or funcname(combine), token_key) + k = npartitions + depth = 0 + while k > split_every: + for part_i, inds in enumerate(partition_all(split_every, range(k))): + for j in range(split_out): + conc = (sp.SparseFrame.vstack, [(a, depth, i, j) for i in inds]) + # Finally we apply the combine function on the concatenated + # results. This is usually the same as the aggregate + # function. + if combine_kwargs: + dsk[(b, depth + 1, part_i, j)] = (apply, combine, [conc], combine_kwargs) + else: + dsk[(b, depth + 1, part_i, j)] = (combine, conc) + k = part_i + 1 + a = b + depth += 1 + + # Aggregate + for j in range(split_out): + b = '{0}-agg-{1}'.format(token or funcname(aggregate), token_key) + conc = (sp.SparseFrame.vstack, [(a, depth, i, j) for i in range(k)]) + if aggregate_kwargs: + dsk[(b, j)] = (apply, aggregate, [conc], aggregate_kwargs) + else: + dsk[(b, j)] = (aggregate, conc) + + if meta is no_default: + meta_chunk = _emulate(chunk, *args, **chunk_kwargs) + meta = _emulate(aggregate, sp.SparseFrame.vstack([meta_chunk]), + **aggregate_kwargs) + + for arg in args: + if isinstance(arg, SparseFrame): + dsk.update(arg.dask) + + divisions = [None] * (split_out + 1) + + return SparseFrame(dsk, b, meta, divisions) + + normalize_token.register((SparseFrame,), lambda a: a._name) diff --git a/sparsity/dask/multi.py b/sparsity/dask/multi.py index 15a67cb..fad58c6 100644 --- a/sparsity/dask/multi.py +++ b/sparsity/dask/multi.py @@ -6,11 +6,10 @@ from dask.dataframe.multi import require, required from sparsity.dask.core import SparseFrame from functools import partial -from dask.dataframe.core import is_broadcastable, _Frame +from dask.dataframe.core import is_broadcastable, _Frame, aca from toolz import unique, merge_sorted - def join_indexed_sparseframes(lhs, rhs, how='left'): """ Join two partitioned sparseframes along their index """ diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 7c638c0..b25b9b7 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -129,7 +129,9 @@ def todense(self, pandas=True): dense = pd.DataFrame(dense.reshape(1, -1), index=self.index, columns=self.columns) else: - idx = np.broadcast_to(self.index, dense.shape[0]) + # need to copy as broadcast_to return read_only array + idx = np.broadcast_to(self.index, dense.shape[0])\ + .copy() dense = pd.DataFrame(dense, index=idx, columns=self.columns) return dense diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index eaf38ce..bec2d5b 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -273,6 +273,28 @@ def test_distributed_join(how): pdt.assert_frame_equal(correct, res) +@pytest.mark.parametrize('idx', [ + list('ABCD'*25), + np.array(list('0123'*25)).astype(int), + np.array(list('0123'*25)).astype(float), +]) +def test_groupby_sum(idx): + + df = pd.DataFrame(dict(A=np.ones(100), B=np.ones(100)), + index=idx) + correct = df.groupby(level=0).sum() + correct.sort_index(inplace=True) + + spf = dsp.from_pandas(df, npartitions=2) + assert spf.npartitions == 2 + grouped = spf.groupby_sum(split_out=4) + + assert grouped.npartitions == 4 + res = grouped.compute().todense() + res.sort_index(inplace=True) + + pdt.assert_frame_equal(res, correct) + def test_from_ddf(): ddf = dd.from_pandas( From 4d855022a1f13d1aad9e2211cd87521fa99b12a0 Mon Sep 17 00:00:00 2001 From: kayibal Date: Thu, 19 Apr 2018 17:44:46 +0200 Subject: [PATCH 49/76] Sort index (#37) implements sort_index for sparsity dask collection. --- sparsity/dask/core.py | 90 ++++++++- sparsity/dask/shuffle.py | 243 ++++++++++++++++++++++++ sparsity/sparse_frame.py | 3 + sparsity/test/test_dask_sparse_frame.py | 100 ++++++++-- 4 files changed, 406 insertions(+), 30 deletions(-) create mode 100644 sparsity/dask/shuffle.py diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index f5f08c4..cb57fc0 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -11,9 +11,9 @@ from dask.dataframe.core import (Scalar, Series, _emulate, _extract_meta, _Frame, _maybe_from_pandas, apply, funcname, no_default, partial, partial_by_order, - split_evenly, check_divisions, hash_shard, split_out_on_index) -from dask.dataframe.groupby import _apply_chunk -from dask.dataframe.utils import _nonempty_index, make_meta + split_evenly, check_divisions, hash_shard, + split_out_on_index, Index) +from dask.dataframe.utils import _nonempty_index from dask.dataframe.utils import make_meta as dd_make_meta from dask.delayed import Delayed from dask.optimize import cull @@ -23,6 +23,7 @@ import sparsity as sp from sparsity.dask.indexing import _LocIndexer + def _make_meta(inp): if isinstance(inp, sp.SparseFrame) and inp.empty: return inp @@ -47,7 +48,6 @@ def finalize(results): results = [r for r in results if not r.empty] return sp.SparseFrame.vstack(results) - class SparseFrame(dask.base.DaskMethodsMixin): def __init__(self, dsk, name, meta, divisions=None): @@ -55,11 +55,6 @@ def __init__(self, dsk, name, meta, divisions=None): self._name = name self._meta = _make_meta(meta) - if divisions: - self.known_divisions = True - else: - self.known_divisions = False - self.divisions = tuple(divisions) self.ndim = 2 @@ -96,9 +91,20 @@ def _meta_nonempty(self): def columns(self): return self._meta.columns + @property + def known_divisions(self): + """Whether divisions are already known""" + return len(self.divisions) > 0 and self.divisions[0] is not None + @property def index(self): - return self._meta.index + """Return dask Index instance""" + name = self._name + '-index' + dsk = {(name, i): (getattr, key, 'index') + for i, key in enumerate(self.__dask_keys__())} + + return Index(merge(dsk, self.dask), name, + self._meta.index, self.divisions) def map_partitions(self, func, meta, *args, **kwargs): return map_partitions(func, self, meta, *args, **kwargs) @@ -150,6 +156,19 @@ def repartition(self, divisions=None, npartitions=None, force=False): return repartition_npartitions(self, npartitions) raise ValueError('Either divisions or npartitions must be supplied') + def get_partition(self, n): + """Get a sparse dask DataFrame/Series representing + the `nth` partition.""" + if 0 <= n < self.npartitions: + name = 'get-partition-%s-%s' % (str(n), self._name) + dsk = {(name, 0): (self._name, n)} + divisions = self.divisions[n:n + 2] + return SparseFrame(merge(self.dask, dsk), name, + self._meta, divisions) + else: + msg = "n must be 0 <= n < {0}".format(self.npartitions) + raise ValueError(msg) + def join(self, other, on=None, how='left', lsuffix='', rsuffix='', npartitions=None): from .multi import join_indexed_sparseframes @@ -169,6 +188,57 @@ def groupby_sum(self, split_out=1, split_every=8): meta=meta, token=token, split_every=split_every, split_out=split_out, split_out_setup=split_out_on_index) + def sort_index(self, npartitions=None, divisions=None, **kwargs): + """Sort the DataFrame index (row labels) + This realigns the dataset to be sorted by the index. This can have a + significant impact on performance, because joins, groupbys, lookups, etc. + are all much faster on that column. However, this performance increase + comes with a cost, sorting a parallel dataset requires expensive shuffles. + Often we ``sort_index`` once directly after data ingest and filtering and + then perform many cheap computations off of the sorted dataset. + This function operates exactly like ``pandas.sort_index`` except with + different performance costs (it is much more expensive). Under normal + operation this function does an initial pass over the index column to + compute approximate qunatiles to serve as future divisions. It then passes + over the data a second time, splitting up each input partition into several + pieces and sharing those pieces to all of the output partitions now in + sorted order. + In some cases we can alleviate those costs, for example if your dataset is + sorted already then we can avoid making many small pieces or if you know + good values to split the new index column then we can avoid the initial + pass over the data. For example if your new index is a datetime index and + your data is already sorted by day then this entire operation can be done + for free. You can control these options with the following parameters. + + Parameters + ---------- + npartitions: int, None, or 'auto' + The ideal number of output partitions. If None use the same as + the input. If 'auto' then decide by memory use. + divisions: list, optional + Known values on which to separate index values of the partitions. + See http://dask.pydata.org/en/latest/dataframe-design.html#partitions + Defaults to computing this with a single pass over the data. Note + that if ``sorted=True``, specified divisions are assumed to match + the existing partitions in the data. If this is untrue, you should + leave divisions empty and call ``repartition`` after ``set_index``. + partition_size: int, optional + if npartitions is set to auto repartition the dataframe into + partitions of this size. + """ + from .shuffle import sort_index + return sort_index(self, npartitions=npartitions, + divisions=None, **kwargs) + + def groupby_sum(self, split_out=1, split_every=8): + meta = self._meta + token = 'groupby_sum' + return apply_concat_apply(self, + chunk=sp.SparseFrame.groupby_sum, + aggregate=sp.SparseFrame.groupby_sum, + meta=meta, token=token, split_every=split_every, + split_out=split_out, split_out_setup=split_out_on_index) + def __repr__(self): return \ """ diff --git a/sparsity/dask/shuffle.py b/sparsity/dask/shuffle.py new file mode 100644 index 0000000..2dea823 --- /dev/null +++ b/sparsity/dask/shuffle.py @@ -0,0 +1,243 @@ +import math +from operator import getitem + +from dask import base, delayed +from dask.sizeof import sizeof +from dask.base import tokenize +from dask.dataframe.shuffle import shuffle_group_get, set_partitions_pre, \ + remove_nans, set_index_post_series +from pandas._libs.algos import groupsort_indexer +from toolz import merge +from dask.utils import digit, insert + +import sparsity as sp +import pandas as pd +import numpy as np + +from sparsity.dask import SparseFrame + + +def sort_index(df, npartitions=None, shuffle='tasks', + drop=True, upsample=1.0, divisions=None, + partition_size=128e6, **kwargs): + """ See _Frame.set_index for docstring """ + if npartitions == 'auto': + repartition = True + npartitions = max(100, df.npartitions) + else: + if npartitions is None: + npartitions = df.npartitions + repartition = False + + index2 = index_to_series(df.index) + + if divisions is None: + divisions = index2._repartition_quantiles(npartitions, upsample=upsample) + if repartition: + parts = df.to_delayed() + sizes = [delayed(sizeof)(part) for part in parts] + else: + sizes = [] + iparts = index2.to_delayed() + mins = [ipart.min() for ipart in iparts] + maxes = [ipart.max() for ipart in iparts] + divisions, sizes, mins, maxes = base.compute(divisions, sizes, mins, maxes) + divisions = divisions.tolist() + + empty_dataframe_detected = pd.isnull(divisions).all() + if repartition or empty_dataframe_detected: + total = sum(sizes) + npartitions = max(math.ceil(total / partition_size), 1) + npartitions = min(npartitions, df.npartitions) + n = len(divisions) + try: + divisions = np.interp(x=np.linspace(0, n - 1, npartitions + 1), + xp=np.linspace(0, n - 1, n), + fp=divisions).tolist() + except (TypeError, ValueError): # str type + indexes = np.linspace(0, n - 1, npartitions + 1).astype(int) + divisions = [divisions[i] for i in indexes] + + return set_partition(df, divisions, shuffle=shuffle, drop=drop, + **kwargs) + + +def index_to_series(idx): + return idx.map_partitions(lambda x: x.to_series(), + meta=idx._meta.to_series()) + + +def set_partition(sf: SparseFrame, divisions: list, + max_branch=32, drop=True, shuffle=None): + """ Group DataFrame by index + + Sets a new index and partitions data along that index according to + divisions. Divisions are often found by computing approximate quantiles. + The function ``set_index`` will do both of these steps. + + Parameters + ---------- + sf: DataFrame/Series + Data that we want to re-partition + index: string or Series + Column to become the new index + divisions: list + Values to form new divisions between partitions + drop: bool, default True + Whether to delete columns to be used as the new index + shuffle: str (optional) + Either 'disk' for an on-disk shuffle or 'tasks' to use the task + scheduling framework. Use 'disk' if you are on a single machine + and 'tasks' if you are on a distributed cluster. + max_branch: int (optional) + If using the task-based shuffle, the amount of splitting each + partition undergoes. Increase this for fewer copies but more + scheduler overhead. + + See Also + -------- + set_index + shuffle + partd + """ + index = index_to_series(sf.index) + partitions = index.map_partitions(set_partitions_pre, + divisions=divisions, + meta=pd.Series([0])) + sf2 = sf.assign(_partitions=partitions) + + df3 = rearrange_by_index(sf2, max_branch=max_branch, + npartitions=len(divisions) - 1, shuffle=shuffle) + + df4 = df3.map_partitions(sort_index_post_series, + index_name=index.name, + meta=sort_index_post_series(df3._meta, index.name)) + + df4.divisions = divisions + + return df4.map_partitions(sp.SparseFrame.sort_index, df4._meta) + + +def sort_index_post_series(df, index_name): + df2 = df.drop('_partitions', axis=1) + df2.index.name = index_name + return df2 + + +def rearrange_by_index(df, npartitions=None, max_branch=None, + shuffle='tasks'): + if shuffle == 'tasks': + return rearrange_by_index_tasks(df, max_branch, npartitions) + else: + raise NotImplementedError("Unknown shuffle method %s" % shuffle) + + +def rearrange_by_index_tasks(df, max_branch=32, npartitions=None): + """ Order divisions of DataFrame so that all values within index align + + This enacts a task-based shuffle + + See also: + rearrange_by_column_disk + set_partitions_tasks + shuffle_tasks + """ + max_branch = max_branch or 32 + n = df.npartitions + + stages = int(np.math.ceil(math.log(n) / math.log(max_branch))) + if stages > 1: + k = int(math.ceil(n ** (1 / stages))) + else: + k = n + + groups = [] + splits = [] + joins = [] + + inputs = [tuple(digit(i, j, k) for j in range(stages)) + for i in range(k**stages)] + + token = tokenize(df, max_branch) + + start = dict((('shuffle-join-' + token, 0, inp), + (df._name, i) if i < df.npartitions else df._meta) + for i, inp in enumerate(inputs)) + + for stage in range(1, stages + 1): + group = dict((('shuffle-group-' + token, stage, inp), + (shuffle_index, ('shuffle-join-' + token, stage - 1, inp), + stage - 1, k, n)) + for inp in inputs) + + split = dict((('shuffle-split-' + token, stage, i, inp), + (getitem, ('shuffle-group-' + token, stage, inp), i)) + for i in range(k) + for inp in inputs) + + join = dict((('shuffle-join-' + token, stage, inp), + (sp.SparseFrame.vstack, + [('shuffle-split-' + token, stage, inp[stage - 1], + insert(inp, stage - 1, j)) for j in range(k)])) + for inp in inputs) + groups.append(group) + splits.append(split) + joins.append(join) + + end = dict((('shuffle-' + token, i), + ('shuffle-join-' + token, stages, inp)) + for i, inp in enumerate(inputs)) + + dsk = merge(df.dask, start, end, *(groups + splits + joins)) + df2 = SparseFrame(dsk, 'shuffle-' + token, df, df.divisions) + + if npartitions is not None and npartitions != df.npartitions: + parts = [i % df.npartitions for i in range(npartitions)] + token = tokenize(df2, npartitions) + dsk = {('repartition-group-' + token, i): (shuffle_group_2, k) + for i, k in enumerate(df2.__dask_keys__())} + for p in range(npartitions): + dsk[('repartition-get-' + token, p)] = \ + (shuffle_group_get, ('repartition-group-' + token, parts[p]), p) + + df3 = SparseFrame(merge(df2.dask, dsk), 'repartition-get-' + token, df2, + [None] * (npartitions + 1)) + else: + df3 = df2 + df3.divisions = (None,) * (df.npartitions + 1) + + return df3 + + +def shuffle_index(sf: sp.SparseFrame, stage, k, npartitions): + ind = sf['_partitions'].todense().astype(np.int) + c = ind._values + typ = np.min_scalar_type(npartitions * 2) + c = c.astype(typ) + + npartitions, k, stage = [np.array(x, dtype=np.min_scalar_type(x))[()] + for x in [npartitions, k, stage]] + + c = np.mod(c, npartitions, out=c) + c = np.floor_divide(c, k ** stage, out=c) + c = np.mod(c, k, out=c) + + indexer, locations = groupsort_indexer(c.astype(np.int64), k) + df2 = sf.take(indexer) + locations = locations.cumsum() + parts = [df2.iloc[a:b] for a, b in zip(locations[:-1], locations[1:])] + + return dict(zip(range(k), parts)) + + +def shuffle_group_2(sf: sp.SparseFrame): + if not len(sf): + return {}, sf + ind = sf['_partitions'].todense()._values.astype(np.int64) + n = ind.max() + 1 + indexer, locations = groupsort_indexer(ind.view(np.int64), n) + df2 = sf.take(indexer) + locations = locations.cumsum() + parts = [df2.iloc[a:b] for a, b in zip(locations[:-1], locations[1:])] + result2 = dict(zip(range(n), parts)) + return result2, sf.iloc[:0] diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index b25b9b7..d30f2d7 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -370,6 +370,9 @@ def join(self, other, axis=1, how='outer', level=None): columns=np.concatenate([self._columns, other._columns])) return res + def __len__(self): + return self.shape[0] + def rename(self, columns, inplace=False): """ Rename columns by applying a callable to every column name. diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index bec2d5b..39d8576 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -1,5 +1,6 @@ import datetime as dt import os +from uuid import uuid4 import dask import dask.dataframe as dd @@ -222,15 +223,20 @@ def test_assign_column(): sf = dsf.compute() assert np.all(sf.todense() == f.assign(new=s)) +@pytest.mark.parametrize('arg_dict', [ + dict(divisions=[0, 30, 50, 70, 99]), + dict(npartitions=6), + dict(npartitions=2), +]) +def test_repartition_divisions(arg_dict): + df = pd.DataFrame(np.identity(100)) + dsf = dsp.from_pandas(df, npartitions=4) -def test_repartition_divisions(): - df = pd.DataFrame(np.identity(10)) - dsf = dsp.from_pandas(df, npartitions=2) - - dsf2 = dsf.repartition(divisions=[0,3,5,7,9]) + dsf2 = dsf.repartition(**arg_dict) assert isinstance(dsf2, dsp.SparseFrame) - assert dsf2.divisions == (0, 3, 5, 7, 9) + if 'divisions' in arg_dict: + assert tuple(dsf2.divisions) == tuple(arg_dict['divisions']) df2 = dsf2.compute().todense() pdt.assert_frame_equal(df, df2) @@ -274,26 +280,33 @@ def test_distributed_join(how): pdt.assert_frame_equal(correct, res) @pytest.mark.parametrize('idx', [ - list('ABCD'*25), - np.array(list('0123'*25)).astype(int), - np.array(list('0123'*25)).astype(float), + np.random.choice([uuid4() for i in range(1000)], size=10000), + np.random.randint(0, 10000, 10000), + np.random.randint(0, 10000, 10000).astype(float), + pd.date_range('01-01-1970', periods=10000, freq='s'), ]) def test_groupby_sum(idx): + for sorted in [True, False]: + df = pd.DataFrame(dict(A=np.ones(len(idx)), B=np.arange(len(idx))), + index=idx, dtype=np.float) + correct = df.groupby(level=0).sum() + correct.sort_index(inplace=True) - df = pd.DataFrame(dict(A=np.ones(100), B=np.ones(100)), - index=idx) - correct = df.groupby(level=0).sum() - correct.sort_index(inplace=True) + spf = dsp.from_ddf(dd.from_pandas(df, npartitions=10, sort=sorted)) + assert spf.npartitions == 10 + grouped = spf.groupby_sum(split_out=4) + grouped2 = spf.groupby_sum(split_out=12) - spf = dsp.from_pandas(df, npartitions=2) - assert spf.npartitions == 2 - grouped = spf.groupby_sum(split_out=4) + assert grouped.npartitions == 4 + res1 = grouped.compute().todense() + res1.sort_index(inplace=True) - assert grouped.npartitions == 4 - res = grouped.compute().todense() - res.sort_index(inplace=True) + assert grouped2.npartitions == 12 + res2 = grouped2.compute().todense() + res2.sort_index(inplace=True) - pdt.assert_frame_equal(res, correct) + pdt.assert_frame_equal(res1, correct) + pdt.assert_frame_equal(res2, correct) def test_from_ddf(): @@ -313,3 +326,50 @@ def test_from_ddf(): with pytest.raises(ValueError): ddf = ddf.assign(A="some str value") dsf = dsp.from_ddf(ddf) + + +def test_sdf_sort_index(): + data = pd.DataFrame(np.random.rand(20, 4), + columns=list('ABCD'), + index=np.random.choice([1,2,3,4,5,6], 20)) + ddf = dd.from_pandas(data, + npartitions=4, + sort=False, + ) + + dsf = dsp.from_ddf(ddf) + dsf = dsf.sort_index() + + assert dsf.known_divisions + + res = dsf.compute() + assert res.index.is_monotonic + assert res.columns.tolist() == list('ABCD') + + +def test_sdf_sort_index_auto_partition(): + data = pd.DataFrame(np.random.rand(20000, 4), + columns=list('ABCD'), + index=np.random.choice(list(range(5000)), 20000)) + ddf = dd.from_pandas(data, + npartitions=20, + sort=False, + ) + + dsf = dsp.from_ddf(ddf) + dsf = dsf.sort_index(npartitions='auto', partition_size=80000) + + assert dsf.known_divisions + assert dsf.npartitions == 16 + + res = dsf.compute() + assert res.index.is_monotonic + assert res.columns.tolist() == list('ABCD') + + +def test_get_partition(dsf): + correct = dsf.compute().todense() + parts = [dsf.get_partition(i).compute().todense() + for i in range(dsf.npartitions)] + res = pd.concat(parts, axis=0) + pdt.assert_frame_equal(res, correct) From 9352ea3ccfa6aa50ad4de5ec844a6549014e9620 Mon Sep 17 00:00:00 2001 From: kayibal Date: Thu, 19 Apr 2018 18:08:25 +0200 Subject: [PATCH 50/76] Optimization of distributed procedures (#38) implements distributed rename method and adds quicker routines to groupby_sum if divisions are known. Adds support for joining sp.SparseFrames onto a distributed SparseFrame. --- sparsity/dask/core.py | 26 +++++++++++-- sparsity/dask/multi.py | 2 +- sparsity/test/test_dask_sparse_frame.py | 51 ++++++++++++++++++++++++- 3 files changed, 74 insertions(+), 5 deletions(-) diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index cb57fc0..d302bad 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -13,7 +13,8 @@ no_default, partial, partial_by_order, split_evenly, check_divisions, hash_shard, split_out_on_index, Index) -from dask.dataframe.utils import _nonempty_index +from dask.dataframe.groupby import _apply_chunk +from dask.dataframe.utils import _nonempty_index, make_meta from dask.dataframe.utils import make_meta as dd_make_meta from dask.delayed import Delayed from dask.optimize import cull @@ -173,14 +174,33 @@ def join(self, other, on=None, how='left', lsuffix='', rsuffix='', npartitions=None): from .multi import join_indexed_sparseframes + if isinstance(other, sp.SparseFrame) and how in ['left', 'inner']: + meta = sp.SparseFrame.join(self._meta_nonempty, + other, + how=how) + join_func = partial(sp.SparseFrame.join, other=other, + how=how) + return self.map_partitions(join_func, meta=meta, name='simplejoin') if not isinstance(other, (SparseFrame)): raise ValueError('other must be SparseFrame') return join_indexed_sparseframes( self, other, how=how) + def rename(self, columns): + _meta = self._meta.rename(columns=columns) + return self.map_partitions(sp.SparseFrame.rename, meta=_meta, + columns=columns) + def groupby_sum(self, split_out=1, split_every=8): meta = self._meta + if self.known_divisions: + res = self.map_partitions(sp.SparseFrame.groupby_sum, + meta=meta) + res.divisions = self.divisions + if split_out and split_out != self.npartitions: + res = res.repartition(npartitions=split_out) + return res token = 'groupby_sum' return apply_concat_apply(self, chunk=sp.SparseFrame.groupby_sum, @@ -569,9 +589,9 @@ def elemwise(op, *args, **kwargs): return SparseFrame(dsk, _name, meta, divisions) -def map_partitions(func, ddf, meta, **kwargs): +def map_partitions(func, ddf, meta, name=None, **kwargs): dsk = {} - name = func.__name__ + name = name or func.__name__ token = tokenize(func, meta, **kwargs) name = '{0}-{1}'.format(name, token) diff --git a/sparsity/dask/multi.py b/sparsity/dask/multi.py index fad58c6..81ff1ef 100644 --- a/sparsity/dask/multi.py +++ b/sparsity/dask/multi.py @@ -64,7 +64,7 @@ def align_partitions(*dfs): raise ValueError("dfs contains no DataFrame and Series") if not all(df.known_divisions for df in dfs1): raise ValueError("Not all divisions are known, can't align " - "partitions. Please use `set_index` or " + "partitions. Please use `sort_index` or " "`set_partition` to set the index.") divisions = list(unique(merge_sorted(*[df.divisions for df in dfs1]))) diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index 39d8576..dcec25a 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -21,7 +21,8 @@ @pytest.fixture def dsf(): - return dsp.from_pandas(pd.DataFrame(np.random.rand(10,2)), + return dsp.from_pandas(pd.DataFrame(np.random.rand(10,2), + columns=['A', 'B']), npartitions=3) def test_from_pandas(): @@ -309,6 +310,54 @@ def test_groupby_sum(idx): pdt.assert_frame_equal(res2, correct) +@pytest.mark.parametrize('how', ['left', 'inner']) +def test_distributed_join_shortcut(how): + left = pd.DataFrame(np.identity(10), + index=np.arange(10), + columns=list('ABCDEFGHIJ')) + right = pd.DataFrame(np.identity(10), + index=np.arange(5, 15), + columns=list('KLMNOPQRST')) + correct = left.join(right, how=how).fillna(0) + + d_left = dsp.from_pandas(left, npartitions=2) + d_right = sp.SparseFrame(right) + + joined = d_left.join(d_right, how=how) + + res = joined.compute().todense() + + pdt.assert_frame_equal(correct, res) + + +@pytest.mark.parametrize('idx, sorted', [ + (list('ABCD'*25), True), + (np.array(list('0123'*25)).astype(int), True), + (np.array(list('0123'*25)).astype(float), True), + (list('ABCD'*25), False), + (np.array(list('0123'*25)).astype(int), False), + (np.array(list('0123'*25)).astype(float), False), +]) +def test_groupby_sum(idx, sorted): + + df = pd.DataFrame(dict(A=np.ones(100), B=np.ones(100)), + index=idx) + correct = df.groupby(level=0).sum() + correct.sort_index(inplace=True) + + spf = dsp.from_pandas(df, npartitions=2) + if not sorted: + spf.divisions = [None] * (spf.npartitions + 1) + assert spf.npartitions == 2 + grouped = spf.groupby_sum(split_out=3) + + assert grouped.npartitions == 3 + res = grouped.compute().todense() + res.sort_index(inplace=True) + + pdt.assert_frame_equal(res, correct) + + def test_from_ddf(): ddf = dd.from_pandas( pd.DataFrame(np.random.rand(20, 4), From 401c4c620efc39a0628b08de276ee2c52f1ca8b6 Mon Sep 17 00:00:00 2001 From: kayibal Date: Fri, 20 Apr 2018 11:05:39 +0200 Subject: [PATCH 51/76] Set index (#36) implement distributed set_index. --- sparsity/dask/core.py | 21 +++++--- sparsity/sparse_frame.py | 19 ++++++- sparsity/test/conftest.py | 71 +++++++++++++++++++++++++ sparsity/test/test_dask_sparse_frame.py | 13 +++++ sparsity/test/test_sparse_frame.py | 69 ------------------------ 5 files changed, 115 insertions(+), 78 deletions(-) diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index d302bad..18327f5 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -18,6 +18,7 @@ from dask.dataframe.utils import make_meta as dd_make_meta from dask.delayed import Delayed from dask.optimize import cull +from dask.utils import derived_from from scipy import sparse from toolz import merge, remove, partition_all @@ -250,14 +251,18 @@ def sort_index(self, npartitions=None, divisions=None, **kwargs): return sort_index(self, npartitions=npartitions, divisions=None, **kwargs) - def groupby_sum(self, split_out=1, split_every=8): - meta = self._meta - token = 'groupby_sum' - return apply_concat_apply(self, - chunk=sp.SparseFrame.groupby_sum, - aggregate=sp.SparseFrame.groupby_sum, - meta=meta, token=token, split_every=split_every, - split_out=split_out, split_out_setup=split_out_on_index) + @derived_from(sp.SparseFrame) + def set_index(self, column=None, idx=None, level=None): + if column is None and idx is None and level is None: + raise ValueError("Either column, idx or level should not be None") + if idx is not None: + raise NotImplementedError('Only column or level supported') + new_name = self._meta.index.names[level] if level else column + meta = self._meta.set_index(pd.Index([], name=new_name)) + res = self.map_partitions(sp.SparseFrame.set_index, meta=meta, + column=column, idx=idx, level=level) + res.divisions = [None] * ( self.npartitions + 1) + return res def __repr__(self): return \ diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index d30f2d7..d8dd1bc 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -582,7 +582,24 @@ def dropna(self): return SparseFrame(new_data, index=new_index, columns=self.columns) def set_index(self, column=None, idx=None, level=None, inplace=False): - """Set index from array, column or existing multi-index level.""" + """Set index from array, column or existing multi-index level. + + Parameters + ---------- + column: str + set index from existing column in data. + idx: pd.Index, np.array + Set the index directly with a pandas index object or array + level: int + set index from a multiindex level. useful for groupbys. + inplace: bool + perform data transformation inplace + + Returns + ------- + sf: sp.SparseFrame \ None + the transformed sparse frame or None if inplace was True + """ if column is None and idx is None and level is None: raise ValueError("Either column, idx or level should not be None") elif idx is not None: diff --git a/sparsity/test/conftest.py b/sparsity/test/conftest.py index 9752d7f..b014bdc 100644 --- a/sparsity/test/conftest.py +++ b/sparsity/test/conftest.py @@ -9,6 +9,77 @@ import sparsity +# 2017 starts with a sunday +from sparsity import SparseFrame + + +@pytest.fixture() +def sampledata(): + def gendata(n, categorical=False): + sample_data = pd.DataFrame( + dict(date=pd.date_range("2017-01-01", periods=n))) + sample_data["weekday"] = sample_data.date.dt.weekday_name + sample_data["weekday_abbr"] = sample_data.weekday.apply( + lambda x: x[:3]) + + if categorical: + sample_data['weekday'] = sample_data['weekday'].astype('category') + sample_data['weekday_abbr'] = sample_data['weekday_abbr'] \ + .astype('category') + + sample_data["id"] = np.tile(np.arange(7), len(sample_data) // 7 + 1)[ + :len(sample_data)] + return sample_data + + return gendata + + +@pytest.fixture() +def sample_frame_labels(): + return SparseFrame(np.identity(5), + columns = list('ABCDE'), + index = list('VWXYZ')) + +@pytest.fixture() +def weekdays(): + return ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', + 'Friday', 'Saturday'] + + +@pytest.fixture() +def weekdays_abbr(weekdays): + return list(map(lambda x: x[:3], weekdays)) + + +@pytest.fixture() +def groupby_frame(): + shuffle_idx = np.random.permutation(np.arange(100)) + index = np.tile(np.arange(10), 10) + data = np.vstack([np.identity(10) for _ in range(10)]) + t = SparseFrame(data[shuffle_idx, :], index=index[shuffle_idx]) + return t + + +@pytest.fixture() +def sf_midx(): + midx = pd.MultiIndex.from_arrays( + [pd.date_range("2016-10-01", periods=5), + np.arange(5)] + ) + cols = list('ABCDE') + sf = SparseFrame(np.identity(5), index=midx, columns=cols) + return sf + +@pytest.fixture() +def sf_midx_int(): + midx = pd.MultiIndex.from_arrays( + [np.concatenate([np.ones(4), np.zeros(1)]), + pd.date_range("2016-10-01", periods=5)] + ) + cols = list('ABCDE') + sf = SparseFrame(np.identity(5), index=midx, columns=cols) + return sf + @pytest.fixture() def testdb(): return os.path.join(sparsity.__path__[0], 'test/tiny.tdb') diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index dcec25a..1fb74a0 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -422,3 +422,16 @@ def test_get_partition(dsf): for i in range(dsf.npartitions)] res = pd.concat(parts, axis=0) pdt.assert_frame_equal(res, correct) + + +def test_set_index(clickstream): + ddf = dd.from_pandas(clickstream, npartitions=10) + dsf = one_hot_encode(ddf, + categories={'page_id': list('ABCDE'), + 'other_categorical': list('FGHIJ')}, + order=['other_categorical', 'page_id'], + index_col=['index', 'id']) + dense = dsf.compute().set_index(level=1).todense() + res = dsf.set_index(level=1).compute().todense() + + pdt.assert_frame_equal(dense, res) diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 097bc68..3efac39 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -56,75 +56,6 @@ def mock_s3_fs(bucket, data=None): m.stop() -# 2017 starts with a sunday -@pytest.fixture() -def sampledata(): - def gendata(n, categorical=False): - sample_data = pd.DataFrame( - dict(date=pd.date_range("2017-01-01", periods=n))) - sample_data["weekday"] = sample_data.date.dt.weekday_name - sample_data["weekday_abbr"] = sample_data.weekday.apply( - lambda x: x[:3]) - - if categorical: - sample_data['weekday'] = sample_data['weekday'].astype('category') - sample_data['weekday_abbr'] = sample_data['weekday_abbr'] \ - .astype('category') - - sample_data["id"] = np.tile(np.arange(7), len(sample_data) // 7 + 1)[ - :len(sample_data)] - return sample_data - - return gendata - - -@pytest.fixture() -def sample_frame_labels(): - return SparseFrame(np.identity(5), - columns = list('ABCDE'), - index = list('VWXYZ')) - -@pytest.fixture() -def weekdays(): - return ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', - 'Friday', 'Saturday'] - - -@pytest.fixture() -def weekdays_abbr(weekdays): - return list(map(lambda x: x[:3], weekdays)) - - -@pytest.fixture() -def groupby_frame(): - shuffle_idx = np.random.permutation(np.arange(100)) - index = np.tile(np.arange(10), 10) - data = np.vstack([np.identity(10) for _ in range(10)]) - t = SparseFrame(data[shuffle_idx, :], index=index[shuffle_idx]) - return t - - -@pytest.fixture() -def sf_midx(): - midx = pd.MultiIndex.from_arrays( - [pd.date_range("2016-10-01", periods=5), - np.arange(5)] - ) - cols = list('ABCDE') - sf = SparseFrame(np.identity(5), index=midx, columns=cols) - return sf - -@pytest.fixture() -def sf_midx_int(): - midx = pd.MultiIndex.from_arrays( - [np.concatenate([np.ones(4), np.zeros(1)]), - pd.date_range("2016-10-01", periods=5)] - ) - cols = list('ABCDE') - sf = SparseFrame(np.identity(5), index=midx, columns=cols) - return sf - - def test_empty_init(): sf = SparseFrame(np.array([]), index=[], columns=['A', 'B']) assert sf.data.shape == (0, 2) From b6a59383194c0d3b11bc6266b34abad4ceb5905d Mon Sep 17 00:00:00 2001 From: kayibal Date: Fri, 20 Apr 2018 12:47:53 +0200 Subject: [PATCH 52/76] To npz (#39) Implents to_npz for dsitributed collection. Also fixes a small issue with optimized distributed join, --- sparsity/dask/core.py | 8 +-- sparsity/dask/io.py | 66 +++++++++++++++++++++---- sparsity/io.py | 22 ++++++--- sparsity/test/test_dask_sparse_frame.py | 14 +++++- 4 files changed, 88 insertions(+), 22 deletions(-) diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index 18327f5..6bebf88 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -188,10 +188,10 @@ def join(self, other, on=None, how='left', lsuffix='', return join_indexed_sparseframes( self, other, how=how) - def rename(self, columns): - _meta = self._meta.rename(columns=columns) - return self.map_partitions(sp.SparseFrame.rename, meta=_meta, - columns=columns) + def to_npz(self, filename, blocksize=None, + storage_options=None, compute=True): + from sparsity.dask.io import to_npz + to_npz(self, filename, blocksize, storage_options, compute) def groupby_sum(self, split_out=1, split_every=8): meta = self._meta diff --git a/sparsity/dask/io.py b/sparsity/dask/io.py index 403402b..b5e673e 100644 --- a/sparsity/dask/io.py +++ b/sparsity/dask/io.py @@ -3,11 +3,13 @@ import numpy as np import pandas as pd +from dask import delayed, base from dask.base import tokenize from dask.dataframe.io.io import sorted_division_locations import sparsity as sp from sparsity.dask.core import SparseFrame, _make_meta +from sparsity.io import _write_dict_npz, _open_npz_archive _sorted = sorted @@ -71,7 +73,7 @@ def from_pandas(df, npartitions=None, chunksize=None, name=None): return SparseFrame(dsk, name, meta, divisions) -def read_npz(path, sorted=False): +def read_npz(path, read_divisions=False, storage_options=None): """ Read SparseFrame from npz archives @@ -80,9 +82,10 @@ def read_npz(path, sorted=False): path: str path to load files from can contain '*' to reference multiple files - sorted: bool + read_divisions: bool if the files are sorted read the index for each file - to obtain divions + to obtain divions. If files are not sorted this will + raise and error. Returns ------- @@ -90,20 +93,32 @@ def read_npz(path, sorted=False): """ dsk = {} name = 'read_npz-{}'.format(tokenize(path)) - _paths = _sorted(list(glob(path))) - archive = np.load(_paths[0]) + loader = None + divisions = None + try: + loader = _open_npz_archive(path.split('*')[0] + 'metadata.npz', + storage_options) + divisions = loader['divisions'] + _paths = loader['partitions'] + except FileNotFoundError: + _paths = _sorted(list(glob(path))) + finally: + if loader: + loader.close() + archive = _open_npz_archive(_paths[0], storage_options) meta_idx, meta_cols = archive['frame_index'], archive['frame_columns'] meta = sp.SparseFrame(np.empty(shape=(0, len(meta_cols))), index=meta_idx[:0], columns=meta_cols) + for i, p in enumerate(_paths): - dsk[name, i] = (sp.SparseFrame.read_npz, p) + dsk[name, i] = (sp.SparseFrame.read_npz, p, storage_options) - if sorted: + if divisions is None and read_divisions: level = 0 if isinstance(meta_idx, pd.MultiIndex) else None divisions = _npz_read_divisions(_paths, level=level) - else: + elif divisions is None: divisions = [None] * (len(_paths) + 1) return SparseFrame(dsk, name, meta, divisions=divisions) @@ -118,7 +133,6 @@ def _npz_read_divisions(paths, level=None): idx = archive['frame_index'] if level is not None: idx = idx.get_level_values(level) - assert idx.is_monotonic_increasing istart = idx[0] istop = idx[-1] divisions.append(istart) @@ -132,4 +146,36 @@ def _npz_read_divisions(paths, level=None): file=paths[i], div1=divisions[i], div2=divisions[i+1] )) - return divisions \ No newline at end of file + return divisions + + +def write_npz_metadata(writes, divisions, paths, fn, + block_size, storage_options): + data = {} + data['divisions'] = np.asarray(divisions) + data['partitions'] = np.asarray(paths) + + _write_dict_npz(data, fn, block_size, storage_options) + + +def to_npz(sf: SparseFrame, path: str, block_size=None, + storage_options=None, compute=True): + if '*' not in path: + raise ValueError('Path needs to contain "*" wildcard.') + + tmpl_func = path.replace('*', '{0:06d}').format + metadata_fn = path.split('*')[0] + 'metadata.npz' + paths = list(map(tmpl_func, range(sf.npartitions))) + + write = delayed(sp.SparseFrame.to_npz, pure=False) + writes = [write(part, fn, block_size, storage_options) + for fn, part in zip(paths, sf.to_delayed())] + + write_metadata = delayed(write_npz_metadata, pure=False) + out = write_metadata(writes, sf.divisions, paths, metadata_fn, + block_size, storage_options) + + if compute: + out.compute() + return None + return out diff --git a/sparsity/io.py b/sparsity/io.py index 0953a53..08d1982 100644 --- a/sparsity/io.py +++ b/sparsity/io.py @@ -63,6 +63,10 @@ def to_npz(sf, filename, block_size=None, storage_options=None): if not filename.endswith('.npz'): filename += '.npz' + _write_dict_npz(data, filename, block_size, storage_options) + + +def _write_dict_npz(data, filename, block_size, storage_options): protocol = urlparse(filename).scheme or 'file' if protocol == 'file': with open(filename, 'wb') as fp: @@ -90,13 +94,7 @@ def _save_remote(buffer, filename, block_size=None, storage_options=None): def read_npz(filename, storage_options=None): - if storage_options is None: - storage_options = {} - protocol = urlparse(filename).scheme or 'file' - open_f = _filesystems[protocol](**storage_options).open - fp = open_f(filename, 'rb') - - loader = np.load(fp) + loader = _open_npz_archive(filename, storage_options) try: csr_mat = _load_csr(loader) idx = _load_idx_from_npz(loader) @@ -106,6 +104,16 @@ def read_npz(filename, storage_options=None): return csr_mat, idx, cols +def _open_npz_archive(filename, storage_options=None): + if storage_options is None: + storage_options = {} + protocol = urlparse(filename).scheme or 'file' + open_f = _filesystems[protocol](**storage_options).open + fp = open_f(filename, 'rb') + loader = np.load(fp) + return loader + + def _csr_to_dict(array): return dict(data = array.data ,indices=array.indices, indptr =array.indptr, shape=array.shape) diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index 1fb74a0..77b258c 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -207,11 +207,23 @@ def test_read_npz(): sf.iloc[50:75].to_npz(os.path.join(tmp, '3')) sf.iloc[75:].to_npz(os.path.join(tmp, '4')) - dsf = dsp.read_npz(os.path.join(tmp, '*.npz')) + dsf = dsp.read_npz(os.path.join(tmp, '*.npz'), read_divisions=True) sf = dsf.compute() + assert dsf.known_divisions assert np.all(sf.data.toarray() == np.identity(100)) +def test_to_npz(dsf): + dense = dsf.compute().todense() + with tmpdir() as tmp: + path = os.path.join(tmp, '*.npz') + dsf.to_npz(path) + loaded = dsp.read_npz(path) + assert loaded.known_divisions + res = loaded.compute().todense() + pdt.assert_frame_equal(dense, res) + + def test_assign_column(): s = pd.Series(np.arange(10)) ds = dd.from_pandas(s, npartitions=2) From f29af39bab136a10dfbff48d28806abf89839327 Mon Sep 17 00:00:00 2001 From: kayibal Date: Sat, 21 Apr 2018 01:28:08 +0200 Subject: [PATCH 53/76] update dask imports and __dask__keys usage (#40) Removes some deprecation warning by updating calls from _keys() to __dask_keys__() as well as updating th import from dask.optimize to dask.optimization --- sparsity/dask/core.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index 6bebf88..c42adc5 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -13,11 +13,10 @@ no_default, partial, partial_by_order, split_evenly, check_divisions, hash_shard, split_out_on_index, Index) -from dask.dataframe.groupby import _apply_chunk -from dask.dataframe.utils import _nonempty_index, make_meta +from dask.dataframe.utils import _nonempty_index from dask.dataframe.utils import make_meta as dd_make_meta from dask.delayed import Delayed -from dask.optimize import cull +from dask.optimization import cull from dask.utils import derived_from from scipy import sparse from toolz import merge, remove, partition_all @@ -65,9 +64,6 @@ def __init__(self, dsk, name, meta, divisions=None): def __dask_graph__(self): return self.dask - def __dask_keys__(self): - return self._keys() - __dask_scheduler__ = staticmethod(dask.threaded.get) @staticmethod @@ -112,7 +108,7 @@ def map_partitions(self, func, meta, *args, **kwargs): return map_partitions(func, self, meta, *args, **kwargs) def to_delayed(self): - return [Delayed(k, self.dask) for k in self._keys()] + return [Delayed(k, self.dask) for k in self.__dask_keys__()] def assign(self, **kwargs): for k, v in kwargs.items(): @@ -126,7 +122,7 @@ def assign(self, **kwargs): df2 = self._meta.assign(**_extract_meta(kwargs)) return elemwise(methods.assign, self, *pairs, meta=df2) - def _keys(self): + def __dask_keys__(self): return [(self._name, i) for i in range(self.npartitions)] @property @@ -572,8 +568,8 @@ def elemwise(op, *args, **kwargs): if not isinstance(arg, (_Frame, Scalar, SparseFrame))] # Get dsks graph tuple keys and adjust the key length of Scalar - keys = [d._keys() * n if isinstance(d, Scalar) or _is_broadcastable(d) - else d._keys() for d in dasks] + keys = [d.__dask_keys__() * n if isinstance(d, Scalar) or _is_broadcastable(d) + else d.__dask_keys__() for d in dasks] if other: dsk = {(_name, i): From 4d5fd2b2a2c3dc7288e9189a5a58aa13490508e0 Mon Sep 17 00:00:00 2001 From: kayibal Date: Fri, 1 Jun 2018 13:59:24 +0200 Subject: [PATCH 54/76] Drop support for pandas>=0.23.0 as api changes break iloc functionality (#43) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index b09dac8..f1ba91c 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,7 @@ packages=packages, cmdclass=versioneer.get_cmdclass(), install_requires=[ - 'pandas>=0.19.0', + 'pandas>=0.19.0,<0.23.0', 'scipy>=0.18.1', 'numpy>=1.12.0', 's3fs>=0.1.0' From 8d2f8f6551c6d8919982769a90e8661fc576bbc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alan=20H=C3=B6ng?= Date: Wed, 22 Aug 2018 13:24:21 +0200 Subject: [PATCH 55/76] Update indexer instantiation. Allow loc from index with duplicates. (#46) * Update indexer instantiation. Allow loc on index with duplicates. * Support latest versions of pandas (>=0.23.0) * Update circleci configuration to v2 * fix indexing error with older scipy versions (<1.0.0) * Support column indexing in _xs method * raise error if sparse frame is indexed (__getitem__) with None --- .circleci/config.yml | 11 ++++ circle.yml | 21 ------- setup.py | 2 +- sparsity/indexing.py | 11 +++- sparsity/sparse_frame.py | 78 +++++++++++++++++++++---- sparsity/test/test_dask_sparse_frame.py | 34 +++++------ sparsity/test/test_sparse_frame.py | 29 +++++++-- 7 files changed, 126 insertions(+), 60 deletions(-) create mode 100644 .circleci/config.yml delete mode 100644 circle.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..7e1f000 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,11 @@ +version: 2 +jobs: + build: + working_directory: ~/sparsity + docker: + - image: drtools/dask:latest + steps: + - checkout + - run: pip install pytest pytest-cov moto . + - run: py.test --cov sparsity --cov-report xml sparsity + - run: bash <(curl -s https://codecov.io/bash) diff --git a/circle.yml b/circle.yml deleted file mode 100644 index 8cfa0ac..0000000 --- a/circle.yml +++ /dev/null @@ -1,21 +0,0 @@ -machine: - python: - version: 3.5.2 - environment: - LD_LIBRARY_PATH: '/usr/local/lib' - -dependencies: - cache_directories: - - /home/ubuntu/.cache/pip - override: - - pip install numpy cython 2>&1 - - pip install pytest pytest-cov - - pip install -v scipy pandas - - pip install dask[dataframe] moto -test: - override: - - pip install . - - python -c 'import sparsity' - - py.test --cov sparsity --cov-report xml sparsity - post: - - bash <(curl -s https://codecov.io/bash) \ No newline at end of file diff --git a/setup.py b/setup.py index f1ba91c..b09dac8 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,7 @@ packages=packages, cmdclass=versioneer.get_cmdclass(), install_requires=[ - 'pandas>=0.19.0,<0.23.0', + 'pandas>=0.19.0', 'scipy>=0.18.1', 'numpy>=1.12.0', 's3fs>=0.1.0' diff --git a/sparsity/indexing.py b/sparsity/indexing.py index 90b3e6e..d32466f 100644 --- a/sparsity/indexing.py +++ b/sparsity/indexing.py @@ -1,5 +1,13 @@ from pandas.core.indexing import _LocIndexer, _iLocIndexer +def get_indexers_list(): + + return [ + ('iloc', _CsrILocationIndexer), + ('loc', _CsrLocIndexer), + ] + + class _CsrLocIndexer(_LocIndexer): def __getitem__(self, item): @@ -10,6 +18,7 @@ def _slice(self, slice, axis=0, kind=None): raise NotImplementedError() return self.obj._slice(slice) + class _CsrILocationIndexer(_iLocIndexer): def __getitem__(self, item): @@ -18,4 +27,4 @@ def __getitem__(self, item): def _slice(self, slice, axis=0, kind=None): if axis != 0: raise NotImplementedError() - return self.obj._slice(slice) \ No newline at end of file + return self.obj._slice(slice) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index d8dd1bc..8c9d54e 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -1,4 +1,5 @@ # coding=utf-8 +import functools import traceback import uuid import warnings @@ -22,7 +23,8 @@ trail_db = True except: trail_db = False -from sparsity.indexing import _CsrILocationIndexer, _CsrLocIndexer +from sparsity.indexing import _CsrILocationIndexer, _CsrLocIndexer, \ + get_indexers_list def _is_empty(data): @@ -45,9 +47,6 @@ class SparseFrame(object): Simple sparse table based on scipy.sparse.csr_matrix """ - __slots__ = ["_index", "_columns", "_data", "shape", - 'ndim', 'iloc', 'loc', 'empty'] - def __init__(self, data, index=None, columns=None, **kwargs): if len(data.shape) > 2: raise ValueError("Only two dimensional data supported") @@ -86,8 +85,17 @@ def __init__(self, data, index=None, columns=None, **kwargs): # register indexers self.ndim = 2 - self.iloc = _CsrILocationIndexer(self, 'iloc') - self.loc = _CsrLocIndexer(self, 'loc') + + @classmethod + def _create_indexer(cls, name, indexer): + """Create an indexer like _name in the class.""" + if getattr(cls, name, None) is None: + _v = tuple(map(int, pd.__version__.split('.'))) + if _v >= (0, 23, 0): + _indexer = functools.partial(indexer, name) + else: + _indexer = functools.partial(indexer, name=name) + setattr(cls, name, property(_indexer, doc=indexer.__doc__)) def _init_values(self, data, kwargs): if isinstance(data, pd.DataFrame): @@ -219,10 +227,21 @@ def _take(self, *args, **kwargs): """ return self.take(*args, **kwargs) - def _xs(self, key, *args, **kwargs): + def _xs(self, key, *args, axis=0, **kwargs): """Used for label based indexing.""" - loc = self.index.get_loc(key) - return SparseFrame(self.data[loc], index=[key], columns=self.columns) + if axis == 0: + loc = self.index.get_loc(key) + new_data = self.data[loc] + return SparseFrame(new_data, + index=[key] * new_data.shape[0], + columns=self.columns) + else: + loc = self.columns.get_loc(key) + new_data = self.data[:, loc] + return SparseFrame(new_data, + columns=[key] * new_data.shape[1], + index=self.index) + @property def index(self): @@ -558,7 +577,7 @@ def drop(self, labels, axis=0): labels = [labels] if axis == 1: mask = np.logical_not(self.columns.isin(labels)) - sf = self[self.columns[mask].tolist()] + sf = self.loc[:, self.columns[mask].tolist()] else: raise NotImplementedError return sf @@ -570,9 +589,17 @@ def drop_duplicate_idx(self, **kwargs): columns=self.columns) def __getitem__(self, item): + if item is None: + raise ValueError('cannot label index with a null key') if not isinstance(item, (tuple, list)): item = [item] - return self.reindex_axis(item, axis=1) + if len(item) > 0: + return self.reindex_axis(item, axis=1) + else: + data = np.empty(shape=(self.shape[0], 0)) + return SparseFrame(data, index=self.index, + columns=self.columns[[]]) + def dropna(self): """Drop nans from index.""" @@ -609,7 +636,7 @@ def set_index(self, column=None, idx=None, level=None, inplace=False): isinstance(self._index, pd.MultiIndex): new_idx = self.index.get_level_values(level) elif column is not None: - new_idx = np.asarray(self[column].data.todense()).reshape(-1) + new_idx = np.asarray(self.loc[:, column].data.todense()).reshape(-1) if inplace: self._index = _ensure_index(new_idx) @@ -647,6 +674,30 @@ def _get_axis_name(self, axis): raise ValueError('No axis named {} for {}' .format(axis, self.__class__)) + def _reindex_with_indexers(self, reindexers, **kwargs): + """allow_dups indicates an internal call here """ + + # reindex doing multiple operations on different axes if indicated + new_data = self.copy() + for axis in sorted(reindexers.keys()): + index, indexer = reindexers[axis] + + if index is None: + continue + + if axis == 0: + new_mat = new_data.data[indexer, :] + new_data = SparseFrame(new_mat, index=index, + columns=self.columns) + elif axis == 1: + new_mat = new_data.data[:, indexer] + new_data = SparseFrame(new_mat, columns=index, + index=self.index) + else: + raise ValueError('Only supported axes are 0 and 1.') + + return new_data + def reindex(self, labels=None, index=None, columns=None, axis=None, *args, **kwargs): """Conform SparseFrame to new index. @@ -923,3 +974,6 @@ def _check_categories_order(categories1, categories2, categorical_column_name, mismatch_type=mismatch_type ) ) + +for _name, _indexer in get_indexers_list(): + SparseFrame._create_indexer(_name, _indexer) diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index 77b258c..5ddd6b0 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -10,7 +10,6 @@ import sparsity as sp import sparsity.dask as dsp from dask.local import get_sync -from sparsity import sparse_one_hot from sparsity.dask.reshape import one_hot_encode import pandas.util.testing as pdt @@ -63,29 +62,23 @@ def test_loc(iindexer, correct_shape): assert res.shape == correct_shape def test_dask_loc(clickstream): - sf = dd.from_pandas(clickstream, npartitions=10) \ - .map_partitions( - sparse_one_hot, - categories={'page_id': list('ABCDE')}, - meta=list - ) - + sf = one_hot_encode(dd.from_pandas(clickstream, npartitions=10), + categories={'page_id': list('ABCDE'), + 'other_categorical': list('FGHIJ')}, + index_col=['index', 'id']) res = sf.loc['2016-01-15':'2016-02-15'] - res = sp.SparseFrame.concat(res.compute(get=get_sync).tolist()) - assert res.index.date.max() == dt.date(2016, 2, 15) - assert res.index.date.min() == dt.date(2016, 1, 15) + res = res.compute() + assert res.index.levels[0].max().date() == dt.date(2016, 2, 15) + assert res.index.levels[0].min().date() == dt.date(2016, 1, 15) def test_dask_multi_index_loc(clickstream): - sf = dd.from_pandas(clickstream, npartitions=10) \ - .map_partitions( - sparse_one_hot, - index_col=['index', 'id'], - categories={'page_id': list('ABCDE')}, - meta=list - ) + sf = one_hot_encode(dd.from_pandas(clickstream, npartitions=10), + categories={'page_id': list('ABCDE'), + 'other_categorical': list('FGHIJ')}, + index_col=['index', 'id']) res = sf.loc['2016-01-15':'2016-02-15'] - res = sp.SparseFrame.vstack(res.compute(get=get_sync).tolist()) + res = res.compute() assert res.index.get_level_values(0).date.min() == dt.date(2016, 1, 15) assert res.index.get_level_values(0).date.max() == dt.date(2016, 2, 15) @@ -234,7 +227,8 @@ def test_assign_column(): dsf = dsf.assign(new=ds) assert dsf._meta.empty sf = dsf.compute() - assert np.all(sf.todense() == f.assign(new=s)) + assert np.all((sf.todense() == f.assign(new=s)).values) + @pytest.mark.parametrize('arg_dict', [ dict(divisions=[0, 30, 50, 70, 99]), diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 3efac39..10f51e6 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -2,7 +2,6 @@ import datetime as dt import os -#import dask.dataframe as dd from contextlib import contextmanager import numpy as np @@ -202,8 +201,8 @@ def test_loc_multi_index(sf_midx, sf_midx_int): assert np.all(sf_midx.loc[dt_slice].data.todense() == np.identity(5)[:3]) - assert np.all(sf_midx_int.loc[1].todense() == sf_midx.data[:4,:]) - assert np.all(sf_midx_int.loc[0].todense() == sf_midx.data[4, :]) + assert np.all(sf_midx_int.loc[1].todense().values == sf_midx.data[:4,:]) + assert np.all(sf_midx_int.loc[0].todense().values == sf_midx.data[4, :]) def test_set_index(sf_midx): @@ -619,13 +618,20 @@ def test_npz_io_s3(complex_example): def test_getitem(): - sf = SparseFrame(np.identity(10), columns=list('abcdefghij')) + id_ = np.identity(10) + sf = SparseFrame(id_, columns=list('abcdefghij')) assert sf['a'].data.todense()[0] == 1 assert sf['j'].data.todense()[9] == 1 + assert np.all(sf[['a', 'b']].data.todense() == np.asmatrix(id_[:, [0, 1]])) tmp = sf[['j', 'a']].data.todense() assert tmp[9, 0] == 1 assert tmp[0, 1] == 1 assert (sf[list('abcdefghij')].data.todense() == np.identity(10)).all() + assert sf[[]].shape == (10, 0) + assert len(sf[[]].columns) == 0 + assert isinstance(sf.columns, type(sf[[]].columns)) + with pytest.raises(ValueError): + sf[None] def test_vstack(): @@ -895,4 +901,17 @@ def test_empty_elemwise(): assert np.all(res == sf.data.todense()) with pytest.raises(ValueError): - res = sf.add(sf_empty, fill_value=None) \ No newline at end of file + res = sf.add(sf_empty, fill_value=None) + + +def test_loc_duplicate_index(): + sf = SparseFrame(np.identity(5), + columns=list('UUXYZ'), + index=list('AAABB')) + assert len(sf.loc['A'].index) == 3 + assert len(sf.loc['B'].index) == 2 + assert np.all(sf.loc['A'].todense().values == np.identity(5)[:3]) + assert np.all(sf.loc['B'].todense().values == np.identity(5)[3:]) + + assert len(sf.loc[:, 'U'].columns) == 2 + assert np.all(sf.loc[:, 'U'].todense().values == np.identity(5)[:, :2]) From ce1ac3a4a8b32424b75eb2a9fcbfe9890ae7c2a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D?= Date: Tue, 28 Aug 2018 14:53:51 +0200 Subject: [PATCH 56/76] Accept pathlib objects in io module. (#48) This resolves problems that appeared after changing drtools' FileSystems behaviour. Eventually this should be handled more elegantly. Currently there's some duplicated code which is the same as in filesystem module in drtools. Maybe we should make FileSystems a separate package (opensource) and use it both in sparsity and drtools? --- sparsity/io.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/sparsity/io.py b/sparsity/io.py index 08d1982..3b94e42 100644 --- a/sparsity/io.py +++ b/sparsity/io.py @@ -1,4 +1,5 @@ from io import BytesIO +from pathlib import PurePath from urllib.parse import urlparse import numpy as np @@ -55,6 +56,7 @@ def traildb_to_coo(db, fieldname): def to_npz(sf, filename, block_size=None, storage_options=None): + filename = path2str(filename) data = _csr_to_dict(sf.data) data['metadata'] = \ {'multiindex': True if isinstance(sf.index, pd.MultiIndex) else False} @@ -67,6 +69,7 @@ def to_npz(sf, filename, block_size=None, storage_options=None): def _write_dict_npz(data, filename, block_size, storage_options): + filename = path2str(filename) protocol = urlparse(filename).scheme or 'file' if protocol == 'file': with open(filename, 'wb') as fp: @@ -83,6 +86,7 @@ def _write_dict_npz(data, filename, block_size, storage_options): def _save_remote(buffer, filename, block_size=None, storage_options=None): if storage_options is None: storage_options = {} + filename = path2str(filename) protocol = urlparse(filename).scheme fs = _filesystems[protocol](**storage_options) with fs.open(filename, 'wb', block_size) as remote_f: @@ -107,6 +111,7 @@ def read_npz(filename, storage_options=None): def _open_npz_archive(filename, storage_options=None): if storage_options is None: storage_options = {} + filename = path2str(filename) protocol = urlparse(filename).scheme or 'file' open_f = _filesystems[protocol](**storage_options).open fp = open_f(filename, 'rb') @@ -138,9 +143,20 @@ def _load_idx_from_npz(loader): def _just_read_array(path): + path = path2str(path) if path.endswith('hdf') or path.endswith('hdf5'): return pd.read_hdf(path, '/df').values elif path.endswith('csv'): return pd.read_csv(path).values elif path.endswith('pickle'): - return pd.read_pickle(path).values \ No newline at end of file + return pd.read_pickle(path).values + + +def path2str(arg): + """Convert arg into its string representation. + + This is only done if arg is subclass of PurePath + """ + if issubclass(type(arg), PurePath): + return str(arg) + return arg From 4c09026d0f2ff731b6dcaed5988fc10b7ffddca9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alan=20H=C3=B6ng?= Date: Tue, 4 Sep 2018 13:38:24 +0200 Subject: [PATCH 57/76] Raise error when initialising with unaligned indices (#51) * Raise error when initializing with unaligned indices --- sparsity/sparse_frame.py | 18 +++++++++++++++++- sparsity/test/test_sparse_frame.py | 17 +++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 8c9d54e..2a34b28 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -42,6 +42,7 @@ def _is_empty(data): return True return False + class SparseFrame(object): """ Simple sparse table based on scipy.sparse.csr_matrix @@ -62,12 +63,27 @@ def __init__(self, data, index=None, columns=None, **kwargs): if index is None: self._index = _default_index(N) + elif len(index) != N and data.size: + if columns is not None: + implied_axis_1 = len(columns) + else: + implied_axis_1 = data.shape[1] + raise ValueError('Shape of passed values is {},' + 'indices imply {}' + .format(data.shape, (len(index), implied_axis_1))) else: - # assert len(index) == N self._index = _ensure_index(index) if columns is None: self._columns = _default_index(K) + elif len(columns) != K and data.size: + if index is not None: + implied_axis_0 = len(index) + else: + implied_axis_0 = data.shape[0] + raise ValueError('Shape of passed values is {},' + 'indices imply {}' + .format(data.shape, (implied_axis_0, len(columns)))) else: # assert len(columns) == K self._columns = _ensure_index(columns) diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 10f51e6..7c2b6dc 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -59,6 +59,8 @@ def test_empty_init(): sf = SparseFrame(np.array([]), index=[], columns=['A', 'B']) assert sf.data.shape == (0, 2) + sf = SparseFrame(np.array([]), index=['A', 'B'], columns=[]) + assert sf.data.shape == (2, 0) def test_groupby(groupby_frame): t = groupby_frame @@ -915,3 +917,18 @@ def test_loc_duplicate_index(): assert len(sf.loc[:, 'U'].columns) == 2 assert np.all(sf.loc[:, 'U'].todense().values == np.identity(5)[:, :2]) + + +def test_error_unaligned_indices(): + data = np.identity(5) + with pytest.raises(ValueError) as e: + SparseFrame(data, index=np.arange(6)) + assert '(5, 5)' in str(e) and '(6, 5)' in str(e) + + with pytest.raises(ValueError) as e: + SparseFrame(data, columns=np.arange(6)) + assert '(5, 5)' in str(e) and '(5, 6)' in str(e) + + with pytest.raises(ValueError) as e: + SparseFrame(data, columns=np.arange(6), index=np.arange(6)) + assert '(5, 5)' in str(e) and '(6, 6)' in str(e) From 011fd3effaabd99e72ab519d85c1b32021cf0f5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D?= Date: Wed, 5 Sep 2018 17:41:32 +0200 Subject: [PATCH 58/76] Fix __repr__ (#60) Now it detects whether pandas appended 2 description rows at the end and removes them only if necessary. --- sparsity/sparse_frame.py | 27 +++++++++++++-------------- sparsity/test/test_sparse_frame.py | 11 +++++++++++ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 2a34b28..3989565 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -491,24 +491,23 @@ def __repr__(self): data = data.toarray() else: cols = self._columns - data = self.data[:nrows,:].toarray() + data = self.data[:nrows, :].toarray() + + df = pd.DataFrame(data, columns=cols, index=self._index[:nrows]) + df_str = df.__repr__().splitlines() + if df_str[-2] == '': + df_str = df_str[:-2] - df = pd.DataFrame(data, - columns=cols, - index=self._index[:nrows] - ) - df_str = df.__repr__().splitlines()[:-2] sparse_str = "[{nrows}x{ncols} SparseFrame of type '' \n with {nnz} stored elements " \ "in Compressed Sparse Row format]".format( - nrows=self.shape[0], - ncols=self.shape[1], - dtype=self.data.dtype, - nnz=self.data.nnz - ) - repr = "{data}\n{sparse}"\ - .format(data='\n'.join(df_str), - sparse=sparse_str) + nrows=self.shape[0], + ncols=self.shape[1], + dtype=self.data.dtype, + nnz=self.data.nnz + ) + repr = "{data}\n{sparse}" \ + .format(data='\n'.join(df_str), sparse=sparse_str) return repr def __array__(self): diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 7c2b6dc..8b0b16f 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -714,11 +714,22 @@ def test_drop_duplicate_idx(): def test_repr(): + sf = SparseFrame(sparse.csr_matrix((2, 3))) + res = sf.__repr__() + assert isinstance(res, str) + assert len(res.splitlines()) == 1 + 2 + 2 # column names + 2 rows + descr. + sf = SparseFrame(sparse.csr_matrix((10, 10000))) res = sf.__repr__() assert isinstance(res, str) assert '10x10000' in res assert '0 stored' in res + assert len(res.splitlines()) == 1 + 5 + 2 + + sf = SparseFrame(sparse.csr_matrix((10000, 10000))) + res = sf.__repr__() + assert isinstance(res, str) + assert len(res.splitlines()) == 1 + 5 + 2 sf = SparseFrame(np.array([]), index=[], columns=['A', 'B']) res = sf.__repr__() From eb777fd1e06c9660dff92932df738da9c6a14715 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D?= Date: Thu, 6 Sep 2018 09:05:38 +0200 Subject: [PATCH 59/76] Fix joining with axis=0 with different columns (#57) --- sparsity/sparse_frame.py | 25 +++++++++++++++---------- sparsity/test/test_sparse_frame.py | 7 +++---- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 3989565..2efb37a 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -43,6 +43,13 @@ def _is_empty(data): return False +def _append_zero_row(csr): + return sparse.vstack( + [csr, + sparse.coo_matrix((1, csr.shape[1])).tocsr()] + ) + + class SparseFrame(object): """ Simple sparse table based on scipy.sparse.csr_matrix @@ -164,10 +171,7 @@ def _init_csr(self, csr): """Keep a zero row at the end of the csr matrix for aligns.""" self.shape = csr.shape if not self.empty: - self._data = sparse.vstack( - [csr, - sparse.coo_matrix((1,csr.shape[1])).tocsr() - ]) + self._data = _append_zero_row(csr) else: self._data = csr @@ -369,12 +373,13 @@ def join(self, other, axis=1, how='outer', level=None): index = np.hstack([self.index, other.index]) res = SparseFrame(data, index=index, columns=self._columns) else: - raise NotImplementedError( - "Joining along axis 0 fails when column names differ." - "This is probably caused by adding all-zeros row.") - data, new_index = _matrix_join(self._data.T.tocsr(), other._data.T.tocsr(), - self._columns, other._columns, - how=how) + data, new_index = _matrix_join( + _append_zero_row(self.data.T.tocsr()), + _append_zero_row(other.data.T.tocsr()), + self._columns, + other._columns, + how=how, + ) res = SparseFrame(data.T.tocsr(), index=np.concatenate([self.index, other.index]), columns=new_index) diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 8b0b16f..c6144cb 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -127,10 +127,9 @@ def test_mutually_exclusive_join(): left_ax0 = SparseFrame(np.identity(5), columns=np.arange(5)) right_ax0 = SparseFrame(np.identity(5), columns=np.arange(5, 10)) - with pytest.raises(NotImplementedError): # FIXME: remove when repaired - res_ax0 = left_ax0.join(right_ax0, axis=0) - assert np.all(res_ax0.data.todense() == correct), \ - "Joining along axis 0 failed." + res_ax0 = left_ax0.join(right_ax0, axis=0) + assert np.all(res_ax0.data.todense() == correct), \ + "Joining along axis 0 failed." assert np.all(res_ax1.data.todense() == correct), \ "Joining along axis 1 failed." From c042db98e9e9771a9e42c780ede37d55264f65b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D?= Date: Thu, 6 Sep 2018 13:19:34 +0200 Subject: [PATCH 60/76] Fix init from pd.DataFrame with passed index/columns (#61) Previously original DataFrame's index/columns would be preserved and passed index/columns would be ignored. Now passed index/columns are used but a SyntaxWarning is issued. Fixes #52. --- sparsity/sparse_frame.py | 22 +++++++++++++++++----- sparsity/test/test_sparse_frame.py | 8 +++++++- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 2efb37a..a2b7bc8 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -92,12 +92,14 @@ def __init__(self, data, index=None, columns=None, **kwargs): 'indices imply {}' .format(data.shape, (implied_axis_0, len(columns)))) else: - # assert len(columns) == K self._columns = _ensure_index(columns) if not sparse.isspmatrix_csr(data): try: - self._init_values(data, kwargs) + self._init_values(data, + init_index=index is None, + init_columns=columns is None, + **kwargs) except TypeError: raise TypeError(traceback.format_exc() + "\nThe error described above occurred while " @@ -120,12 +122,22 @@ def _create_indexer(cls, name, indexer): _indexer = functools.partial(indexer, name=name) setattr(cls, name, property(_indexer, doc=indexer.__doc__)) - def _init_values(self, data, kwargs): + def _init_values(self, data, init_index=True, init_columns=True, **kwargs): if isinstance(data, pd.DataFrame): self.empty = data.empty self._init_csr(sparse.csr_matrix(data.values)) - self._index = _ensure_index(data.index) - self._columns = _ensure_index(data.columns) + if init_index: + self._index = _ensure_index(data.index) + else: + warnings.warn("Passed index explicitly while initializing " + "from pd.DataFrame. Original DataFrame's index " + "will be ignored.", SyntaxWarning) + if init_columns: + self._columns = _ensure_index(data.columns) + else: + warnings.warn("Passed columns explicitly while initializing " + "from pd.DataFrame. Original DataFrame's columns" + " will be ignored.", SyntaxWarning) elif _is_empty(data): self.empty = True self._data = sparse.csr_matrix((len(self.index), diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index c6144cb..cab8514 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -759,7 +759,13 @@ def test_init_with_pandas(): sf = SparseFrame(df) assert sf.shape == (5, 5) assert isinstance(sf.index, pd.MultiIndex) - assert sf.columns.tolist() == list('ABCDE') + assert (sf.index == df.index).all() + assert (sf.columns == df.columns).all() + + with pytest.warns(SyntaxWarning): + sf = SparseFrame(df, index=np.arange(10, 15), columns=list('VWXYZ')) + assert sf.index.tolist() == np.arange(10, 15).tolist() + assert sf.columns.tolist() == list('VWXYZ') s = pd.Series(np.ones(10)) sf = SparseFrame(s) From f3cd306d0fb947b7e47d9652118f575556269e2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D?= Date: Thu, 6 Sep 2018 13:20:21 +0200 Subject: [PATCH 61/76] Removed unused code (#62) `data` currently can't be a list anyway. Its `.shape` attribute is used at the very beginning of init method, so it has to be array-like. --- sparsity/sparse_frame.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index a2b7bc8..d9b4f0b 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -28,17 +28,7 @@ def _is_empty(data): - try: - if any(map(lambda x: x== 0, data.shape)): - return True - else: - return False - except: - pass - - if len(data) == 0: - return True - elif isinstance(data, list) and sum(map(len, list)) == 0: + if any(map(lambda x: x == 0, data.shape)): return True return False From 2c2cdd7518e5b11a4f9350534e4e7b6e00962f23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D?= Date: Thu, 6 Sep 2018 13:20:45 +0200 Subject: [PATCH 62/76] Swap behaviour for axis=0/1 in .multiply (#63) And add a better docstring. --- sparsity/sparse_frame.py | 15 ++++++++-- sparsity/test/test_sparse_frame.py | 44 +++++++++++++++++++++++------- 2 files changed, 46 insertions(+), 13 deletions(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index d9b4f0b..e6a085c 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -208,8 +208,15 @@ def copy(self, *args, deep=True, **kwargs): def multiply(self, other, axis='columns'): """ - To multiply row-wise 'other' should be of shape: (self.shape[0], 1) - To multiply col-wise 'other should be of shape: (1, self.shape[1]) + Multiply SparseFrame row-wise or column-wise. + + Parameters + ---------- + other: array-like + Vector of numbers to multiply columns/rows by. + axis: int | str + - 1 or 'columns' to multiply column-wise (default) + - 0 or 'index' to multiply row-wise """ try: other = other.toarray() @@ -217,9 +224,11 @@ def multiply(self, other, axis='columns'): pass if axis in [0, 'index']: + other = np.asarray(other).reshape(-1, 1) + elif axis in [1, 'columns']: other = np.asarray(other).reshape(1, -1) else: - other = np.asarray(other).reshape(-1, 1) + raise ValueError("Axis should be one of 0, 1, 'index', 'columns'.") data = self.data.multiply(other) assert data.shape == self.data.shape, \ diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index cab8514..419f562 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -784,20 +784,28 @@ def test_multiply_rowwise(): other = np.arange(5) msg = "Row wise multiplication failed" - # nd.array - other = other.reshape(1, -1) + # list + res = sf.multiply(list(other), axis=0) + assert np.all(res.sum(axis=1).T == 5 * other), msg + + # 1D array res = sf.multiply(other, axis=0) - assert np.all(res.sum(axis=0) == 5 * other), msg + assert np.all(res.sum(axis=1).T == 5 * other), msg + + # 2D array + _other = other.reshape(-1, 1) + res = sf.multiply(_other, axis=0) + assert np.all(res.sum(axis=1).T == 5 * other), msg # SparseFrame _other = SparseFrame(other) res = sf.multiply(_other, axis=0) - assert np.all(res.sum(axis=0) == 5 * other), msg + assert np.all(res.sum(axis=1).T == 5 * other), msg # csr_matrix _other = _other.data res = sf.multiply(_other, axis=0) - assert np.all(res.sum(axis=0) == 5 * other), msg + assert np.all(res.sum(axis=1).T == 5 * other), msg def test_multiply_colwise(): @@ -806,21 +814,37 @@ def test_multiply_colwise(): other = np.arange(5) msg = "Column wise multiplication failed" - # nd.array - other = other.reshape(-1, 1) + # list + res = sf.multiply(list(other), axis=1) + assert np.all(res.sum(axis=0) == 5 * other), msg + + # 1D array res = sf.multiply(other, axis=1) - assert np.all(res.sum(axis=1) == 5 * other), msg + assert np.all(res.sum(axis=0) == 5 * other), msg + + # 2D array + _other = other.reshape(1, -1) + res = sf.multiply(_other, axis=1) + assert np.all(res.sum(axis=0) == 5 * other), msg # SparseFrame _other = SparseFrame(other) res = sf.multiply(_other, axis=1) - assert np.all(res.sum(axis=1) == 5 * other), msg + assert np.all(res.sum(axis=0) == 5 * other), msg # csr_matrix _other = _other.data _other.toarray() res = sf.multiply(_other, axis=1) - assert np.all(res.sum(axis=1) == 5 * other), msg + assert np.all(res.sum(axis=0) == 5 * other), msg + + +def test_multiply_wrong_axis(): + sf = SparseFrame(np.ones((5, 5))) + other = np.arange(5) + + with pytest.raises(ValueError): + sf.multiply(other, axis=2) def test_drop_single_label(): From 20e3bc43b8f55168e270b2f728c18320d06ebae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D?= Date: Fri, 7 Sep 2018 11:32:26 +0200 Subject: [PATCH 63/76] Better index/columns handling in groupby operations (#64) - column names are preserved in groupby_agg - when groupby_agg is used with Multiindex and level=, resulting index has values only for specified level - when grouping by column, this column is not present in result Fixes #58. --- sparsity/sparse_frame.py | 25 ++++++++++++++----------- sparsity/test/test_sparse_frame.py | 26 ++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index e6a085c..0b711df 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -293,14 +293,15 @@ def groupby(self, by=None, level=0): return self.groupby_sum(by, level) def groupby_agg(self, by=None, level=None, agg_func=None): - by = self._get_groupby_col(by, level) + by, cols = self._get_groupby_col(by, level) groups = pd.Index(np.arange(self.shape[0])).groupby(by) res = sparse.csr_matrix((len(groups), self.shape[1])) new_idx = [] for i, (name, indizes) in enumerate(groups.items()): - new_idx.append(self.index.values[indizes[0]]) + new_idx.append(name) res[i] = agg_func(self.data[indizes.values,:]) - return SparseFrame(res, index=new_idx) + res = SparseFrame(res, index=new_idx, columns=self.columns) + return res[cols] def groupby_sum(self, by=None, level=0): """ @@ -321,19 +322,23 @@ def groupby_sum(self, by=None, level=0): df: sparsity.SparseFrame Grouped by and summed SparseFrame. """ - by = self._get_groupby_col(by, level) + by, cols = self._get_groupby_col(by, level) group_idx = by.argsort() gm = _create_group_matrix(by[group_idx]) grouped_data = self._data[group_idx, :].T.dot(gm).T - return SparseFrame(grouped_data, index=np.unique(by), columns=self._columns) + res = SparseFrame(grouped_data, index=np.unique(by), + columns=self._columns) + return res[cols] def _get_groupby_col(self, by, level): if by is None and level is None: raise ValueError("You have to supply one of 'by' and 'level'") + other_cols = self._columns.tolist() if by is not None: try: if by in self._columns: + other_cols.remove(by) by = self[by].toarray() except TypeError: assert len(by) == self.data.shape[0] @@ -341,14 +346,12 @@ def _get_groupby_col(self, by, level): else: if level and isinstance(self._index, pd.MultiIndex): by = self.index.get_level_values(level).values - elif level == 0: - by = np.asarray(self._index) elif level > 0: raise ValueError( - "Connot use level > 0 in a non MultiIndex Frame") - else: - by = self.index.values - return by + "Cannot use level > 0 in a non-MultiIndex Frame.") + else: # level == 0 + by = np.asarray(self._index) + return by, other_cols def join(self, other, axis=1, how='outer', level=None): """ diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 419f562..3468b41 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -745,8 +745,30 @@ def test_groupby_agg(groupby_frame): res = groupby_frame.groupby_agg( level=0, agg_func=lambda x: x.mean(axis=0) - ).data.todense() - assert np.all(res.round() == np.identity(10)) + ) + assert np.all(res.data.todense().round() == np.identity(10)) + + assert np.all(res.columns == groupby_frame.columns) + assert np.all(res.index == groupby_frame.index.unique().sort_values()) + + +def test_groupby_agg_multiindex(): + df = pd.DataFrame({'X': [1, 1, 1, 0], + 'Y': [0, 1, 0, 1], + 'gr': ['a', 'a', 'b', 'b'], + 'day': [10, 11, 11, 12]}) + df = df.set_index(['day', 'gr']) + sf = SparseFrame(df) + + correct = df.groupby(level=1).mean() + res = sf.groupby_agg(level=1, agg_func=lambda x: x.mean(axis=0)) + assert np.all(res.index == correct.index) + assert np.all(res.columns == correct.columns) + + correct = df.groupby(by='Y').mean() + res = sf.groupby_agg(by='Y', agg_func=lambda x: x.mean(axis=0)) + assert np.all(res.index == correct.index) + assert np.all(res.columns == correct.columns) def test_init_with_pandas(): From b52a27010bd83b4c71ac891b936725b48d9ded50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alan=20H=C3=B6ng?= Date: Fri, 7 Sep 2018 11:36:58 +0200 Subject: [PATCH 64/76] Remove traildb (#41) --- Makefile | 8 - install_traildbcore.sh | 10 - setup.py | 18 +- sparsity/_traildb.pyx | 45 - sparsity/io.py | 23 - sparsity/sparse_frame.py | 18 - sparsity/src/atomic_defs.h | 64 -- sparsity/src/bsd_queue.h | 564 ------------- sparsity/src/hashtable.c | 1014 ---------------------- sparsity/src/hashtable.h | 409 --------- sparsity/src/linklist.c | 1267 ---------------------------- sparsity/src/linklist.h | 423 ---------- sparsity/src/main.c | 54 -- sparsity/src/traildb_coo.c | 115 --- sparsity/src/traildb_coo.h | 17 - sparsity/test/pydata.tdb | Bin 3101696 -> 0 bytes sparsity/test/test_coo.py | 26 - sparsity/test/test_sparse_frame.py | 18 - sparsity/test/tiny.tdb | Bin 1321984 -> 0 bytes 19 files changed, 1 insertion(+), 4092 deletions(-) delete mode 100644 Makefile delete mode 100644 install_traildbcore.sh delete mode 100644 sparsity/_traildb.pyx delete mode 100755 sparsity/src/atomic_defs.h delete mode 100755 sparsity/src/bsd_queue.h delete mode 100755 sparsity/src/hashtable.c delete mode 100755 sparsity/src/hashtable.h delete mode 100755 sparsity/src/linklist.c delete mode 100755 sparsity/src/linklist.h delete mode 100644 sparsity/src/main.c delete mode 100644 sparsity/src/traildb_coo.c delete mode 100644 sparsity/src/traildb_coo.h delete mode 100644 sparsity/test/pydata.tdb delete mode 100644 sparsity/test/test_coo.py delete mode 100644 sparsity/test/tiny.tdb diff --git a/Makefile b/Makefile deleted file mode 100644 index ae7290f..0000000 --- a/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -test: sparsity/traildb.cpython-35m-darwin.so - py.test sparsity/test -s - -sparsity/traildb.cpython-35m-darwin.so: sparsity/_traildb.pyx - python setup.py build_ext --inplace - -clean: - rm -f sparsity/_traildb.c sparsity/_traildb.cpython-35m-darwin.so \ No newline at end of file diff --git a/install_traildbcore.sh b/install_traildbcore.sh deleted file mode 100644 index c1c7953..0000000 --- a/install_traildbcore.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash -git clone https://github.com/traildb/traildb traildb-core && pushd traildb-core -wget https://mirrors.kernel.org/ubuntu/pool/universe/j/judy/libjudy-dev_1.0.5-5_amd64.deb \ - https://mirrors.kernel.org/ubuntu/pool/universe/j/judy/libjudydebian1_1.0.5-5_amd64.deb -sudo dpkg -i libjudy-dev_1.0.5-5_amd64.deb libjudydebian1_1.0.5-5_amd64.deb -sudo apt-get update -sudo apt-get install -y libjudy-dev libarchive-dev pkg-config build-essential -sudo python ./waf configure -sudo python ./waf build -sudo python ./waf install \ No newline at end of file diff --git a/setup.py b/setup.py index b09dac8..6cfbcfa 100644 --- a/setup.py +++ b/setup.py @@ -1,29 +1,13 @@ import versioneer -from distutils.core import setup, Extension +from distutils.core import setup from setuptools import find_packages -try: - import traildb - import numpy as np - from Cython.Build import cythonize - ext = Extension("sparsity._traildb", - ['sparsity/_traildb.pyx', - 'sparsity/src/traildb_coo.c', - 'sparsity/src/hashtable.c', - 'sparsity/src/linklist.c'], - include_dirs=['/usr/local/include/', np.get_include()], - libraries=["traildb"]) - ext_modules = cythonize([ext]) -except (ImportError, OSError): - ext_modules = None - packages = find_packages() packages.remove('sparsity.test') setup( name='sparsity', version=versioneer.get_version(), - ext_modules = ext_modules, author='Alan Hoeng', author_email='alan.f.hoeng@gmail.com', packages=packages, diff --git a/sparsity/_traildb.pyx b/sparsity/_traildb.pyx deleted file mode 100644 index b3b93cf..0000000 --- a/sparsity/_traildb.pyx +++ /dev/null @@ -1,45 +0,0 @@ -from libc.stdlib cimport malloc, free -cimport numpy as np -from cpython.bytes cimport PyBytes_FromString -np.import_array() - -cdef extern from "stdint.h": - ctypedef unsigned long long uint64_t - ctypedef unsigned char uint8_t -# cdefine the signature of our c function -cdef extern from "src/traildb_coo.h": - uint64_t traildb_coo_repr (const char * path, const char * fieldname, - uint64_t * row_idx, uint64_t * col_idx, - uint8_t * uids, uint64_t * timestamps, - char** col_names, uint64_t** str_lens) - -# create the wrapper code, with numpy type annotations -def traildb_coo_repr_func(char * path, char * fieldname, - np.ndarray[np.uint64_t, ndim=1, mode="c"] row_idx not None, - np.ndarray[np.uint64_t, ndim=1, mode="c"] col_idx not None, - np.ndarray[np.uint8_t, ndim=2, mode="c"] uuids not None, - np.ndarray[np.uint64_t, ndim=1, mode="c"] timestamps not None): - #cdef uint8_t** uuids = malloc(len(row_idx) * sizeof(uint8_t*)) - cdef uint8_t[:,:] cython_uuids_view = uuids - cdef uint8_t *c_uuid_array = &cython_uuids_view[0, 0] - cdef char* col_names; - cdef uint64_t* lens; - n_cols = traildb_coo_repr(path, fieldname, - np.PyArray_DATA(row_idx), - np.PyArray_DATA(col_idx), - c_uuid_array, - np.PyArray_DATA(timestamps), - &col_names, - &lens) - - cols_raw = PyBytes_FromString(col_names) - cols = [] - start = 0 - end = 0 - for i in range(n_cols): - end = start + lens[i] - cols.append(cols_raw[start:end].decode()) - start = end - free(col_names) - free(lens) - return cols \ No newline at end of file diff --git a/sparsity/io.py b/sparsity/io.py index 3b94e42..68c8f05 100644 --- a/sparsity/io.py +++ b/sparsity/io.py @@ -6,12 +6,6 @@ import pandas as pd from scipy import sparse -try: - from traildb import TrailDB - from sparsity._traildb import traildb_coo_repr_func -except (ImportError, OSError): - TrailDB = False - _filesystems = {} try: @@ -38,23 +32,6 @@ class LocalFileSystem: pass -def traildb_to_coo(db, fieldname): - if not TrailDB: - raise ImportError("Could not find traildb") - db_handle = TrailDB(db) - num_events = db_handle.num_events - del db_handle - r_idx = np.zeros(num_events, dtype=np.uint64) - c_idx = np.zeros(num_events, dtype=np.uint64) - uuids = np.zeros((num_events,16), dtype=np.uint8) - timestamps = np.zeros(num_events, dtype=np.uint64) - - cols = traildb_coo_repr_func(db.encode(), fieldname.encode(), r_idx, - c_idx, uuids, timestamps) - return uuids, timestamps, cols,\ - sparse.coo_matrix((np.ones(num_events), (r_idx, c_idx))) - - def to_npz(sf, filename, block_size=None, storage_options=None): filename = path2str(filename) data = _csr_to_dict(sf.data) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 0b711df..8ee6888 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -18,11 +18,6 @@ from sparsity.io import to_npz, read_npz, _just_read_array from scipy import sparse -try: - from sparsity.io import traildb_to_coo - trail_db = True -except: - trail_db = False from sparsity.indexing import _CsrILocationIndexer, _CsrLocIndexer, \ get_indexers_list @@ -560,19 +555,6 @@ def _ixs(self, key, axis=0): index=new_idx, columns=self.columns) - @classmethod - def read_traildb(cls, file, field, ts_unit='s'): - if not trail_db: - raise ImportError("Traildb could not be imported") - uuids, timestamps, cols, coo = traildb_to_coo(file, field) - uuids = np.asarray([uuid.UUID(bytes=x.tobytes()) for x in - uuids]) - index = pd.MultiIndex.from_arrays \ - ([pd.CategoricalIndex(uuids), - pd.to_datetime(timestamps, unit=ts_unit,)], - names=('uuid', 'timestamp')) - return cls(coo.tocsr(), index=index, columns=cols) - def assign(self, **kwargs): sf = self for key, value in kwargs.items(): diff --git a/sparsity/src/atomic_defs.h b/sparsity/src/atomic_defs.h deleted file mode 100755 index b50a762..0000000 --- a/sparsity/src/atomic_defs.h +++ /dev/null @@ -1,64 +0,0 @@ -#ifndef HL_ATOMIC_DEFS_H -#define HL_ATOMIC_DEFS_H - -#define ATOMIC_READ(_v) __sync_fetch_and_add(&(_v), 0) -#define ATOMIC_INCREMENT(_v) (void)__sync_fetch_and_add(&(_v), 1) -#define ATOMIC_DECREMENT(_v) (void)__sync_fetch_and_sub(&(_v), 1) -#define ATOMIC_INCREASE(_v, _n) __sync_add_and_fetch(&(_v), (_n)) -#define ATOMIC_DECREASE(_v, _n) __sync_sub_and_fetch(&(_v), (_n)) -#define ATOMIC_CAS(_v, _o, _n) __sync_bool_compare_and_swap(&(_v), (_o), (_n)) -#define ATOMIC_CAS_RETURN(_v, _o, _n) __sync_val_compare_and_swap(&(_v), (_o), (_n)) - -#define ATOMIC_SET(_v, _n) {\ - int _b = 0;\ - do {\ - _b = ATOMIC_CAS(_v, ATOMIC_READ(_v), _n);\ - } while (__builtin_expect(!_b, 0));\ -} - -#define ATOMIC_SET_IF(_v, _c, _n, _t) {\ - _t _o = ATOMIC_READ(_v);\ - while (__builtin_expect((_o _c (_n)) && !ATOMIC_CAS(_v, _o, _n), 0)) \ - _o = ATOMIC_READ(_v);\ -} - - -#ifdef THREAD_SAFE - -#define __POSIX_C_SOURCE -#include - -#ifdef __MACH__ -#include -#endif - -#define MUTEX_INIT(_mutex) if (__builtin_expect(pthread_mutex_init(&(_mutex), 0) != 0, 0)) { abort(); } -#define MUTEX_DESTROY(_mutex) pthread_mutex_destroy(&(_mutex)) -#define MUTEX_LOCK(_mutex) if (__builtin_expect(pthread_mutex_lock(&(_mutex)) != 0, 0)) { abort(); } -#define MUTEX_UNLOCK(_mutex) if (__builtin_expect(pthread_mutex_unlock(&(_mutex)) != 0, 0)) { abort(); } -#ifdef __MACH__ -#define SPIN_INIT(_mutex) ((_mutex) = 0) -#define SPIN_DESTROY(_mutex) -#define SPIN_LOCK(_mutex) OSSpinLockLock(&(_mutex)) -#define SPIN_UNLOCK(_mutex) OSSpinLockUnlock(&(_mutex)) -#else -#define SPIN_INIT(_mutex) pthread_spin_init(&(_mutex), 0) -#define SPIN_DESTROY(_mutex) pthread_spin_destroy(&(_mutex)) -#define SPIN_LOCK(_mutex) if (__builtin_expect(pthread_spin_lock(&(_mutex)) != 0, 0)) { abort(); } -#define SPIN_UNLOCK(_mutex) if (__builtin_expect(pthread_spin_unlock(&(_mutex)) != 0, 0)) { abort(); } -#endif -#else -#define MUTEX_INIT(_mutex) -#define MUTEX_DESTROY(_mutex) -#define MUTEX_LOCK(_mutex) -#define MUTEX_UNLOCK(_mutex) -#define SPIN_INIT(_mutex) -#define SPIN_DESTROY(_mutex) -#define SPIN_LOCK(_mutex) -#define SPIN_UNLOCK(_mutex) -#endif - -#endif //ATOMIC_DEFS_H - -// vim: tabstop=4 shiftwidth=4 expandtab: -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ diff --git a/sparsity/src/bsd_queue.h b/sparsity/src/bsd_queue.h deleted file mode 100755 index 5ef6c87..0000000 --- a/sparsity/src/bsd_queue.h +++ /dev/null @@ -1,564 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)queue.h 8.5 (Berkeley) 8/20/94 - * $FreeBSD: src/sys/sys/queue.h,v 1.60.2.1 2005/08/16 22:41:39 phk Exp $ - */ - -#ifndef HL_SYS_QUEUE_H -#define HL_SYS_QUEUE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/* - * This file defines four types of data structures: singly-linked lists, - * singly-linked tail queues, lists and tail queues. - * - * A singly-linked list is headed by a single forward pointer. The elements - * are singly linked for minimum space and pointer manipulation overhead at - * the expense of O(n) removal for arbitrary elements. New elements can be - * added to the list after an existing element or at the head of the list. - * Elements being removed from the head of the list should use the explicit - * macro for this purpose for optimum efficiency. A singly-linked list may - * only be traversed in the forward direction. Singly-linked lists are ideal - * for applications with large datasets and few or no removals or for - * implementing a LIFO queue. - * - * A singly-linked tail queue is headed by a pair of pointers, one to the - * head of the list and the other to the tail of the list. The elements are - * singly linked for minimum space and pointer manipulation overhead at the - * expense of O(n) removal for arbitrary elements. New elements can be added - * to the list after an existing element, at the head of the list, or at the - * end of the list. Elements being removed from the head of the tail queue - * should use the explicit macro for this purpose for optimum efficiency. - * A singly-linked tail queue may only be traversed in the forward direction. - * Singly-linked tail queues are ideal for applications with large datasets - * and few or no removals or for implementing a FIFO queue. - * - * A list is headed by a single forward pointer (or an array of forward - * pointers for a hash table header). The elements are doubly linked - * so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before - * or after an existing element or at the head of the list. A list - * may only be traversed in the forward direction. - * - * A tail queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or - * after an existing element, at the head of the list, or at the end of - * the list. A tail queue may be traversed in either direction. - * - * For details on the use of these macros, see the queue(3) manual page. - * - * - * SLIST LIST STAILQ TAILQ - * _HEAD + + + + - * _HEAD_INITIALIZER + + + + - * _ENTRY + + + + - * _INIT + + + + - * _EMPTY + + + + - * _FIRST + + + + - * _NEXT + + + + - * _PREV - - - + - * _LAST - - + + - * _FOREACH + + + + - * _FOREACH_SAFE + + + + - * _FOREACH_REVERSE - - - + - * _FOREACH_REVERSE_SAFE - - - + - * _INSERT_HEAD + + + + - * _INSERT_BEFORE - + - + - * _INSERT_AFTER + + + + - * _INSERT_TAIL - - + + - * _CONCAT - - + + - * _REMOVE_HEAD + - + - - * _REMOVE + + + + - * - */ -#define QUEUE_MACRO_DEBUG 0 -#if QUEUE_MACRO_DEBUG -/* Store the last 2 places the queue element or head was altered */ -struct qm_trace { - char * lastfile; - int lastline; - char * prevfile; - int prevline; -}; - -#define TRACEBUF struct qm_trace trace; -#define TRASHIT(x) do {(x) = (void *)-1;} while (0) - -#define QMD_TRACE_HEAD(head) do { \ - (head)->trace.prevline = (head)->trace.lastline; \ - (head)->trace.prevfile = (head)->trace.lastfile; \ - (head)->trace.lastline = __LINE__; \ - (head)->trace.lastfile = __FILE__; \ -} while (0) - -#define QMD_TRACE_ELEM(elem) do { \ - (elem)->trace.prevline = (elem)->trace.lastline; \ - (elem)->trace.prevfile = (elem)->trace.lastfile; \ - (elem)->trace.lastline = __LINE__; \ - (elem)->trace.lastfile = __FILE__; \ -} while (0) - -#else -#define QMD_TRACE_ELEM(elem) -#define QMD_TRACE_HEAD(head) -#define TRACEBUF -#define TRASHIT(x) -#endif /* QUEUE_MACRO_DEBUG */ - -/* - * Singly-linked List declarations. - */ -#define SLIST_HEAD(name, type) \ -struct name { \ - struct type *slh_first; /* first element */ \ -} - -#define SLIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define SLIST_ENTRY(type) \ -struct { \ - struct type *sle_next; /* next element */ \ -} - -/* - * Singly-linked List functions. - */ -#define SLIST_EMPTY(head) ((head)->slh_first == NULL) - -#define SLIST_FIRST(head) ((head)->slh_first) - -#define SLIST_FOREACH(var, head, field) \ - for ((var) = SLIST_FIRST((head)); \ - (var); \ - (var) = SLIST_NEXT((var), field)) - -#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = SLIST_FIRST((head)); \ - (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define SLIST_FOREACH_PREVPTR(var, varp, head, field) \ - for ((varp) = &SLIST_FIRST((head)); \ - ((var) = *(varp)) != NULL; \ - (varp) = &SLIST_NEXT((var), field)) - -#define SLIST_INIT(head) do { \ - SLIST_FIRST((head)) = NULL; \ -} while (0) - -#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ - SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \ - SLIST_NEXT((slistelm), field) = (elm); \ -} while (0) - -#define SLIST_INSERT_HEAD(head, elm, field) do { \ - SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \ - SLIST_FIRST((head)) = (elm); \ -} while (0) - -#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) - -#define SLIST_REMOVE(head, elm, type, field) do { \ - if (SLIST_FIRST((head)) == (elm)) { \ - SLIST_REMOVE_HEAD((head), field); \ - } \ - else { \ - struct type *curelm = SLIST_FIRST((head)); \ - while (SLIST_NEXT(curelm, field) != (elm)) \ - curelm = SLIST_NEXT(curelm, field); \ - SLIST_NEXT(curelm, field) = \ - SLIST_NEXT(SLIST_NEXT(curelm, field), field); \ - } \ -} while (0) - -#define SLIST_REMOVE_HEAD(head, field) do { \ - SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ -} while (0) - -/* - * Singly-linked Tail queue declarations. - */ -#define STAILQ_HEAD(name, type) \ -struct name { \ - struct type *stqh_first;/* first element */ \ - struct type **stqh_last;/* addr of last next element */ \ -} - -#define STAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).stqh_first } - -#define STAILQ_ENTRY(type) \ -struct { \ - struct type *stqe_next; /* next element */ \ -} - -/* - * Singly-linked Tail queue functions. - */ -#define STAILQ_CONCAT(head1, head2) do { \ - if (!STAILQ_EMPTY((head2))) { \ - *(head1)->stqh_last = (head2)->stqh_first; \ - (head1)->stqh_last = (head2)->stqh_last; \ - STAILQ_INIT((head2)); \ - } \ -} while (0) - -#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) - -#define STAILQ_FIRST(head) ((head)->stqh_first) - -#define STAILQ_FOREACH(var, head, field) \ - for((var) = STAILQ_FIRST((head)); \ - (var); \ - (var) = STAILQ_NEXT((var), field)) - - -#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = STAILQ_FIRST((head)); \ - (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define STAILQ_INIT(head) do { \ - STAILQ_FIRST((head)) = NULL; \ - (head)->stqh_last = &STAILQ_FIRST((head)); \ -} while (0) - -#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ - if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ - STAILQ_NEXT((tqelm), field) = (elm); \ -} while (0) - -#define STAILQ_INSERT_HEAD(head, elm, field) do { \ - if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ - STAILQ_FIRST((head)) = (elm); \ -} while (0) - -#define STAILQ_INSERT_TAIL(head, elm, field) do { \ - STAILQ_NEXT((elm), field) = NULL; \ - *(head)->stqh_last = (elm); \ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ -} while (0) - -#define STAILQ_LAST(head, type, field) \ - (STAILQ_EMPTY((head)) ? \ - NULL : \ - ((struct type *) \ - ((char *)((head)->stqh_last) - __offsetof(struct type, field)))) - -#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) - -#define STAILQ_REMOVE(head, elm, type, field) do { \ - if (STAILQ_FIRST((head)) == (elm)) { \ - STAILQ_REMOVE_HEAD((head), field); \ - } \ - else { \ - struct type *curelm = STAILQ_FIRST((head)); \ - while (STAILQ_NEXT(curelm, field) != (elm)) \ - curelm = STAILQ_NEXT(curelm, field); \ - if ((STAILQ_NEXT(curelm, field) = \ - STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL)\ - (head)->stqh_last = &STAILQ_NEXT((curelm), field);\ - } \ -} while (0) - -#define STAILQ_REMOVE_HEAD(head, field) do { \ - if ((STAILQ_FIRST((head)) = \ - STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \ - (head)->stqh_last = &STAILQ_FIRST((head)); \ -} while (0) - -#define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do { \ - if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL) \ - (head)->stqh_last = &STAILQ_FIRST((head)); \ -} while (0) - -/* - * List declarations. - */ -#define LIST_HEAD(name, type) \ -struct name { \ - struct type *lh_first; /* first element */ \ -} - -#define LIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define LIST_ENTRY(type) \ -struct { \ - struct type *le_next; /* next element */ \ - struct type **le_prev; /* address of previous next element */ \ -} - -/* - * List functions. - */ - -#define LIST_EMPTY(head) ((head)->lh_first == NULL) - -#define LIST_FIRST(head) ((head)->lh_first) - -#define LIST_FOREACH(var, head, field) \ - for ((var) = LIST_FIRST((head)); \ - (var); \ - (var) = LIST_NEXT((var), field)) - -#define LIST_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = LIST_FIRST((head)); \ - (var) && ((tvar) = LIST_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define LIST_INIT(head) do { \ - LIST_FIRST((head)) = NULL; \ -} while (0) - -#define LIST_INSERT_AFTER(listelm, elm, field) do { \ - if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\ - LIST_NEXT((listelm), field)->field.le_prev = \ - &LIST_NEXT((elm), field); \ - LIST_NEXT((listelm), field) = (elm); \ - (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ -} while (0) - -#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.le_prev = (listelm)->field.le_prev; \ - LIST_NEXT((elm), field) = (listelm); \ - *(listelm)->field.le_prev = (elm); \ - (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ -} while (0) - -#define LIST_INSERT_HEAD(head, elm, field) do { \ - if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ - LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\ - LIST_FIRST((head)) = (elm); \ - (elm)->field.le_prev = &LIST_FIRST((head)); \ -} while (0) - -#define LIST_NEXT(elm, field) ((elm)->field.le_next) - -#define LIST_REMOVE(elm, field) do { \ - if (LIST_NEXT((elm), field) != NULL) \ - LIST_NEXT((elm), field)->field.le_prev = \ - (elm)->field.le_prev; \ - *(elm)->field.le_prev = LIST_NEXT((elm), field); \ -} while (0) - -/* - * Tail queue declarations. - */ -#define TAILQ_HEAD(name, type) \ -struct name { \ - struct type *tqh_first; /* first element */ \ - struct type **tqh_last; /* addr of last next element */ \ - TRACEBUF \ -} - -#define TAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).tqh_first } - -#define TAILQ_ENTRY(type) \ -struct { \ - struct type *tqe_next; /* next element */ \ - struct type **tqe_prev; /* address of previous next element */ \ - TRACEBUF \ -} - -/* - * Tail queue functions. - */ -#define TAILQ_CONCAT(head1, head2, field) do { \ - if (!TAILQ_EMPTY(head2)) { \ - *(head1)->tqh_last = (head2)->tqh_first; \ - (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ - (head1)->tqh_last = (head2)->tqh_last; \ - TAILQ_INIT((head2)); \ - QMD_TRACE_HEAD(head1); \ - QMD_TRACE_HEAD(head2); \ - } \ -} while (0) - -#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) - -#define TAILQ_FIRST(head) ((head)->tqh_first) - -#define TAILQ_FOREACH(var, head, field) \ - for ((var) = TAILQ_FIRST((head)); \ - (var); \ - (var) = TAILQ_NEXT((var), field)) - -#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = TAILQ_FIRST((head)); \ - (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ - for ((var) = TAILQ_LAST((head), headname); \ - (var); \ - (var) = TAILQ_PREV((var), headname, field)) - -#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ - for ((var) = TAILQ_LAST((head), headname); \ - (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ - (var) = (tvar)) - -#define TAILQ_INIT(head) do { \ - TAILQ_FIRST((head)) = NULL; \ - (head)->tqh_last = &TAILQ_FIRST((head)); \ - QMD_TRACE_HEAD(head); \ -} while (0) - -#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ - TAILQ_NEXT((elm), field)->field.tqe_prev = \ - &TAILQ_NEXT((elm), field); \ - else { \ - (head)->tqh_last = &TAILQ_NEXT((elm), field); \ - QMD_TRACE_HEAD(head); \ - } \ - TAILQ_NEXT((listelm), field) = (elm); \ - (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ - QMD_TRACE_ELEM(&(elm)->field); \ - QMD_TRACE_ELEM(&listelm->field); \ -} while (0) - -#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ - TAILQ_NEXT((elm), field) = (listelm); \ - *(listelm)->field.tqe_prev = (elm); \ - (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ - QMD_TRACE_ELEM(&(elm)->field); \ - QMD_TRACE_ELEM(&listelm->field); \ -} while (0) - -#define TAILQ_INSERT_HEAD(head, elm, field) do { \ - if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ - TAILQ_FIRST((head))->field.tqe_prev = \ - &TAILQ_NEXT((elm), field); \ - else \ - (head)->tqh_last = &TAILQ_NEXT((elm), field); \ - TAILQ_FIRST((head)) = (elm); \ - (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ - QMD_TRACE_HEAD(head); \ - QMD_TRACE_ELEM(&(elm)->field); \ -} while (0) - -#define TAILQ_INSERT_TAIL(head, elm, field) do { \ - TAILQ_NEXT((elm), field) = NULL; \ - (elm)->field.tqe_prev = (head)->tqh_last; \ - *(head)->tqh_last = (elm); \ - (head)->tqh_last = &TAILQ_NEXT((elm), field); \ - QMD_TRACE_HEAD(head); \ - QMD_TRACE_ELEM(&(elm)->field); \ -} while (0) - -#define TAILQ_LAST(head, headname) \ - (*(((struct headname *)((head)->tqh_last))->tqh_last)) - -#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) - -#define TAILQ_PREV(elm, headname, field) \ - (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) - -#define TAILQ_REMOVE(head, elm, field) do { \ - if ((TAILQ_NEXT((elm), field)) != NULL) \ - TAILQ_NEXT((elm), field)->field.tqe_prev = \ - (elm)->field.tqe_prev; \ - else { \ - (head)->tqh_last = (elm)->field.tqe_prev; \ - QMD_TRACE_HEAD(head); \ - } \ - *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ - TRASHIT((elm)->field.tqe_next); \ - TRASHIT((elm)->field.tqe_prev); \ - QMD_TRACE_ELEM(&(elm)->field); \ -} while (0) - - -#ifdef _KERNEL - -/* - * XXX insque() and remque() are an old way of handling certain queues. - * They bogusly assumes that all queue heads look alike. - */ - -struct quehead { - struct quehead *qh_link; - struct quehead *qh_rlink; -}; - -#ifdef __CC_SUPPORTS___INLINE - -static __inline void -insque(void *a, void *b) -{ - struct quehead *element = (struct quehead *)a, - *head = (struct quehead *)b; - - element->qh_link = head->qh_link; - element->qh_rlink = head; - head->qh_link = element; - element->qh_link->qh_rlink = element; -} - -static __inline void -remque(void *a) -{ - struct quehead *element = (struct quehead *)a; - - element->qh_link->qh_rlink = element->qh_rlink; - element->qh_rlink->qh_link = element->qh_link; - element->qh_rlink = 0; -} - -#else /* !__CC_SUPPORTS___INLINE */ - -void insque(void *a, void *b); -void remque(void *a); - -#endif /* __CC_SUPPORTS___INLINE */ - -#endif /* _KERNEL */ - -#ifdef __cplusplus -} -#endif - -#endif /* !_SYS_QUEUE_H_ */ - -// vim: tabstop=4 shiftwidth=4 expandtab: -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ diff --git a/sparsity/src/hashtable.c b/sparsity/src/hashtable.c deleted file mode 100755 index e39f829..0000000 --- a/sparsity/src/hashtable.c +++ /dev/null @@ -1,1014 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "bsd_queue.h" -#include "atomic_defs.h" -#include "hashtable.h" - -#define HT_KEY_EQUALS(_k1, _kl1, _k2, _kl2) \ - (((char *)(_k1))[0] == ((char *)(_k2))[0] && \ - (_kl1) == (_kl2) && \ - memcmp((_k1), (_k2), (_kl1)) == 0) - - -typedef struct _ht_item { - uint32_t hash; - char kbuf[32]; - void *key; - size_t klen; - void *data; - size_t dlen; - TAILQ_ENTRY(_ht_item) next; -} __attribute__((packed)) ht_item_t; - -typedef struct _ht_item_list { - TAILQ_HEAD(, _ht_item) head; -#ifdef THREAD_SAFE -#ifdef __MACH__ - OSSpinLock lock; -#else - pthread_spinlock_t lock; -#endif -#endif - size_t index; - TAILQ_ENTRY(_ht_item_list) iterator_next; -} __attribute__((packed)) ht_items_list_t; - -typedef struct { - TAILQ_HEAD(, _ht_item_list) head; -} __attribute__((packed)) ht_iterator_list_t; - -// NOTE : order here matters (and also numbering) -typedef enum { - HT_STATUS_CLEAR = 0, - HT_STATUS_WRITE = 1, - HT_STATUS_GROW = 2, - HT_STATUS_IDLE = 3, - HT_STATUS_READ = 4 -} __attribute__((packed)) ht_status_t; - -struct _hashtable_s { - size_t size; - size_t max_size; - size_t count; - ht_status_t status; - uint32_t seed; - ht_items_list_t **items; - ht_free_item_callback_t free_item_cb; - ht_iterator_list_t *iterator_list; -#ifdef THREAD_SAFE - pthread_mutex_t iterator_lock; -#endif -} __attribute__((packed)); - -typedef struct _ht_iterator_callback { - int (*cb)(); - void *user; - size_t count; - hashtable_t *table; -} ht_iterator_callback_t; - -typedef struct _ht_collector_arg { - linked_list_t *output; - size_t count; -} ht_collector_arg_t; - -static inline uint32_t -ht_hash_one_at_a_time(hashtable_t *table, const unsigned char *str, const ssize_t len) -{ - const unsigned char * const end = (const unsigned char *)str + len; - uint32_t hash = table->seed + len; - while (str < end) { - hash += *str++; - hash += (hash << 10); - hash ^= (hash >> 6); - } - hash += (hash << 3); - hash ^= (hash >> 11); - return (hash + (hash << 15)); -} - - -hashtable_t * -ht_create(size_t initial_size, size_t max_size, ht_free_item_callback_t cb) -{ - hashtable_t *table = (hashtable_t *)calloc(1, sizeof(hashtable_t)); - - if (table && ht_init(table, initial_size, max_size, cb) != 0) { - free(table); - return NULL; - } - - return table; -} - -int -ht_init(hashtable_t *table, - size_t initial_size, - size_t max_size, - ht_free_item_callback_t cb) -{ - table->size = initial_size > HT_SIZE_MIN ? initial_size : HT_SIZE_MIN; - table->max_size = max_size; - table->items = (ht_items_list_t **)calloc(table->size, sizeof(ht_items_list_t *)); - if (!table->items) - return -1; - - table->status = HT_STATUS_IDLE; - - ht_set_free_item_callback(table, cb); -#ifdef BSD - table->seed = arc4random()%UINT32_MAX; -#else - table->seed = random()%UINT32_MAX; -#endif - table->iterator_list = calloc(1, sizeof(ht_iterator_list_t)); - if (!table->iterator_list) { - free(table->items); - return -1; - } - TAILQ_INIT(&table->iterator_list->head); - - MUTEX_INIT(table->iterator_lock); - - return 0; -} - -void -ht_set_free_item_callback(hashtable_t *table, ht_free_item_callback_t cb) -{ - ATOMIC_SET(table->free_item_cb, cb); -} - -void -ht_clear(hashtable_t *table) -{ - while(!ATOMIC_CAS(table->status, HT_STATUS_IDLE, HT_STATUS_CLEAR)) - sched_yield(); - - MUTEX_LOCK(table->iterator_lock); - ht_items_list_t *tmplist, *list = NULL; - TAILQ_FOREACH_SAFE(list, &table->iterator_list->head, iterator_next, tmplist) { - SPIN_LOCK(list->lock); - - ht_item_t *item = NULL; - ht_item_t *tmp; - - TAILQ_FOREACH_SAFE(item, &list->head, next, tmp) { - TAILQ_REMOVE(&list->head, item, next); - if (table->free_item_cb) - table->free_item_cb(item->data); - if (item->key != item->kbuf) - free(item->key); - free(item); - ATOMIC_DECREMENT(table->count); - } - - table->items[list->index] = NULL; - TAILQ_REMOVE(&table->iterator_list->head, list, iterator_next); - SPIN_UNLOCK(list->lock); - SPIN_DESTROY(list->lock); - free(list); - } - MUTEX_UNLOCK(table->iterator_lock); - - ATOMIC_CAS(table->status, HT_STATUS_CLEAR, HT_STATUS_IDLE); -} - -void -ht_destroy(hashtable_t *table) -{ - ht_clear(table); - free(table->items); - MUTEX_DESTROY(table->iterator_lock); - free(table->iterator_list); - free(table); -} - -static inline void -ht_grow_table(hashtable_t *table) -{ - // if we are not able to change the status now, let's return. - // ht_grow_table() will be called again next time a new key has been set - if (!ATOMIC_CAS(table->status, HT_STATUS_IDLE, HT_STATUS_GROW)) - return; - - // extra check if the table has been already updated by another thread in the meanwhile - if (table->max_size && ATOMIC_READ(table->size) >= table->max_size) { - ATOMIC_CAS(table->status, HT_STATUS_GROW, HT_STATUS_IDLE); - return; - } - - ht_iterator_list_t *new_iterator_list = calloc(1, sizeof(ht_iterator_list_t)); - if (!new_iterator_list) { - ATOMIC_CAS(table->status, HT_STATUS_GROW, HT_STATUS_IDLE); - return; - } - - TAILQ_INIT(&new_iterator_list->head); - - size_t new_size = ATOMIC_READ(table->size) << 1; - - if (table->max_size && new_size > table->max_size) - new_size = table->max_size; - - ht_items_list_t **items_list = - (ht_items_list_t **)calloc(new_size, sizeof(ht_items_list_t *)); - - if (!items_list) { - free(new_iterator_list); - ATOMIC_CAS(table->status, HT_STATUS_GROW, HT_STATUS_IDLE); - return; - } - - ht_item_t *item = NULL; - - MUTEX_LOCK(table->iterator_lock); - - ht_items_list_t **old_items = table->items; - table->items = items_list; - ATOMIC_SET(table->size, new_size); - - ht_items_list_t *tmp, *list = NULL; - TAILQ_FOREACH_SAFE(list, &table->iterator_list->head, iterator_next, tmp) { - // NOTE : list->index is safe to access outside of the lock - ATOMIC_SET(old_items[list->index], NULL); - // now readers can't access this list anymore - SPIN_LOCK(list->lock); - - // move all the items from the old list to the new one - while((item = TAILQ_FIRST(&list->head))) { - ht_items_list_t *new_list = ATOMIC_READ(items_list[item->hash%new_size]); - if (!new_list) { - new_list = malloc(sizeof(ht_items_list_t)); - // XXX - if malloc fails here the table is irremediably corrupted - // so there is no point in handling the case. - // TODO : using an internal prealloc'd bufferpool would ensure - // us to always obtain a valid pointer here - TAILQ_INIT(&new_list->head); - SPIN_INIT(new_list->lock); - size_t index = item->hash%new_size; - ATOMIC_SET(items_list[index], new_list); - new_list->index = index; - TAILQ_INSERT_TAIL(&new_iterator_list->head, new_list, iterator_next); - } - TAILQ_REMOVE(&list->head, item, next); - TAILQ_INSERT_TAIL(&new_list->head, item, next); - - } - - // we can now unregister the list from the iterator and release it - TAILQ_REMOVE(&table->iterator_list->head, list, iterator_next); - SPIN_UNLOCK(list->lock); - SPIN_DESTROY(list->lock); - free(list); - } - - // swap the iterator list - free(table->iterator_list); - table->iterator_list = new_iterator_list; - MUTEX_UNLOCK(table->iterator_lock); - - ATOMIC_CAS(table->status, HT_STATUS_GROW, HT_STATUS_IDLE); - - free(old_items); - - //fprintf(stderr, "Done growing table\n"); -} - -static inline ht_items_list_t * -ht_get_list(hashtable_t *table, uint32_t hash) -{ - size_t index = hash%ATOMIC_READ(table->size); - - // first try updating the status assuming we are the first reader requesting - // access to the table - uint32_t status; - do { - status = ATOMIC_CAS_RETURN(table->status, HT_STATUS_IDLE, HT_STATUS_READ); - // NOTE : if some writer is accessing the table we need to wait, - // multiple readers (status greater than IDLE) are allowed. - // In the unlikely event that sched_yield() fails, we break the loop - // but we will still check if the status is valid and in case it's not - // (so the cas operation didn't succeed) we will synchronize again with - // the other threads - } while (status < HT_STATUS_IDLE && sched_yield() == 0); - - // if some other reader is running in a background thread and has already - // updated the status (so it's already greater than IDLE), let's take that - // into account and try incrementing the status value by one - while (status != HT_STATUS_IDLE && - !(status >= HT_STATUS_READ && ATOMIC_CAS(table->status, status, status + 1))) - { - // if we didn't succeed incrementing the status, maybe the other readers finished - // their job and it was already put back to IDLE - status = ATOMIC_CAS_RETURN(table->status, HT_STATUS_IDLE, HT_STATUS_READ); - if (status < HT_STATUS_IDLE) // some writer is accessing the table, we need to wait - sched_yield(); - } - - status++; // status now holds the value we have updated in table->status - - // we can now safely retrieve the list - ht_items_list_t *list = table->items[index]; - - // NOTE: it's important here to lock the list while the status - // has not been put back to idle yet (so writes can't happen) - if (list) - SPIN_LOCK(list->lock); - - // now let's update the status by decrementing it - // NOTE: if we are the last active reader it will go down to the idle state - do { - if (ATOMIC_CAS(table->status, status, status -1)) - break; - status = ATOMIC_CAS_RETURN(table->status, HT_STATUS_READ, HT_STATUS_IDLE); - } while (status > HT_STATUS_READ); - - // NOTE: the returned list is already locked - return list; -} - -static inline ht_items_list_t * -ht_set_list(hashtable_t *table, uint32_t hash) -{ - ht_items_list_t *list = malloc(sizeof(ht_items_list_t)); - if (!list) - return NULL; - - SPIN_INIT(list->lock); - TAILQ_INIT(&list->head); - SPIN_LOCK(list->lock); - - size_t index = hash%ATOMIC_READ(table->size); - list->index = index; - - while (!ATOMIC_CAS(table->status, HT_STATUS_IDLE, HT_STATUS_WRITE)) - sched_yield(); - - // NOTE: once the status has been set to WRITE no other threads can access the table - - index = hash%ATOMIC_READ(table->size); - list->index = index; - - // NOTE: since nobody could have changed the status in the meanwhile - if (table->items[index]) { - // if there is a list already set at our index it means that some other - // thread succeded in setting a new list already, completing its job before - // we were able to update the table status. - // So we can release our newly created list and return the existing one - SPIN_UNLOCK(list->lock); - SPIN_DESTROY(list->lock); - free(list); - list = table->items[index]; - SPIN_LOCK(list->lock); - ATOMIC_CAS(table->status, HT_STATUS_WRITE, HT_STATUS_IDLE); - return list; - } - - table->items[index] = list; - - // it's safe to assume the status still WRITE, - // so we don't need to check if the CAS operation succeeded - ATOMIC_CAS(table->status, HT_STATUS_WRITE, HT_STATUS_IDLE); - - MUTEX_LOCK(table->iterator_lock); - TAILQ_INSERT_TAIL(&table->iterator_list->head, list, iterator_next); - MUTEX_UNLOCK(table->iterator_lock); - - // NOTE: the newly created list is already locked - return list; -} - -static inline int -ht_set_internal(hashtable_t *table, - void *key, - size_t klen, - void *data, - size_t dlen, - void **prev_data, - size_t *prev_len, - int copy, - int inx) -{ - void *prev = NULL; - size_t plen = 0; - - if (!klen) - return -1; - - uint32_t hash = ht_hash_one_at_a_time(table, key, klen); - - // let's first try checking if we fall in an existing bucket list - ht_items_list_t *list = ht_get_list(table, hash); - - if (!list) // if not, let's create a new bucket list - list = ht_set_list(table, hash); - - if (!list) - return -1; - - ht_item_t *item = NULL; - TAILQ_FOREACH(item, &list->head, next) { - if (/*ht_item->hash == arg->item.hash && */ - HT_KEY_EQUALS(item->key, item->klen, key, klen)) - { - prev = item->data; - plen = item->dlen; - break; - } - } - - if (!prev) { - ht_item_t *item = (ht_item_t *)calloc(1, sizeof(ht_item_t)); - if (!item) { - //fprintf(stderr, "Can't create new item: %s\n", strerror(errno)); - SPIN_UNLOCK(list->lock); - return -1; - } - item->hash = hash; - item->klen = klen; - - if (klen > sizeof(item->kbuf)) { - item->key = malloc(klen); - if (!item->key) { - free(item); - SPIN_UNLOCK(list->lock); - return -1; - } - } else { - item->key = item->kbuf; - } - - memcpy(item->key, key, klen); - - if (copy) { - if (dlen) { - item->data = malloc(dlen); - if (!item->data) { - if (klen > sizeof(item->kbuf)) - free(item->key); - free(item); - SPIN_UNLOCK(list->lock); - return -1; - } - memcpy(item->data, data, dlen); - } else { - item->data = NULL; - } - } else { - item->data = data; - } - item->dlen = dlen; - - TAILQ_INSERT_TAIL(&list->head, item, next); - ATOMIC_INCREMENT(table->count); - } else { - if (inx) { - if (prev_data) - *prev_data = prev; - if (prev_len) - *prev_len = plen; - SPIN_UNLOCK(list->lock); - return 1; - } - item->dlen = dlen; - if (copy) { - void *dcopy = malloc(dlen); - if (!dcopy) { - SPIN_UNLOCK(list->lock); - return -1; - } - - item->data = dcopy; - memcpy(item->data, data, dlen); - } else { - item->data = data; - } - } - - SPIN_UNLOCK(list->lock); - - size_t current_size = ATOMIC_READ(table->size); - if (ht_count(table) > (current_size + (current_size/3)) && - (!table->max_size || current_size < table->max_size)) - { - ht_grow_table(table); - } - - if (prev) { - if (prev_data) - *prev_data = prev; - else if (table->free_item_cb) - table->free_item_cb(prev); - } else if (prev_data) { - *prev_data = NULL; - } - - if (prev_len) - *prev_len = plen; - - return 0; -} - -int -ht_set(hashtable_t *table, void *key, size_t klen, void *data, size_t dlen) -{ - return ht_set_internal(table, key, klen, data, dlen, NULL, NULL, 0, 0); -} - -int -ht_set_if_not_exists(hashtable_t *table, void *key, size_t klen, void *data, size_t dlen) -{ - return ht_set_internal(table, key, klen, data, dlen, NULL, NULL, 0, 1); -} - -int -ht_get_or_set(hashtable_t *table, - void *key, - size_t klen, - void *data, - size_t dlen, - void **cur_data, - size_t *cur_len) -{ - return ht_set_internal(table, key, klen, data, dlen, cur_data, cur_len, 0, 1); -} - -int -ht_get_and_set(hashtable_t *table, - void *key, - size_t klen, - void *data, - size_t dlen, - void **prev_data, - size_t *prev_len) -{ - return ht_set_internal(table, key, klen, data, dlen, prev_data, prev_len, 0, 0); -} - -int -ht_set_copy(hashtable_t *table, - void *key, - size_t klen, - void *data, - size_t dlen, - void **prev_data, - size_t *prev_len) -{ - return ht_set_internal(table, key, klen, data, dlen, prev_data, prev_len, 1, 0); -} - -static inline int -ht_call_internal(hashtable_t *table, - void *key, - size_t klen, - ht_pair_callback_t cb, - void *user) -{ - int ret = -1; - - uint32_t hash = ht_hash_one_at_a_time(table, key, klen); - - ht_items_list_t *list = ht_get_list(table, hash); - if (!list) - return ret; - - ht_item_t *item = NULL; - ht_item_t *tmp; - TAILQ_FOREACH_SAFE(item, &list->head, next, tmp) { - if (/*ht_item->hash == arg->item.hash && */ - HT_KEY_EQUALS(item->key, item->klen, key, klen)) - { - if (cb) { - ret = cb(table, key, klen, &item->data, &item->dlen, user); - if (ret == 1) { - TAILQ_REMOVE(&list->head, item, next); - if (item->key != item->kbuf) - free(item->key); - free(item); - ATOMIC_DECREMENT(table->count); - ret = 0; - } - } else { - ret = 0; - } - break; - } - } - - SPIN_UNLOCK(list->lock); - - return ret; -} - -int -ht_call(hashtable_t *table, - void *key, - size_t klen, - ht_pair_callback_t cb, - void *user) -{ - return ht_call_internal(table, key, klen, cb, user); -} - -typedef struct { - void *data; - size_t dlen; - void *match; - size_t match_size; - int matched; - void **prev_data; - size_t *prev_len; -} ht_set_if_equals_helper_arg_t; - -static int -ht_set_if_equals_helper(hashtable_t *table, void *key __attribute__ ((unused)), size_t klen __attribute__ ((unused)), void **value, size_t *vlen, void *user) -{ - ht_set_if_equals_helper_arg_t *arg = (ht_set_if_equals_helper_arg_t *)user; - - if (arg->prev_len) - *arg->prev_len = *vlen; - - if (arg->prev_data) - *arg->prev_data = *value; - - if (arg->match_size == *vlen && ((char *)*value)[0] == *((char *)arg->match) && - memcmp(*value, arg->match, arg->match_size) == 0) - { - arg->matched = 1; - - if (!arg->prev_data && table->free_item_cb) - table->free_item_cb(*value); - - *value = arg->data; - *vlen = arg->dlen; - } - - return 0; -} - -int -ht_set_if_equals(hashtable_t *table, - void *key, - size_t klen, - void *data, - size_t dlen, - void *match, - size_t match_size, - void **prev_data, - size_t *prev_len) -{ - if (!match && match_size == 0) - return ht_set_if_not_exists(table, key, klen, data, dlen); - - ht_set_if_equals_helper_arg_t arg = { - .data = data, - .dlen = dlen, - .match = match, - .match_size = match_size, - .matched = 0, - .prev_data = prev_data, - .prev_len = prev_len - }; - if (ht_call_internal(table, key, klen, ht_set_if_equals_helper, (void *)&arg) == 0) - { - return arg.matched ? 0 : 1; - } - return -1; -} - - -typedef struct -{ - int unset; - void **prev_data; - size_t *prev_len; - void *match; - size_t match_size; -} ht_delete_helper_arg_t; - -static int -ht_delete_helper(hashtable_t *table, void *key __attribute__ ((unused)), size_t klen __attribute__ ((unused)), void **value, size_t *vlen, void *user) -{ - ht_delete_helper_arg_t *arg = (ht_delete_helper_arg_t *)user; - - if (arg->match && (arg->match_size != *vlen || memcmp(arg->match, *value, *vlen) != 0)) - return -1; - - if (arg->prev_data) - *arg->prev_data = *value; - else if (table->free_item_cb) - table->free_item_cb(*value); - - if (arg->prev_len) - *arg->prev_len = *vlen; - - if (arg->unset) { - *vlen = 0; - *value = NULL; - return 0; - } - - return 1; // we want the item to be removed -} - -int -ht_unset(hashtable_t *table, - void *key, - size_t klen, - void **prev_data, - size_t *prev_len) -{ - ht_delete_helper_arg_t arg = { - .unset = 1, - .prev_data = prev_data, - .prev_len = prev_len, - .match = NULL, - .match_size = 0 - }; - - return ht_call_internal(table, key, klen, ht_delete_helper, (void *)&arg); -} - -static inline int -ht_delete_internal (hashtable_t *table, - void *key, - size_t klen, - void **prev_data, - size_t *prev_len, - void *match, - size_t match_size) -{ - - ht_delete_helper_arg_t arg = { - .unset = 0, - .prev_data = prev_data, - .prev_len = prev_len, - .match = match, - .match_size = match_size - }; - - return ht_call_internal(table, key, klen, ht_delete_helper, (void *)&arg); -} - -int -ht_delete (hashtable_t *table, - void *key, - size_t klen, - void **prev_data, - size_t *prev_len) -{ - return ht_delete_internal(table, key, klen, prev_data, prev_len, NULL, 0); -} - -int -ht_delete_if_equals(hashtable_t *table, void *key, size_t klen, void *match, size_t match_size) -{ - return ht_delete_internal(table, key, klen, NULL, NULL, match, match_size); -} - -int -ht_exists(hashtable_t *table, void *key, size_t klen) -{ - return (ht_call_internal(table, key, klen, NULL, NULL) == 0); -} - -typedef struct { - void *data; - size_t *dlen; - int copy; - ht_deep_copy_callback_t copy_cb; - void *user; -} ht_get_helper_arg_t; - -static int -ht_get_helper(hashtable_t *table __attribute__ ((unused)), void *key __attribute__ ((unused)), size_t klen __attribute__ ((unused)), void **value, size_t *vlen, void *user) -{ - ht_get_helper_arg_t *arg = (ht_get_helper_arg_t *)user; - - if (arg->copy) { - if (arg->copy_cb) { - arg->data = arg->copy_cb(*value, *vlen, arg->user); - } else { - arg->data = malloc(*vlen); - if (!arg->data) - return -1; - memcpy(arg->data, *value, *vlen); - } - } else { - arg->data = *value; - } - - if (arg->dlen) - *arg->dlen = *vlen; - - - return 0; -} - -static inline void * -ht_get_internal(hashtable_t *table, - void *key, - size_t klen, - size_t *dlen, - int copy, - ht_deep_copy_callback_t copy_cb, - void *user) -{ - ht_get_helper_arg_t arg = { - .data = NULL, - .dlen = dlen, - .copy = copy, - .copy_cb = copy_cb, - .user = user - }; - - ht_call_internal(table, key, klen, ht_get_helper, (void *)&arg); - - return arg.data; -} - -void * -ht_get(hashtable_t *table, void *key, size_t klen, size_t *dlen) -{ - return ht_get_internal(table, key, klen, dlen, 0, NULL, NULL); -} - -void * -ht_get_copy(hashtable_t *table, void *key, size_t klen, size_t *dlen) -{ - return ht_get_internal(table, key, klen, dlen, 1, NULL, NULL); -} - -void * -ht_get_deep_copy(hashtable_t *table, void *key, size_t klen, - size_t *dlen, ht_deep_copy_callback_t copy_cb, void *user) -{ - return ht_get_internal(table, key, klen, dlen, 1, copy_cb, user); -} - -static void -free_key(hashtable_key_t *key) -{ - free(key->data); - free(key); -} - -linked_list_t * -ht_get_all_keys(hashtable_t *table) -{ - linked_list_t *output = list_create(); - list_set_free_value_callback(output, (free_value_callback_t)free_key); - - MUTEX_LOCK(table->iterator_lock); - ht_items_list_t *list = NULL; - TAILQ_FOREACH(list, &table->iterator_list->head, iterator_next) { - SPIN_LOCK(list->lock); - - ht_item_t *item = NULL; - TAILQ_FOREACH(item, &list->head, next) { - hashtable_key_t *key = malloc(sizeof(hashtable_key_t)); - if (!key) { - SPIN_UNLOCK(list->lock); - MUTEX_UNLOCK(table->iterator_lock); - list_destroy(output); - return NULL; - } - key->data = malloc(item->klen); - if (!key->data) { - SPIN_UNLOCK(list->lock); - MUTEX_UNLOCK(table->iterator_lock); - free(key); - list_destroy(output); - return NULL; - } - memcpy(key->data, item->key, item->klen); - key->len = item->klen; - key->vlen = item->dlen; - list_push_value(output, key); - } - - SPIN_UNLOCK(list->lock); - } - MUTEX_UNLOCK(table->iterator_lock); - return output; -} - -linked_list_t * -ht_get_all_values(hashtable_t *table) -{ - linked_list_t *output = list_create(); - list_set_free_value_callback(output, (free_value_callback_t)free); - - MUTEX_LOCK(table->iterator_lock); - ht_items_list_t *list = NULL; - TAILQ_FOREACH(list, &table->iterator_list->head, iterator_next) { - SPIN_LOCK(list->lock); - - ht_item_t *item = NULL; - TAILQ_FOREACH(item, &list->head, next) { - hashtable_value_t *v = malloc(sizeof(hashtable_value_t)); - if (!v) { - SPIN_UNLOCK(list->lock); - MUTEX_UNLOCK(table->iterator_lock); - list_destroy(output); - return NULL; - } - v->data = item->data; - v->len = item->dlen; - v->key = item->key; - v->klen = item->klen; - list_push_value(output, v); - } - - SPIN_UNLOCK(list->lock); - } - MUTEX_UNLOCK(table->iterator_lock); - return output; -} - -typedef struct { - int (*cb)(); - void *user; -} ht_iterator_arg_t; - -static int -ht_foreach_key_helper(hashtable_t *table, void *key, size_t klen, void *value __attribute__ ((unused)), size_t vlen __attribute__ ((unused)), void *user) -{ - ht_iterator_arg_t *arg = (ht_iterator_arg_t *)user; - return arg->cb(table, key, klen, arg->user); -} - -void -ht_foreach_key(hashtable_t *table, ht_key_iterator_callback_t cb, void *user) -{ - ht_iterator_arg_t arg = { cb, user }; - ht_foreach_pair(table, ht_foreach_key_helper, &arg); -} - -static int -ht_foreach_value_helper(hashtable_t *table, void *key __attribute__ ((unused)), size_t klen __attribute__ ((unused)), void *value, size_t vlen, void *user) -{ - ht_iterator_arg_t *arg = (ht_iterator_arg_t *)user; - return arg->cb(table, value, vlen, arg->user); -} - -void -ht_foreach_value(hashtable_t *table, ht_value_iterator_callback_t cb, void *user) -{ - ht_iterator_arg_t arg = { cb, user }; - ht_foreach_pair(table, ht_foreach_value_helper, &arg); -} - -void -ht_foreach_pair(hashtable_t *table, ht_pair_iterator_callback_t cb, void *user) -{ - int rc = 0; - - - MUTEX_LOCK(table->iterator_lock); - ht_items_list_t *list = NULL; - TAILQ_FOREACH(list, &table->iterator_list->head, iterator_next) { - SPIN_LOCK(list->lock); - ht_item_t *item = NULL; - TAILQ_FOREACH(item, &list->head, next) { - rc = cb(table, item->key, item->klen, item->data, item->dlen, user); - if (rc <= 0) - break; - } - - if (item) { - if (rc == 0) { - SPIN_UNLOCK(list->lock); - break; - } else if (rc < 0) { - TAILQ_REMOVE(&list->head, item, next); - if (table->free_item_cb) - table->free_item_cb(item->data); - if (item->key != item->kbuf) - free(item->key); - free(item); - if (rc == -2) { - SPIN_UNLOCK(list->lock); - break; - } - } - } - SPIN_UNLOCK(list->lock); - } - MUTEX_UNLOCK(table->iterator_lock); -} - -size_t -ht_count(hashtable_t *table) -{ - return ATOMIC_READ(table->count); -} - -// vim: tabstop=4 shiftwidth=4 expandtab: -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ diff --git a/sparsity/src/hashtable.h b/sparsity/src/hashtable.h deleted file mode 100755 index 820a3bc..0000000 --- a/sparsity/src/hashtable.h +++ /dev/null @@ -1,409 +0,0 @@ -/** - * @file hashtable.h - * @author Andrea Guzzo - * @date 22/09/2013 - * @brief Fast thread-safe hashtable implementation - * @note In case of failures reported from the pthread interface - * abort() will be called. Callers can catch SIGABRT if more - * actions need to be taken. - */ -#ifndef HL_HASHTABLE_H -#define HL_HASHTABLE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include "linklist.h" - -/** - * @brief Opaque structure representing the actual hash table descriptor - */ -typedef struct _hashtable_s hashtable_t; - -/** - * @brief Callback that, if provided, will be called to release the value resources - * when an item is being removed from the table - */ -typedef void (*ht_free_item_callback_t)(void *); - -#define HT_SIZE_MIN 128 - -/** - * @brief Create a new table descriptor - * @param initial_size : initial size of the table; if 0 HT_SIZE_MIN will be used as initial size - * @param max_size : maximum size the table can be grown up to - * @param free_item_cb : the callback to use when an item needs to be released - * @return a newly allocated and initialized table - * - * The table will be expanded if necessary - */ -hashtable_t *ht_create(size_t initial_size, size_t max_size, ht_free_item_callback_t free_item_cb); - -/** - * @brief Initialize a pre-allocated table descriptor - * - * This function can be used to initialize a statically defined table - * @return 0 on success; -1 otherwise - */ -int ht_init(hashtable_t *table, size_t initial_size, size_t max_size, ht_free_item_callback_t free_item_cb); - -/** - * @brief Set the callback which must be called to release values stored in the table - * @param table : A valid pointer to an hashtable_t structure - * @param cb : an ht_free_item_callback_t function - */ -void ht_set_free_item_callback(hashtable_t *table, ht_free_item_callback_t cb); - -/** - * @brief Clear the table by removing all the stored items - * @param table : A valid pointer to an hashtable_t structure - * - * If a free_item_callback has been set, that will be called for each item removed from the table - */ -void ht_clear(hashtable_t *table); - -/** - * @brief Destroy the table by releasing all its resources - * @param table : A valid pointer to an hashtable_t structure - * - * If a free_item_callback has been set, that will be called for each item removed from the table - */ -void ht_destroy(hashtable_t *table); - -/** - * @brief Get the value stored at a specific key - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key to use - * @param klen : The length of the key - * @param dlen : If not NULL, the size of the returned data will be stored - * at the address pointed by dlen - * @return The stored value if any, NULL otherwise - */ -void *ht_get(hashtable_t *table, void *key, size_t klen, size_t *dlen); - -/** - * @brief Check if a key exists in the hashtable - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key to use - * @param klen : The length of the key - * @return 1 If the key exists, 0 if it doesn't exist and -1 in case of error - */ -int ht_exists(hashtable_t *table, void *key, size_t klen); - -/** - * @brief Get a copy of the value stored at a specific key - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key to use - * @param klen : The length of the key - * @param dlen : If not NULL, the size of the returned data will be stored - * at the address pointed by dlen - * @return The stored value if any, NULL otherwise - * @note The returned value is a copy (memcpy) of the stored value and the - * caller MUST release it using free() once done - * - * @note The copy is a simple copy done using memcpy() if the stored value - * is structured and requires a deep copy, then ht_get_deep_copy() - * should be used instead of this function - */ -void *ht_get_copy(hashtable_t *table, void *key, size_t klen, size_t *dlen); - -typedef void *(*ht_deep_copy_callback_t)(void *data, size_t dlen, void *user); - -/** - * @brief Get a copy of the value stored at a specific key - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key to use - * @param klen : The length of the key - * @param dlen : If not NULL, the size of the returned data will be stored - * at the address pointed by dlen - * @param copy_cb : The callback which will take care of deep-copying the data - * @param user : A private pointer which will be passed back to the copy_cb - * @return The stored value if any, NULL otherwise - * @note The returned value is eventually created by the deep_copy callback - * hence the caller knows if memory will need to be disposed or not and - * how to fully release the structured value which has been deep copied - */ -void *ht_get_deep_copy(hashtable_t *table, void *key, size_t klen, size_t *dlen, ht_deep_copy_callback_t copy_cb, void *user); - -/** - * @brief Set the value for a specific key - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key to use - * @param klen : The length of the key - * @param data : A pointer to the data to store - * @param dlen : The size of the data - * @return 0 on success, -1 otherwise - */ -int ht_set(hashtable_t *table, void *key, size_t klen, void *data, size_t dlen); - -/** - * @brief Set the value for a specific key and returns the previous value if any - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key to use - * @param klen : The length of the key - * @param data : A pointer to the data to store - * @param dlen : The size of the data - * @param prev_data : If not NULL, the referenced pointer will be set to point to the previous data - * @param prev_len : If not NULL, the size of the previous data will be stored in the memory - * pointed by prev_len - * @return 0 on success, -1 otherwise - * @note If prev_data is not NULL, the previous data will not be released using the free_value callback - * so the caller will be responsible of releasing the previous data once done with it - */ -int ht_get_and_set(hashtable_t *table, void *key, size_t klen, void *data, size_t dlen, void **prev_data, size_t *prev_len); - -/** - * @brief Get the value for a specific key or set a new value if none has been found - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key to use - * @param klen : The length of the key - * @param data : A pointer to the new data to store if none is found - * @param dlen : The size of the data to store - * @param cur_data : If not NULL, the referenced pointer will be set to point to the current data - * @param cur_len : If not NULL, the size of the current data will be stored in the memory - * pointed by cur_len - * @return 0 the value new value has been set successfully;\n - * 1 if a value was already set;\n - * -1 in case of errors - */ -int ht_get_or_set(hashtable_t *table, void *key, size_t klen, void *data, size_t dlen, void **cur_data, size_t *cur_len); - -/** - * @brief Set the value for a specific key and returns the previous value if any. - * - * The new value will be copied before being stored - * - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key to use - * @param klen : The length of the key - * @param data : A pointer to the data to store - * @param dlen : The size of the data - * @param prev_data : If not NULL, the referenced pointer will be set to point to the previous data - * @param prev_len : If not NULL, the size of the previous data will be stored in the memory - * pointed by prev_len - * @return The previous value if any, NULL otherwise - * @note If prev_data is not NULL, the previous data will not be released using the free_value callback - * so the caller will be responsible of releasing the previous data once done with it - */ -int ht_set_copy(hashtable_t *table, void *key, size_t klen, void *data, size_t dlen, void **prev_data, size_t *prev_len); - - -/** - * @brief Set the value for a specific key if there is no value already stored - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key to use - * @param klen : The length of the key - * @param data : A pointer to the data to store - * @param dlen : The size of the data - * @return 0 on success;\n - * 1 if a value was already set;\n - * -1 in case of errors - */ -int ht_set_if_not_exists(hashtable_t *table, void *key, size_t klen, void *data, size_t dlen); - -/** - * @brief Set a new value stored at a specific key only if the actual one matches some provided data - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key to use - * @param klen : The length of the key - * @param data : A pointer to the data to store - * @param dlen : The size of the data - * @param match : A valid pointer to the data we need to match in order to delete the value - * @param match_size : The value of the data to match - * @param prev_data : If not NULL the pointer will be set to point to the previous data - * @param prev_len : If not NULL the integer pointer will be set to the size of the previous data - * @node If the prev_data pointer is provided, the caller will be responsible of relasing - * the resources pointed after the call. If not provided (NULL) the free_value callback - * will be eventually used (if defined) - * @return 0 on success;\n - * 1 if the value didn't match (a the new value was not set), - * -1 in case of errors - */ -int ht_set_if_equals(hashtable_t *table, void *key, size_t klen, void *data, size_t dlen, void *match, size_t match_size, void **prev_data, size_t *prev_len); - -/** - * @brief Unset the value stored at a specific key - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key to use - * @param klen : The length of the key - * @param prev_data : If not NULL, the referenced pointer will be set to point to the previous data - * @param prev_len : If not NULL, the size of the previous data will be stored in the memory - * pointed by prev_len - * @return The previous value if any, NULL otherwise - * @note If prev_data is not NULL, the previous data will not be released using the free_value callback - * so the caller will be responsible of releasing the previous data once done with it - */ -int ht_unset(hashtable_t *table, void *key, size_t klen, void **prev_data, size_t *prev_len); - -/** - * @brief Delete the value stored at a specific key - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key to use - * @param klen : The length of the key - * @param prev_data : If not NULL, the referenced pointer will be set to point to the previous data - * @param prev_len : If not NULL, the size of the previous data will be stored in the memory - * pointed by prev_len - * @return 0 on success, -1 otherwise - * @note If prev_data is not NULL, the previous data will not be released using the free_value callback - * so the caller will be responsible of releasing the previous data once done with it - */ -int ht_delete(hashtable_t *table, void *key, size_t klen, void **prev_data, size_t *prev_len); - -/** - * @brief Delete the value stored at a specific key only if it matches some provided data - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key to use - * @param klen : The length of the key - * @param match : A valid pointer to the data we need to match in order to delete the value - * @param match_size : The value of the data to match - * @return 0 on success, -1 otherwise - */ -int ht_delete_if_equals(hashtable_t *table, void *key, size_t klen, void *match, size_t match_size); - -/** - * @brief Callback called if an item for a given key is found - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key to use - * @param klen : The length of the key - * @return 0 on success - * 1 on success and the item must be removed from the hashtable - * -1 on error - */ -typedef int (*ht_pair_callback_t)(hashtable_t *table, void *key, size_t klen, void **value, size_t *vlen, void *user); - -/** - * @brief call the provided callback passing the item stored at the specified key (if any) - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key to use - * @param klen : The length of the key - * @param cb : The callback - * @param user : A private pointer which will be passed to the callback when invoked - * @note the callback is called while the bucket-level mutex is being retained - */ -int ht_call(hashtable_t *table, void *key, size_t klen, ht_pair_callback_t cb, void *user); - -/** - * @brief Return the count of items actually stored in the table - * @param table : A valid pointer to an hashtable_t structure - * @return The actual item count - */ -size_t ht_count(hashtable_t *table); - -// use the following two functions only if the hashtable_t contains -// a small number of keys, use the iterators otherwise - -typedef struct _hashtable_key_s { - void *data; - size_t len; - size_t vlen; -} hashtable_key_t; - -/** - * @brief Get all stored keys - * @param table : A valid pointer to an hashtable_t structure - * @return A list of hashtable_key_t pointers with all the - * keys present in the table - * @note The returned list should be released calling list_destroy() - */ -linked_list_t *ht_get_all_keys(hashtable_t *table); - -typedef struct _hashtable_value_s { - void *key; - size_t klen; - void *data; - size_t len; -} hashtable_value_t; - -/** - * @brief Get all stored values - * @param table : A valid pointer to an hashtable_t structure - * @return A list containing a pointer to all the values stored in the table - * @note The returned list will contain pointers to the actual stored values - * and not copies - * @note The returned list should be released calling list_destroy() - */ -linked_list_t *ht_get_all_values(hashtable_t *table); - -typedef enum { - HT_ITERATOR_STOP = 0, - HT_ITERATOR_CONTINUE = 1, - HT_ITERATOR_REMOVE = -1, - HT_ITERATOR_REMOVE_AND_STOP = -2 -} ht_iterator_status_t; - -/** - * @brief Callback for the key iterator - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key - * @param klen : The length of the key - * @param user : The user pointer passed as argument to the ht_foreach_pair() function - * @return HT_ITERATOR_CONTINUE to go ahead with the iteration, - * HT_ITERATOR_STOP to stop the iteration, - * HT_ITERATOR_REMOVE to remove the current item from the table and go ahead with the iteration - * HT_ITERATOR_REMOVE_AND_STOP to remove the current item from the table and stop the iteration - */ -typedef ht_iterator_status_t (*ht_key_iterator_callback_t)(hashtable_t *table, void *key, size_t klen, void *user); - -/** - * @brief Key iterator - * @param table : A valid pointer to an hashtable_t structure - * @param cb : an ht_key_iterator_callback_t function - * @param user : A pointer which will be passed to the iterator callback at each call - */ -void ht_foreach_key(hashtable_t *table, ht_key_iterator_callback_t cb, void *user); - -/** - * @brief Callback for the value iterator - * @param table : A valid pointer to an hashtable_t structure - * @param value : The value - * @param vlen : The length of the value - * @param user : The user pointer passed as argument to the ht_foreach_pair() function - * @return HT_ITERATOR_CONTINUE to go ahead with the iteration, - * HT_ITERATOR_STOP to stop the iteration, - * HT_ITERATOR_REMOVE to remove the current item from the table and go ahead with the iteration - * HT_ITERATOR_REMOVE_AND_STOP to remove the current item from the table and stop the iteration - */ -typedef ht_iterator_status_t (*ht_value_iterator_callback_t)(hashtable_t *table, void *value, size_t vlen, void *user); - -/** - * @brief Value iterator - * @param table : A valid pointer to an hashtable_t structure - * @param cb : an ht_value_iterator_callback_t function - * @param user : A pointer which will be passed to the iterator callback at each call - */ -void ht_foreach_value(hashtable_t *table, ht_value_iterator_callback_t cb, void *user); - -/** - * @brief Callback for the pair iterator - * @param table : A valid pointer to an hashtable_t structure - * @param key : The key - * @param klen : The length of the key - * @param value : The value - * @param vlen : The length of the value - * @param user : The user pointer passed as argument to the ht_foreach_pair() function - * @return HT_ITERATOR_CONTINUE to go ahead with the iteration, - * HT_ITERATOR_STOP to stop the iteration, - * HT_ITERATOR_REMOVE to remove the current item from the table and go ahead with the iteration - * HT_ITERATOR_REMOVE_AND_STOP to remove the current item from the table and stop the iteration - */ -typedef ht_iterator_status_t (*ht_pair_iterator_callback_t)(hashtable_t *table, void *key, size_t klen, void *value, size_t vlen, void *user); - -/** - * @brief Pair iterator - * @param table : A valid pointer to an hashtable_t structure - * @param cb : an ht_pair_iterator_callback_t function - * @param user : A pointer which will be passed to the iterator callback at each call - */ -void ht_foreach_pair(hashtable_t *table, ht_pair_iterator_callback_t cb, void *user); - -#ifdef __cplusplus -} -#endif - -#endif - -// vim: tabstop=4 shiftwidth=4 expandtab: -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ diff --git a/sparsity/src/linklist.c b/sparsity/src/linklist.c deleted file mode 100755 index 21ab76d..0000000 --- a/sparsity/src/linklist.c +++ /dev/null @@ -1,1267 +0,0 @@ -/* linked list management library - by xant - */ - -//#include -#include -#include -#include - -#include "linklist.h" -#include "atomic_defs.h" - -typedef struct _list_entry_s { - struct _linked_list_s *list; - struct _list_entry_s *prev; - struct _list_entry_s *next; - void *value; - int tagged; -} list_entry_t; - -struct _linked_list_s { - list_entry_t *head; - list_entry_t *tail; - list_entry_t *cur; - size_t pos; - size_t length; -#ifdef THREAD_SAFE - pthread_mutex_t lock; -#endif - free_value_callback_t free_value_cb; - int refcnt; - list_entry_t *slices; -}; - -struct _slice_s { - linked_list_t *list; - size_t offset; - size_t length; -}; - -/******************************************************************** - * Entry-based API - * - Internal use only - ********************************************************************/ - -/* Entry creation and destruction routines */ -static inline list_entry_t *create_entry(); -static inline void destroy_entry(list_entry_t *entry); - -/* List and list_entry_t manipulation routines */ -static inline list_entry_t *pop_entry(linked_list_t *list); -static inline int push_entry(linked_list_t *list, list_entry_t *entry); -static inline int unshift_entry(linked_list_t *list, list_entry_t *entry); -static inline list_entry_t *shift_entry(linked_list_t *list); -static inline int insert_entry(linked_list_t *list, list_entry_t *entry, size_t pos); -static inline list_entry_t *pick_entry(linked_list_t *list, size_t pos); -static inline list_entry_t *fetch_entry(linked_list_t *list, size_t pos); -//list_entry_t *SelectEntry(linked_list_t *list, size_t pos); -static inline list_entry_t *remove_entry(linked_list_t *list, size_t pos); -static inline long get_entry_position(list_entry_t *entry); -static inline int move_entry(linked_list_t *list, size_t srcPos, size_t dstPos); -static inline list_entry_t *subst_entry(linked_list_t *list, size_t pos, list_entry_t *entry); -static inline int swap_entries(linked_list_t *list, size_t pos1, size_t pos2); - -/* - * Create a new linked_list_t. Allocates resources and returns - * a linked_list_t opaque structure for later use - */ -linked_list_t * -list_create() -{ - linked_list_t *list = (linked_list_t *)calloc(1, sizeof(linked_list_t)); - if(list) { - if (list_init(list) != 0) { - free(list); - return NULL; - } - } - return list; -} - -/* - * Initialize a preallocated linked_list_t pointed by list - * useful when using static list handlers - */ -int -list_init(linked_list_t *list __attribute__ ((unused))) -{ -#ifdef THREAD_SAFE - pthread_mutexattr_t attr; - if (pthread_mutexattr_init(&attr) != 0) { - return -1; - } - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); - if (pthread_mutex_init(&list->lock, &attr) != 0) { - return -1; - } - pthread_mutexattr_destroy(&attr); -#endif - return 0; -} - -/* - * Destroy a linked_list_t. Free resources allocated for list - */ -void -list_destroy(linked_list_t *list) -{ - if(list) - { - while (list->slices) - slice_destroy(list->slices->value); - list_clear(list); -#ifdef THREAD_SAFE - MUTEX_DESTROY(list->lock); -#endif - free(list); - } -} - -static void -list_destroy_tagged_value_internal(tagged_value_t *tval, void (*free_cb)(void *v)) -{ - if(tval) - { - free(tval->tag); - if(tval->value) { - if(tval->type == TV_TYPE_LIST) - list_destroy((linked_list_t *)tval->value); - else if (free_cb) - free_cb(tval->value); - else if (tval->vlen) - free(tval->value); - } - free(tval); - } -} - -/* - * Clear a linked_list_t. Removes all entries in list - * if values are associated to entries, resources for those will not be freed. - * list_clear() can be used safely with entry-based and tagged-based api, - * otherwise you must really know what you are doing - */ -void -list_clear(linked_list_t *list) -{ - list_entry_t *e; - /* Destroy all entries still in list */ - while((e = shift_entry(list)) != NULL) - { - /* if there is a tagged_value_t associated to the entry, - * let's free memory also for it */ - if(e->tagged && e->value) - list_destroy_tagged_value_internal((tagged_value_t *)e->value, list->free_value_cb); - else if (list->free_value_cb) - list->free_value_cb(e->value); - - destroy_entry(e); - } -} - -/* Returns actual lenght of linked_list_t pointed by l */ -size_t -list_count(linked_list_t *l) -{ - size_t len; - MUTEX_LOCK(l->lock); - len = l->length; - MUTEX_UNLOCK(l->lock); - return len; -} - -void -list_set_free_value_callback(linked_list_t *list, free_value_callback_t free_value_cb) -{ - MUTEX_LOCK(list->lock); - list->free_value_cb = free_value_cb; - MUTEX_UNLOCK(list->lock); -} - -void -list_lock(linked_list_t *list __attribute__ ((unused))) -{ - MUTEX_LOCK(list->lock); -} - -void -list_unlock(linked_list_t *list __attribute__ ((unused))) -{ - MUTEX_UNLOCK(list->lock); -} - -/* - * Create a new list_entry_t structure. Allocates resources and returns - * a pointer to the just created list_entry_t opaque structure - */ -static inline -list_entry_t *create_entry() -{ - list_entry_t *new_entry = (list_entry_t *)calloc(1, sizeof(list_entry_t)); - /* - if (!new_entry) { - fprintf(stderr, "Can't create new entry: %s", strerror(errno)); - } - */ - return new_entry; -} - -/* - * Free resources allocated for a list_entry_t structure - * If the entry is linked in a list this routine will also unlink correctly - * the entry from the list. - */ -static inline void -destroy_entry(list_entry_t *entry) -{ - long pos; - if(entry) - { - if(entry->list) - { - /* entry is linked in a list...let's remove that reference */ - pos = get_entry_position(entry); - if(pos >= 0) - remove_entry(entry->list, pos); - } - free(entry); - } -} - -/* - * Pops a list_entry_t from the end of the list (or bottom of the stack - * if you are using the list as a stack) - */ -static inline -list_entry_t *pop_entry(linked_list_t *list) -{ - list_entry_t *entry; - MUTEX_LOCK(list->lock); - - entry = list->tail; - if(entry) - { - list->tail = entry->prev; - if(list->tail) - list->tail->next = NULL; - list->length--; - - entry->list = NULL; - entry->prev = NULL; - entry->next = NULL; - - if (list->cur == entry) - list->cur = NULL; - } - if(list->length == 0) - list->head = list->tail = NULL; - - MUTEX_UNLOCK(list->lock); - return entry; -} - -/* - * Pushs a list_entry_t at the end of a list - */ -static inline int -push_entry(linked_list_t *list, list_entry_t *entry) -{ - list_entry_t *p; - if(!entry) - return -1; - MUTEX_LOCK(list->lock); - if(list->length == 0) - { - list->head = list->tail = entry; - } - else - { - p = list->tail; - p->next = entry; - entry->prev = p; - entry->next = NULL; - list->tail = entry; - } - list->length++; - entry->list = list; - MUTEX_UNLOCK(list->lock); - return 0; -} - -/* - * Retreive a list_entry_t from the beginning of a list (or top of the stack - * if you are using the list as a stack) - */ -static inline -list_entry_t *shift_entry(linked_list_t *list) -{ - list_entry_t *entry; - MUTEX_LOCK(list->lock); - entry = list->head; - if(entry) - { - list->head = entry->next; - if(list->head) - list->head->prev = NULL; - list->length--; - - entry->list = NULL; - entry->prev = NULL; - entry->next = NULL; - - if (list->cur == entry) - list->cur = NULL; - else if (list->pos) - list->pos--; - } - if(list->length == 0) - list->head = list->tail = NULL; - MUTEX_UNLOCK(list->lock); - return entry; -} - - -/* - * Insert a list_entry_t at the beginning of a list (or at the top if the stack) - */ -static inline int -unshift_entry(linked_list_t *list, list_entry_t *entry) -{ - list_entry_t *p; - if(!entry) - return -1; - MUTEX_LOCK(list->lock); - if(list->length == 0) - { - list->head = list->tail = entry; - } - else - { - p = list->head; - p->prev = entry; - entry->prev = NULL; - entry->next = p; - list->head = entry; - } - list->length++; - entry->list = list; - if (list->cur) - list->pos++; - MUTEX_UNLOCK(list->lock); - return 0; -} - -/* - * Instert an entry at a specified position in a linked_list_t - */ -static inline int -insert_entry(linked_list_t *list, list_entry_t *entry, size_t pos) -{ - list_entry_t *prev, *next; - int ret = -1; - MUTEX_LOCK(list->lock); - if(pos == 0) { - ret = unshift_entry(list, entry); - } else if(pos == list->length) { - ret = push_entry(list, entry); - } else if (pos > list->length) { - unsigned int i; - for (i = list->length; i < pos; i++) { - list_entry_t *emptyEntry = create_entry(); - if (!emptyEntry || push_entry(list, emptyEntry) != 0) - { - if (emptyEntry) - destroy_entry(emptyEntry); - MUTEX_UNLOCK(list->lock); - return -1; - } - } - ret = push_entry(list, entry); - } - - if (ret == 0) { - MUTEX_UNLOCK(list->lock); - return ret; - } - - prev = pick_entry(list, pos-1); - if(prev) - { - next = prev->next; - prev->next = entry; - entry->prev = prev; - entry->next = next; - if (next) - next->prev = entry; - list->length++; - ret = 0; - } - MUTEX_UNLOCK(list->lock); - return ret; -} - -/* - * Retreive the list_entry_t at pos in a linked_list_t without removing it from the list - */ -static inline -list_entry_t *pick_entry(linked_list_t *list, size_t pos) -{ - unsigned int i; - list_entry_t *entry; - - MUTEX_LOCK(list->lock); - - if(list->length <= pos) { - MUTEX_UNLOCK(list->lock); - return NULL; - } - - size_t half_length = list->length >> 1; - /* we rely on integer underflow for the argument to abs(). */ - if (list->cur && (size_t)abs((int)(list->pos - pos)) < half_length) { - entry = list->cur; - if (list->pos != pos) { - if (list->pos < pos) { - for(i=list->pos; i < pos; i++) { - entry = entry->next; - } - } else if (list->pos > pos) { - for(i=list->pos; i > pos; i--) { - entry = entry->prev; - } - } - } - } else { - if (pos > half_length) - { - entry = list->tail; - for(i=list->length - 1;i>pos;i--) { - entry = entry->prev; - } - } - else - { - entry = list->head; - for(i=0;inext; - } - } - } - if (entry) { - list->pos = pos; - list->cur = entry; - } - - MUTEX_UNLOCK(list->lock); - return entry; -} - -/* Retreive the list_entry_t at pos in a linked_list_t removing it from the list - * XXX - no locking here because this routine is just an accessor to other routines - * Caller MUST destroy the returned entry trough destroy_entry() call - */ -static inline -list_entry_t *fetch_entry(linked_list_t *list, size_t pos) -{ - list_entry_t *entry = NULL; - if(pos == 0 ) - return shift_entry(list); - else if(pos == list_count(list) - 1) - return pop_entry(list); - - entry = remove_entry(list, pos); - return entry; -} - -static inline int -move_entry(linked_list_t *list, size_t srcPos, size_t dstPos) -{ - list_entry_t *e; - - e = fetch_entry(list, srcPos); - if(e) - { - if(insert_entry(list, e, dstPos) == 0) - return 0; - else - { - if(insert_entry(list, e, srcPos) != 0) - { - //fprintf(stderr, "Can't restore entry at index %lu while moving to %lu\n", srcPos, dstPos); - } - } - } - /* TODO - Unimplemented */ - return -1; -} - -/* XXX - still dangerous ... */ -static inline int -swap_entries(linked_list_t *list, size_t pos1, size_t pos2) -{ - list_entry_t *e1; - list_entry_t *e2; - if(pos2 > pos1) - { - e2 = fetch_entry(list, pos2); - insert_entry(list, e2, pos1); - e1 = fetch_entry(list, pos1+1); - insert_entry(list, e1, pos2); - } - else if(pos1 > pos2) - { - e1 = fetch_entry(list, pos1); - insert_entry(list, e1, pos2); - e2 = fetch_entry(list, pos2+1); - insert_entry(list, e2, pos1); - } - else - return -1; - - /* TODO - Unimplemented */ - return 0; -} - -/* return old entry at pos */ -static inline -list_entry_t *subst_entry(linked_list_t *list, size_t pos, list_entry_t *entry) -{ - list_entry_t *old; - - MUTEX_LOCK(list->lock); - - old = fetch_entry(list, pos); - if(!old) { - MUTEX_UNLOCK(list->lock); - return NULL; - } - insert_entry(list, entry, pos); - - MUTEX_UNLOCK(list->lock); - /* XXX - NO CHECK ON INSERTION */ - return old; -} - -/* XXX - POSSIBLE RACE CONDITION BETWEEN pick_entry and the actual removal */ -static inline -list_entry_t *remove_entry(linked_list_t *list, size_t pos) -{ - list_entry_t *next, *prev; - list_entry_t *entry = pick_entry(list, pos); - MUTEX_LOCK(list->lock); - if(entry) - { - prev = entry->prev; - next = entry->next; - if (pos == 0) - list->head = next; - else if (pos == list->length - 1) - list->tail = prev; - - if(prev) - prev->next = next; - if(next) - next->prev = prev; - - list->length--; - entry->list = NULL; - entry->prev = NULL; - entry->next = NULL; - - if (list->cur == entry) { - list->cur = NULL; - list->pos = 0; - } else if (list->pos > pos) { - list->pos--; - } - MUTEX_UNLOCK(list->lock); - return entry; - } - MUTEX_UNLOCK(list->lock); - return NULL; -} - -/* return position of entry if linked in a list. - * Scans entire list so it can be slow for very long lists */ -long -get_entry_position(list_entry_t *entry) -{ - int i = 0; - linked_list_t *list; - list_entry_t *p; - list = entry->list; - - if (!list) - return -1; - - MUTEX_LOCK(list->lock); - if(list) - { - p = list->head; - while(p) - { - if(p == entry) { - MUTEX_UNLOCK(list->lock); - return i; - } - p = p->next; - i++; - } - } - MUTEX_UNLOCK(list->lock); - return -1; -} - -void * -list_pop_value(linked_list_t *list) -{ - void *val = NULL; - list_entry_t *entry = pop_entry(list); - if(entry) - { - val = entry->value; - destroy_entry(entry); - } - return val; -} - -int -list_push_value(linked_list_t *list, void *val) -{ - int res; - list_entry_t *new_entry = create_entry(); - if(!new_entry) - return -1; - new_entry->value = val; - res = push_entry(list, new_entry); - if(res != 0) - destroy_entry(new_entry); - return res; -} - -int -list_unshift_value(linked_list_t *list, void *val) -{ - int res; - list_entry_t *new_entry = create_entry(); - if(!new_entry) - return -1; - new_entry->value = val; - res = unshift_entry(list, new_entry); - if(res != 0) - destroy_entry(new_entry); - return res; -} - -void * -list_shift_value(linked_list_t *list) -{ - void *val = NULL; - list_entry_t *entry = shift_entry(list); - if(entry) - { - val = entry->value; - destroy_entry(entry); - } - return val; -} - -int -list_insert_value(linked_list_t *list, void *val, size_t pos) -{ - int res; - list_entry_t *new_entry = create_entry(); - if(!new_entry) - return -1; - new_entry->value = val; - res=insert_entry(list, new_entry, pos); - if(res != 0) - destroy_entry(new_entry); - return res; -} - -void * -list_pick_value(linked_list_t *list, size_t pos) -{ - list_entry_t *entry = pick_entry(list, pos); - if(entry) - return entry->value; - return NULL; -} - -void * -list_fetch_value(linked_list_t *list, size_t pos) -{ - void *val = NULL; - list_entry_t *entry = fetch_entry(list, pos); - if(entry) - { - val = entry->value; - destroy_entry(entry); - } - return val; -} - -/* just an accessor to move_entry */ -int -list_move_value(linked_list_t *list, size_t srcPos, size_t dstPos) -{ - return move_entry(list, srcPos, dstPos); -} - -void * -list_set_value(linked_list_t *list, size_t pos, void *newval) -{ - void *old_value = NULL; - MUTEX_LOCK(list->lock); - list_entry_t *entry = pick_entry(list, pos); - if (entry) { - old_value = entry->value; - entry->value = newval; - } else { - list_insert_value(list, newval, pos); - } - MUTEX_UNLOCK(list->lock); - return old_value; -} - -/* return old value at pos */ -void * -list_subst_value(linked_list_t *list, size_t pos, void *newval) -{ - void *old_value = NULL; - MUTEX_LOCK(list->lock); - list_entry_t *entry = pick_entry(list, pos); - if (entry) { - old_value = entry->value; - entry->value = newval; - } - MUTEX_UNLOCK(list->lock); - return old_value; -} - -int -list_swap_values(linked_list_t *list, size_t pos1, size_t pos2) -{ - return swap_entries(list, pos1, pos2); -} - -int -list_foreach_value(linked_list_t *list, int (*item_handler)(void *item, size_t idx, void *user), void *user) -{ - MUTEX_LOCK(list->lock); - slice_t slice = { - .list = list, - .offset = 0, - .length = list->length - }; - MUTEX_UNLOCK(list->lock); - return slice_foreach_value(&slice, item_handler, user); -} - -tagged_value_t * -list_create_tagged_value_nocopy(char *tag, void *val) -{ - tagged_value_t *newval = (tagged_value_t *)calloc(1, sizeof(tagged_value_t)); - if(!newval) { - //fprintf(stderr, "Can't create new tagged value: %s", strerror(errno)); - return NULL; - } - - if(tag) - newval->tag = strdup(tag); - if (val) - newval->value = val; - - return newval; -} - -/* - * Allocates resources for a new tagged_value_t initializing both tag and value - * to what received as argument. - * if vlen is 0 or negative, then val is assumed to be a string and - * strdup is used to copy it. - * Return a pointer to the new allocated tagged_value_t. - */ -tagged_value_t * -list_create_tagged_value(char *tag, void *val, size_t vlen) -{ - tagged_value_t *newval = (tagged_value_t *)calloc(1, sizeof(tagged_value_t)); - if(!newval) { - //fprintf(stderr, "Can't create new tagged value: %s", strerror(errno)); - return NULL; - } - - if(tag) - newval->tag = strdup(tag); - if(val) - { - if(vlen) - { - newval->value = malloc(vlen+1); - if(newval->value) - { - memcpy(newval->value, val, vlen); - memset((char *)newval->value+vlen, 0, 1); - newval->vlen = vlen; - } else { - //fprintf(stderr, "Can't copy value: %s", strerror(errno)); - free(newval->tag); - free(newval); - return NULL; - } - newval->type = TV_TYPE_BINARY; - } - else - { - newval->value = (void *)strdup((char *)val); - newval->vlen = strlen((char *)val); - newval->type = TV_TYPE_STRING; - } - } - return newval; -} - -/* - * Allocates resources for a new tagged_value_t - * containing a linked_list_t instead of a simple buffer. - * This let us define folded linked_list_t and therefore represent - * trees (or a sort of folded hashrefs) - */ -tagged_value_t * -list_create_tagged_sublist(char *tag, linked_list_t *sublist) -{ - tagged_value_t *newval = (tagged_value_t *)calloc(1, sizeof(tagged_value_t)); - if(!newval) { - //fprintf(stderr, "Can't create new tagged value: %s", strerror(errno)); - return NULL; - } - - if(tag) - newval->tag = strdup(tag); - newval->type = TV_TYPE_LIST; - newval->value = sublist; - return newval; -} - -/* Release resources for tagged_value_t pointed by tval */ -void -list_destroy_tagged_value(tagged_value_t *tval) -{ - list_destroy_tagged_value_internal(tval, NULL); -} - -tagged_value_t * -list_set_tagged_value(linked_list_t *list, char *tag, void *value, size_t len, int copy) -{ - int i; - - tagged_value_t *tval; - if (copy) - tval = list_create_tagged_value(tag, value, len); - else - tval = list_create_tagged_value_nocopy(tag, value); - - MUTEX_LOCK(list->lock); - for (i = 0; i < (int)list->length; i++) { - tagged_value_t *tv = list_pick_tagged_value(list, i); - if (tv && tv->tag && tv->tag[0] == tag[0] && - strcmp(tv->tag, tag) == 0) - { - MUTEX_UNLOCK(list->lock); - if (!list_set_value(list, i, tval)) { - list_destroy_tagged_value(tval); - return NULL; - } - return tv; - } - } - if (list_push_tagged_value(list, tval) == 0) { - list_destroy_tagged_value(tval); - tval = NULL; - } - MUTEX_UNLOCK(list->lock); - return NULL; -} - -/* Pops a tagged_value_t from the list pointed by list */ -tagged_value_t * -list_pop_tagged_value(linked_list_t *list) -{ - return (tagged_value_t *)list_pop_value(list); -} - -/* - * Pushes a new tagged_value_t into list. user must give a valid tagged_value_t pointer - * created trough a call to create_tagged_value() routine - */ -int -list_push_tagged_value(linked_list_t *list, tagged_value_t *tval) -{ - list_entry_t *new_entry; - int res = 0; - if(tval) - { - new_entry = create_entry(); - if(new_entry) - { - new_entry->tagged = 1; - new_entry->value = tval; - res = push_entry(list, new_entry); - if(res != 0) - destroy_entry(new_entry); - } - } - return res; -} - -int -list_unshift_tagged_value(linked_list_t *list, tagged_value_t *tval) -{ - int res = 0; - list_entry_t *new_entry; - if(tval) - { - new_entry = create_entry(); - if(new_entry) - { - new_entry->tagged = 1; - new_entry->value = tval; - res = unshift_entry(list, new_entry); - if(res != 0) - destroy_entry(new_entry); - } - } - return res; -} - -tagged_value_t * -shift_tagged_value(linked_list_t *list) -{ - return (tagged_value_t *)list_shift_value(list); -} - -int -list_insert_tagged_value(linked_list_t *list, tagged_value_t *tval, size_t pos) -{ - int res = 0; - list_entry_t *new_entry; - if(tval) - { - new_entry = create_entry(); - if(new_entry) - { - new_entry->tagged = 1; - new_entry->value = tval; - res = insert_entry(list, new_entry, pos); - if(res != 0) - destroy_entry(new_entry); - } - } - return res; -} - -tagged_value_t * -list_pick_tagged_value(linked_list_t *list, size_t pos) -{ - return (tagged_value_t *)list_pick_value(list, pos); -} - -tagged_value_t * -list_fetch_tagged_value(linked_list_t *list, size_t pos) -{ - return (tagged_value_t *)list_fetch_value(list, pos); -} - -/* - * ... without removing it from the list - */ -tagged_value_t * -list_get_tagged_value(linked_list_t *list, char *tag) -{ - int i; - tagged_value_t *tval; - for(i = 0;i < (int)list_count(list); i++) - { - tval = list_pick_tagged_value(list, i); - if (!tval) { - continue; - } - if(strcmp(tval->tag, tag) == 0) - return tval; - } - return NULL; -} - -/* - * ... without removing it from the list - * USER MUST NOT FREE MEMORY FOR RETURNED VALUES - * User MUST create a new list, pass it as 'values' - * and destroy it when no more needed .... entries - * returned inside the 'values' list MUST not be freed, - * because they reference directly the real entries inside 'list'. - */ -size_t -list_get_tagged_values(linked_list_t *list, char *tag, linked_list_t *values) -{ - int i; - int ret; - tagged_value_t *tval; - ret = 0; - for(i = 0;i < (int)list_count(list); i++) - { - tval = list_pick_tagged_value(list, i); - if (!tval) { - continue; - } - if(strcmp(tval->tag, tag) == 0) - { - list_push_value(values, tval->value); - ret++; - } - } - return ret; -} - -static inline void -swap_entry_node_val(list_entry_t *p1, list_entry_t *p2) -{ - if (!p1 || !p2) return; - - void *tmp = p1->value; - p1->value = p2->value; - p2->value = tmp; -} - -static inline void -list_quick_sort(list_entry_t *head, - list_entry_t *tail, - list_entry_t *pivot, - int length, - list_comparator_callback_t comparator) -{ - if (!head || !tail || !pivot || length < 2 || !comparator) return; - - if (length == 2) { - if (comparator(head->value, tail->value) < 0) - swap_entry_node_val(head, tail); - return; - } - - void *pvalue = pivot->value; - list_entry_t *p1 = head, *p2 = tail; - - for (;;) { - - while(p1 && p1 != pivot && comparator(p1->value, pvalue) > 0) - p1 = p1->next; - - while(p2 && p2 != pivot && comparator(p2->value, pvalue) < 0) - p2 = p2->prev; - - if (p1 == p2 || !p1 || !p2) - break; - - if (p1 == pivot) { - // all the elements on the left of the pivot are smaller - // so we can't just swap values anymore - if (p2->prev) - p2->prev->next = p2->next; - if (p2->next) - p2->next->prev = p2->prev; - - if (pivot->prev) - pivot->prev->next = p2; - else if (pivot == pivot->list->head) - pivot->list->head = p2; - - if (p2 == pivot->list->tail) - pivot->list->tail = p2->prev; - - list_entry_t *tmp = p2->prev; - p2->prev = pivot->prev; - pivot->prev = p2; - if (p2->prev) - p2->prev->next = p2; - - p2->next = pivot; - if (p2->next == head) - head = p2; - if (p2 == tail) - tail = tmp; - p2 = tmp; - - if (p1 != pivot) - p1 = p1->next; - - - } else if (p2 == pivot) { - // all the elements on the right of the pivot are bigger - // so we can't just swap values anymore - if (p1->prev) - p1->prev->next = p1->next; - if (p1->next) - p1->next->prev = p1->prev; - - if (pivot->next) - pivot->next->prev = p1; - else if (pivot == pivot->list->tail) - pivot->list->tail = p1; - - if (p1 == pivot->list->head) - pivot->list->head = p1->next; - - list_entry_t *tmp = p1->next; - p1->next = pivot->next; - pivot->next = p1; - if (p1->next) - p1->next->prev = p1; - - p1->prev = pivot; - if (p1->prev == tail) - tail = p1; - if (p1 == head) - head = tmp; - p1 = tmp; - - if (p2 != pivot) - p2 = p2->prev; - - } else { - swap_entry_node_val(p1, p2); - - if (p1 != pivot) - p1 = p1->next; - if (p2 != pivot) - p2 = p2->prev; - } - - } - - // TODO - optimize the pivot selection on the sublists - // (it could be done while traversing the list - // earlier in this function) - int l1 = 0; - p1 = head; - while (p1 != pivot) { - p1 = p1->next; - l1++; - } - int l2 = length - (l1 + 1); - int i; - list_entry_t *pv1 = head, *pv2 = tail; - for (i = 0; pv1 && pv1->next && i < l1/2; ++i) - pv1 = pv1->next; - for (i = 0; pv2 && pv2->prev && i < l2/2; ++i) - pv2 = pv2->prev; - - // recursion here - if (l1 > 1 && pivot->prev && head != pivot->prev) - list_quick_sort(head, pivot->prev, pv1, l1, comparator); - if (l2 > 1 && pivot->next && tail != pivot->next) - list_quick_sort(pivot->next, tail, pv2, l2, comparator); -} - -void -list_sort(linked_list_t *list, list_comparator_callback_t comparator) -{ - MUTEX_LOCK(list->lock); - list_entry_t *pivot = pick_entry(list, (list->length/2) - 1); - list_quick_sort(list->head, list->tail, pivot, list->length, comparator); - list->cur = NULL; - list->pos = 0; - MUTEX_UNLOCK(list->lock); -} - -slice_t * -slice_create(linked_list_t *list, size_t offset, size_t length) -{ - slice_t *slice = calloc(1, sizeof(slice_t)); - slice->list = list; - slice->offset = offset; - slice->length = length; - list_entry_t *e = create_entry(); - e->value = slice; - list_entry_t *cur = list->slices; - if (!cur) { - list->slices = e; - } else { - while (cur->next) - cur = cur->next; - cur->next = e; - e->prev = cur; - } - - return slice; -} - -void -slice_destroy(slice_t *slice) -{ - linked_list_t *list = slice->list; - list_entry_t *cur = list->slices; - list_entry_t *prev = NULL; - while (cur) { - if (cur->value == slice) { - if (prev) { - prev->next = cur->next; - cur->next->prev = prev; - } else { - list->slices = cur->next; - } - destroy_entry(cur); - break; - } - prev = cur; - cur = cur->next; - } - free(slice); -} - -int -slice_foreach_value(slice_t *slice, int (*item_handler)(void *item, size_t idx, void *user), void *user) -{ - linked_list_t *list = slice->list; - MUTEX_LOCK(list->lock); - size_t idx = 0; - list_entry_t *e = pick_entry(list, slice->offset); - while(e && idx < slice->length) { - int rc = item_handler(e->value, idx++, user); - if (rc == 0) { - break; - } else if (rc == -1 || rc == -2) { - list_entry_t *d = e; - e = e->next; - if (list->head == list->tail && list->tail == d) { - list->head = list->tail = NULL; - } else if (d == list->head) { - list->head = d->next; - list->head->prev = NULL; - } else if (d == list->tail) { - list->tail = d->prev; - list->tail->next = NULL; - } else { - e->prev = d->prev; - e->prev->next = e; - } - d->list = NULL; - if (list->cur == d) - list->cur = NULL; - list->length--; - slice->length--; - // the callback got the value and will take care of releasing it - destroy_entry(d); - if (rc == -2) // -2 means : remove and stop the iteration - break; - // -1 instead means that we still want to remove the item - // but we also want to go ahead with the iteration - } else { - e = e->next; - } - } - MUTEX_UNLOCK(list->lock); - return idx; -} - -// vim: tabstop=4 shiftwidth=4 expandtab: -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ diff --git a/sparsity/src/linklist.h b/sparsity/src/linklist.h deleted file mode 100755 index 1f8d7de..0000000 --- a/sparsity/src/linklist.h +++ /dev/null @@ -1,423 +0,0 @@ -/** - * @file linklist.h - * @author Andrea Guzzo - * @date 22/09/2013 - * @brief Fast thread-safe linklist implementation - * @note In case of failures reported from the pthread interface - * abort() will be called. Callers can catch SIGABRT if more - * actions need to be taken. - */ -#ifndef HL_LINKLIST_H -#define HL_LINKLIST_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include -#ifdef WIN32 -#ifdef THREAD_SAFE -#include -#endif -#endif -#include // for memset - -/** - * @brief Callback that, if provided, will be called to release the value resources - * when an item is being removed from the list - */ -typedef void (*free_value_callback_t)(void *v); - -typedef int (*list_comparator_callback_t)(void *v1, void *v2); - -/** - * @brief Opaque structure representing the actual linked list descriptor - */ -typedef struct _linked_list_s linked_list_t; - - -/******************************************************************** - * Common API - ********************************************************************/ - -/* List creation and destruction routines */ - -/** - * @brief Create a new list - * @return a newly allocated and initialized list - */ -linked_list_t *list_create(); - -/** - * @brief Initialize a pre-allocated list - * - * This function can be used to initialize a statically defined list - * @return 0 on success; -1 otherwise - */ -int list_init(linked_list_t *list); - -/** - * @brief Release all resources related to the list - * @param list : A valid pointer to a linked_list_t structure - */ -void list_destroy(linked_list_t *list); - -/** - * @brief remove all items from the list - * @param list : A valid pointer to a linked_list_t structure - */ -void list_clear(linked_list_t *list); - -/** - * @brief Return the total count of items in the list - * @param list : A valid pointer to a linked_list_t structure - * @return the actual number of items stored in the list - */ -size_t list_count(linked_list_t *list); - -/** - * @brief Set the callback which must be called to release values stored in the list - * @param list : A valid pointer to a linked_list_t structure - * @param free_value_cb : an free_value_callback_t function - */ -void list_set_free_value_callback(linked_list_t *list, free_value_callback_t free_value_cb); - -/** - * @brief Lock the list - * @param list : A valid pointer to a linked_list_t structure - */ -void list_lock(linked_list_t *list); - -/** - * @brief Unlock the list - * @param list : A valid pointer to a linked_list_t structure - */ -void list_unlock(linked_list_t *list); - -/******************************************************************** - * Value-based API - ********************************************************************/ - - -/* List access routines */ - -/** - * @brief Remove last value from the list - * @param list : A valid pointer to a linked_list_t structure - * @return The value previous tail of the list - */ -void *list_pop_value(linked_list_t *list); - -/** - * @brief Append a new value to the list (tail) - * @param list : A valid pointer to a linked_list_t structure - * @param val : The value to store in the tail of the list - * @return : 0 if success, -1 otherwise - */ -int list_push_value(linked_list_t *list, void *val); - -/** - * @brief Insert a new value at the beginning of the least (head) - * @param list : A valid pointer to a linked_list_t structure - * @param val : The value to store in the head of the list - * @return : 0 if success, -1 otherwise - */ -int list_unshift_value(linked_list_t *list, void *val); - -/** - * @brief Remove the first value from the list - * @param list : A valid pointer to a linked_list_t structure - * @return The previous value stored in the tail of the list - */ - -void *list_shift_value(linked_list_t *list); - -/** - * @brief Insert a value at a specific position - * @param list : A valid pointer to a linked_list_t structure - * @param val : The value to store at pos - * @param pos : The position (offset) where to store the value - * @return 0 if success, -1 otherwise - * - * If the list is shorter than pos-1 empty values will be inserted up to - * that position before inserting the new one - */ -int list_insert_value(linked_list_t *list, void *val, size_t pos); - - -/** - * @brief Set the value at a specific position - * @param list : A valid pointer to a linked_list_t structure - * @param pos : The position (offset) where to store the value - * @param val : The value to store at pos - * - * This function will replace the value at pos if present or insert it if missing - * filling in the gaps with NULL values if the length of the list is shorter than pos - */ -void *list_set_value(linked_list_t *list, size_t pos, void *val); - -/** - * @brief Replace the value stored at a specific position with a new value - * @param list : A valid pointer to a linked_list_t structure - * @param pos : The position of the value we want to replace - * @param val : The new value - */ -void *list_subst_value(linked_list_t *list, size_t pos, void *val); - - -/** - * @brief Pick the value at a specific position - * @param list : A valid pointer to a linked_list_t structure - * @param pos : The position (offset) of the requested value - * @return : The value stored at pos if any, NULL otherwise - * - * Note this is a read-only access and the value will not be removed from the list - */ -void *list_pick_value(linked_list_t *list, size_t pos); - -/** - * @brief Fetch (aka: Pick and Remove) the value at a specific position - * @param list : A valid pointer to a linked_list_t structure - * @param pos : The position (offset) of the requested value - * @return : The value stored at pos if any, NULL otherwise - * - * Note this is a read-write access and the value will be removed from the list before returning it. - * The value will not be released so the free_value_callback won't be called in this case - */ -void *list_fetch_value(linked_list_t *list, size_t pos); - -/** - * @brief Move an existing value to a new position - * @param list : A valid pointer to a linked_list_t structure - * @param srcPos : The actual position of the value we want to move - * @param dstPos : The new position where to move the value to - * @return : 0 if success, -1 otherwise - */ -int list_move_value(linked_list_t *list, size_t srcPos, size_t dstPos); - -/** - * @brief Swap two values - * @param list : A valid pointer to a linked_list_t structure - * @param pos1 : The position of the first value to swap with a second one - * @param pos2 : The position of the second value to swap with the first - * @return 0 if success, -1 otherwise - */ -int list_swap_values(linked_list_t *list, size_t pos1, size_t pos2); - - -/** - * @brief Callback for the value iterator - * @return 1 to go ahead with the iteration, - * 0 to stop the iteration, - * -1 to remove the current item from the list and go ahead with the iteration - * -2 to remove the current item from the list and stop the iteration - */ -typedef int (*item_handler_t)(void *item, size_t idx, void *user); - -/* list iterator. This iterator can be used for both Tag-based and Value-based lists. - * If tagged, items can simply be casted to a tagged_value_t pointer. - * @return The number of items visited during the iteration - */ -int list_foreach_value(linked_list_t *list, item_handler_t item_handler, void *user); - -/******************************************************************** - * Tag-based API - ********************************************************************/ - -/** - * @brief Tagged Value - * - * This structure represent a tagged_value_t and is the main datatype - * you will have to handle when workin with the tagged-based api. - * If user extract such structure from the list (removing it from the list) - * then he MUST release its resources trough a call to destroy_tagged_value - * when finished using it. - * If a new tagged_value must be created and inserted in a list, then - * list_create_tagged_value() should be used to allocate resources and obtain - * a pointer to a tagged_value_t structure. - */ -typedef struct _tagged_value_s { - char *tag; - void *value; - size_t vlen; - char type; -#define TV_TYPE_STRING 0 -#define TV_TYPE_BINARY 1 -#define TV_TYPE_LIST 2 -} tagged_value_t; - - -/* List creation and destruction routines */ - -/* Tagged List access routines (same of previous but with tag support */ -/** - * @brief Allocate resources for a new tagged value - * @param tag : The tag - * @param val : The value - * @param len : The size of the value - * @return a newly created tagged value with the provided tag and value - * - * Both the tag and the value will be copied. len will be the size used by the copy - */ -tagged_value_t *list_create_tagged_value(char *tag, void *val, size_t len); - -/** - * @brief Allocate resources for a new tagged value without copying the value - * @param tag : The tag - * @param val : The value - * @return A newly created tagged value with the provided tag and value - * - * Only the tag will be copied, the value will just point - * to the provided value without it being copied - */ -tagged_value_t *list_create_tagged_value_nocopy(char *tag, void *val); - -/** - * @brief Create a tagged value where the value is a linked_list_t - * @param tag : The tag - * @param list : The list used as value - * @return A newly created tagged value with type TV_TYPE_LIST - * - * This function is just an accessor to set the tagged_value->type properly - * when using it to store a list - */ -tagged_value_t *list_create_tagged_sublist(char *tag, linked_list_t *list); - -/** - * @brief Release resources used by the tagged value tval - * @param tval : The tagged value to release - */ -void list_destroy_tagged_value(tagged_value_t *tval); - -/** - * @brief Same as pop_value but expect the value to be a pointer to a tagged_value_t structure - * @param list : A valid pointer to a linked_list_t structure holding tagged values - * @return The tagged value stored at the end of the list - */ -tagged_value_t *list_pop_tagged_value(linked_list_t *list); - -/** - * @brief Same as push_value but when using the list to store tagged values - * @param list : A valid pointer to a linked_list_t structure holding tagged values - * @param tval: The new tagged value to store - * @return 0 if success, -1 otherwise - */ -int list_push_tagged_value(linked_list_t *list, tagged_value_t *tval); - -/** - * @brief Same as unshift_value but when using the list to store tagged values - * @param list : A valid pointer to a linked_list_t structure holding tagged values - * @param tval: The new tagged value to store - * @return 0 if success, -1 otherwise - */ -int list_unshift_tagged_value(linked_list_t *list, tagged_value_t *tval); - -/** - * @brief Same as shift_value but when using the list to store tagged values - * @param list : A valid pointer to a linked_list_t structure holding tagged values - * @return The tagged value stored in the head of the list, NULL if the list is empty - */ -tagged_value_t *list_shift_tagged_value(linked_list_t *list); - -/** - * @brief Same as insert_value but when using the list to store tagged values - * @param list : A valid pointer to a linked_list_t structure holding tagged values - * @param tval: The new tagged value to store - * @param pos: The position (index) where to store the new tagged value - * @return 0 if success, -1 otherwise - */ -int list_insert_tagged_value(linked_list_t *list, tagged_value_t *tval, size_t pos); - -/** - * @brief Same as pick_value but when using the list to store tagged values - * @param list : A valid pointer to a linked_list_t structure holding tagged values - * @param pos : The position (offset) of the requested tagged value - * @return : The tagged value stored at pos if any, NULL otherwise - * - * Note this is a read-only access and the tagged value will not be removed from the list - */ -tagged_value_t *list_pick_tagged_value(linked_list_t *list, size_t pos); - -/** - * @brief Same as fetch_value but when using the list to store tagged values - * @param list : A valid pointer to a linked_list_t structure holding tagged values - * @param pos : The position (offset) of the requested tagged value - * @return : The tagged value stored at pos if any, NULL otherwise - * - * Note this is a read-write access and the tagged value will be removed from - * the list before returning it. - * The tagged value will not be released - */ -tagged_value_t *list_fetch_tagged_value(linked_list_t *list, size_t pos); - -/** - * @brief Get a tagged value from the list by using its tag instead of the position - * @param list : A valid pointer to a linked_list_t structure holding tagged values - * @param tag : The tag of the value we are looking for - * @return The first tagged value in the list whose tag matches the provided tag - * - * Note this is a read-only access and the tagged value will not be removed from the list - */ -tagged_value_t *list_get_tagged_value(linked_list_t *list, char *tag); - -/** - * @brief Set a new tagged value in the list. If the list already - * contains values with the same tag, the first occurrence will be replaced with the new value - * (but still at the same index in the list) - * @param list: The list used as value - * @param tval: The new tagged value to insert to the list - * @return The previous tagged_value_t matching the given tag if any; NULL otherwise - * @note If a tagged value with the same tag is already contained in the list, - * this function will replace the old tagged_value_t structure with the - * new one preserving the position in the list.\n - * If no matching tagged_value_t structure is found, then the new one - * is added to the end of the list - */ -tagged_value_t *list_set_tagged_value(linked_list_t *list, char *tag, void *value, size_t len, int copy); - - -/** - * @brief Get all value pointers for all tagged values matching a specific tag - * @param list : A valid pointer to a linked_list_t structure holding tagged values - * @param tag : The tag of the values we are looking for - * @param values : a valid pointer to a linked_list_t structure where to put the - * value pointers held by the tagged_value_t items matching the provided tag - * @return The number of tagged values matching the tag and added to the values linked list - * - * Note The caller MUST NOT release resources for the returned values - * (since still pointed by the tagged_value_t still in list) - */ -size_t list_get_tagged_values(linked_list_t *list, char *tag, linked_list_t *values); - -/** - * @brief Sort the content of the list using an in-place quicksort algorithm and a - * provided callback able to compare the value stored in the list - * @param list : A valid pointer to a linked_list_t structure holding tagged values - * @param comparator : A valid list_comparator_callback_t callback able to compare the - * actual value stored in the list - */ -void list_sort(linked_list_t *list, list_comparator_callback_t comparator); - - -/******************************************************************** - * Slice API - ********************************************************************/ - -typedef struct _slice_s slice_t; - -slice_t *slice_create(linked_list_t *list, size_t offset, size_t length); - -void slice_destroy(slice_t *slice); - -int slice_foreach_value(slice_t *slice, item_handler_t item_handler, void *user); - -#ifdef __cplusplus -} -#endif - -#endif - -// vim: tabstop=4 shiftwidth=4 expandtab: -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ diff --git a/sparsity/src/main.c b/sparsity/src/main.c deleted file mode 100644 index e588424..0000000 --- a/sparsity/src/main.c +++ /dev/null @@ -1,54 +0,0 @@ -// -// main.c -// traildb_to_sparse -// -// Created by Alan Höng on 19/02/2017. -// Copyright © 2017 Alan Höng. All rights reserved. -// - -#include -#include -#include "traildb_coo.h" -#include - -int main(int argc, const char * argv[]) { - tdb_error err; - const char * db_path = argv[1]; - tdb* db = tdb_init(); - - printf("%s\n", db_path); - if ((err = tdb_open(db, db_path))){ - printf("Opening TrailDB failed: %s\n", tdb_error_str(err)); - exit(1); - } - - uint64_t num_events = tdb_num_events(db); - - tdb_close(db); - - uint64_t *row_idx_array = malloc(sizeof(uint64_t) * num_events); - uint64_t *col_idx_array = malloc(sizeof(uint64_t) * num_events); - uint8_t **uids = malloc(sizeof(uint8_t*) * num_events); - uint64_t *timestamps = malloc(sizeof(uint64_t) * num_events); - - traildb_coo_repr(db_path, "username", row_idx_array, col_idx_array, uids, timestamps); - - int i; - for (i=0; i < num_events; i++){ - char str[37] = {}; - - printf("row_idx: %" PRIu64 "\n", row_idx_array[i]); - printf("col_idx: %" PRIu64 "\n", col_idx_array[i]); - printf("ts: %" PRIu64 "\n", timestamps[i]); - } - - //free data - free(row_idx_array); - free(col_idx_array); - for(i=0; i < num_events; i++){ - free(uids[i]); - } - free(uids); - free(timestamps); - return 0; -} diff --git a/sparsity/src/traildb_coo.c b/sparsity/src/traildb_coo.c deleted file mode 100644 index 6dbbd5f..0000000 --- a/sparsity/src/traildb_coo.c +++ /dev/null @@ -1,115 +0,0 @@ -// -// traildb_coo.c -// traildb_to_sparse -// -// Created by Alan Höng on 19/02/2017. -// Copyright © 2017 Alan Höng. All rights reserved. -// -#include "hashtable.h" -#include "traildb_coo.h" -#include - -uint64_t traildb_coo_repr(const char* fname, const char* fieldname, - uint64_t* row_idx_array, uint64_t* col_idx_array, - uint8_t* uids, uint64_t* timestamps, - char** col_names, uint64_t** str_lens){ - int summed = 0; - tdb_error err; - const char * db_path = fname; - tdb* db = tdb_init(); - - - printf("%s\n", db_path); - if ((err = tdb_open(db, db_path))){ - printf("Opening TrailDB failed: %s\n", tdb_error_str(err)); - exit(1); - } - - tdb_field oh_field; - if (( err = tdb_get_field(db, fieldname, &oh_field))){ - printf("Could not find field: %s\n", tdb_error_str(err)); - exit(1); - } - - uint64_t n_columns = tdb_lexicon_size(db, oh_field); - hashtable_t *col_mapping = ht_create(n_columns, n_columns, free); - linked_list_t* cols = list_create(); - linked_list_t* col_len = list_create(); - - uint64_t max_col_idx = 0; - - tdb_cursor *cursor = tdb_cursor_new(db); - - uint64_t i; - uint64_t j; - uint64_t row_idx = 0; - uint64_t cidx; - uint64_t total_col_chars = 1; - /* loop over all trails aka users */ - for (i = 0; i < tdb_num_trails(db); i++){ - const tdb_event *event; - tdb_get_trail(cursor, i); - - /* loop over all events */ - while ((event = tdb_cursor_next(cursor))){ - for (j = 0; j < event->num_items; j++){ - if (oh_field == tdb_item_field(event->items[j])){ - uint64_t len; - const char *val = tdb_get_item_value(db, event->items[j], &len); - if (ht_exists(col_mapping, val, len)){ - cidx = *((uint64_t*) (ht_get(col_mapping, val, len, NULL))); - } else { - uint64_t *tmp = malloc(sizeof max_col_idx); - *tmp = max_col_idx; - ht_set(col_mapping, val, len, tmp, 1); - cidx = max_col_idx; - max_col_idx += 1; - - char* col_name = malloc(sizeof(char)*(len+1)); - *((char *)memcpy(col_name, val, len+1)) = '\0'; - total_col_chars += len; - list_push_value(cols, col_name); - - uint64_t *list_len = (uint64_t*) malloc(sizeof(uint64_t)); - *list_len = len; - list_push_value(col_len, list_len); - } - if (summed <=0){ - row_idx_array[row_idx] = row_idx; - col_idx_array[row_idx] = cidx; - timestamps[row_idx] = event->timestamp; - - //uids[row_idx] = malloc(sizeof(uint8_t)*16); - memcpy(&uids[row_idx*16], tdb_get_uuid(db, i), 16); - - row_idx += 1; - } - break; - } - } - } - } - uint64_t n_cols = (uint64_t) list_count(cols); - char* cols_concat = (char*) malloc(sizeof(char)*(total_col_chars)); - cols_concat[0] = '\0'; - for (i = 0; i < n_cols; i++){ - char* tmp = (char *) list_pop_value(cols); - strcat(cols_concat, tmp); - free(tmp); - } - *col_names = cols_concat; - uint64_t* col_lens = (uint64_t*) malloc(sizeof(uint64_t)*n_cols); - for (i = 0; i < n_cols; i++){ - uint64_t *val = (uint64_t*) list_pop_value(col_len); - col_lens[i] = *val; - free(val); - } - *str_lens = col_lens; - tdb_cursor_free(cursor); - list_destroy(cols); - list_destroy(col_len); - ht_destroy(col_mapping); - tdb_close(db); - //printf("col names: %s\n", *col_names); - return n_cols; -} diff --git a/sparsity/src/traildb_coo.h b/sparsity/src/traildb_coo.h deleted file mode 100644 index 63ca7be..0000000 --- a/sparsity/src/traildb_coo.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// traildb_coo.h -// traildb_to_sparse -// -// Created by Alan Höng on 19/02/2017. -// Copyright © 2017 Alan Höng. All rights reserved. -// - -#ifndef traildb_coo_h -#define traildb_coo_h -#include -#include -uint64_t traildb_coo_repr(const char* fname, const char* fieldname, - uint64_t* row_idx_array, uint64_t* col_idx_array, - uint8_t* uids, uint64_t* timestamps, - char** col_names, uint64_t** str_lens); -#endif /* traildb_coo_h */ diff --git a/sparsity/test/pydata.tdb b/sparsity/test/pydata.tdb deleted file mode 100644 index 4dd1b83b2cb07d845886f833f03573e1b943d646..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3101696 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 owj^<3R4S*j|3eY!W{17G2UXGH^l?`GL#DT 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⋘UEeG0UA1Tcjm5Z@@O#DWz)u7kA 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
^1xHQmLef6c*$O8OE5G#`*J2288 z$wOo?ylnUEDs31dsQ$ww$lzKY#V57Zi70~+Wm5r38xY7L$zT+(yzTy^T_7sxkgIzt;`4lllK)wZ>+f6w&f zlH1L8%^$XI9j_F482E4U2Te~@`!*DeF*X#atvjtot^2GNZRFd^R$mpG5PWM8dX_&m z#12>B=$tD7!A%V0+54+p2N^ubBZcPrSkQLlxsj2VmRs45GAQO@9k)_=Oqtv_4p^tY znW{^)cAuo$TiJa<|L5R_8QO*EL81h&Gu!a>YYDc(E60%|gHj&$=;41%t_;d~X|KPt zm^@jIZ(Mwn6Hs-8gTT$2D>ypLHS=$dvkV^MVY4S&^7t~C&La>X@;ELsc$lZ46o9T7 z)Xtv&38D=AZz5Z%&ly$1oLfD}NtfPF7c^py((f!UNc@;?jtoqhg04D6>Y@^YFl<4{goP3TxK&!ha( zO-r42U+$$^%}o0#mC05`6(Ee(f8@1F6f&jKEm&sh9Y)jtr|aQ|%363Y7s|KOAGO`8 zdm~#+ToCn_wr-w>c4VUDzo6p>K1vP(tTEPJ5Mt94P|h`ha}#A>(;O|b?5>tV^-?J zvM)_-_2)$p`PwaIwC+blIaD_5(55!OE-PDQFlWyJsL zII>VpW-vk5&J2#@9#Hojn~_aX@-!LM{MkTR$^zJYb+){PmJINd9->_Sl6|9@$k{)x zvIXi^YOJ8yG_PHcl-Q(X$((vdRmjy9uctzyFg1~h& zdiS(3)@Nat8xJ@R1GXPW(UiMQqf*-4(6uTMI~x5ShR7cn1h((BL|t14seq%t4!_}|Y~jPUcIZcZyQ-Dy!sbm>(z&*mpd?!KLNh{4QfU}0xQyT ziZDeDub+C4D5LJwTkrI}mQkfS7GosbsD@RiCL)Z5Uy^>^+Z5@|#LYsP)_)TBc{3a4 zSO3M6E)Yr-mOzct&`v&BGY`u}oF*yb;2EYWPK@auY4#?pMQh5yJC>f&*&UA)V!c1MWL3Too2XwMnNU%R4 zKB?Xv(CH3V?F%+kt&7~sFH*xkk*e_URpBW$?57^JE)f;0;cpR18*3meQNsc1A~5ME zns;mC8UvUfxg!JTun-Hch_J7eS5XJnI5Cj;3;u#L>SNR|VKeC__pBO%V)oJ~<12Tx zO1+tZk$K(Qz&KX*7k5zC-o(1poSW@1n~oJMYS)@`x%B^QUmc5 zgt5VcaW;Jma>ofT95n*FqKn?!iXD8l! zo?%{-c9PC+4is9A2cCW?-uJkhr&mKG@u$x5=rli6)wyT2_?G&7K!Qr!`k(Z+8k&e% zqPsJAb!uo<>>~5_*a~v|QvQO>TH76hyK2Z57lw>P&iPfW4nRK2OWf|Mp`}=*zW$wm zUk$CrhURL7_EXSfh`holy>xTP2=d01S zU#b`S1C?L%Ovy7fbQCiTm72Z6^^HNjVJ7-#3_Mce&VR0km^e{wjjSDus`5j;L=9@_ zDn^W(cZeF*kSo@#Z@MpdsfPUGD%Y#?FR}t`K;K(D(VT|+c8N#3fV zSd7@5UN3s5hElNsvgAtI;=K!IbUipqW27biTOc3h4Y+CSf^&YET63C;x8|JSy;>iT zK+9P_Q`oA89>sLdg&XI?eql(6G+y{o4L!xGs*q-Bn;MQ3tGe?}3qPshXtBysR4Vwa zhTdY;MWdOLFKReOtSY%}!vCs;4)s~3y>)Ct z&Dg%h**^o3qu(;QU25nrriEv{m3FJ21|+16V1gJ+1IAUE;JX^iizm}nPBZ39eyE{B zj7M(REACOl;NmVxeOWzgS^%156fSRP#Wa$vy1!Un-D6Pgf*1c0W53i`@FozPk?0nD zT1jtoxoSA+>_)j`$H-aob`2fRVADSSto><*Xx1di{;J_Pai%UNNHC~|VdArs5b!+! zZJWT91GIU=0uTl`_y&71kA}kuVjy1$JmqL~o0S4ZgA4>ESr`+yoe(QWNpbHNd)w%J z(zY8lO5 zkilt)GXsaQfuUHY9c@}5%EWxyB|~r+A+CG+1*{E3AIx!(d!U?Df*xkTY1r=u9$}1m zYuK0rE=b=ibHs1o$pVWO0DPs~aUM{ns{rPN*T3}zdUaQR9jm!K0bhNEhGBU0U?kw; zT^nd#kLj2zjvcZAEq(dwt!#w{iz--9G*M-~(-i0?48`Wt#}qP@dF)$NcMO}eYNcms zY->dmm<@6ic0elNDvQ{P8NYy*;w$W;H5nSDj%8wjc6HaNJ{=A|<2nPA;aEE*G9bD# za{n?iHd@G|(7=?n05#!Ar$z!DhtYS$0Q1C^aXUe50?^K-W!o#x5{5t#gvQ-4kgq@k zy(ZJNrkqJ~2XL8_wxF7G^+Qe&`Y?lrz5N}SPIOce+K;egFiXmb|=&tUZQY$LfA zZ9Zv^gjsOH?z6yfSDaQ%!$R@46cr<7lquFXhP%%mjCW=DQtIba)46F(d3$f`$8*8` zPLrr!)EHNMTcQy*8BhF51A2;luC$T2KXZTEu-@hJ=c%-i6n@-cDn2jyXK3C0?{?JR zx>{SI0<*LPhF-|tv5YWlj#31`PFDu-1lV-E+WI-`%Ps_)fzQsjuzu-}C}&tG%BKLf zL{T?69IOpNs|#JQ<{{n+D^Tr<_ikrkk+_FG69i|mi;QW?RTdqjy&)BJ;fI)|hD`9; zm9e1+U{QGJFS9QmbY+^w^|=vKg@88B&Ni$Db-8T2`=&pza5FKJ?lh8D7{tZd1A8}| z>MX+I@aT8Pz_G0!Xrag&40pRaq}`1TeBAI!zgXBZy#Ccez}?24Hr-8GWD(UX@qQ%+ zk#4Uu^1yKb^xv&UE2?VK!Q*ju!n|)(mw=n!_z964-56126sRAs@7RQJx3iPRxhU%_ z6yGP&vV9cZyRCsD6x|(dggL)XFhG3lJ$UPJI8Chd$wp#B`&T1IcV0<1;BbbR`WIiu zPr-WvIybkk@fU<1N^wJ~v$t?J;&7H2ul3|{H{o!OIFUDQ-MLT{kN9@Q+G|PVL}q5{ z)>iwUar-9r+9JBI1Hv>MMu}B&!F9oA97c;(_^uuNbethipiir{lx5&Bw%E4_SYBr% z>*R^9DjdcYdssdnoUdf~f|O`{qnB8aiCfD%t(dBEtY=8-;>Jn6de&A3=u$3X{Wb)N zf`tP|+6>?IN4~uM(7Wn3>+i{Tqe{DdDwiL+o@O$*<_4cfm!g)y<4hk@L21Hn4B4J= zRNihw{?Om$5jb2{Yz_>@?nxDBaIU7p$-OcW#5vH)=w4%do_`symTtvF07?n+zEWe~0G;iBz0Ocr|# z6(Zlm(2cKHa?B73-%LBEW6@?XHb{5kFhwk1PZ0>KK31a7V~=e z4svuoJuwe4xFT(n9LHgH@jrzAui_u~1P*hGr*Kc=n9u_-_OK0{e)scE;c$2Hh#&;1 z9QImRjKjUfU5nI~CKDwk_zZdHL&waCYw5yL9Of0XG>g+0VP*J@-sc7vD$=mi_@SH! zv!V<++bOGxG{(dodBFTBEyv-0G2@hXzW5vt^Tl-z?M%;!D6;p+Snhco78FXZ5ntvIG$BM5J=kDGY zU%}ytVpz~JNY@C=%!QRWEGnKtQ(e9mAi9dfVzI&M;)}@)E`1YSHLB{i@EQ(F#rT3r zE7vDHMy{!y*^>g8Kprm!Efdkqtlh7ym#%D_*^4lX)eQa(9G)%id6KxB$|$X00bY+s z_zab{YPF~u$K_PCZC@m;!QnZv!3c*4aV-wd7e7R?B$|?KMI*Ds}t_oaW&@HH@raS8AD-1Qth=|lPdGT zJi`DG;b*{3wP(B=@*nR$eqNpce5p{p+KQ&%*EMU;Qbj}Ym65c`DAE!9O8N+g6=Ec% z@2coA4zGxr!*fS-pWu3V=a1p%wF+>U&p>*Yhsd7cPpNaCQK08O$Kh463idqbzrf*j zF)3-u8Iro(e$M(;<+d*TzQ=dUZ4sr5%YMmA9M%-GH6i;AWUp|jFJ6fdLvAKmE#2+- z$u!&)$SVw0?YP;br*%AaH?U?>+V_VE_L`alP1^&bP@iVV{Br6T?*k5R728D*7cf))-SUGfEo55%|`d$Db5jQw1uYD>#SQ9BMFi#0pbkBh(I@M-ZbfV`1Q zWgR#pFaaEz=D_R3;q&76F1#)r`F-)3pc{t`;!L;2McnT=d?_xxXJhU;rQZm_#!nIT z;P7?v*9l`eiQz_|TrkPX@phBr`%f;VCoRERbJX=G4&N5na{F=Q+g~Z~7Y>`mc-Hhy zqTe`d5$DZM1Lvlo$lsxd#RE8O6(gr+mI?pj)`1C{#g1jRsp*aLnNc%^E??47Y9po-@JsPODywna zmCqnxd-21J4QfphfowsgmfP5$yt`>BM;FmP6cH>`XkW)rYaTtELV z%W^6;KySYjTN1FJimi{-@vI2=Tg>n|7-f^1yl)|s1>>I!Z3sA6Ja3-V2vLP_3q-a= zQec9CeG5}$N8o{-%8hX*r{k#jUzof)8Ru-Kzuv=@xDXSWHDy_RF3X(`nPu4P+?RcQ0f4{UFxM99mUW^v`j?ayqJiU@ea` zy7A?bde=ThgU}2prlVImh$&&_btHc}0p${vcuc5x z2B8m3pjVvs6VD``26pbgRDN=pNmDBoxfb9%ms9aA?ZHW^DCN{USs$b4E)}=#s_HTa z+!D5G+O>M_TmmX2D$zi{cpd?RB`WXt!zJ?xI8K7liw6Y@2pA?o)@1Zcq6j!af*)wi z+p9|3x14G4U%r7|YQEnmr?bq`u8ZOrqUjV0Vs``>u*;ZAtqo0O=Cob1h=Ab|=8M~% zqBx=_urn*l%Dl~Ca$On_Nf;`@1TWbV0!B#ibJdq6O9?owWTa!}EW0S#a$>ewlL@Hu zO4%Nh_;Q_Z`-ZITuNM6aX8pp=zig}arvvr{MYIlpbF)(B*UUmyPZIVDRugcBgk0LY zk{eGj6rENVml?$Z_1lgV5UOv0Etm}_=&w*oz-1+yJ8+iK z6W-ZGHEm8x+w5B7f9&cS%yUjkDo6U7uOw6xqMPs2=JeliAr5iRvOz)3Fg`)R6(zZa zaY7Gm3@6dl6ZlAR$s>y6OdxX30;!JRDiX+1i_S~75O7rqML}vBs}yGuFur8A?JWh; zyt6{Ejev;~V#M~B{Otr>TOu#8j2X4TsBTg7Lz}vqe=HU9K+E4rj8r7Zvo|BQ>GN#w zC=j!NPoiA}Op-7bUbfpUOm2*4GF!TXWV;ENQd0XZ{P?*p-*PEKwQ_70KbL@;B+S;^ zt7Umau%dGpO=YJu;O!$|nuJwkWnm*LxdRyOk^lJn37B3|crFqp_q|HV-JWirxc(po zS7^TRLXc0uObMBr`dM_4fOyGlfb8rX!!ID9M#A)FzT+MuptdBHWe{h!UQ$TFEhY6p zY3^srJxt6{Boy7)1zhJ=d|k8aQOz#P$2BjQ%%cX_apM2ZB>nlWRkxYF!H7KEc%hTR zLaZztQj@*eGW)5b-q-~c(zeipFLZeX&ZE<^pDD1#w^`+(Q_KcuFPE8&?i0q{iD0ae zrFn0ZU463PY+NW7yCc8jwt8UQW`%ZH^P}?60+$+BRH+}*F~W5&S`=|l9%tOlu0rrO zzi4;tE+6cZ;g2E^>^uP`6@i*{V15KGY&B;f@*1mL#weR%$u9WeCAW2EuAPTk6kQ&d zXdE*VaR`g&G;NWBM>0mpUw~B-$l4DEysHG`^S$Ezk_wj@zO2d?u`)pX@IK`oJ_NMOI)iIkIv zdT%*T*m3Ym+eNF^tg{c+0DT4fdu#qJY@lh~l?u+Bz#PPyYcgHu z051ufH@@zK?N%TyGsGK);jT;3Anq&mQE=;u@-`LbfhKsJpuQY zB+RKZMi^TbCpcAZuwTc-mn8&oKN4_%3EljhOW*HMb-ryn3+b;r%>6{b{F0-4dlbq! z`6Gp22v|_E8hO^3Ao@zcLJ8^r(qGt4z#}CS0ln(aXPa43`~`tajHYJy)zmv0GcUaS zxhs2fV-j=17peTUvFh9^dR;2#waqO=<<4NVUWwp#6S$)DAqC>NJel{MfJGATncEya z7osYo>7OJ$#BN1`!R1Rkc)bKHF8NBM%@Q5t^%2Ju31=(0;708Sx*5oyH$(c9fTbl1 z@Uh>{xb+k8v_yC(i;=Ss1vaf2HkC{5lbImb0E=ftlu#?sSmbh*wfGMK&q*?8zq)PH zac)v&=HqBfY=FS7h{3TN>zQKEw8rQCnSc|`)arA`+D4Xh{;{9z-e zgA5*`fmbAqkz0>TX&QL7gfzuJx^ek*jb4%94JVo^qWd4-IdJ25ozil)eV7HsH>1ir zK87E!>Y6g#Zc>u9Yj+aQ!co$Zhd<1X0CyC5_Eh8LW@Bi zze&LF@ZZW{ySHfFA{Y5`J2H@A;ySC^vA9(chsF6N{;+mg@J*LLlgazgN{aY|Ky^K;Ha9yTk|5YMV! z8x6dN-dd5YOtZ^Wyl0}eugnLC0J+@cVQhN>oA!cc8H?U*SIC1+5ajo{Hldpa-Yv=c z&(0cIHupD=tAY06Zm}1Q$<3iU!y-)pn>%z(*crJwOb<8z{e7B z?#gh1NCTgisAXb}Drfn1sYC;xOK_jlv$;}DtD-X_o#{J|4w&EW$@nr2Y>==oJojvg zO>y378&p5yl=n$H_Dcq+>zxT`i%_XGB9Aq3H#K@d`M6ACdMOCs*5(VuEe}WjD9xFZ z4R-Ol4z>Rnx4V4r3}>j0q->Uq(ZH7y@<_!Zp05VJmY{vc%$h~$GHTa*lL?~A`!r7M zuYqqR2DL`Z+yXSPsl;tRu&3eo5}!L(rbedO{C172=+@uf`ew7Wz2|^6$MdxrqsMom zEJOoaC0Gn)NsdFABf7kKp&IzHWFe#Mk*z%2l^}VxikEFuTp>#dtU4AFm0;5fda$jA(arszxNMT;@^)B#=0l zN28I3PL#V^h00Hu#6+wC1NFC}otnA^Z1$H5-76YIV&yQ<7r z%guVHZAiKDYW1eu;pycG%SuKomU%O?CAIIFke#!Yu8gy<*^|v+%YwStI&f}rN{qSB zXv&3R(rI9F&p>{~gfn!9(LnuM8|hhRp7KC^<7cxErz=M<{E>Gwp(oE>Q@$hpnd*j3 zt0}0mvO8fmRNg);uO|#`S&V)hE|On2X`ZoqESkq*#OC5IbC=Z~Koa--0^ECS?(q+S z`RCkCzU(xY>rDc`#M;&6aVk0}LEH#@|1Ptxpi1M|5njsO_BDUb`mjd?d92bh)-FL+ z^to-^Wg7Thf`t9{moC@99tpiI(JaBmgBhrF~ zrD&QrcrHbMHW|ymo5ZX*f@ljkBg-sQ4Q0xW;qyBQ8~*|=AFVU>3$6yTADy3 z*wRIk0~+X9>cmnFcQfMWYoN1~c)RL6|DXn9r3cQ?lyLV_ae)T9mX2tB(shRIzIq~^ zSE$+H-~D{@N)xXPGr7Xl{Cn>|HNPHUM>Hf662U#Hf!tDSjba5FYc7~N!4yH3S2zey zXdqvTBzk<8oYVvdC8*|3RPl;5P$!kT>dD>w3Jn}xdhLdN!K5k5)}fl^hmw6lUa-G6 z`zYIo(o|>XTz9>yf!X)Ux{~~{EMay0oq?}k1 zWna0xkzB8Guhw8kDT27g)}qd=}q1P&5WP~?I|1JLIn5Iu!ovU&YHQ-G-1642A9r8R9SXv z;Uf(kCsn;F8X|qHfnieB_4Qod6AhdoW$Kq(2%l=;q*BZ_W!ma~%Yh~U%11NkvqHXb zUua;sbk0LVkhvN?B)mE4oM}QoP>Q^E@?L6SMCl@W$S!;Al?Dks>d$|zfzzZou)Q}V zH*3`=Q)KrqRP;szXGm37Kd>CUrO zZS0789$PI!5q4s2iL;si28I%M$ecYHD2MG~VJ#XZahDbMn%y!kLf$^k`?3pdTD;v` z>q_Kw1)X|9czQTk8;>rfcFgKc&r}Sto{WLxR^qab0cJiYrf1kbZT5}_8P?MPR z3bejs%Xc^^fnz#)nra?;ZTdn)fvr!s4<&N92t^^=4oOWY>LjT5D5cfcD{55a`YD%107A3^Wt_0alRg14*i$nPARqCopA0r_Xb8?V5hte;8;9QM}s@vUdc5?ZW_VE!w~mW684f zTOE`sN$iXN=nvj3wW$&R8+J1WLMGGOlxl4m4=oVEQlcW~52fF+N*x<5|2 zw8F#20tA0x=eS!bOC6m9A6O3fFsUif-xq?!_*^xOx$ZyZ4et`!08 z0>cMCQS6@S!~Kr(c(W&oMh`d*z1HB452Gd6M)byP)<^ z-@pkD2@LVehb?!2u!kHpYdGlk8E|0J?Ud_&j_$W{2QeKJ7x-u=DnPDV@=bvsy6gZ@ zdU&1puv0eJ6c#xG#;3&4Gs@5rNOob6{2m*`#MjeVpnGdo^)^IX&$$|D0qn<2`XCD? zn-V-h&FijX7^q4+2f`k4Mt-#c!^hy;DiQWagTe*_V5J=jlwlK@l28)PFWqJ^7;{1# zM#8AltT*GwkGa~imxhQZ9Fa~SVYCzsJ2Oi*k%X~Q?I^0*yEyc;coLZulmHq!Y^9S) zJgBpcm6;#fHRkV$vcF!KNia~Yk-QLulQ2$-G)ET*rjT%nl$j!X$c-R(2X#tPahl4t zcOri(371J3yr*WuX(U`B&3i*L^IVS-zrHo`W{_}IX_v#PF$|T%nwNrEB#f6L389yG zvq_jJC1X@!!Z{>dTN(ryL#v7ekt9r#W*ZrSBkNHEcjXDeJQ60Cszvij7r;Q@e&H=3 zVM=L+i(S%ACcx=81l?myfXb+)OuCSSo207bts{idButYk3%WvvT-w;U!{)6hhQuFn zH}PXhs4SJRn&$}Rx6IrP7;|r*=EadPv-Iz)sFaP$m8M`?GKy0oHPI3h;?lhK70k8C zD7dK%wyjKS%ef==CMWCf5k%ZezoBo-Tt+HV58WLtpD+VqD*A1v{uA%&+ z8G;uKpPTa~DKdx2D7m|L_pN37a+t{E$i3Vo67H3%Zaj4ntS4cfRQ0)!DNQEfeyM6j zBF5i9!h9)BG3zfsg@gsA3u8oFde~bIBD&cn*+iZXN?=-N&y%E*u&{Ju)UO%Mz6@|; zyPbG536GT4_OL_Iu2ySssa+C!y&Z`TZw1orK3q<%k+@Qb;pMc%pQr|Gy9W z>i?bRFuK^t;Kn$fiiAZ{-1+`#UM8sz>h$0wH-0s0ZcflHFd)7i{=y|lSS8hsu})0f|pD71SK$BddAw=ZrZn(Nt(2W3Gzrvg8gos zr#Zs-yV{bspM)1nt!i;karXTnboJ|zHPmqrzFfsWNWzNJcOMrcmyNmn0uo*+J(E8~ zVHT-Ob5?|Ao3rbK)Pj+(tSa*|KmENrE7<(Z&PTN+v9<|+LT>+_!5NGHS!s$LCv)2= zas>t5H-9)Z_^b`^8S6)9SuQRV6_MQFgop?T%CnTlGNAp!iMxAH*$~q7U%& z8`jQ=8v}qHcAMdv+CP(K223|986gxwd3x3|@qZ+&k*aR(u@Igopb>OrH?ld zUCuP*U466k8VMgr5vOl){OcsFm#T(}LWMWTk--T>fAK$l6$u}gz6S;sFWW@bBz#($ zKxZZWUM{O4;qy`}){m0|zgC55%n_Bveh-nJgbh+PSDfTjnHYIs{qW)bj8%~UyG@?4 zY^?=_V_6{9HeJR2#a3?F`o^YGsr~f#ZpZxyd6Qk-udYoGQmUNV*KA(^GCt)tO^+!p zWcsZt+A@kpetqXFyhqLm?wlvOPkLFl1yw9F0&T2Azc(B8G)L}WnYA6Gu<=;Cpq>oS zr!<`z6VP8%la>2epIe2v1nA4jP+V8S;yk{hQU3xTgj?3GbKdnJXg?=goI^7VxH zjr%E5e~=bNfph6pChwrYNKQ3njw=9Re>lpqRbWj3W5Ogetdo4`geY&nRr9+@*e*@^ zBmxGTl5n?f5_XhMM36t*=JCIiuuG~uJ5VhCK_*dGoZmyTW~={m>m}iLX;H^yMr;PU zdkPb4Huv^A2rdWUx#mo)pR80qK8ze|yK0k@f%=WMmiL(d6Z|2giM=>O4KWph9!3hj)U%a zS7pisj(niV4jWvv&jd3V>f4r=sZ1Hyo)6$AX zu-9A}jdeKq{@j(LO4+px^KXO(Ep(i2(SL-cOu}fIa%zzNT^)VI7Bn9@OdQcr+Y1g6 zS7~zUI+$AnT4tVBlssg<9}^e`rtQ{ZZ*v+NIS_3rF*a;jf1J^+w6M}ogodv9A1U(X zBU@GWG7z@ZB&-6+BiM&^!63}Y^|dF35DoN8jtqR=x_@y0ESk7QPa%wY$)inZ_l|Fk8u-*sc4Nz{C{`|KI)0P7+85sR7K$z5BSfMH-U zX)>bJW3(+3s6JK0$wO)KC2Y>N0)S_|UDr4+#mo~Z)M(~>CYJnh9H<-xrm0g}7NvbT z8vbR6!{)^an0Y`&n|be%>F&QrZT@2MA)a-)?TlL4?hV)u`qh=q?}Whb&EOJji$7Sa zMpq4^%V)9AY~tco247%U4*_gBhREPZ?6hf=!M%+*Bh0vZGH;2{X+r>$=cq#t8h zggxUZ`>`7P1I%of;EKK{fQF+R%891849yvO7nSSZV2A~3UrfQ-)E?qr3qCbVdZa1` zbAlhNg?&=i_S-APAzIj9O0`_?$?J6+r-i?zh;&o9Tc{QfPC!gcGeu!qI3QIGE}SG7 zuZ4qBLP8)zebqUi{-&M7`K9v}AJ4F5NE;}xc-69BuXQWRg#31o;! zpSs|8^Yud`YBa;+9&QM)88Z9TYP&fH2L&o>bEADx^U>Vv>IGp1$6ao=1$w-q_**A8 z9}@hY_0MBN*7{T{n% z4q8pRvo7^EtXWm^f*8TqX>4EQ z?5zytc}~rHE`#kAY`3Nj{jNcYA9Q&W+r_v+qt4WG-j3fHWRkGkNB=GN^$^^w`^yj? z{dv(eGUbyinG#-bQ0ElekK-JLwG6O*^iy_u>lf~NUgy;EpI3EI+AzUJ?K`(k+UC#Y zi=M34I<`CRRw-$Kp-t_QCk{Jb=Y$tC1F|FvJ(HHBMV${&^}(&l z*=?3Uew&KLHojwk@L(Toi`HXok71mJ#S$x2>ETLSyUa%G^uzbob~D<>9!vR9i@@Vt z09I}bVu$M8Gxxd}XNLwWyIlcImr`1_C^T~!8)%)@`^1Kx@Uk5roR};Io;q~C;Eh~p zfmqp_hw)l&>@XarK{lZQ$~mr?C3K*y-s^rqKMUU3Xc>mLeOEZnRo8Z=3Un6gFDw%_#w~M^z*N1A&}uwDTlWm##CZMe{r8_p=;S!o0a;>cSf~j z1z77TAw=~!Tp!slXw<68`rCLfwU8?_5N#AmUTGm;=6!C8OU<^F%U#FVAT#aZ>21|? z)!TqQf;U0^RZAYbSAg{47w`IRWz@Ol`7X*(F z(^aO=Z}D5SaF|SW$}5`tUJE^Bc#-5keyi3xr1QoDsitW1!js7uJU?|p9M%}9KFHXH!1Q&?~iGte)cXRGmo4^*z5JF9nPN`xyn+v!CS^Y zF`)x1mWSeopB&k~t$XS>kM)WwOI$n$v^sUG3+3hhfZ=R0%-d9{cXRGJvuW(@8wG-m zf8~X9e*mpti{`;qpQ=T)8@0I$*=DOz57w1?zx&Hh~}+_g#XR&dpc z29F_HCzAu}Ff6$~G;?rJw1|}{IS9gj7&0kO*aN?Mr8U4>MuD6i6^q!(5)ePLXst6i zwIsyFB0j-L-maYY`%ITx)ctaL6q8jp1iSceqP#O3#In-weq{v3Fy#XloP+m4U4W}y z4+XIeGii58TNPmUFxsRF9^ogbPFdu3Z_*TcLoh)2ANvWbX@O7|*7R5<1NM28jK$DokvNq+}UuLt1WKYqE*} zt*+hSM&nw{J%>4#jsoCL7~U1m#D?m!t2cuM;y#q#`0Cf{x0Ve>c#;0xP4cC!I^90m>x~1y0 z1n3VKmegt}(y4F6&K}mot|{ED(~QBs@r+BsOl+hsfWG_$)!Sp)e3(PmPIm2CzYbg; ze|1-A<_adl&JWJZAwl`rLG3rQ-wLKY*;0*8Y3XZl4!D^dpy}bJ3;lHqB>}oKXoTzh zbJoCc0{(;=Y6@N9Eq@Rv>>g=(B)DkeaxiT-`ZS&?-)ec|#hEI(HMsuelGcgQ>Sx$w zKWNqznGITn7S3_hoq<==xPTfSeYg>+o95bJ$WS)K*YA^pf=gqsEAR4Xv6bojJ$U}t z%NKYFC+pq`Rgr6-iNbYoqzoBuULu^LBss~O zqZ=8LfKS|!%Zt=Og^c~HWXzF0DDtv2kUvicgJlN&9;gGzPS}E2lfwXZ|*ys)# zCo)Ldj>-Hq9h@s`IKLA-T!X0mF4pii>t=)`Bu+5~Ex9SnRfq506lUn)d>QCSvv;_( zqOqhm6FDR4=PPwETE-|Wzs^(XU~JjsCjG3N+UQt2WfFz+t=0#hROH$D8zWN}zLyX> z7$-xdGXPJcgG*$L{CV#L)opHeFmur+cfvbi3}5@y1D8Ikt8Br;E>03q))s z_j2}az53XXf77{E?(MC^yDv|_a{k5OS$%T)Mec50sI*YS0_6uE@6|1Ky*JcA*)Z%5 zGuGEXaFH*5Mt_mKJsq%LeV(OT?Q&7~E$@MC3pM*zv6{kY)O%uP%>mjau3gQh;Oq%g z;9)%sRLx!u^cU$1d_ndt|BI`Ka?jcufbwtYCmSx#9(K_f%`{ZHISQ+Jpy{d|!1o;b z&O4}sYs*}2SXRuZgO+`$ieEEQd`JhAWCpAy^^!te618mQ@>_0Nwt`HWWjp_{4kpXc zy+>HC`%@y>9-G!$dG4>+^B;M{$Bc7K$MOF@oUWM56dl*$Aqin~<6L6*qb-+4apI#W zEr!G0|b;@Wtd#$s&u3Q)q&+Z z-2T%+txOd^vzvQf2e-(`cjwBiy;kolXYQ@H3tVAEmB@RHpz{Y~{Rsii{|dup%7gf~2$&T6|V#q?h#aAl6(Hm%AiT{~)Rjmah; z(VUxRH5v7&<){ewV^*61&skzlZ^<>S%YYXwBYm9ZowEt|m4!|`l^T||YC5W_dSUjX zaZ?7oWEr^m3X+^nC{fwZI-|0HdthBcex1Qxa*L_T*uV2Jo};K3V+=E3wq=^PD$V>& z2F!Wrb@qFGFM=#vQbv830rM=8FJ(yB@kQER#3?y1C~BCut2EAn`zw{@F{9at{0p2WWX{@Y)A**s5b+?uxuSh7AxmS zlMHh-uXJ_<3hhZ;dr3C!L!54Y@iyQd8>GF<%1cof8?&vQ@aK|b|Y#)q||70GAQjm&>%!0Ly5JyrH#DbI8y1J*vY z4!~h=bQzCk!1{-|8M2k;#mdt99ax;INZv$}0UIqZ-A@IExdfbJthwg?K&|I^?o3`M z?N0`LZFyCc;jbwPR>*2buSfo5vWF*Uj-Ig4~JG*HF9@RC1 zd+eEqi5w61K3tY0$LY@6Oq1uqeoOWx<8UJd9vrX)Dc^9ldC~=7{PiVm5f6TUxKMGt zmq!8hPNeIIC)?hn_U9OxNLb5k2?erY;rmTUJUH|aC*5~D2 zlSgvGt0iYJBBh406UZhU=Sfhx*%DreYXnF1Ycb7`2PZ5!$DWy5Qh0FEG7WV;)V>61 zRXtJaEq)6?;$k3DZdg|RW*ust%a#k`kDwd|$e8>~3<_j5qnH`mc(dTWWMOLZuGY zwP=B|ng^BXNb=lwssj(I(m7Ff3g(VHs7_BI{C=rTSHavY(qGt8%L z;6W35YCS6Uy^#ma3dN=NrkK>^jRwZvJZM2DufB~a-z?kD;-k{Uz0@$GX~Rn-?HkdO zwuJ}jg*{4fO*SXHiWW4?t~rIR8Jh}6f^L=t8*oN3=q}zH8xk{PDd2Fe2veAj^U`eFAp*cHFh7{ENrR(h*UM#*pCO7 z(h($KJ8d@)TGMgmOWaNUdC-PV^rQpZ3Jh{O?jbFJ2kq#H7XP+cAP=sjCtF6?)AsP7 zJ)QMV4H(`cyv);JHLAAH5H1@cK)sK;mj@l_NQK)f<9)mjt`TXmpSq0p^B}8m0wmum z+u5dyaKiuTm>%RoXFA7@7;Jus2VLmM_Z^>UVLa$cM-=f4v%|arbP8)Ebx^~3(7mwq z==d!HGIsWeNhA+?(m5yfwJAqujDnsBS;Y?L2AA`eqA6D;tIt zWDYN4{Zh5<*)*cMC*%Vl}vWah5} zm^%bKVLkcjNSfD2FTuk+oEP4c^~#3q>C>ObSuAap8jKnVGUv#Q>}bSqj- zkl%mg?3%UGh{vGhNy}l6t@cfwpPy~dPGE09ODCTMD&7V49jO=5@_Rmyd4Pi9ZXy*| zxU#LyoS#jh0`3h}96|wJS4mfapOs%UI26-)B(27XOBi z8;hR1P7bWD0o=_b?-XS=S^|In5<*+a(UdR8?Pz1jOs zSjkTi+!j(c`!qYmELm3bI&niopiHuRPrm6@9`r6e`*~B?LydUVQ}UPZP_lV&GhMV1 z3)=1yZYE)St*3X5sVRWs;B%mU%Msgj-)7tCtvIA-iP$2K2e;CZrFQQq`8>Ft4wj#Y zpul zPcH8^y3K=ubg7mTNWLfa=6IYlGP%oxL3GabgLlmD@n8rYA^fQ_xzB_9=*XUz&ZZA| zIJXGoKh{OFhddZcN5u9j)IuISNIw9p9w?BX8WWb?1wXdo_H9LozQG?gyc5;>;t-^Mds@CWAlLBN zd?S!kh{&W;MSIqcZ6gEc2bV56@zfmQz>}Z{1V0N5OQ4p&0cBh3=!*NnC^!Fmfoz_< zfI$;kG7>GoI-`bgQ4{ybaLf`9c5cr+ue;;ha6L#&C`Og5$+Ndcl~xeia#N@@yIdn zLC7u=Dw3 z-XH2mp0!&9XCq(Ew3Fw84&TS)kBvU@U_2f7^5jxoTmDZJ`?xz3MM&~sA{}v~tfGG5 zK{h=(*77Q)iwBbnQvw)>xbwLAS03cjWpiF@P`i0BweSWa>-O=KNe>UE7p?}J$CbM* zdwGyYN4!?kP5O8+la6=psW9s2K|x^^Hu)ht$4tzFB05259cc0HdwCooJU8_DL|Pev;=5PS>6Hrb9e?4oycDRM9VgGr3GMDgRPNBiw`*N}#6>p8ldC_j8Xw{nMPQ1w<9?YY2oHazW z2_C#o$9y}RYVwx{3kvms-wu?8#Sl}xfvM_yd2DEIQPcJpmQCC3Sz)J!>n|kT>5Mv& z*ZDe5{ecaJ#R@{tx+QAQnzomjKb_rB@-5NtpIVFYJTK{NQo|v+>i#T`>i(}JPD8{J zEPuazO;GXXVrhw{MfZ!S;<5uyKC?$WeBwoG_ei3eYlD6!yGZ(qYKx^|>b+A4+u9c?EQ!(F8zgBs6(reK@^Pb~8b83tLY;A%-_S1KXo&FU z42-q-@D?5E(%ovL&4+jB=$W$0REK}gZ8T6>&@h<1L;T5 zq8^oLaMF2ys3v?^M(5mr-DqseFK`=$U*|$o$z%J>&G_&|;V{FTuk@(c0)q?oi=$cc zVR>PZ0`h3;t2vzyE9to8H-knDKCCVjCSL!jAba4-E>k8S))wB#ZtfZ124vpwrN&l# zSYL=T!eVN@0K3@&!{N;|nJ(kQMmqMbL}+Hshs}jIgu!CcnuF@?d(+?c+gjN2)2{Ve z%*(vm*|p&7vR@MNX=i-0TucA{C9C=SH^i&g=?v^A;qRF@n6vosb>TxKxwaxu&G-1_ zPsdbAyUNFd;H@mBMY7MDpQ%{Zy#h${fdl4i`0yP)`EMTj@MgPV}Cvzpd+!fNk##D_`R^`({XuX z@!C9;sr5iQHH=ic5na%hsYTsUT)j;-X2JY=w}{>^*1-8G;U-Up^;*5XB>hwWQJWRM zxK2ATmL>PO-;{m;#Y$ZSE{93!yRodW1D%$kp!R9Z*i75gn8QbW72CfZmiWqb8HR+D zK!z{w_y!qr6u;$D-={om{RNrzD68U8esv@Ur4GS=O+0+pxBO|RrN8fpx=?6|=RnqT zlNkO7x6xIxipa^vH>RCi{L?<`TP8JiD((WSn!K)Ec2p3&Rim{e()!q-T4 zE{kCY#uv4GH>c$esGqBCAb(8n>raXLIN77>JA11$XsTX4VQZKq_&3S-S9RxgUs6NE zmjGivf5u-jyq})QpK=%XpYAWyj8C4214krbnCDWD3_p9eJ3ZCKSYu&CKi^N$-%KM# z4L0ZvL`h7NpQ9ou&!x`q{bsd4`IWocX{_-W?EhNfY_C!G=i5;U8S_HgtNh~9EpHc% zB-0yw#LZo!ZlNHWgsj!ArrzSi5!6AIT`<1Qhhv3Wzx|aF%YDxK>a3B>~Z>^|pA#hx2qc?MpoEF&~1W3dBM&&7_nMF$~Ve z4iBRze4P6zR=3v^H=)3dyXziydWT?FxJJ^Eu+thEU28dw{zE3u`Ks;_h!yLW(F;Dr zF*pxi9yNW*hcXO&3XX16&ZoMM{%-BtZC7x@suz*nlAJJE(N3;FI4Uc58CUWlfq^ug z4lt_XLwN>beNfhN{q{CVUya`eP&C_RqC;*LC;I{c6Q1fLg|Cqab5zAH7W@RVE#P!{NBSov0dh zy51)0ARpQ@ybCZOxsveTX25FGsC%|HL86cRUVqhSm=7Ho*osIqlV5zuVz5uvfwoFb zLf)oma3o;%>%0Nylse0FlwXPtMuzfbqcJ{oX4pMRL6oZqr=Cv^nT+$HOVQ{%kVeav zxBSD0u0<3CIsfuEZGsQo8CbpLXH-ul?EG=8qacyQxhB8Le3B2>GdMeB<*8HrdiMy< zgXLw$Qa;?sK(MK6Y14e@%|JpPhS2`;KcLSnSK4Ph!-tz0ghPqywN(Tz18AJDiM{+2 zkNYpyh&soI+ZmD3KUVfv5jflVPmCA%(1(G%TH8hgnQ#|_qg;O66v-TLA1&5vKCTE- zWM}e&73HQ+=<*TEICS}ht zmlxPyn?A_2LTNy+o*aDu5%H^%=}E1jvqOtlEk388(L3JK9-)Cv($+0)O;dUk24pm3 z2&RNg7+CZe;p{wi(MT>61~HIlT0B$vOc=sIri)x6GyA!_`zf7vAn>qwC z5s>{dxe9mZDX1nbdQlHpqWfv6BF)%T)mRsvmw@z+I^Ijiik+$-I)G-Z_-mR%-7g%F z&eXi2gD|7w7ms1e$OK{+Uw3^u`l%CnF{oa(0(Iu)mxO@c(KO0)G^*={kja7DNZ`!U zy62bBZzZi)>H#KL;F3(b$H7(ip~62i0p|8?@__kq84z7O58mxAO2#ZgTj8kAIxhoa zeghCFrvctgEhJbbEs!R@)lKzWv$0`x)nVCx5{3fNokLN6HhE-PEz{+QDs}>F|?l~e{m_MAC zE(a-WvmY^EBcccew!u|ty} zpW46G?^{`YW9n9qef)xaDT0t~2Io5crq*&L^L;aZg109FHfy4C(c-yI-Ko9#KP$7D z-NLugjy7NBsun6QF}od4e7&gLI5Rji75oRilHh35GS~TL>RXDWGKSf$fnF-n+Vh(X z(&d9YH*VLgyH{IFNIZvf0%_KT_t#2W+iD5_@NzVxkP&d=okpFQGMkC;+&Ksdf5>?An}0h{XxDo*H_IsS3ef4UP? zcOdd{AoBYG9E*bb3Yz&j>Y!jr&%!x#+e{G$3+Cs0P)=jCuqd*RGPGZ&L;x{2h>OHWcSx-S73N zE~d9P+?n0+>%6vPWrd?|MZ^Q~O*2*)g*vXFk!y2@5dw zn!gsMjh1dKxr><_7uMN&>tg{aC_Ypxh+Cuw$S#?A4l8Tw6IPRZBf#UkTczzbeCH*UGkE(p*zyZKXd|d@$_w zq22^E>!2deBI~N7|A8C08j!s+_xw`YbX}8kUK6CNik%ks^ocsRR=>xh({!W8RYPjp zs79l)Y$*!myW0P9n9W9jUC$Tok|1t0O3^3nu3TjD3}O3O&F`xTD!-PuRc|D!Ax5|4 z)jRvWVQuC?XAfs?_;=IKsykX*sgkjL=M}q8LH1*Q%JjyMf2@)`HN@8pDjik&_Hc_( zx6D8D2exJE-M3C^QR0^sJuj`0;P~`E6)n4JHAj;$CTq7nJL>e~(oha0)IzU0|iZ%*JZM2Y{Wy@u!Qe=Bo>` ztma-%cOP-?(o7jy*w(GtLbP)oqvC;bleA@&9+gQ<#-M+`jRAGVmF)jyfIl@lll)2n z{ft$K030}_06?)GYE!EE;tk@vt`SJ8B*K{j%Q9Yl! z+*#hD!{tguRR;83XsFYwTQ~CE6g`A0l#Hj18q`mB4?0h1p4d%|%Va%U1o~ekH(v$m z8zigb4JhUPC{{2yUQ%cKVVf+wlY84fK1H|=h#VWo43H2U@&u4MnJg5-?jj=jEJ4_c zOEK@30;02P`hE1-a^y4=n6O0rdvOnOxdI3h=S~IeH)T$X38q4`qLuM=>9Xj9z%a@w zM$|fC7oT$C3P{hIO5ttDIkVKJdyVrRS3q3rdTAK~9yJqY(CPzCEdyO25nx*{?S51@ z#i(YgqDJyjU$8i0m%dg~!i({2N1Kt7w3rvlV;S)Ugs7vCeiO?UEzQX(DPfV7QI*W#-m3U? z1$(Q#_F=h&1v7T>Ym_X|`Hr_(hEBez?CsuK?N?UsMl9~3Z{rf`&sklI4|`*vW3`ui z-5NzfPjA_K{z!{KrAnb*WAllKWm$yt6)Hkwq)X?wBozX+n z&zaE$hVYVi{||XT8`P)|MNY^A?gguB+ry%zMKZwaA}2-(WRK?fdR=6Qf`Sw2@66rm z;t(L()i|JD^1hAO=(_0a%?qTm08~=@TdUXYqm?uEnQVH**9Xs(yl;_=;Royy7FVl% zn|>wxwmhh3HMz=cRYZ-;ye{^o5D>0eaIwwXlWK)A(cbv zDW7G@40#|rv7HWbDE37Gf$xV!NxL>(kg1yrAnvha1U z#(>(lm;9I5%&v&tTq)^{47^MNIp?OL!(v45(N2FowY^eHIP5X~tUh%{iF^rDeRf>y z*(wSvFhJqEmSuI%LVsZ8B7n;#-Fl&jZd8%snygwaPRJ{4x*a9E7YnrZa~mxd5p~o< z&pc$GTc)31m9p<0Ab-zfzrcWjY?8yE3_EX`11Y#}KGeZ<&F{rHQM4=hoH{u0yG@wB zGME);?Tx9w<(Sr48W{Ho^>&&jr|Kln(e;uRkIsVOOi^hZ2&%IWZF?sbmF($_-U8BB zQK<1~T5_}!jK3oU_~2Q+T3bfMt1QF>)m6v2%MxQ3*X$Rz?#>}UvG@qo7QZULtBHK*#dMOoUS1tKK~tp zb4FDR>3<8NyOeSdT=PeAodLKK0f5~Pr24F~ZVq7A(L&HnS398<^@qy>aDWurb)}A0 zzY7PnLT6>m_M*eSdDoq~!PwrezXK6maz|ALR8sOR1*2#w| zQ6!%$;mk@f-bx_`I(4*^WF#bPBsb_! zm|(-yp0Iz1a?YVnXYp=7O{}|uc(OAyNlq@9APH1lVt@{}JUXE{LNCzl5^S+7KXkp# zM1i8Z42fl?U6s(|R_Oo`l5NM4ljgXVha5yBayDKGqEvk4JiaUE7 zkae=WzbpdW8&+ZRoB=Frr8YyCE33zjvBtoUs9T?`y9BL?ZhRTI*BW)Md&=0>$u+Jx z5el+eNd<;&gn2QR<*HqC@i&&>LHPwk*`40BUF)?2G8W-CM&Vc+wfly4%hY?F`mT#^ z8l*?NiPg`Czbz;qb}+q`l4tFlvlp>Dp|>!FWjdiRYLa#%c0IDWig>bV7TD{Jak(jR zUb|hJQ*sN`f0q%iLC6+aEYE7xCk#{*g0?n-BpYG*X*)goKR{4CO4z+kmKCTS;goRz zx4nco7LAx}mt()Nu5Bqs(z8I}Ga@Tgn{(?dwmy{`E+;cKwQ%eSZv(}`Sdo2Ofo&xR z25ylos4DDU>*U#Ac)R$-fwlv`atrl0o@pl-p2nfa8Sm2=^sXb{5cZID^1H=|=$dOx zxjv|ECj_L)_l_=*&gQtb4tj$Ac0$)`gq&kk9i$4T58zgMFCLrfdA(-E2@c93oW6nJ zqQ3~8tmpnsrM>Fqs{nQ%$~3!C9X**j`6K8F30bTPvNgg%@&q#W3pqnV>*YQIwilI^ z)iXX?rB3!x19As(e@o@Yrt0<>V2JsRd^XAoUZ0A)xsfn7wPqa?5#_t)$=w4<3n@oN zk`;~R$SzsMH(!8)J1A=LMx&SW)%!qnqmdTpbPz|k)Qgnj)UFcA9$Bom0-IZHCA-nmHoj1NIE&1Z*&P; zDMOzeFc}BAMb>}Fo3p&nJx4`g~S_gpz6I}K>tv*11kcpKnnvLg$I z7QN*-WpB6e$x`)*kabl{GufF14;J;J#m(+wvt3y*jDcl-uA}*8!SEtJh))NE9pd-I zZAPGfh~u#nNUujPA1RAjJ|BBFetD&9wYHPiE8y-!Y2FuwBOSu+p#gGm7CS)$t$!t@ zNUjW-@6CddMNN3*6&y6#mj$C3m>C~^ll@sRx@b$00WLGs(I_+v9xr-{^tBU3rLNVY zVdQ!T0sq2lP)jG9`eRYVhj6D(?LA7oJ@qoOC<#do?Qj;1K_fy1$Be?W;7JCelB{eV zkp<%!xFmftH8Kk(GECmwS*iSyAR{|nXcUzN*^Jf*i=|6H#@xqp#KKaO=q#AbKpHlg zQ;%gqE+bi#R4}O+`DyI0t=*OcBM$+09pHdRC zU}jNktR8~b=izCISx`{4We+@ouV02mKGiI?Ov-{H23NzQ+L)aM&oHV(F+jOf$|Klx zZ<5gws@A%W$>D(9T7P?+&LX$e97dj|jl+kd8m~5=Ok5FG{-NjidZJFSiBXAUV{l6H zN^Ow7=+RD1ojR7b&Vq(cNP7t<$w^-)*B<{!;@O_*86s{;4-xknpUryaXQJb1WYfyO z*{BR%fxZlg`lJ~X*6Rh z(_!{5EFA-9XB{U84N(8jabv^3myZwostnuyT^Gj2dgfAYW_h_-9WHm;sFT}#U@Y-$ zi0N+9uxywdU>DfbE+T;Rzl(_a=ut3~T)ajJggmjr-z&E9U$;w#kyd8ozsq08QN6Qq z)y2-nvFOu>yWB#alG>I7miC!tr=D7&GG*mQOAgO^h3iBRyBY^CcDahAs50{x>5E5S zV%~9|kuI15_Joapnbf9M2CZEF`}fHnu}|)f)k?`^2h`8Y`oA1~kjp5>-xrW;vsj;S zAf(L7+PN#{nU6t|eKa|!OVe24Nbpe8KgI0=9Y-Cf@Y$@A?$MYgp9q@X@Z6=3<}k}~ zFx~h~maWH8@x}hGGD>W?J&$GEeatuR#qkcK7m{6uUkP_D0PB{{7Hzp>;vQ!XbOEBD zjXg#kO}QW49_UP!UGuY*G4IT(X^@G3Z={hzLUjm+{~l5P-N?U&k2x*_9(|P(2haL2 z7zuUEELl+SQnEzFB0?!a60Yb{sly0yd1*Dv?D+H8S1w|<*05W;>QxLy7p>%35`jDT z|6>aIiS5`SJTQ&GC2T@{r!3mij&|Fs`LC;y-Uwdv>d{?pA7zY>~vTc zm9^`mkC51a<{wtmR%ZPrt}hvh*mz~h@2tCPaxV95udlEY?f*X294Aid?bcX62EH=AfRKlrCHS z7rnNLX9sM%zbdiwupm87O!Jgg8UEdG*D;(lriMnXsw5M8t0dN^ry85wx^xUycEBmi z*(_wsKb@i-vpP!d^EyecK(}U+2He@=O)k}vqC+9oq!;FZO|%<1?YT={w=V*XBAmor zLHGaLlnb#B((W5|yp@y`PWkU3>L%HD{2f*u?n^-pOq@q#SA0oNoYY`CzH^JJt^sja zvbXg;9z5zTlOuMcB$binFZVMR35qz`Xc%Cz;K$Ur8c865D_%1@{o=>=wtxg-mu=!v zzt#wxBTaZCLRyX{wYz7Mw_-rRrbfya7X$0lME76hG`e`9b!6ui4) z-f5s-GUXs62?AsjLG@EC5S&wO8hCQOU#d&*n0CXcsk;pgA)u|FkWNB3d|li1{<;fE zbxkX=jVMOIN^l}3wb{;}&~UO$@WxJtq}|kB!Tw+uzAH?(>a0#vgkX{SBuXeAS5QNG z8iz8*+d2%L5yz}^X_D;9y{PAQiHPE6-syked3nsvzq;WcMtTCB>ib}L8Cr|oCXR7p zI0$ZM%-SW^;F?KH6rT5>{j02_KUcSIz~}atz0H!+lKB%v!=^8C`^DWb=$bt%Q@1Gn zn7(1htBQeUE22|W7mvCkwbRm5a6*_bn|z@20K9R5HC35`Ijlh6fE1P1vx(Jw)>rKQeoZ-%p?woteb|@uTZ)k zqfw`$>tC6M322_5bsbIB1v7WbR_I%oMB4xUGuQ1Od$jx?u|!Zy!@ZOIHF{??7x-We z%Nj-g4-zs_KHMSQQBYFJ_0Z)IN$7~0A67r z2kqTyae@%^$EU|uB;Th4k%JrlKhML)iGpa4(c3c9M{%+q3%h7+0oP-+B}qExmoVgz zJ`os@moRS;@8sl#o_@~nxY~jJt_G?Z2xpyUy9q~d&I6@ie#N9E3t%>bQ!u*MI7I++ z7+lxSh9+DA%wy!OQU)2z4J?{Xvt%|85jeTWe;KC=;B^M)?*6URGyyCqQjvIY{QH`z z=>m9*fs?GBHO&yfI}G-H55?=~FSc0L81V)09)lBp&yAWXfDahR(Z*7XECDQJAX_qG zX#xQ(W~7<3{I!PzcTOH_!~BRbDOn6a27F6BEhzAaAcV1j;SXugNc8cgKQ4v;OEcFy zyME=Z1A-?>wBX-2O*5V-ZTjZitI_cJ<>t%L+^9cT zR|T-V$TIKh&#&BeiFZM}q=$i|5FVT|&Jn=Mq8(3Bp<)!0v>F=a3Lx6AM$!}Jc>-9= zz#ZK4Oye2H?#CjWBiN%McP9F{J=o? zABkp#0@%SQE071beF&%SMbD~Qw!ccmV-DPZWL6}Aos2s~E3+dvS!H5b!UGB?V}8F; zi2#0PaLoKA)JFo?g|?c~YxYm9}Rf9jlDsM&xZ*!5S9DT<7`p| zghI*yx{tm(hQomeMLLI0Xw4pr{B$h-?O*KJ5Ws#0XC!!+d8Ggj zFc9tUjmA|1_?^M_JmX_tEr3Ien0#9+}YivNdSK_ zQr1fHXw3pRQdH&fNc`U0Vb7IY~)rY5PKZA^F1K93b>wig_lwfe4582E`Ixr-V30VA!7bR41W_$y>JuiT+ABjH5#T%{0!viE_y_@k=H}Ef0n}w8zakuI5&_g_rkQ%b zG#M8_GBc9tEmv|HaO@IJQvL{_Armv~R!p4`sCtg-t+GRI4ZXAYE1-Hta7;oE8BYoz zm3iu2{Rg8d0W>Za{gRc{P(P!4C{7D6^Rr2o+|fa~KB{>#=rBhSi-;23+#}3D?I_{t zHNg6(S45c?c;}&q_8v($zE@Iwp6zCG6wMSpMbe6lmY8CM(5#q&uz$ix8deA`iq|Yu zsFraYhDS|sLP%$(y5HVtj2A*?aR3HMWzHGN2;ovDr||t26Img&W@0@iQfLGrv?(53 z_B@A;)uOstR-|o`)kc{BV%nLv}dOI{yuN6BZLmcZj(8-h^)tX;d!T% zT7=^h*m=B}8i@Qt6f{*;#4C2bQU*tA1j7-5SOgS^N$wX2>==6)@nDU$9%yb72eeoQ zA5NY1dXVM)GWcOnr1OKUw;H>DO^v+$TBP^Kcex*rf(|=h znZ*##H0|(sB@VZW#o?S_`9D#!1ZzIz!Gy|T3oVX z@jy6IJ07EWAQneKPvdkUdsQqL_(t-1gke|PCkxRM*-K5il%>MEC-;6Q&F@QLx7sI; zf4G|1N8PVPPyoG~0ul~hiM`|K53W|t2iJJ@DvGW&JwGZ$fi7f&CNF)Q3>>?(xL%t)GwT-1bg z_%_Nv`qatTT?k#6z>i&Q?jhXjIl7>7vq@yQPRLc4|9sBr@F#){C*WI&`FbIAXQozc zqnK_GLeJv=bA6iInQj!q^-N^z_<4$#5N>30hCD>3-a_cjM0iy!qfJ7%naPohIbgO~ z2)8ovnlIj%Y!QZdjuypD2DJJv`8-~UMQIiwU&sJ{^NW802pg!Hf!pZjqR zqQ^a-IdfN9lE%db-G7QhRy(v}1F%AX37lzR??j0<;2i|$%gd2Feiq)S!nkw+a+yjZ z#UhW&{t_ih7)w@K*s@Xj*L$*QY2p}5>0;dcS7{q8>WY7`4CNp}?9?b`yM%B%6Y-Rb zGV&EdA13F7lNZ%b2zN2r?u!hJb_=6DBYaR*HssEy1ap5O^kZ@eVQu=y%$pyy^uk}YWp3H8g>=TM6(FFg)+2&WD#D@nr*T{XQ z6gRF!JmO~2U>dUMf|c1pAq--IxYz>fAtBduRKaCW9L~^=Og@bASZR4t!-X)UI050# z1ys=@gm51-avA{46d?_%Ic9N0c+PWF2XNwZf{mkuFqDa0bLJQy6~co|%p4=ZG+GG5 zihC>ZX)E~N)MG*zUVI;LuT9wNG(~DHmf`f=k2X6lgi%b+aI7-zgb+qE)7CxyXc{Ag z$C>W!kHMKKLa!Ldn$Smpe0Z~_P_*?&f`mP`w1pZcEcJ|FzX2e5-r@i)UI=4~4`1w7 z4YfbQURL;5@6@V>5Nd)Do-7{omBevAaYO?*CH`X74% zEqAd5Rwzx%o2EL~r3Og@!Ipl#yzk=EfpaJ`+#ks{+2}tJaj&k8CiS*RW7w+4)k?m% zOeU9nFH|`+UxnqCE$PtZ+6J?I{*3(xK!1*Yv?QLpZ#5w23depc0NlipWyF$WKrVs% z_81^v7dj?*bsBV)5~|y$Y5i$Eohp+PFTypCPCfhCQh?8VxDfB|WaJa~K57-f|3& z3w%%jaFY^Y!uQiJ15=CuxL=ADb-EE13BYhBrjh^qpHZ~}0xl=aY6Sg}t8QN%s;de5 zoXIF;rC^eDVFP-kewBNalf-xWwGVI=I9u#N%u0=*sU6SvOf5K}X?y9l_H@DssK#9GY;5ao3RL3T+!Q%vMWqk)h80`S)jzYw?hB_S2CZa zpp;rMFJvc3CyCoTUBxA%~BCh#2UGOMqmayI$A$Lq{>a}KqW=Zho%}$B-a|UUn z^?>|J$aVjxriSqk0RY)MqI>O9A(YREP-N8B-gyj zLC&fHVt>P)+7Nv6ABreR4R8|6r}bGI--D9B1|zb%t#vO3FMmb8)wSXVQmbTlTB7^- zY(riJ2IzjdpfGE2Rs3SxnxD5E9>egrw3+s={XKnuZreL#I{aQS*Kcd`UML&0vI<+u zN7yNP>t)qGr=0$d2W#-v!ak$ORsh(;s$lj{%b;qxJYc&x>Yq5B82?Sy@V!v@nbbNY z&-Mwn#s6#C#Qi6E!e4&;(CFD`f1Cb3S*^c$j!>@(0>x<}r$9{oKgl;n=Z>mEKgY`I zzw-2JISAZXx%)*{5uJ=h*MB(lR`(da5U)@K99R0kV0nM(Nap1|rdaCE!4rrV&1 zGbxZK`Z~@onfu01nRy9_Qa3wY6y~;HsQK(vw5o>skF=_}U4eaaD5Az45lNfQ$`^Ix z%#=ZOP5B^i877gn83Be1gzpel)&-Gu2JBWxf9cI@A4&1n<#-H` zByl-AaO4GH;4U*1+@sw6Pl@#}vDecRl%&$DmfL2Jcc>xFhrS+Vud04ulA4UX3r1Kn z|7gH#u>HOqCL~k|L198< zIT72}5x5}Z!6L(}pl>#bkI4UedH5|Y{)fUm6i$8ZGxx=ORTot~b$pN}{az$jEL$+B z1op7)NuuZyP>W9#V;wsdb`N=C2fp_F@h)*innZRq0h zB&7+TY6b>Ptn;r~Hn^BXvdN%C#!>0^6pp;{)f)dOOtl-zKgw1#B{I>d;%*OI$hhrk zc6r~$;Uzzqkbq~CJn z?1k5>#4Ei{d5uNA9r6R|f~Uv#hkQd**!KnJ0}d(O*&MJGy5<(sm(k zZf2Qq{;R>c(Zpw#xnp5zlJ+Dh8~=x&V3n%RCZNh1teoO0>TP>_r}~e8`=@DX@}n|@ ztSwrC*z_xrbwoPlA4xxMG2-uE8?v^j?xUid#pCNl=)pjVswY|!xF11#U%%C<=lIFQ z)pa$~!n*q3p|Fd`h%$Kz4X%u_+c?$n}4Tj}F&KJJM5C~MMBTCZAnGJKnDMzWH8x03m zjopm9ndJD3qhEt4zW_@(@yx9J&C63)K1JwE=*AO~anmk`;Co}4+{ z9Z#^t`;0Q;4!=pKUQr(rP-VuSOBS)#h5#2Cxo|1JFc;x%_FI<}_tcEAdyxv8GF zj;VRxXoOyKP_dRrU{A2RM>JQ>f39YsyoQK;+13aiAYpATYtJAH6uUCjLkiP-XSLH~jSP-qn zlpv7>Q8zb6X3S_Eo%rxm$)^d<%ThKzKWWfT7v233GFU!ylr@fwdLjAgceq$gRwkv~G8b8A z)@}1@8CaG7`~8^jeR}!+&dc24SroCH`Zxd&@IN!3{GRva{fZw477zLKd)f7!BUe8B z@9hVVh|BH~JwHeOmPG8ka(nvE=Q&L?T@w2|8}#w{r?4sAcUs0c#D9sYsyXW1ic3nN zL-87Q@H-uX6J{MmiT7AmSB_qwA9QL#BSQJ!KO_3WP zdVJaE@Tqlkoz&smOW*jPp)E_VJ0;C@$EeJDVX~ZbY16c!GvSP^P2~Hx~qxa@z>jgTA%2vSKGGy`t$Zf zsbfz5471z2|9o!f^fPIQ%B_hF(@iW)q;Fp|2|Di*v0#77(xoKk)vlN|gUGbUuHqt< zn|9>^QkztrIE?x-WO~P`dSRWfiA!X?Te$ukJi-5dM;`0_Y938Z)qA&(&?D)LO3N7G zHcc;V^reUO^iY;2*x5)gIVpp#yWj$-(^J~d&NQ_490VG5)_Z|oIP9yNJBspHs27g<>as)^IxNx) z$9;8sW@flY>xC1(x@$|$w~x^aCw)cEGmpCcqZdwRozgzrFK%l69I5+7{S}$3?Nk@T z-ng___bSSdy*)25tvpziy4&Wld#qkK>syqI>rZL3ZuXL(Mwj4_6f)S^?Qpm!F(gaU z4sHD57N?hlMpvxtAihrje48y!vU&a1F>~QARjk9hHf|(mr@|>Zx>6N4k!YOm7^mwk2Co7cG~>4hu4l&-@U?_|Aj)i()yr5#fAiqMAp z&Ca^r6Hm2I)e8l_+Sy6R-P81Lq0ufQ8pvYPpB;i$;jCDhf0s>{+qVjB=eBdI3DKln z`MppVH(^qT^?KpDuSu)ZRqZ$EyM#vj=H9}2*((>kF#V}qnIfT*zU_9`>xCP>x|NR8 z-8sE*3$O9XZ|}`|p~zPkzsF+-QTF6O*UA)0g)_0v?CRTVM~eK*qa7m#>!LfZ?66NS zl=$kn{_EQB*9-R%?lVjC&d>`Fd~*+5kgA~XG{NO9t@MFj2lPU@FEyd2#`BiEc;ZX_ug<6AQN2*@%O-O>+>YsmXTH-CwvZ%qGm_sS zXmr~H^Ae~v9cO-6G%59uH%X1n?C@)8texX`?c=|0{U1LN%}tejIo`K%>GufRp})ur zbF;B6ZGytv=9gR?({@~pN$F zyIlCO!<2Dj>8bbS98Rs4T>Un8>#dkdM=2$FYRO#C_YaMxhG*n@U(}BUDvfpV%+U+) ze5p$%Z#w4cg%7@Iu4_LknW{Vc8p7L%bh%GYdtTDd42{+eQaX5E)(amo^(?l#=IMoc zU-n87f-X!MmRL(SV?)eB#;&Y31}QE5H%^};vb9tV^})N0rE z*1B)st=z8Zh3~#P%eDQzuIq&+Uuu5JJI_MB@XI%KM9_Zs8+zf7@0>GgDtq!Gy2k{S z%lOXUf~-l;v}#4xqrTdSjPK1VYDU-RcP26go?FEdyDyP3$trqtE3@7coP)NurS3XQ ziu~O+(A8vmnuPKnu)y=4UTF5!6{PKUE71$YPxm5|Qe>`;dEa`AjY-Y3>R%n6MRskz zD~mYTHgOP__GjRkKNJ5Q^}~Z?BzcmcJmg#FB4Ix|uxezIViM8MElNC~6jP>MUnRyw z=aR$rHtifp!6{dRe(uQ|_;JWbJ0;|nzs-WdF{@e;o7QIWepx|h+m1|2N|(4i(I*CX zcO+!kWYd_u6%y@p2WqB+f6%Jyn@qdEy4|?kR(#mOX7|>#pp)%&Q)W9e&-7dI`se2P zcs$n&B0p+cPg#c=y&&;Rd158C%vR<_vEOng74lPYt%UAym{uZ8w{^|s;P zgO)$n&*t`1QylPKfqLTIe|GKO#8Uyj=Mzt$4YM3TDg4JkBVAn@ygleGV#>bge;O4 zg(_Tr>NA?6O#8R7IX?WW_G3s=H@=f~LeUnI+*hJc7<@coSL+v6W?{|)gPPk?;zPlA z+z59*G&)E}NKMH9NOSa<#Q435;z|i+HaNZm#R&>OvSH|6FA*oGvd>hWqq1*Tx{Eo% z){jyp;(`uNu=iu#tL&CVcUp1-cN;h_bT{DyXFr{M?eX?fPH^#)R=do0r#YcrwmeBh zsrvu)Fy#a{KkAarcW*OJXzxemWv=%!=LAnboul2q?iQTT(NEV+k?z)t6TJOcy~{9< z)|}AEFXjwo^TOJ!e=kjtb32L}8d&db%?ZAK(gBn9bd+&|e|E#lhkLI?-TZW8o|JkiIH89h)u#7QFC{1R@-vay zd%3GPp|@Y|lPP4e?B{CJfv;M#AHQyvtt`znNnLs2s)s!%^!2m#Zx)@Et@L^@HvC6# z4@Yix)x7s>Bq{33F?i_Vn(=38S(DNm~1G*3E|#MrZ%~dpSiNJ;TX=FWS{H_GaN8s`Xd7OL#Z8xA~NA zt>o=YiHjfC{aRjO7o3He@^wg#XJ_tJXhR<>)-gS{eHTs`@3&^36B#Wx^SFRdncB4( z6caR@ES8&nx@;X3(~dG(-G7NkPwrc2LkKOlEHZE3ixVbhKW{Ca5>w|IzzLJHM|qIc zSO2W>?#)StH3)6$?~K%~Odthq#*4J&bz<^R??VROR$NPsaJ*Kd^d~812k**#mhJMA zQj;B9yZ7OQa6gm3V~9szPMDU>Qq;Tqv)Tu8!i?;ZvW&r0;;JOiU{08sef$0Twz30* zQ|{Kt+(S5FmS53|Lf3u@GhNW}7_R}GVpz1~k-V$o*kU_I%5K<1R1R|{G1A{RB|#h7 zQ96F^><)uCw_(w`e)IRVAIu30{E}+Iojiwd!Xm#OlSGyW6+cZWkA!f~P_7HO{+ucG z9L5PT*@dp-pGG}D)?>i4n5+nT<+>}5*&q7tiHRNAU$?H+{2^msZ5r5av_74Xc1pW1 z$=K`~!_{`~r!@1oAwehF)mmj(tr_>KvX6RO=3wcw_T$@6zzN*Y_U33c`UQ?VcI@Iv<%Wao?CdT&;l=}JSBJI>>Tc)v7B_u-!NIUyn2$2{zn(-G!N*B7cw zjP}X^k!7UvY&9)$4 zaV00L%id3Pe=T>pui}IaekRK;PRMf>RQg?1AKueN`*FY`D&^DAz48e&?fj+Wv0{c> zJSS|Rcqeee*6gh9e+GnCm`!{2V{<{#$aT})q(@hcc1z}j?b&CD z$XTg(PvL}}*$qElbkX~iillblQk(JNk2X-csvZXSR8H9AN4t!*cTeMlec6KuwRm-f zE6WKPe$>?ycJ6C9;h>*nPU>g3wVZG``{_YjGiq?ogpTVu;iw;V@aWq18#v*(A9Y>g z>-{e$obc1m%%7tSn7ONK>~VHlH@glSIpMV5v~D8u#n$Yv4+(N{rBavMtzbA#$jTOr zQYK8Uv#&~=)J>|(I+NIbGbfz)(`K0tb>G4X7qi)6rOZ~2mR**1+{OvH*{dnt-;I9W z+d1K~Uy9qVuFMWjxZw z6V>_4*X$D%<#g|h>mE+H?x#!X6YH^;6K?n=4?Qtyiz>ddN9=Dat7`FvwcV0d3`|>5 zkANT{DfhYtDt(sP^^_(Fr|R18=Y-vjO}=c6CPy04ew`fCVlhnv0{Aq z(T$Yu@BB=nOKiKN!%0qf;g>QtA|btb{;u9q z>O%KSuTz}x#?K_zCd}#Exx>R6;tD(#i%etOGFA*FW*e(5#5S|?J+E`ZpX^eR?#eR{??O&! z_DfsP?~VHnP9Xkz?E)&0N^U-{u+7}O{e9~o#6(BC6Rqu_z84FbjA!S1jy-tFRs3~0 z-|XSD%1*yaR8V*O#FZf%TyZQR-r|aqtWW(k8(gi{j-#CJ(=OwG&i+{t9DD(13!i9} zce5jVf4HL2TOsPEp5uOpyD_XGf9+y7%IB`kL*N9FKV>^Qvcp|Ykoaro#|3-e;{@s1 z{nXqXQI^LxU9@GD9QUYwY5;6I9dh*(dQ98f(=^dVOLMwmquJfPWpK*fa*}PW)HYq;BDIP*AfBXZPUlaf8V{S}teL_~W@LJHzqlXlK_XEzL5WUB9h zPvT16&)C*)pA=sy{dAhK?fUX3K-BV12tXrYZc3VezmpFde}CN@Mp2rFw5oP=h0u0J`&@aW?gOh|2f{-KY9u5ZKPB+W$) z)B=3`RPy8fHJff^aN;XhpEh|-gZl3K(&kdv{R%RqM$(sL4_)**^6#)|?L?cWTW9v* z`=2}*k!UH2$5*VSaid-AniZMvE*-NSoRI93G*|-n^wp?HWypq}L@&NGvfqU-#Pn^l zs|j&2-R!%%1DT<0AFDLE!!j0|r}eZUDZyVfrPq!G+o-miXnPFacU+yYeqt&)(2u+d zw%K}z(gqFgryfa}zKuI5B)mG6@Y<=qHa_dGicI_7o)jg#DkQos&Y=oJZ~hudB`KRi zTJ;iX({BS`H$^v;R+5TLunsF_5HmBP;EqBs@B$@wWshsgDzG}*bQa@Bo z=VFpH>g8n>6Hr{w&~X88UFxl3LeQppp+v=m784U@ft%70$VV(u?3^=(%zp2X z(Dr;(Pbznlg+xDU2h~YLoon|6m)r7IR;;v4s$#}qXmk56RBD1SqPw+iluQ`f8=@Gl z;y^JO6~4^L5X5hyC1k9Xf{85dD`KPKR;!u$s23IfL?H{tINsNfRBMc2>+Lu-vjhz! zIG$55aRB?SK38+bBGHi*N`n#X?RHZs>xZ`28rG?p2_b?6KAK z<7?mD6BGKUM@KaWPCD)ev1PWPwXW9Q3ML((#6Q-_fFkzC&Rt685C&ti(MHK+787dy zqK_)(Tydvm-Po6x|H@?{XyC@wavKc*>wR#EJqM85+!A8L5ORxoaa>h;JJvs zHr-jl2x$K9$3hiThE_+%td%oW0IjWdDh$S^#t*q*E9=iwqAd%4D>VK22nRN$+Dys3 zL^ai}ju59}lA3CA(w^(jZ=&v#=j7YN*=8Am67BrH_=aZDbvg4D?ZrlkYz=6JepYl) z!Td&L?^|D#j2K7doZGWP$yf-4J>BZEN;UwaRx5uhH2_IAX95+BT==eFy`7FI7zZ$= zMA|Ajl+j-wnb{hQ!1Txh72}GcLH<2ej2FO2TYrUYAd2i~n%FX((T8+eteOcx(V@3j z6-)>y2UN$@OsGIor(Eu>)C}aW*>AM0k8v+}){SiZy7zi2?)@{_?)pm3j1ihetW(N) z6%&T~k2?~G1;CV^pJW{RNQ>E3C1>Uf8PBk~dWv*!!XQBd`JDY-x@;$yUtL&*Y!HUh zRxMF5OHlE8z$BT*NclEtnG**f^bb_F|C&a6jUb-#`&m@NR68cddSfPNA0tTc^^wDEWkUcgvsndm4h_CvJl9DB3fsBt4lXeiNZRq0N)=NmWKhdxczaJ`oj79! zTiqvngOP7r(<3|CP*A#$S*2nGyvBgO8z4f)chzrZZ-oYBX^Zf#xuJYAVGsAZfp`@< zQXZS7HlQr|#+Vr@StwtY8{tgPJoOv$gwl5DRdP)zUzkVePJVk-OdUpDGX0{0`6>{q zV0Dd(3*|?4reDr!QZc_#X8!)D(h!Q_{Fk}RNj40_2`qc6(ilP4$k&jryF?qGW~Szb z@%d)wd*l|Jp|>((EL3+1UCRY28Tnnpt~ubPG@wdaed-to*>GNWqlD`H;n)N!DfChi zWbW=pNs*ewbfgDOe4*3~$NyFTG+xCG=Y#j-?hJNJ=4mD4iUx!GUX>eA%)WiOs4FD#{iMNrBp|3>kIWo0@jLt0>5}JXAaAHcf6ClteNO-#&~~lc3_RP2;EjVW8u9^ zQVa=;RZQgFjb^mj=~i+B1|+c*pHj;-eDJ?ri1tkq_K`9%E4sLe6dDa5aod5gik;9k z^U=zPxAsa-gJ*c$e<_w>{0CDpr3^-jkgQb6M&mjCZp>0@08EBf&BG+STOy&oS7jPb7TTs8((S50kFFzZ42S>9L0Y`II4dPk>YmfgMj z^I<|)nty&>#T-KM@KsH6jj=+-(#x1>7{-JjS#staz|(ExR7@UtEaTcMn8Ldxc`%kZ zZVZ3m)AbPT%?-V^n{PFfwhuN^X}dNuO2ZhwZS*T_^=@f8Z6_PcPmjGmy5Itxv|=3{ z+geYOEUN?LjBs~Eo25qrDAsUtf>JXU59{?kQo#YxGYY>T8~rXZDH+*-`F3{%Ng6O2 zZ)7Z=^K7;x+JulldJ&;#HDK9(iBahrS2)SWq2fu^T`c5xN!sl+h|V~Ec~i~)NJ_k( zy`tps%aMKEb-c=8Y(}_eh#~NvYg`s`K-ugg)aL>m-{1vC*!CfdUXikv|eT z!~P#k5p+1Q<%g091?cm{(Sbv`wEpd12;n^!k&gqRw+yCj4WP2w_qVB;Fk=N@D@Y{9 zT-v9bikT0}u^#~{W(hjB?}rt6BA+9cZXAub5O=Seh+Z*woPtS4;hQ7qeNOXaf3eA$Y8dGH6`C+!SAl>MyLm?q7WaEZ+&Z9_oD1W9vI_c&Nea_e?ntiu$qkGz z=x$DSB#m878ec8@8>BENf7)clnUMPqVsgJ5K61c04P)aZLFP9ptsBl<3H9&);mO3y zSvv^H=oU}@P%(2!%@*HrR@iH7rs8#?_31%NV#pMc`3Dh+2^R%bn0?2gDdqM^4Zi2o zRQ+O2{-)p&c0_yGA7^jj#*dS?)CH}xE?JYH)mKCXYZqH+x36<1Q_ss?o{|mA14-`K zEmTJN1(S?DFKO-igQld;AZ`o@3BN5Rrz}U1f3~+FbTKSxrV8)+@1Alw^Ac|{@4tQa z20ZOV%;c-TyzGKN}fE2o&c1zhS|wVLpUEoiB|slsgOnRR%PQR zxY9#Z|H(BG7+9lcv6>lELL_Y`VI>GFNs6l{?9)0oHD@dxdj~RS1Sz*`l$vS$bc>1R1uwkLHPQBs>5`y;QfpSe?z$}p7P@gV9?=LqBhRa3(*chC zE5bxAA*sh=Kig}j^9Nq;6p@wl?MYfx`zQrBou6J+Ww&S5Px|GspqH&$joSOg)8)!; ze;5lp9AT27|A?q;wE<0~b-MxsdIsP9TcwDt$?{QXX5jfJx;NS|acKXaAv&lCoF_n+ z8?`gaX!-x5VaekSnum0Sj=*0qtnstLFoVzk@?T1adF4tby~No>WU;NqK^Dm$;4gcm z1O`!?=I5%}M~@UX%%PIg=PnT1;X}59$wV_<+axHNb0tL7{st&{B_n!BS+k<=YNil> zUG!`$F_HY17Lt}|aY@NV^4B~Hu~;UqH6CV&+CQ=ntC=!@$OdzjArfPM)3qLo0FOAu zR%;`h3Cgh_Xv7Gr58@dBOcqSCgE}aw7bRty2uh}|#8OVL2&=U>ppe$Q?g;}Po$D{Q zC}mOn^qDpa7}%e};Wd`@`~BnkV@f>#*j$AsivJNIx*^4-?GN?4m0T1b-IU1cV>ieR zQRu95qYCC&DWSa%W6`nzkX`Jcl+8j>$F;DMl3MIZR8NOpFktX7}Jq?%>XW`tGq5s^1Y?qR>!p}s_fx4#DgRnQxo`$DbN^~oY z#{6u4h(n-M?!K%Rbuu;(Dp$9h=22e~C z(;1~~9v|G=QxtE~#4zM|z(SE})NqrSZkwraYC}(dV&~k6JSb8SMGYbENM9247oRXM zD<)*#38LNfO-v@%&}48MQ=*lJ6PLq;OfS^(bw^+3R#YaBo+c(gu#)dsiFgrG0Y>%1 z9{mAxlJQYYGWL~|g3tpZ@-&Phk9(OA`vHOEM#LQA@^K69r$*y}ZOwz`uOixX90ijF zz3U6pQJd*ORb7JBxH6i+K6d5cH#&v6{giJ*kCOLv40*^z%~6-~___7ovSv z+FCb>f?_5}5ZK6XlrzcrzYlu9RB7hn&loqR-j)MkQ)^(LuP-G@hxZjh2bcC0vlF%( zhw!Kik)yj~%j&m-{`HbpowtrEROcy0AblEUt_1iP#(Gb)-Ku!(YNW7 z00$o|mGg^~97f-Sa>D`SzH_!yW7aG5?6Mj}5UWG-Yi<0?@iPFU_ zU!hsR=McKg!A;KmE+vvlH|o{g0=_okuPA8pUZPbj?v2G@GHuI+#dmFwcjkYY!PY~tox&8yfCif?goX%NNL{Z?8pHSUAq%%rt|&2hNH<>YwB7q z+;M7dczyfNr#FA;R>OxtC!*HUs46TN_hAvPNmekS04t7~I~Y)%eWf%&zk%ZA)J83f zM$1EAV=e=*r^X_%7IvRVxY?0PCi4Di6MDzAVyp&e(d{d^2BfQ*mjEmB|Aje( zK4#ndLRvtniWwv~pbz%wY&_F%6nTHxr)Is9-DrcD355lKlgo-=+v~$qghq z;=(8;<6!8grrUOpb<&_LY5ki-CHD_sXv$i)H~y!nSNA2#)_^jaTRlQ4TZ{%azt-7n z0O)rYyD2#%mrDP5O-~bUC)R&oLZ$kj9jTHn z;ioU|uMApVJyb-0zo>!Rflm76*(sUM1|qR=#z>a%$i~C ziG1>$NuSB8vou+{*PMu2|IdEVb_oRs^U;ix2Q00LNJ!KM!f?{O8T%O zg=`sgY0bdtjfcc(gC4F?YnJiXXfsn{l6BMx%FFOzd2%;=8A9*sgShW9%!NeRawo$w zzC|Jl{pTGNnc<>{ez5BW^cR}m-spq?mVprK+0S4$8Lno~)wK|hSPb;=vgdMU37EP} zb+XeKDeZ^BM~O2Kx+WJP%VZSgP@R<=is(Tp|ATuB$~e(Ig~7<27&jdYEGSDttzq~8 z4DVnGAK5@s7y9GLG7XrXE!{goPEppQ?QMuDn%>tx9=a$MEER+U-)SzEom9iClqKKBC!H~+(o0k{?t19%ir{{0EW(BxAcyVeDfPObfDKi); z+mmYG0Dvd(J!Q+(p_cpp5S45thBo|@SfN?T*KV6G57N!=OLU%hh@^QY`GEZNIhXMX zWQjQ$wOwW^dTROlveOK;8?N7EB|U-_9BQ+6=kdP+r0z?E+q#NBLum#7T7_m6AKgbg z(VOIWPn+5ja$54{9TnvHE^H<#SRf}?pB;1h(^da!4RJYogOK`_M60%$=0$ zFJ3{GB4WKrN(y){+&I-VLP_S>Lc7s^9Y{^@FG(#)&xVlPP8E0EiT)?<47@mj6uj1w zJ*x5wd$M8$O;z}h>c#&1eV2k;#b5Kyw&*<_fv5VFaD4E(#)zY^1^{gJzN9j&!UM3h$Yk_O=y=AI1k^V9ZRm$S| z+P()12>UTagDA!W1TPLE6cP`y`2M@QoUwR7=#cwA)Ep@6@Pl6!27t6f&P&v?)x7Rn z(gwoXcZ-7717Gu@oodZ$)HK)bRB=XN<8VdIIH1vP<6P|xps+2cux`47`M)caoh$*A z!H8XH08&Sr2B^3Mev^cL>Aeve4Ao*HVzD+oAZhLaSgQjbK%eg}xi4oz(7<71>?ZU9 zk-lsFOKnKtYnKlak(2?5w=-iNG)vhh?>alk5-|ub+TK7|tEV3`bT>;#AD0YWGttEMP5 zAhDzm;urw*jD=famOUVn3CFAz1|6^KsuRW26t#%JR(de{cJEla<^+PXs_ONDM-mCY3)h^RL3qjZJXJZr$M@mmD~h(RQ`z zSoBc;r}6I-9uSjDL$Jk@%9nL)=w&x{tGHm{+o7i^Hhpy`xO5nH`4U%^EDbe}O~al> z6>3riU9d_4T-#=*(x52m@Lm`QX?$(P5)#kQA);Z>(WshoITzCsKr=MU)&NGbpX;TR zvAj>ujgQ-I`1mvIpPRSYb~!vYX2A8oZ&%bB7CkAS2f%47gDo==?XrA`h&@Eh;l7m- zcJJiw5O#oosjzb#$_V}WR)NxBtajM(7NQZLc)MgH=1@kY5oT8q_AVo_wHek!Z-5ApdDI?n93*p{}mYuHnW}vI_ zvN+Ubj~CV}3;@Yj7cR4tt>qIPQ`*D`*sLjQmP$vJbyaEB^3=b$=#=(J#P(Pi1~Io2 z;(n23m^!y-|Aaw?0d8u)+K~ezyK&zGg!n+&%Vo)!xH4GDX3!VOW#46K3+$jx*Yahb zq3Mbb!P_rG7_8PGny$=Q%C2A_P3fpPZOIxna|nP|bb+eFo8i(SqU#`s!#RYO&y@w8 zD}uA0VVkJXfJ*OwJq8kl3a2+<|EmzM`C7z1M{XTo*!O^#t-RSw$p~d6_3(bFlVKe% zrrAfsHX^!PMnnyAXO(O{A7R1Xn|1=q3~h`ih;F|Gu#F@(n)PVj=d>AA7lu)=6`|Cx zc#$6_;9p$NN57VROV4jy`03@>Ii9A6ZLp2!ITPkRD(_A_rZyNWe~mZ_)2$pkTFH2Z z4ZIcA%Y(#pSg~gyN%~*#IHhI-Y@&%Ir4t()yBs!uIiYX%|BhHMK#>|gxI;N%_tPDf z+y=beg^&DH1^~L|r9F1)z;mVnwu2XVzCf~M|Dx#AzPoVPQ8auBV%PyFdi%Qo#!z`e z3XvS(u{8e6mmPQdJ&D>zlO8XmFJqqndAI*>s*g+AyyqSLvhrVF?{+1!yCMi4Xziun ziH!%5Uh+y!9G%a|o799%tCW)GzmnVrG_LF+ZIs8m>piYFNQQbs*?lkkof4Y)t)^CQ zF)8<5AbHtlhodYF7N@$gD$Qj3#wXI zhQ!v4>a=R+pooMsx9dhE*6u!+UvkH1`{1Vityll=z*Etg!^6e2)xFy`vW<8nk$KoG z3&TTtd;7r}!((d%wY|nzG&eV0!5M-0+%}~FK$`t+rAoGmKd>U&9lLp$4Vq0T9@@X3 zf|*}V(yqs-A-mP1WN+ z<d=-Qmtb!|HR<>&DB7>(-$g0S*P9^b zrUm9%7%P z2ph(7fZtObRR$ELep+)D?&(9zPs>Gg?%hX9*%t6m`EnbI{UJ$~!G_mt;jNt574{a8 z_J^G;nrFmOY^`{-ngb`hYT9>XI-tR$OJ`vrd`LtkQ#z^)sM0I7%Y`R0*;bzNFYzGL zHZq71#(Ys|K#=yQ9c;O+e6Yiw@s!D`3uDww$iu!w{BlGZB{(a_=ThsFOcGIQ% zE5BQ==y=?LXxWuRSAR1k#x3|S?!jBt=o^Iq+_rH>VO!GE%qkU&hE$IR|v+OK8G{>{}E{wG1@4|_(2@2GWSn$ z16Ack$Tn}%82YY=Ci+!q!<=9IKWh3^xS5d;od?lTf9w<--jB(^iVq6IHr_`}=U#@P zz8(MTR@^_y%*Veqa2iaoB>)ZKNj4f3CHFZJt>U)xiRN~6(UC_=188jNj4=w?4%ACr zGRsM01YNF{z?H(k@F@L`oC76Izpc zZH5OzV?89&j22i3zaREPKs0F`6w)K?LDcWYbbLhU-tVy0B?qvaHB&81hxHSkU5V-V z=sQ01gy+q;KB}kaOWIbLdZ;&P9pWmT0gl72(14w-xM-#30O+jU-<1X?+_90h=^nz6p{1qe~@<{x^FlR=7oe5{kA|5JBl=JoIx_4^`PQc zc77*nMRq30$%KVsYfnN(Hi=0OA|fXnt;wh`oR1oW>;f+p(N4fohNS|&b0gw zCELfhUDIbGk;X21qSWl;Yuip8hiKbB?r>coJGn6(RNOwi&erC+js_#xz6jfU`ymyF z!agfCMsR#zCnX2K&NW)3aroEz2PI*uqIzM*5v9RcR6E`ih9M}cCO0c(8KC^g7TIb5 z=*EX8ww#gjUE!-R7{SER`3l(qfRsHZDvc44L(VD=fG#TV!#qbjW#69KFzEoVdwjx7 z2JqSS#@1kDj{2#CeTiZ0xNsb^_YwArmKG~y2lf1Q%$94Pe2j6j%|phQPV?F>eqf1Rt8vO@r!{B=r=5hNcSAZN-Rk(5*3 za}hCq)c5M7a!e)fg3e8~*u3ZF& zc;RE1AFYPiaiFAy9d5)X=;Mpxq&ZWOZRPMdeCWcjZK;))j;joZdGYTyl8hrcO4$*9 zB%P-2hv2H~V=NjwwuZw0cub@}E{8+YK8_V9-zfhI|M~G%6^U3>Wy6F#zSzr+wX{2` z)*QhTx4ICC>5h(jt$C#2KoL#ShpG)n_~7UL+&?C5I(@X!BW=Y1EtZ1E8y6SfHm^b$ ztZPR{*-?yo0}^SNFg!%{$s?q?tUAU6P{&bM=fh(5;Oy}g!|%T7QWQ?6!#w09dgPO;j0*plex z(rCy~A^ukTsBcJzc}#LfLb23M9gJW#9{J|cJZ$3w)W1Wd?V?1^%K-qIY zK&b(RzGDx+F8~9$F#sDfMxM2Au@e+hL6R!@_i`q*;;P9Wf2{F8l3sfU?t9;=#hLzP zIRbKvRtkcH6b56RD18s5>@g4Z)`B`U+et@uDN-wW8$1wCHE6%g(SX;!PYi zMvf<@_u-qMljc>k;BZ&K9Ug8>aI8qMNbWLgyPV77bxEpDWXRXPrgxsHj;IY;d|=8UZ9DQM^dEAgzFbM)Pgv+6%SOwNv+pQ00OIBBGdnJuFYI_mO2?KU zq?w1YZa8~XVL&O}uNm7)h4`y)czMHbses8H(|A!KJBx_VMx@VZ&hq)Q=96B}5AAt9 zvDo)5!j7-Ekb-$hggCP*#P-eMQ-Ya2ws}1K`3f8*ao9s?ILmiG-#TU;Ddcbf;0KG;vh!G*R_&dl(wyf5+tNekB*B$O z+0H)S9s6<@i?wE-MNBBK0LAH%J{s7i zkBzCS7x^C|)>*X~amh*|RvB{%FY=qj?Dy=A_OcvwV><#nTIrQU+HU6=r6z~Ze}9s^ zhWGOPKNHjWVzzPG9Y`d`bvOYlv#~{h{wvnq2;xX5ob114Pp3kv)|hexB~R8vC*D`a%NH#*)9SU~~hN?iC?qXawh- zZJ08E93O?!fL7_XCk46e5E2t`3a8NM$h?tGdDfV7`L#-Ri1Jb{Ujo2}o%AT}jdg?w_jET;@yXHdPH;&cDfH zf4@vizVfa@7uS}MxW?3-Tnmnch(z~!PxUek1&NS55C7fo0*WdCyPY%x4Xlz z8iKn|<7c?d;EoT&Cj%i*NOI9s{GECHCVRHsmQiXB_2|MxjnZHQes%r`BZB)`dM?(% zC&a|<3S5b>CnJ7&&2}#DNz=2_jWUOZ54_01&e#)@^nD(-&z3x~l$&g6x(n_5q}hah zIdcLQFBCdY*4WCf@Mqo@l|7XPE^+PgS3)Mxk`fbb@_zFx3sR;9(z9yH<(ex{Z!z)M z++Y9Xw20j|ya&QCPe@v)E=Qo;&kNzo{1V!%p~z&Y`eFIaYx@3|Z6K918TEd57A25Re)>H2P-v3;8TH5H2~z7o~u89Z$PfaTu+52A2r)ehcdUQf}wkkC^#c!#*C|wk19e< zjKxgM=Y9TIEGzT5X7DEkmgOY3)r_t$ zXt`Dq-GYHpj$8qsKb_wGHv*d~V4CL!qp~x4oPQEQxPU5>3*RlHAI__! zi!T2U!dXQmuK)5_=&DAvVtdY7s*qjB6WbU^dk7DD;Z`Z+5TH|TokD{mc3M&|2hmt)Ps6TK>hv0R82OWxmrvaE6@Y?(!iqv1NAh^!rDIMS5Mz-Io>Ev!}m zKJLgrEkv8<{joa>Ko7G&fUqBmtUDZq&4ylnbhT1(#-hB|_6mcMd5e#)Ty_IHIk(<) zcGLh|8%7m;S>)9;$K|bzT;XRy6ISg@>^`&IH)_S!6!oZ&Q^lQDW?M@OE$%D18+;BW ziNCrKOI(#G=${N+4z(Xx5dGEPh@075M3Tm~;<+;T) zH&U=R(I9(qJ3h0o+A8M(pet zBPLA^cPK?Wh|4$mmU2R1^A< z|6v>1O}roKY$r#J5p3O%q2K^gGMw)!3^)1iQcInt;SzkS>I5}iJ0}{`r<$Z%)p)=v zt?ndFcJ(-_l-=TMXJgXs4i;&@X4?|Z^%p*$nSp8TRgHko#h-G`Ev!$Q@^34+TYMrV z{`kaTXSl_Wv}c!h9)+krxE5MY!di_nT@DVnk=@2nqOZYS3PI7;_c!5m0gQ}=2|ETn zYYtshX~08g^_ZsQZu28AEu+{K*xNFIn3m~<`5RXKT}0n&cUmng0$;0ch$Tg$iHYJ! zI8xO_`qG$qTf~c>og%dOYLbEj8@u*vy{!R28njQRmfhhu{b|%qFDMAbR$3{{q9v%8 zwpyXm+~M24#@>g?w(HoximPrWY?@mRtcmK4t-fu{c{+%sD(zvF+~Kbc$A9t*fe3o& zg4s&L9SmjoNu*$|$50NuL*TF&n(NbjQ%tJrzEXCf^BK&lY9je?y9tIub+`$82(wB9 zE>>965neqW-g^FZOeTO@`j(nQk#xqEcw0j;f30UDW{=IdziOEPs$IJ!DviJg_j%rq zNWV|mgYzi(1F5ZJ5i2`%8i^IvM0|J-v_oNaLTF5mw^Svn!m(D2P`ya)NMD(`5Yak} zQbu8O3(cjT8@UV0p?V`tSM{<`%I;#|jnsIU3Drq7yBdbG1|)XjL>DCoK(9*sq&65S zn|<(@_W&w?X4-3v;H(GiTO%OxYwZjGCg!kin7Zn4N~<-$Dr3G@pN`PqV_#&hbdr@A zU)jK12MqvAt3E@)U{t3zz-$sfCA9iCGD<9-!ZE4q1ziA2J8WohM&_d2r)q-{44Exb z$w~oKZE7LDV4gY(pP9HmCDI)M(JBp!zV*ID*q3b(webSg_XNV2ou3v|BTPl-*&;R{ zU~Kp#Y&P)HTX%lKs*h%N|DU3(4v1pw;&*ds7`EuJ6%iGmg#uze3&(Cz^cff^m?$hc z##0=zyPn;CwmU9j2Rfo+fOIHGryzd6`S0wxId|_p_w=nSPzz$meR|>>-vSs@n4)1s z;NkWi*t3~LGH+*$9rxDYnt0lRntVD{Er_LK<-M_y(Pz(utlHJV0=bpzz!OCadXp_=2%!aO2s6c25wj!2qM^wl2tyduNE= z^2yA9=Ibs*ZqwEQZf2P-mJ~~7K%PQnjny`tAT~For$NvM#_cAIb7|mJCwpb8m^6cI zp#Ib@;x_Mv)Gbv)^gXSlYc?x8XH%iIp`mW_rKb1$wvz;9N5Y@l?F+7mOd?y#@6i+h9Z3 z?rV=iONCEcJODcPG)yUI=PO(k_!A%fq9NR8>d#d<5bDR4Wor684n^dk&yapH-JV>< zUwh{mgfU?C0fl`v9Dtp-?Ty|tTYcv%CKY}S<>{lT0a26H0!r8p%^5oS13rG-&m~$0 z0Bh_fgV9{v2DxJ$IkBj1L>p{ROk&Ht7mk96xwmVzGyM^jpX|z0F#xCr*oHi1-{5Y1 z1l#E&9`7cS#QZ9)@X_$5!0!Irhym-nuOHmlhV7Fy9y|LRp=>w6`l|wvwP25mPDdX( zcb`MW^^M>qyHqWcZg4NM>}L$363K+JtrBWBj-Y4jZ$$6E85S~+Z`;f+x5Rzv8{Mx{ z&4Zw6F&W0>Nfg59tW0k9nk z>%uhDp0XV$KKL7n`zyd##bGYaQbI1QkP_dgD+twk_BpK}PS98&a zy?x9MoA_IoSf5lVcE*eWlf32IP3H~0rED{0YR8F{%Y$$O0H7+G20}N0VLLB)uBN}B zNV~pF#Q>nJ4=uFkL`;x*FI(Y@Au9BF^^pw^@q(&J!z{VGDREn}c1>Yo;lRWBN%NKR zp71}t0R#9&_@o`c0@(d|W>0@bKhYI3Edzjku?!xTCoq-}6OTQOI`4a2g>e(WSBujc zPON+|2hkh%fN}k=S|f<9w2xp|NdcyB21MJJXx^AR5z16xc0GnxIs>hio*oQC3BLX1 zY)CB`2KRjm;@<=wyhl$`QA{<3QPh{U&>f3)UtU`dCJ3#wyv=o=(%M@Iog?C(>x z;BLN=1k2GKRCK0cwoF3&EnshG{pwVh$I&${9=Kxjhr{yujVSjN>(kFJwG zYq?C^sI4|vtAtF0YtP9QqGQnj81DlQ8hOa8;33xJ&>y0^4OH$u`^IA)3?w8Ad)#+YTp5ccW=;J_g$ zNCsw+gicvuS~}Y>0QsPaEUN=VrV&{;m6Y4XFefG(GYIB}*mBv1G*>BA(YMr50FGMR zw8f6j0pRO`T{aHAWR3q|%j6i`yF;L01Lxx4qL__7*3(H40T0y`9i0mx5K*QK04k}` zM(sHbE&UI{*cF_0^z=e0Q7S*eS z$mo%)h9g-!P{adSsq|z^VoV_H&9t|W7t!o$xzWb+d=?=c^IWk{v&t-4^O!(rPEqFX z5DSI?qphv#tLD%*b=eD%JR-o(-lC!NakI1yS^&8*%SEa0#Dip{W!1_2-*|k=i&{0fzijQaD?*ZWsx}Nj~UP)WYzgf*}HT0f@o$D`M1%1V7beZuD4K38F63B z(rp3o5#GMndS z$rC0;cY!iBTQ5F*Mm-%m3Yvp#B71zRHMr4i-hp}@m7%2zaB~bnSQk@ZNO~e=Zymn~ z>mT~|f;)`o2#mI2c^p&*z|?~i;0g>!Rv=cd{dnB%*+hR7*NkUycI5EuRc}JNY*@^8 zg^RIg2x@ElDeXMN(EjSZd^)aEV}1gI1ZZ5CZ*DE}Qos6OLh@J>Oe59oMYa1`ry!95 z7_tpM17A_cXLL6+#pGc>8*rmJ=}@eO>GY5%B2m#jo%Omgx>B%)WhzZLlQC}712Kot7XdPR6E+!C&&NbH+v#$ID}xjABJQ9E$H6t zT;aGF=c}hoKkSs`Xt!$)W?QcULklo4v~hrzGt zf$6pknbI1F#3uQ^bjv4>aMdgh_0V;T#c zfHL-E${{GK@Wp2L5kp&Um_6w48WPN4a&L#vQZwZswqu>AYPoWQwKu!B0m%)j@z*U) zgN)Ub(^DRsHg|$rC^y{ducSimBUDC~OJo73pdd8Qb#Y=FM$Z9nmP^UHTE$Vt$mLmzG&h?a^b^nCAI1N5s)$r zaiI~S#0Y#z?te*8TmiG-Ko2#CK3IMluApfs%4iK zB$vd^l{KsAYD1uu)o;ClZI(-vg^8=}m}*14jQV+EB}8R(@^Lb@ZY+Rr&WM`cf`I}r zc-e8)nDzS~7j=RN_`p4buEEXba2O63Nx3mmIi3>sM#3Z=18m&44-3>>jUlj*R+) zEGcMKbMZBHD7Ho6?cX|~){s2w(V#eGymcb5m5 z>I+hd#=;=Py;lS1{a~wxuEXGi2>i5~fTNoOI zYyI1(+yv96HN$>)ep8!Liy(qYqqjh`$OBJlM>`5)OXphH{p-=G?Bz8LBLXRXpl&nI zBW%A8FJZaKBZ?-`!=&C2JpyW{-D(2Y%SSLBI_8o1`B8h+LOneBq7_G{L*0{?Ix0H; z)-?^?U`Ux9Kcp0bgGb&rB^A2#94IKpowH>6S1%O?JOS1vvp7O^vH6oA1 zeen*k=Nb&ImT{9nbc6PG2eco&^j)UNMwn&pmceW)7T8uV#KnT{A;$J z!5C%PTPbia)FTI8QFzLFs3 zy%WhGchZ#E%YyzgCsy}DtlEX2Q{WDD2|9qMQtwbClBN<4P1SKt*rz_Dpqn|7*X60F zGG?3ZC&ZAv>@)vL`dLs-PNoh5s<6cuungC+9v7YUYPuP#mMogK04VQHk5F;VhUnvV zB(6;5H2g6k~~wt{>3z;^Mt^-};;zfaWCzoFKC zx-kq!r#$_eW7I*IY%1qy7@#Q|aeo0w*yaO9?6)DgZ#X*qJ~UiQx1hs6ES}g!0*&F@0h9>;6#m}VEXC>_IdsV{_KDte%3N9&45`^046Pf-O zyaHP1`)Xv<#vl^NBR|rGx;qS7Qtx~scgc^$dB`7a&dxjStl^PV}zT z3epm0PR8!GCJTZFOP+O{APb5#TF)8$C){%JSaZqb5pCpei~6ecdz;iSi>>)(N6Yvl zxyYLIe6fy^VGzS&GaUyYc68-^9LoFvonri;iJ<-YaQxDcPcR@VtatU-2{L|Jeemx) z3S}FS&6M*4q9oV_9@g*Fj2v_P9=6(<1E6R(ztKsM^OxV0H#=3s`>5MmR9Enlgs8X< zh_TNn%MiD$d|uhCV-$RFTdB15=Wi-b!M|CRdPH~7>eKKbqy3c?79{BW5aM5VPNpxM zEF(W%EXm%Ywi0Q|qX>6EF9*q3l{q$yN8P%;Xfcz%~*66(vom*9r* zkM_;|*NG7eU0+(^gaQ+4UZUbe%=oS;IH&mQQfE`n0x#VIAGW_y$9g{Vhf%fY0wHL{GZH~!udPClh*aToo7OBZT%Bv zRrlk_`I>$6AIyKV^{Zs|P3amd`fZ|_t0FPJH`#P?Mb5n=vPGj;QS9<yZDjy2X|Kb0;6C zwE#X@P$?}3C}aDK5h75ZH%`e@|`}#d38QfEgu4#cZMHZdxiWfCnx(f zbaK3ZIJ|m(RE29!`k%W`SNgUbG+ypWdjId@IvZ=}+`B%j_WDMBi`}P?R7~-!+feGX z?ZMZZe>S{1LYyg*{iPG}kF_Kw$}^`;N!PJ5a?7B%wbpE(4`84nzae3r8cL4jsX4dh@D#694q<1rJHco0`qhtTq`^P zyl;m0yElMlr&b^*1w=oVzl7_x;Ndy;*XVOv2F=*vRS#`FM-&iwnXg>Kne*=b11$6* zz3hm*-vFs>?-?+`;|e10(5%;0h<4Koh|)(f(orzyqx)|%CG5^YzaUQ(kob-c<2AGe zpWJ&K=))lz7QYP|6=Q(|xT&c|#aZyjV)q9Sg@-Hj1R({N2rE-qLyLjgwHgHGFromm za|K)-V+&k<|A;ANu1qypcD{MA(3S7%`iFCekbQ{h~5qJTGz>uWkf%UNQN zuz?Wz1xsEM{q%i*$QuRH5O%XOJm;=sJMBtBhPHc{)?SMzcC;0rXihc1gY1)nC6ESz zGQKPzjc~SNUoD)XW~}g`b6!|GaaQ~Qll4=;S{K?m3cym159X+7YpnENyGp>!F7d77dxEQaw4W-)CRR60%MY)61D-!e9R<6 zN-n5NE|M#A_Ceoi!^aZ&%)5++v*8m>X7#xsHTr|caQ`{gI6B&7@qLo*bfox*O?F#C zrgxF*gCiPr2Z!3d?czpG#~-|fNT!H~Uby=TNWzum19pN9pBy~`9~SiB8ctRrbnTT| zJDTRB`>k*_4nx>u&96APtPLEiVQ74IQu0VONAvYEHoxQ!4DE%4dT_%|C7>)OA?<>W zw&mS-U)||XS$1e#7Zvd2kH3D1{3O{mSrYW;QbdHCeC4o7YQ~n2g3gW-Z87Lzyla23 zl7)ozyfztfHvk8uD&cIg3_V}KSH}aG=e1*D0Yv5Dx7RugD2iF$*#j!+Lf)6{u>B4! zEhyVn_7~Vk0HflY?PwL+dv=FWavU&Yf|tTc1099Vwp24>QSSZs_8b7}m+q!k5HWwa zU~KO~5;rO~LPx9l%L*#@2pHjzLZWo`g2FVc&{&M~N}YX-SX(t({0L3gaw2f$6y9%+ zK=<`Q)n3hg9NW-9vrDNb$ zasU{&OJ$B6FfulHnT-J8<64P-=l`ilrH5?0RMP;9N%(gunY^Q|WWHjdlqQQ#Xh`S# za^8K#}&uami~&)x#LNPZ>PyD%WGcyWr{BwTeP&6pFMM5 z8{>~qxZUn`TmoSnlb>Y15SL9MNqEsI9fEjampW6){pG$Se$eX6Fa;JGZx58{pX0Ws z%->(oFj_3$fsR2c4gg!w9?{z(Mkmk4xhX`f_BLcHd|AlLW8UqB;w7z6+B4p9$OD{) z!bk;`7zKK-L;a4uphU~VmzNye3mF{1+|=bzMPokQ8h?WF7nZG@KR@F2`OM!pzPBNY zLOpI?9Y4FjH6hM$P-9*GJkoOLNtSM1fh}Bg>61LpR@H*dS#-%f=9+jd>-Z=c&*zn!h>i1*Xv z{|*NyqN*-x|IP^i~*qr&SW+;;E_!NlB+o5qS9%T7V-ngujs*LA0GLUm;9GJ67%P4QqB)94>f&GtXdikEHV*{F!!*mf&eU)YeB#xVK3IvwMkIqnXIp<~=ma#7cd7%g z;mAk5zg)i1ETR9XcaDrB?>@6s1KWzh0h*l|}sTY&@;@V-3 zoFjkCq4#)WW7ZN3xp}!(aKt2bnj0a@78A;JVmmGE1lsDPMn+60-r9tU-il-qK*dc8 zcnQ^Dv6YlM`NT>s07dnzk*aBDUP9Iu4b?EteDsYfdB*XgtFCJ|G=!TIRzJf+!=aqb zJvz`?5P`;1rW)D>H;wl|TL;F4FIT+bXmV{)0I6wusHIxMWEu{|Z1>H>;8lbf-7q?6 z1z@P&yKs4X6vN#xe4Uzh1*X@E0a^wC+fn9)3m%m}v1K590A}YUs5!At(fy4O7J#uG z)>9*hn6$ah@QDP*Irf;X=QsfMBt=WRp~!r>qb&nKaW4e%LDP!2DHXFL$7wk?u(ecq zNH`)&u#BG~z`KSNwpc|YTyIF*xe8_*8pRj2aUpc zVCHp&h6JtRdLSUm^LlYlq!{b4szOD#!YnFk!2#YYZlTzM%nMKhqG3+*M`)dkXBMS| zdJx5}EXaUq#a)_T8umzI_fa*_suXu|q3o1fH4J)SFC+%S2!?S^9Dsqk1VEWZItWfN zQC={g=)kq&kJ)8E1y?p*0u>AT-@Nv%PC(1J8@kR=?R}3lr8>3wWJk9~XEDu98U{ez z_H(J&fZtt+%$kP&RrP(eubdim3$`rB@9?iaovY?hjS4gVs}%qwyfQKxx(%Pxb2(^_ zb?;X8OdDPz^>sL}U`I zdA3|TKG3vVTb}UumOd0J)}N5N)e$SbqN`=-y{Dc70i(=J`h?%eeeRSZXb_T{@*-S!TN@CwGL*Ca8ysHzNj0ic; zua({uf2^H5dkWZ2|lPzgs!KKqNCY13rjcN9^2zqmjF^BR?QiLG*`o zWY|lKkUPkh_(W+e`91wxtG(}C$(U{`Nov6n^RG>E68ck0x;B~W`)h3JCv2#y zGrJra08~F)Sdo)3D1Uvpngd1}VzR?t=)|WTc5VK%^lqz(Ps*b@vHyui6c04~A%U!X z;5&)$`wekU9{gow2JP_>+z7fD{t|la^Vkn#)i7sW2jB_^ch7q$@|}GEM<2lP$9Ghm z2OnG3_s1W;XFIw0cTeR_z^gD@U@ynv%(TsRfLyJZ`^6 zOLyjHpXn#TK&fv)F}@S|#nNw(VZXP0HleP4->+dhgG$!kiU76v-Xcx7xVb^Yb>@>_ zw!e}}cSCyr3lgP&@~lTX%!$TF^%w5R@C1nIs6vu^VqJZLp0y9_zS zJez7$Z_Ua$fuc7bRr@ea(m;hpT1mP8k@~aj5_6 z&{%NNsPFwZoZW%}w1>f3KtrXU&Q(Qs<&$sCYL7sgdo+YUamc@6=?w#rJSs%XbjAGE zUD~GO0I<~H7f|=3)1md3HG+t_Km41D?uI(?Tii5EH$ImC1jFsfz>hi(ST=Y27lh3H zAo1bdZ>ofDeEsV4txxV$r&K0~ssv!TD^J?p|wax&S=ifkW&sJ|B$#DCLPJOU280Q>IB|I~DM5NhZ2 zJ>c4ZfNNj=RD-(#Yb0W1wS(1GQ zR)Zf$z5iWLVv)WQ(&mp#m!95T@D!AAYHtM3-9tAQr^DkQ-0->zi2X|!o9J=F@EOYq<^fEQG1qx4F-xeTT-Rw0L0hG;M)H6N2*-;_$s_I zy`jSE2UdOWYQ%8m{TSV}1=&J6!hyI1Bc6M|02~*3KDi@aOZNZ~@8nUVV|wsu)fAZk zT2~!}gK?*DjP%l*Y)ma;9J#7;mZ<(*#;jeGLRNH$IMm5O1uOiw-~f7Y7bCeLpnjy?fiiaq&b zv+|WhY4HxauAY3bNsjeN{1tA7A@Ff3A(X>ku>Yz`NX*=VOdN-jmeuDo!@oA}KC=E> zWAU<@HeQjZqkN=MjSor=YR9BXjFWr|-aI(u)aluYD6ePfhu1B1TMaGzNbu-u3ft;7 zi5b-``kFU0ZU8M+rKS0SZJVU zO1CTR@!-LOpSx@-_MatPbdT<|0h{{}xxibOkc8CAN)6qMj~?717ldIi2$2V7eF0)#-QCuDl7s_6IlvJ4y_h-+6B{z{Ppx`}j zUGzbnhIBp-K(~JcFl_)@4Ltx(t%R@@NX<$2Mz5jX!72s-xg|Qrgp{NvQBQuu%o>K; zHostEjQ|jK8T!Cj0GU(z>o~F5R%p}(5%^0?_SXkMH{~(dZPE2F&=}985)$8AG_UmG zQ~I`7Qsb@nfn=kH^8QHPc>;fS;?eC6TpvE#B9@Rfi=-renbmQv(1(8$9OQLD7bByJ z+160Fpr3zXB~pCSNO#?EsngU@_XFx z&9E63RJRO#dkO{&-!~T~v=SmcKgm+d_2vCWEYKvZ%Fb1g(WZ^rgltV-9Z`PDLB$cPr=-k66u6i$f4oGzj2T?^n#DOs&v(FYf2apt73exaPPvvn>wQY z29MQR4j4AOH!iByz;yo<1nIJrB>W01fNi$)rYzoFv~2nCvy_zL(rGx4qENr;9%ykX z!kixTm;lOKO5&G}K!8<0-hGB&hl9Ext+l;z6^HsU4s*b@;DkHboRE!lQrOhi9WkHzglyZiIE z{`0u^saF53&V`EecX%ct#_ z;X*B$-dD%?VigDP1_N*%pVqPXoR;(D^IZI1EzBAH6$I(7mVzDv^SGb%6$}7+&pQRS z`z3($h9o=>BGN-q{hkKQ`W(oRe(3P@S@5JH(5Vv=+R{`L88$3n{0PSSR z*3|&^Jh-Ie#L9Z?T@JI-6{h7Y~`K2T~OhU%EBQ4lsIMa{U zklqKa>OIT{4mnP8pSK~gwqC8^V)Rp*K}-8|7zSnTPb+Wsw`VITa(@!)*O%$w>3<>! z^%i7*e@uHw*I{-H0IJ3X3O|pZMDev_gfr*QTT5az`*6*8|Kwe$1{$#}KIq_!=$SbX z9r#B{A?X3=)M^v7w?B#O#7nSC(|)ElTgOWt;vo9-(W6_ej2?Bn$;@YmBpv!~Qc86W z(wYnjv3aK;6&q9}d*m5n#CwwnA%53IOAo+&{2wCp1wh=KO|W1G|9mGWgPZUYG9?4| zT-PiyCO%*JMsJ1;AIi3ZRK*S8XWNIELjCU+j`vDbaqXBR)eCuf0>-v8L?Ul zUrCVmn8euKo6?)~QIMxL7DW3(K^FY$M~o9q$fUOODZsCjk5x;6q!4{n{Q@xep8uv zkvPloX<5lCEj^I8uAMJo)i(9m`#%Y3+;vOE4CDi^%iQSiSl+fR}ZKK6l% z9>lw!IF>{b))nG7ocI~@HD{2N>RgfU#0)~+DW@QhpU2i%H&#$_z))c6)|CK93JMUGJ#R{|aitMgx<5?Ti?~?3d6KO_6AUkvEpzRpkizTS_{74n3GBC@yb2yC{ zF=Wd}6!l;?N0og)Rq2U53jx{2h3OGB`7Zz*lYvpWOAMf(*yyaA&NP zY|ZFRj(@u&$+*7Frt8pePI~X15~8#p(Tt~6c=x_rtU%xra7C!f2>I%eq-BQkQ9b!)MM5%9Z?rz)bXP|Y!{Tv1V?phKIbSyw1{%zD76*Un5dhr&E7UTm6W1`SP|XeF zlM5LW@=sGB*&5UdIis+Mg4jdd&ST&PP+xX<4x+};Rp+TzI{I&@N308wggdy*O3EI1 zi**eti<}Fk3v{3iN~v6C1ynew|9t|a=Li7*o}2-Gpp3+Y8+&TGzxjdYl;P_ljUd)u zJDgL~!vV~AjZ_W*B+_p`pvEb4=|x@gf@Vi7>(c?JBB_ihqapAM!}(Y#HP`9_*kg1a zvI*VdSvN$-HY>*m#)1gS%Ny;((=exBH=7_wmACwfzyUiuT}O|F6!U+4d%_ljwX?ag6+W{$L>2X-1 z%af1WdRAk^vH#rAGQdzndDtAAfbq?QuO2YUd+JwOVI1$?9jPl6+dZ~v>G6EdZ#P0# zYsj$Zy8GW!8 z_vlRUQa=Vi)Y22Mu`cK00GU^`D5znMF&YLaHofgBJlKM=j13ZvFo7RXc5Si#tAi6^ zkEcT!K9P6#?o3X;xZiCI9Wg4)ubn zEzQ8&F1&lkG&zw5o0WiLs*v_&pUeXd@u(o|>OY9A^sayvZS!Gx;sWEI>VsEa@Bv$) zAr$~5#DvTSpH$&ecG|C(j5_Rre9F;U#4wsHQeCrfEd|;bhXHT-1|6al?Z!SV+hYvPH zKTJZh|FtDOONH-?R*`ArB%uW}+fyO?;r|m-LF9KmeyNzreDo1z7yp)21-S)V6J6SY zbom)fE(FyRBc31kKhT?y-FlgRYo>yPmv<+>GuM-erhUoLzidgxf0yynqc<_e9+&E^ zh7!Hxx14w=I+C8}=aGz!LkW5Pg4moclV^L_EB)6^CHnOnBxK*95#&ekf8_p1fAXpJ zlf-6Gn#2h1%0J_Pxju0wAqQ5BBvvLb$p4U^`8NJm{fBwPO}~sH>Owr1JlK&47m?D~ za;qeN$tcp`bp#=&za`l#w#xOT+dJtq&x}XdWDnMkn~XJfcIX8F_CQ=0KdO)+X*P55`%8yiUWqNK-&6gIJYIg zYgEiMUN)2UVEi>4P*l-###sQsy7%{m1dH0UpL~EOr-JAg`4l+O)A?x1zRk&OrJN?A zal<3cZXj#rbfi6YR=?On{J%Jkq42CihJrjCG+8Po^QpFWgf!1W1aX}B>OfREA)Syx z%c8%Xm8IV9pDUfDpoax_w9Is9aQE+kQ$=+}WNWI+4Y+4E;lmVJxVU7MB<{`w+?dn( zUM5sb@OPbn>QrLI1l*m-ayn(ybVqsyFg^S_L!DVkVpq8>!pW|5v7>xT-qQ@q*#E-+ zw&g^?A{XYZ)|D^}DXVb2(f)0FYzFU25}o4?CeWwSWoJ;N2{ph>WST0WF|I|X&k>cp zj1|Jb=Z*vFS#Z5Zn87Df?32_-$gPG>_)IKVaOKf`>C4v-kSL}&QMl78V`S{fd!MxQ zObo2cK&muoElwbwQHp9Rfgr^oz9;vZ_W(y2LqoQ)3dMuZBiiLZ^5_CL0mBd4EyFZ z#uAIhJ2qnzR}xuTeH%Mr7VrL70z%FM<@$@}6cNn(l1sM~M%p%^s_zFa9mKnT{e{2g z)cejlCJ5B+T{^sL4^+DOz&OpmbxgsQ#RSsMHaKx8mYI}k)j|+oKd|JCq`_HIFqSmm za1C8*Pu#veCpO-eQh$p!#LeDOe!u5i_lcxy(m`TuX)p1Y&!_a(HwkI|$tnB0Mb}0* zGI_;$;y+?02@(m+r6fYyosn+8rkE}c~5gfS0HgccYbxK^g0xy-UXdpuz&MB55f4 z;C2DYZ_wUuVht_K=4YRF8g3kxqSZIlbRpw1oQeOXHWKv7>14fR8V!*%@Or zHU3&{=ij`RavECv+oTx6L&Xbca^-%!LZ6wa@W0Zlo-DMrx;7waqS}`13&D-}O#(H; z9B><-Gd@A7P)U5O%}Cr*8zcw1RS2^}R2nDt?DL~RE6m{soQsth4O3&0#d8w;VuP^( z+Fa?PWrF#@_2*$y{{o$ls;Wh%$h-k@(6P$pYq|nYf5LONbrq33wQhvaQZ+Ms)5?z2 zJ009U(Lro0%RM?Fn2+9Z*UW#tN1vF}r&o|~-U}pbdnKYry)lccqt@x@xme@H1n~?$ zm|)v>ckCEoC`||?qk&aK9`NOpj+@H|np3N@{k4KvJH5(POV0zaA}rm30U#SBy7+t1ov`PYHzEJ zq0lY7J&P!lX_!;S8A!pw76sQ({lgt(cZ(6dm-UGqM-iaXPHp{`-vc{ z`RFL%7XHU1eE2pz%IbLlW1N^^t7XKZ=AlotoCsu#8nP3plc9#}ejarWRKm7#9hkFE zp6dkEi9Ny`MC@`^fHAv8O&UYSkPELr$*67!2c{Qbe~0>u_Ux*eQnr$UkLXMEvHeY< zBZD$(e(o|I2Y_`|L0Ub1Z=UL*ch_6kn3XPUZ(J3+ z_AM@z+=-^dd!vp7jq{RLgd6Z~!#)^m#GY!qz@sS-^GhsBSJ4Zh6j+aMU>5QzR&0g> zZ%UP5={6p-(Q*s<tgY$S)WTx^!KA%aasBq5?r*1WSRzAs^sE-_UNnF7Ww;Z) z1k+sq4H0m`)kHSkagB;u!biDK+wB(P6T(!h^E>pE(|- zK~rl)*?Wdzu$kswc$5a1oH8g0BhYdNBu39z0KM@r6ekv4Pv7Gth`^gc6V&uF{DX&f z)xfNOW}qz=pXVYDTPl|2cN@d0=X&g&@w=M6r0rBrUg$ zk6!ILkz|AQ#JeHD)MJ1N!1F)Z;f8z#}$j+2I77@8`-J;9WOs@=#o3u1gd zpygMyWGNLkMoDJIYKRH+rE3O7k|S)JfyjAUxj7cpy?Wb~H=`a}!5|!%iBp$`?-{=% zSR;rNqVbA`=T}T_-HvbK;ncUtgUd0cCSzZC)F4OvA@hfhoLCn5pHVA_ zz}r<>Q0AiV%{%c-$qM`{$&jf%eQJoL9I0ZM6}(Ia>Akg*#ez<10ktTFxs!$t zL-pZn5tB2p2HK)EeX#p#h^&w3G9AYIZJ{*!!VW`KTo`|hseWqQ854TDW&#yA6Usxe z<=6S&)pR)e+IM9M6i78BE@cw2W5W4?GRh9tA5JXuUoSw;LHFsY>!As#A<@rwLv9bL z;R9u=L^#TX)r^jK>6b8Xue>5Gvc+lX?b2S9sf+T>tZMAPniyn5O@-hdi{77du={MO zX^~gUVTe3D4Zo7`;ri1n)dGf!owhX)d#>h^j-nHgICv#4iF5Bg@GuQOV6>EEShDNH zkhPV(mn6PDk&Im2oh(|{T{5WNhg5uXkcEzby@x&O2o3%TOn0LtYy;;3$ei&G%yo?O zIDU~@K&NcB+e++C6p^c-Few1mnlx+ZReVa}_NKHpM7iSxgo~Fo5YBH6fOa_zHP*F- zcivY3i|>FR&8s2O8H?nT;UU8P#KgGrbynrOz(pJXp=U)~=DVV}89es^1KYBe$l8k`>TCEvR`NhQ1bnXHAK;B$7gG(lhM%3iku+O36pt~^peD}D zR|{*fwi#19sp++RGGjFH4>^5VKXjfPG^T zsyPltX-gHLkhKV5U9wNht>ayzCv6EQCZAJFd$pW7d9VLyL+_)={hjq)zbbspn@vmQ zj|P!!tI(yVPw0akNoe$yv+M>+x$lIuqQCzJLJsSq=Pi@mPTl3dMRdIMY%J3Wm@Cz= z?x=>20BL15X5a}KewKW*ty;P?6kKVcR8k3StUoA)-2qHr|B9`!_}a+Y|Uw^>JmH> z4`5Mt{fxI2*7JT!>fGwt1aYN#$?j< z=y2lJQ;oEh8*xMK2Diqb1yv0>pA&&?eU>-~020hv_0ZCKKAPL%4kvu^MMFJ5>-yR8 z%Z|RYA_40wBsK}qyN@={eS;gK@t&)O)APqtkX~!vc_;mb4YuUiE+yIdVWrXB_^x8d;kcG4 zL+L9x>a{MvhCkd%A;0*c_bLW$^(ISUM3vPAv`o9g2Dl@B2}t&;CEPsC>+slj-Y=ZN zIwGI<;3P!jy3tZu==hO%s|GyJo|!jr3Cj=%5Q8S!&tYwEjV2x3ui~K^U^*Axg!Z_O zBq-{(t2kiR^%y~@B|Fb)1hII)YebfMqd`ClEY&^$a(CA`(Xl8pISHfbz&iBqrqnXP zP<+%ZdrmCUEpCQXT}Nbx5_=zNE<&o~=l1C7=fDzx=X}j>mmG7AXrD0N>@L`C(WHbpjvE;WvBy z4!pgmVKQrW&jVAB?)g+aA0ih0ySYh6C-6r$6Z!Fp@Ldb3iz)Ma%38Dg>Lx)tN7eWa zd%)VG@#p^MG)w|E(&p?VHe3P}rcjS5^jyA9NPyy)jia}N?MI7|cwe4o@ioIfCxQj4 zBZ^6XuTnECA1jNuod-2`Qr%Led}B9U0|)B1NtN&CfT*+l5kwZJpMvutno8ULwcCl_ z$j`30Z|1Z{5r1%WB~0CQm!z_&33YgV2L8T-OK6fXX%3!)IA0eaAx=-0Yq*X45gT?G zg^sUd!bJ^fuz%E%_&M`wt+0_l=AGa}jy-_a^a5C7JX0{$oudvz3_#seA&EMA6BaRO z${KiG*DW0o@78S^SfIK~gjy-JRWm45R>r~xmRDy5=B6f}=#z-@$_>nY6E7ptGNuf7 zR9&P_Ir?FiPC)faZ#9XYG<}km-ps!lMeUgZLqIhK-P^T4-j%`PKYc3RT^M~zDg-52 zJM0P6lvQF5{|1p>+%-#r34aa(D-&!rr z!?s0Z{aLskdDN3=3o+1Z3-32gZj+8UGVl7x_@-q0~i1|H~hHan}TX#O@aGcR<@sSy+tN zdJ@~oVlWt(dKb&r|4PX@dpyJ0kLX|jS#Qghd9}A={>3(G(`~St6M^Er9~=Y#>_mU$ zAWFi_P3ysS9H=L88y8q$gVggT3H|dy4bIma8yA=n#l&^bRP!dnGkKC zIQEY$exqzh<^Ga>yE3QwTXg6v4XS^mrMK}9%;ZmgzQJayFH^?1yZlnaY~yE1DbvaC zb=)@0J?|d8g3>VM%*ZENLB#xptwSdQc#(cr%>YoSq^H$fBEK41_M--P05)I14)lzouuU2P!E!@-I3T0Mx2@b z!NpqAZ-YcX=uqh1wnRFvxQ~PM=(AB0xBF{Jznq|+--)q&Bhil-j4q+t`n1oCbjCvn zChl#Cexo1p{}0|GcTXzy6+O&J{vEg~R=JarUR{aZM^iFpx`qUGU7*wt93|7QgB44@ zosb?+UCD)Zz4Zrtty_F#+5IdF*ZXJx(wB9Wk(1vf>hZNfYudTUtpHvKoHQg|E1iXsy&n#q+PZ${XK}3N@5P?10w!%3C z?Njy-QPVr%Ji4Q;vx?clC(_+n^Cnz(z)_nXAub$%Y(RREJ)OiKG2UBtF=cy#J$ve$ zRKp~pqt##E*>WN<#bz&rjRq3;IiwOaz9A-JFGACPR%O*p$tdpa68hA&bhb<}>{Um# zki0Mxw{y79?KvIM6Ey`5Ne$6$u6RV_mZY}V=jgfV0_4`~ySmr|7ud{4GP_yL9;q>g(HGz8~XbpP7<1N3H!F zMkfC1bNay>|JBpU?MjvFmy6A|edRLa;nA(Hxc3emN|FcgfkeNiry}&~C|3SZNDn z&)KU+NsN}MI+N$Iy(=FFZHhJRx7g&+GS7&16@MgcERbJsVAuueN7jx2@CAd$5G=7YE>` z!h-ol*Q*&|*m+n>PAvLC_JibL@5~!DT_fz_XL~x?E|xIE%#aK(`xd1AMi_sZVU^em zMxp?-$6A^A6!rOJ>`_b)3ghpN;@F*+3hn>_Y5XjCJK z8@h2A)B%l4DJolDhL-wD8G$rL8g>uuQ+n(@GP2!;fiPO} zAwW_QT$^G4PY*eHmEMO8Q(TlhFlWtU2g4y0!>7Mpt6}zG$Wyy7LRim4(2}Vp{I<IM&i|C-dy!xpwb*xyxuzI0EVR-ly)3|c>S4BcuY0E zTXZ^J%FZ2t;LaorU8($|5>PD9xiZOtKFA-l8u4tplA3i2_xwRLcX3WpaU!rE;({Oo z&2rJ@6iw4}9B}FyNy6)21MKKSe6nMQRz#i{ze>d%;-lji*!NQyZ7<98CeSRg1=(Y? z+#!7ZS}_Dr1X7>lQacP_>ui6>MELp}D-m0M9l;fUeSsswy+;1Sd0#oZll_iIULZt| zx{n9I4)cDN@#j}f)d@gly5TXK8<1t@>B@0#(Xx3`h8=wbmYFaadG2hde;i?A^Tc@g zF9jLuPC^gM+3Vq}pwGhWk3#PBOlu^uYbQU%n=t$=3u;#BNbGw|WROa#=8nMg$FyPv z)Uu6Tl+>J76Y(kxcIpbejZ7cqqa$;BAUE<mdgR?LbDCd~LZ0pbFpV#XCC7ytt*h$sq5e1BW@)~&i9 zpXb}Hx_+_gndzBxcFs)a#t3~ggq${G0jrHS3MEGrS%-TtJ}n{f#C@jUiqGJml2CpWSYd8=4UL( z!V4(5^GGPkQdqA{o>@FiZy+^__p&O(zEOjwdg(Nu);^2{_m3XlhH^aY2^hd>C$#+L2emDpF!DHZtg0}Q0gs@y1?G>I5BSG6{9+ri*rVVpQnEIiij_wd ziB9dz8JrOyg|q^nq+EoQR?D2`nc^- z70PI%Bv-AcxIf#L8?(Kd+@NJ>Q}FoLp+1wKm#kN$v#A__)Hgf_A7h*J&~LWad0D?4 zE7%>|NZJ*040?vPp=rMl*+iDF=IL$G6Df}?YV3MIg;`^}#7J-gRPqwr3?u-Uku#7F z>4d`fKP!eFG-}ZHDPlUxL8)O67LB=Fp zaDxK)d+Csw5<_H$KV6Ikr*OC|AN8Msi zQ>;W!*}H>j&`AT6n>fQra2lAM@>p{T0KO&7$G3@Rs*@q>G%$%j)Gk2**tY(24~~WJ z2z;DvTl==duoe3|TBuZwt%#2@5uCx;FAXyg8HBO(P{!A(9vjP{=7dOcMiIjH=g>q% zl*v5$EXQ5dM#*~@eHY2kC`zlFy-iaGyUiCX&p@lmbphnm-Uepth$^J-EPkchZ?B;* zXum1spRAn+9=V-(o3}w7f;JN&$}$;5b&BL?6~6HdDqamrML2(t<6?Y!_XONqpnmO8m4W=6BJo^{Co+%U zLg@+D_PMPw8qBQoXK)3z2d{vQm#bgh%gT@6cj-$brE0X6>taK}dAx)~U09KZw^Pbd z7@Z~O6_%Z$oZ}%>6VKtxaqP-fed_YvQSt?V@x`kKf(sZP(-+*+cr3?2y~RMH!koQl zV<1-n!i6J^lqz79cD<1x7eJ_+x=5k|Dv$9*aura})FoD`fXf?w;qweS|AwxI=CB>V z#l0&~S_5+*87ZB@fmvk_)oTne>lPn35L|={pA`gEr?~dVuR4DA zHfg7{mif0$)0;ZOvU>|H^mTUp^TXcMolIJ*kVBJKDYkDQ!=q>}405 zUUqhBA7cKvsMBebW{uo5M(VlNIq^CyyTuWjO~rl_ylJav-Wxp%<~WhJDQ^Lfa-1}! zJ_`1!1xWnOXjUg!ozbBq_hCT~`pmeGwr|a3EWJ&90(eO5;4HNn^d*NaeK7Q0zYTRY z)VDRBs?VGI5YIOddnLVn70lj(n+8fe1%EY8c)@>QwGR%vDwO=E@YWLZMTIAD^Qzu} zK$X=Dk687s8~(!WM_!k~<$L!J*h$ZzdHw9w&`sc#ty_~Xl!FN0Vud}vC14J!N?DYm z&;CH@X3!)ntI>pt5KYBMKPR|^&WYck38+Ay`8aVUz_9fo$;mG%y4!#4eRAg$S(Ox+ z`RLEop+O5xX#G1ddpA78p~Yy&jdLFo!X-swyE`2lDV;e@ObhiOh@F^09Su9!e2da& z5Hvx0(f5bA{V+iH$rYjCvcmh5H-C@qFNmCIEDf7!Ai0c{EQVv2Tm^VuN;6WbfE{a^ zg@P+scF$i>*0*EXe=Y}@N`T>8{+eMdS2g`!Q!ZAjFjc`w)Or=b@0p{85&$VzGd_yt zR~3oJ9myvhDgckkP;DGkIU=z;D7o-vilOqVBEgb>e9RRC!8MFz9fA!@vjd3|hND8Q zK?n4V7Ii|2s_F4+_yCv!Q-2zLY&u{)SA8hg6mH!IzL-foTKOWKm8iXz1EONgsL*gLS@R%JR9*m5={g@~mL3 z5acPYp$co%8QgnV%bE{u2o(U(^Cc1u`(x#CKSml#@)Q>g)283sXeiH9goI%W^4q51 zh6%vR?&xvF$~;97mmkZjgmMluM}+(k3Gy-Xk(6y_5&-;~#l65mb`WdH2KY?HbewPI zCztBPflcg~JD9^S%zzC?)o(@&{I!xhh~5=tiIn+@kk8`SVy`Lcd7mObUgJq4aG>em zljRwDMIL2sKQhyh@2@iM7k~?iSiv)v6euQZ$XZIFCQZj9Bxu9nm(hVdGAm(}JENo8#3zkB>-fVb`G!@ zf$G>w?2hXll=^}_3%c+Q@>6F?hoFq9%=5?ss829DU$@pwt{S9WoFY`J$c(OlHM|hO z_icHG5&*K;K9f*}MK!~RE_@Ooe6bL!vnmWf_$v^FS->c@oGFH!(_sOf&*CgxA03qT zvtEpi+;Nr79Tfnra(f4>zJf1{r+9P04G>#1swYaafc&JzxJ*=-y2*EiN)={@s=TrS zm`8WcL(J(!MacfpW@`div=;_mgH9hfZ^oxT09T^(3fm72(FsVmYXcyvCn_qb2G?ru z!IjWStcgwmLb*brtH~cO4izfV##=BRJ`k>*!=Q;ZMfM!e&QvQ2X{8j>^fPwz-cs zY$^awA^Vj?)#u}Qm?<;RN4Fx+R1S=+_@V+51Td=`>kXBvJ_}r?8VE`N_$_@ek^tZx zy#cncL{TwE{x}MRaa8`8AtQ zZ!U0%|2g3XwoE6bt{k-v$5Pj04&N;n#}|6byvAU|07(A*MO&mSRd|msQsX~*3>&p3 z^v(Nl>iv<>gR zxKi8(F#B?|p#*^J_gL7POwl>g8>wn-04zB50w-1%r3{*gN&&82$a43z;6IW4wj$wx zE6HN|W50T$-?#G)BBhE}{gZ2A!5z?Q6yU`I;5xZa70d4^vVKn{vh|q7mI)=tAqiuU zvE5v-+IWO_p~!yX4?tFnOsNKXf^O=%iO>;3htt% zaUD#l0Dgra4ai5^cZPEOk@nw46c|kII`m<^zmZp2TkoA+*2eD)&oC(e$6gZ`8}*u zuo%k$zroL`ejj5G zbV2;T)I~|&DwFH=u3_atL2+!E@t-k5CE8_IM!^75ip4DQj};3Z0Q2j2not6OrE`1& z4!|x8aq7-}_$4d4q)SgBV|YCRg0-$HL~>Q<-MWKdGslFB?52S=1|7NA9Gq>yoUg%U z*$m*B1JqpY04o1fh?E$`m;Ca_nbnOmeeG~m48ePyf?8Ehn%zlA*&KBhr&l+z$=L}z ztGjDmu}!apt|``CE&q-NweF}I(zH89%`+mbwLJd&@$)f9^$y3LdeG^S_4Zf!42#A( zOZA^0T;AH}y-bmpY4Tf;Nk@VSlKbp|8>mh9dgzW;o)yc1O7Ye7f&shRS(j7!W~@;8 zP_ZrJFptk5#M#Le5$KD&5tiVIMVUM8S>t_$nUO(aVQ?LJ@ra(#K7&YEw0VkRA5 z0{5TpmW$f!d9t!kYj6^R$VMa?5j@5s9~a={i0kg+C%-zjLEx0!eZDK;Q0Ix&mWU=r z!3n4I?j&~V-va}&k-9Ay4r@D-Dm+%yDBWzm@_o)Wv7}iptjIScj5qf&E?LIdU&)3< z5YU9}hBePxgxn*Tg*ETub#RB>I%0mas(|qste`!`0D2O1igE~mo}`;nbU#4RU)l`~ z*lqYfC^3$2YYwH@1N8oMNr)YS-aD_@U_$`&q_qvUDFA);X&4I1(Rq%Rp1A~oOfwT{ zW$MvcKWw;Au4)>fw*v)J02~Nz5elB5&z2`Aaok}Wl&R8xK2dnTe1as(Pv2PFY3j`V ze$ji9o1)xeT6s)J{5S97dqjr8quq@V{O-NK{Hx{Pd+q-?Mxhtpq}-7B(7ip+)WTAM9WRw&AQ zl^b+bt$*9SwNPX=L6^3=mk+O)7N3+pq)e)FXY=R~k`u#*CJ_A4@H{oM7Fz zBEd67$*(IKBy12+N^eahes4?{N}gefTb~cZxr>>uZpStUMwYX|4CgLZGj*`3NU6e9 zZ%czj224TAIY?y0aJ_?}Yl|Vq?lpoH;QE@jV%jNV!E;5;VeWW1-i6qa26QdL=i zGa%NB3!C93D*0gwCD+d68u)LL>RE!jux&tB=AJ%KEO?2HZsn z#Foit7vO%!6eI4!MvGqjOufa1asV97T_EsMk96#L$G(i$NRHRLnCIk5cbPaX!T zh_11cMv9Se@dN1&N>14@R3vz%2ni{6qsg&DNknC2{(U)1Hen`wsOqt#PY&3Y%>Z1B zS3;=(;N6H!q2v`7S8>>7nX(5N$*UB;-TGWg{&Ns#QYd4oBb&J2N~ly(S~?USy5V?$Ukl2N1aGjmxjULo zBr0J2TPz9yzf#&{pahUQZ8uWPzeSL~Y~xAz+Pp=Z{SKJ4WANPn)r~Whzg1Yr@8~K0 zUN@cix!Nk;LG|ja!J#CpruYCSjC6)!Caai;w~EPyA?5w7HZgSUY8-2>+OehiAO8lo z2F8{x>^$W-DfNVy^w_^<8s1#IJJExo6lPH-OFBUGgkk8WUCA=eCjn8zLU`Y6F+QgU zf2n2D_9H~=`D;$_$*0VKbWHXl1Ch+(EgVf1^0RqrEPtm+FpwQM#xYWYfXwx_%DawXQsjtUbvnaL z){+hTv;rzQJbq0CWSZ-YHz(0*s0O4Z#yeED-FZK_1U$IUt^p#!d;F#~8xP?wV063s zr?L-0Pgccj1Z_97?dQBWs1tiV7s-K5GY;;LD}gCFi$WjVhbV)s ze6MnQYV8{hZ5lSkz@<-wf@&M7oQ2B2&B!7;9^J)jSw>3C z$FCYc3!y0p6!g(>5DID(S^J%}i(Osph`I3>zP|yipoTjMKTKrj_{hu`ijf9?KM5r@ z_~~j^V=LAmoK~iL{fAHq6u;JguBo6Fz~GH4T`_uBe}*n01`+P3wfc!AwTd5|cZz&; z??<%t^n?yWj1Mj4->?)UpyYV%@Qq!Z%qle3J^3AQn>zSd#lZmTg;dX!g(6l4o@ ziF&jZliBSY+N)>HmYx)G8Y{(ffBy_C8-AgA2&$N%f}>L$i(!wm-ESnXRg@Su3_Yly zl-t@2ZkJ{0^;U!b=pcf-)3L7n(KAt)20zfK46dQz130dcM-(E-2gPs`e$sqIbY-AZ zVD=LfkHPukk92uX2UrP?vgC{$9K~o0@g62rqD`jbkN~M2@3wA)%5et3^3ZIt;3JwY zz!^rO0w#P4F_Z(~k5u`*T}L11Zz|>lz@}xVjg@FhF}a7M_yNmOn`;pFP$c-I+D~un zPM}r`2z+w^2U>yd=T(w5Fno1Acz{%4A+=IBY)}BoF^KM{$E)6?`jS5>y1CM6vjY*o z$+|H3W7eTXe7#3bICen<1zW{}&-e+0=Y)zRpA{tq|Jj2{z7Y)53!CBJ9*C4xXil;@ zn{BB4jATFSutjZWFf<79c&yQ?EG%`%(|ko;Hd=fbo0$z+XojzWqz)?`u%`k1Ffe~# z{xOuRFoitCqML$l+PZrNN?#sKhrY%5k`I({2Ic)?f2 z@Lx0W!B;=N33gVsn&O$TWT4-xe3iwJ9omFU2X8VBC13G`7C!z$IRL)3&Ji47=yhET z`QQM6)?sizI0^#ADpR4V&r1fihQDEyo+w%*Q2~uRsv*0h5BtG1q!9x!@K!l^SO9Oj zk+7f?z_jCIP=iI0H2}Gxh89}B+pJrBoA^om-Z;$IOiG?ANWOyYtzSw!=6OG%@|z;W z_M;&&=TN6aP_GE`-I{)|l@j06q9JpY+%BvAogDoYFi ze&}{r6jA}^WgCv4Dy$?UW&mz{Jlg$NEjR;#nb7a4Nbnu|#cQa@Nb(&T_8eWyPF=SB z;V|&T>>xv#DaQ>v4`W`YLDhz?e6zR{&;f9eH)3x;krEi$K@>d`Gy;en2N_M1!|;|t zj+8Vi4kORcaNE;{ax|tzXKX<|6h%$zIjA3ecEWgI03y~mAk3R`z)yZrpg0QXm(24r zm8gKVZ@^I4py~GZ-9kAqY04G0Q~*=A|;6P(-yU$MhlM3P~@YOG{e_i zHul_6Y$+~Sqm#DKEOMDNpJzRV@@7TF5f*v!SeqKT)<_by|=8O_bKtLuo zzz3zGv=uICN)=%7#@$5l2SCd;m~1?`3`?({>bT+-^^|1?K}s91S_vD`nf{=7Qwm3( z0ARv3JZ+^C^kCaLCRqFB(PsPT>C6bl21W@NI+ zWFTWT(!P3!F=`%b()JVtKi96Lz(}7uaO-JX)JV}+pZ=<`i?2SCnLJ(C)s}NcR`i;o z+XpmgQi2Ah-YO3?khCb6sNamw-Q@!J-qJTcXiNp+ebTW=FFMwrk@m8B#$!{k`)qd8 zTzB%Z%HjBETJof~ws0w|N`t(zc|K!aTUj0Fk5Lx!4C)*B@G~J6SUQZn2z{&2)6m`npP4w#A0Qz$L zG|`rPDi&@;;>u2zG-I>|T?s&AuD{RU3g2Ma73AP_W2BSh5Q+Nmt#YCLjoI5+gl$i7hQdX!~W@`I^FAX!BDO zdb08)eH~cBWvEbN?^8>XHo8hjIO@%nQt>FvF?I?|dd~_kxq+dB`&o2wffu>|97DM? z7qWaNd}LGlW=(oOU6XWIu*i!%>DdGh9XV)EeF4)hHS(G2qb=QcnbC{2>OGe0qgyMG zt~#$t;)D8B;HyC+23j*?sxy$ObQQ;EXRfLA`WgHJ(}_k+U{}v>O`3ZqJJ&aOd@U<@ z;S{F2)P>0EIE$hy89KC~7cD9_EG{eF<<9tMOGs)6O%s1|XAsH-;UjoA{1=!>?zStY z{Gwt1gi7G}>F*#d$Kd1HRJ{(uIG5omPTQFYS{1|NhV=5#I_ViMdr;H$`rYgLPL{>i z!(H>;FZba2HC!;4W}}cgr%Xd-O67X%ruEh7XDDe^SR+pOn0Q@@OE}f) zok!U0US9aNTNOp>DYGh|{%A!ocl51PVp`meK&8(u>Kw~oaTUQw8TfqvsH)%{z*0_K zsY7ugMb`ZFIK&b+IO5>NN~4jk+35_INj$4@Ni6xRD7n|i!e`KJJ?e=sc%$AFTG63P zOM9$`qV=02wDX{-ztPBC{uih0JXZ^$@~@)k-#ot2?M$$cT!s-(_k=2xd*RQu8Qc%k zJ1u1MQz2CS!^@dy90W%_jK8!FMJy{YcNr{@5;Vzzk>bp$3YbME;B8fy)03h7_yCNI z3;wAdfQH5vGbNf*m#AXPnz=5Jg6=%gcWMVkL)Y&(WO+>5bd-D-v?)q@+8e{$@;>DF zHV`X+(W>vH$zzxU(EiBV6hWOly|ix}zpW3LLE7^BMzlb1ihdUmOLiF*`J4=R44vw_ z1#=J2tzjB>t8*Ac93K0z2cPe)R5Mh9WNM$^;0xLn6&9r$Par6jzC!r4BacbFhn)P9 zc7+Q|w(!n=h(0{1u^z%{%9CgL&5TL9k6N1Yc16f$fzYS=HjfO~45XrE-L!R86!B7E zlT@}VY6OIDZp$uQ{lj^OXUZ}fra>)*hnvux2gev*(dV6Rkl^9C?-T&?V_L7_2nL{i zCRr@#04ot&Xe5$!C_+}ItVbG$Py<6bu)GiKI}qP_tJ(a_CtbMWF=E!h(b%OtIM}GP zdFaHS*#jJ6GB6`Pf#FC;pD9!CK}T0-=Nf0h0|db;GGJdFzvH5ajvY{|sbK*AQZ8 z%4bsgoWPr~;k#(_)sDk^1^xMDXRiyK95JEw83jZf0Lh0x8YopwllPnz30Qd4roG5N z;mQBu%zv$AfnCW*Y|+rmd^LjboFa3>!tEAr4C<*r-3c0O}vU+nOP=%stg&Ii}>tbbwh+ zM&rjTlg*T@qLP<-dWEa>hE+1vI$~|wr8z|^LXH86-(Kidvyh$2DIKet90VpkgU_&% z91`^f?4pp{7fE{4Mu(c}#ZmU7wfkF}QsdVf z%s1B&D>+3)DF#{;shexP1+lEp-$EScha%N_NbWh<2tewvb`TCv0Cz>m=v4)vebp)h z0k;T=Y#+ZjlW>cY`LZ>Spw0P!HqR*3yQv2-?dJy+a>5G858hGD*b9|mW~kOw`1lAtKWLV z-QZ=BNT7~4*nB7kXQbK%Ms_anolpW4|MOPpW@13?h<2S=4vfswc!G&i)l_+vXC%-7 zW-SXIWO3-jH-pslT=tqyIYlp$$IJ45H7sy_c-!za>>l~BAiGJE;G%ue>j*$mwu#qyb57*3tO zEU)_fj)lL>thWr0t=q0|7g&@&*YVjPv9$W>i|$EH&`P$f7?*x2$vBZBwWLw7z_`C5 zSzikLt~bt|c4RgvV*C<`in{(L?_To#V8U|g*Ky=EGVz!?Nk`se>y5IM9G*7x3{Ph3 z3>U!bYD{V{`W2o7gg*sHVT*yQzdWH$aTkiOL!S-)inL^M^$ z9jH3dbTLu%(iafAftee>0LK`B1*#}~R{+i{p(8*a*`-GCDV`V}61G{S1cqa@>5o{T zSLA!>gn~wkBBViIz?fuxZ$_F6;%D zfpGN;|JbrCD^3{+1Zd2@qyhCdR@NizDHuFFex%nPkwj2rJ=V;$IF(IOZ3RW{Ptp3f zY!=OT`OCaHxeXTjA<%-UhG#DNjlxuTLYM0ZJxB(f!72rDIv#$V53=)S0Q0pF4ov#! z)3b3c>QZ5pKjLQPD&SkB4z!Gz^iIuZ$QbI0JA09r)`o{VQ09Jyi^drYpOID|R;oJR z+!|{xFu>cndk3%Hph!3W#lY^N8qz3Vcv@ak_cml(sjO%QMcdX!NEsuFe7^0baX@{3 zdD-f?`|Da*2Y!OFn$h*hObH^gXxH;Xfv|{4arTXepN4u?%S`XQ6Vs%|c_W5X@Py&=psH(4C zg<&0@=OLbe;>%2|PE^#|aRpjnEjYi`1DW$L0IVUp=}W@kT!h{EwFp6dY>kkssEu*_ z=+o(J*%ZW!I%#S!vZV;mcmQ31< zS5U?|YSg^zHxM3ZPgi44YC!1v4Qa(wBVkZ5#7Nnq2E0l!DCXH7hBXj`)<7@jG#;e; zoJV>-Rg>OOh-v<4TIL96?EsC0os8^Rrx=n1a0?ziG*ha2=|pA<1%^dT;(J4XLy2Kg zxrjgaHMCbi$r3b?;s8Ke@5l!R0;8g=U$^mrpEklf2**sFe~L zO&}j?1IIZd{0bXTP+6`5KKF*IFCBfp`HqIF8hw-v_i*W{)`G34RP|Z56n+TfqQizk)!$32V zfIFj+9LSTs{hlFIf)u~6g#@=J=1pGu58^9;W-febOwgqHb&a`11#Cn8AUOb8|M*QJ zr3&MGeG-Z+0W(7yX(mwt>U~Uwa?_%aMbB7E=X}XJL{wA7k8FQJbXO-R%^_9@ZB_7K^&_oJLApUICj*>|Puwcyjl1lwQcNe6`S zsHjyda%h^};BB-^pXlx-^3nJ{|8=B=9#>jr->2AdAX}Qgo*~H&duEfbko{NA;#a#z zsx?KM4u%3VEdS8OcVYVCh z90N8}9?p3D1R*ispwGw4>6*0xg`ChQGyOR}4Gku>^@=O(JsOksTlm~Pa4nUa7nKy( zGSqm_0x>JW5T-wXKnskZN)^e2q4hY?H5lHNc?*OBi=rCES?t$CD`14Pz*j3CV~PS# zMV820tIC!Dl+4}dmcGCeQ~rXEUIIYY=0msxu$t+Lwfb^ZQx%dOD*-V5$4i9*t0G@( zcUGYZqp?jYl2{dO`>?VDNiF{WfB%a&uyW<%`7!^CasQJceerM5fB~fXAOHT}{|_8E z$ZgR7gZsbjZhiX>AgjLrlS%%!eOJb;2#L0``ri)!|N6MJ)~3kapH4N2)c^bMD>4{5 z^H+Qwp!b|pXlRvpZU_<`uG|>yvR8M;GUfE_Oh^^QkDu8u(0OJ3jyEDgFB+C{lW#e> zVQa&0FRHdH!QD5+@Nl7(LbFVLYWc=$ONK6YTiaN!EtxqYNj7X4^0?OCNb(E;Q?og) zkMr>u93vwp?fTEhZP1V#TSofCGW5l*#3uZ4TuZdx`yu)JF+Q^0v1Ql}o25&pZhdr& zq3Gm=9yR%+gBJZ-ryKc;p}7HygSksOLVD!*q+f1@rFg&n__C;=H+LF7`k8ez6g%y6 z&&!QBLvNE^@vT14z@Nve#JeGuf2MUxzORmw8QgR^hjJeo!92{Ym@wmrgQ^~cGxBTI^?;jGb`p_ z-n?`c8HKn1^Nj2EYg?GPBefincHJo!lAUk;Uw?G@g1K4)QBymn+nH;1Nu0WY?ena11HG?VMfrDcQL4f@$vpRhjr z^4@7rE@|%HtEahemqy?U*?d+MmlmYQ4`};j;u|G56_i&KYTmk{_I3E9$hxo$rxn+BK;-%XM)U!M~(W& z+%xmtf42r5iw%6qBh7f1qnrpK+jLmWz~?nQs`NE`eAVYq_ZSC#!#|&S#M)XIYi9?k@aL0UT9tAXQEa` z?nQ09CvyVT=&k;~iM1J(kFQiW`2H88Ms=NeIxD}u9JFa|F}o#QjVf(=tQ$6Zi|(^q zU$pJ+sgbWyV9v4FCv$K9IFMylqekZXX&tNh`DLe;UX9%NNsW5%U0fp?(A{%x*T;(^ zKC98JZb6IAhkTBlBp<#z+liO;}jl=~!fr#gi_6`L=%9k@eR}JOcs{BoE!I7(cD%B2%nB_kdl$*iADcBI zx>UFJM5-1|8fM@!Zr1hQQIA(=ineRfikGvu-zLRm?O)l&_cOJq`m~EnZ*R$&$%j8~ z6TH%*J=n>SzA*P4BHO2!*48Zx!V_}D8gdb`GM2(x~xMa$1BhAkWOV6*Sc;6<+- zwCVlJCF@Kd3x@7LH+q|BpfM zkHwIm`WpM>j*9}?TC}NeM~Y{~G1&?$PwkY4raJWIMC8!$WhUeGp8t16)&~ioPN$p* zP}E+sHC(wxA7vWs-+cV5Ve+QetV^Mu&f9e;y7$T4NtL0An$;6Z`|Z@BD>JflLqm*~ zPwkbN7_88tmSBNMRC!X|>qgtTzAtrX*+GYsa+*Ia{!T_phvh$YflB;;v{$K3%jXU>caiyDdsjdIa)+>v9*H*?3-?HtR zF0t*`nBHEoutHrD9;0_lmmJg70tO0$29J{-6I?0NrK49%>$Z&n2YghEf;)}o-%ANxG$j8y|eGW?8nZw;QQWf zEC;=yE{FTpJ$hd>v+X`mC7_nF7mlM3p5Cbc((3DdHGT5EeBnZL<*cE$#fQ6WE%a%l z{|}4t*qj=U(~TI$oQ{cDFOrtduF8j`a3cZ5E@e;RPOC_K%y%M1%#ggxWtZt;-I+l=&*RZaLpSTw>!m$+P1?DSa{He=N@w+HXl<|ER;31+ z*LH56|K++qUFGd)-r=4SI5lgjw{5pRNsP~rYI-yL#i#7i*C!en(C<*`n#ETOJmMGD z8!s|6pgpHeM{VJ(SrID9scLXQE#-h(TC`zbp?1oa%Cb=glzH@MkMVISHvK}z3@rCE zpo*ZO{r@Co^sPv%9JMFffG&(5ZdxDayJwuezbFqX$aB3G8a^>z^5;PRDyRRB8&HoM z0TvlT&G~ zy|Lw-+ngj@Aq{FjxbQshrzpxM`*D9nRWEx`EeYz_disT6J%?aC!&BJ^=m6X+{--wQCB*pMnrbK=M{TRbMrNA#ty7|>jwsGDa(UZa%F=b1J{yq}eFiEod)~PVInEXp9tFu01 z_k@rwp}RE1F<^LQ+oM~JI=LD1?+-Gh8$-+cK8#xT)N$HqeznAq zzOTsLlW(PX79Zl3&0cIspVu7lF`0Tk`N5gDHx@)0l0LU;)_CEEX6x8Z6(;u$$>Oh3 zCuusQbedQl@lZD+KZDI%t_Efs?o9Sy`^Daf7A{ig7SCD{8noeD=OK3^iu!NEQg#1d z)%FX5;{T2{BKEIg!`46Zju^A)B@-HMME=t+<@`Cf$aCb)kdt{UjL5=LEjDlA^Ev~I zg~>bC8PO!xroW2M-)3%#AM|F*79+~-+FtcwX5=f+2eer0f)Nc|_vq+{h;J^Z7shSS zD8YO^cQjr4S-?BhR8TPv4a&pc$%k0I*RCe{!N!g_2C9{iaf0#xZ)AF64JEvLn*6CHVy?$bjF-1)G zo)g%0Xldf1y~Sr=8I#1{w;*fDf_)#hO}}SeZ%h|v-+R`0GjH~T`Pcu34KShB4F8-H z_P-3cJ)O6iJ~p9W9>bSDTPdHG@kJ7``nL(?#7^SYo!EZuPS(z|ThvYIsNh5B8tv6< zKQ~;PEY>rntM3~0rVOzBoLySrm~LlE6Pvd`JUM5_oX`x-?ucEc#H{hKn`X!hnNlz_ zF7}=&IRuaFtZMLGVD$D}=TZkV+HrW&%bTMXCmhS#*|gcsjO?03Y{Eiyj>fFr)iD?k`w=Cv~>zUi*`$g3ah`ckVZLMR?h5JB|9RbThJI z-QBE6`S|JYm#iiGKbesz*ky>@kMI)x%p%`~uI3bWPAY3zzdx=tzWPl22y=>deX*wE z`}U`sc+=11`k9mG5#H|8+vLlZZaVgGahf?r4j0+&=&+5yu78MX|CrM`r-yfz7OB}h zb+vk!Z*4()j6>Ag&RnW9J+UTc$zTgwAG)IdoyusB!MB#L;E%VUz*XKMYch2{mZZ?$ z&XX2Yn67m+>t^rk&Zdsx{@jEvvMk)O`J81rEnXyM~>A6HsMA z1;S6(U;BTE8oD`j%GG8IG9P@%^LtSH%w)S2k?Tw>Y4Xj{rwe;-SyFNB^!a;^mK0t3 zFh@{0b65Ycu2(sJmUQ!9&$iZi1NL%Xuht;^nQDW$NA4cWl6?2?~1a< zS*-lidx~CDi6uGejvS|JJ@!JN`HCDNl2Yv~a1P|J(%3&{!i&(VCzj;@VeT*6>u&!n zFYJG}*wu=RzW9DScI319$L-IXPYto6Q%k?HM)dX+*9?_-^c`Z|7&WHSCmM_S(8mO&&2XHtVXR zHT5*^oBD6`_pq}sC!eJe)@1&3)1Rza8UEu>On=)p&YHf3CHU{!LwZ@v$|Dk7af9 z@;`7)9Qy{be^}GQV+G&Fd3H=Hdv7pkjD8P#`=#vG$P?MZai15Nq=|aa5dX5e*q<*; ztwocz>J08dRXOK9TRPrKyx%+U-AD8w!(A!a2mY2U?q85$8M34YS#30XIE2m1Ki{mA zosr*zHZMz^?0@F^@AVCV+SWa6C|NsuasR#{CF?h)=F9zTsB6m*U->2ZhwOi+GT+Rz zq4_=2mA~e{$?4PMRqQRP4Lywf{qD%<`{_^b{@GoZYC{w47oPWCuFu~2lU*6lwxx>o zE5_OJ?mpLDuf2JfA;c; zI=!#XV~&q58)-{h4^Dm^eqgm0_4J8w8DgWAjgY%K$<*PVz|9gSIPn5+zv>UH`KY#Jp%MYg7(yKD9fO(3!2R>h@ z8Tdnr{7*M-_^;Ze6Z=gkaeGCHEsYE>dGfAycDmZ6!*d*dqkr+R(Ac!T%7UpgDk6sU zq!TxEhB&-E^LI%9OpPhwJ&7}P^L^_*IsuCZ8p$v3>`9*a>3^Pl+81E-{lLQDt36TR z!s$}_r6+2BdH4UgsoBxR6$iteHc?V{x%YVe1UourvOlq^aAjni+1qa^2kq#m!EL+D zf%0BCty6ZrEU=@P;o~koi&;@pn-_M+>9-x-=I)$hx;!@J&m!NgYxyt>RE+Cd=9Ur8 zeNon>7}Sflmd*JcA7S!tT7%bFlTE$o(~^*#o-3yIJ8ISAMD({_#CdN}HNM|jALpv= zU-g=Mk>T5)d#@?(CWPe2ZHwU8)2LnH7n?M1Oqr%T=(G#ho_5YmneQ{c`$WR`xl5Fq z_B5_x^YYgFp3eiN3oASj7VG8efPh?$OEQsUOS=RCiUxkHk|FBqvb#Y)=ge) zqZ_bme9S#}V+RL{-85lN=aP!1XTjXHQ3D-lXvEOz2Uip@mr819Sr2odFBi4G{c_Jv zk9Pd15R7x6pU3}3+XtuQXYak?Up&EqiU)o%yRFVsS{&K#_4l*`h23(?xU#_3lQxA&%#^PgS!?68RLyDZ$1osYj)2gRK&>C_wJF}XEI(HrGF zMxXrtY@{@IHX~Gj*_$FtLdvaH59%ks^GnMae|xr$1J?1c$se9BDA;j`iqwI)3@}{?}~AIMVh#a|Sryx1aoj$K&r_?nwUs<+lyI61zy^ zXXxG-=SV{zxb4_o_tA6xzlPiL{f=}uQqy$XxwWUiUe;}&P~u4aUT!!oOR9K~YBhO# zaJ3_i-@Q95AUQPh`HjK%$9{37%6!-DHa)spbZX1;N^JYkKEImhT%~p9d9~}KpTSAp zv~EjCvEILLjcNXB8l(HrW8bxEy%pMBO-9mwP1E|&v_U6h9!sxHj@`S0b0oSCh5cTi zuycG1cZxju0JFLeRj7{*LyZ8BknA1o%{hH&=aN(31*11#Trzgaob?y`kgMqOiwlFN zPw8yPHM?Kbho0vJIwzjqF=@b;QN9M2PIR?5-!`Ow@v@_q!+mS*ov8W0%#9I|3F)`8 zE`DoucB0q*Wdl~uaavuPTBoTw-idsJgZfvv=!}m1IqFK)Bqw_FC-8vmxkbvzsbgcd z%y6O}`I?1yHeM35K0aRAd$AKW49ep^`#NXC#9@aI#qV>Xy8|EIi{F)>88&?$NAbvs zTrK+qojf(l?rc^_$8>dP+IeNVmQpYKxxe>y53Z3jxn6kX{vcG%L|gu!@d#wmDB5=F z#MaD$=t{j4?DLDA>2J>aS#NaqZSHKCtJb~5ndTI}(AB@>uy4imxo?I>IFomniw$3U z4+-)@^XQZ_rKR+nwK_YVUGK3^FYt#my`LbTG~2|-IA#a4)KJ=Y&VRPb* zrBPZg(^Vm(59r7`n!y8PkND3AHR2m3t4cA-?$wZpRy?&s{k8nvK%Szog89r0mV z_l&~hR>5B)kd)i;bRMj^ETdA*(O_c&bKAHb!I_?{JIw`l2s|Z$4+4lw3Y* z?km@=CE|Wm`gZ2Oid*kxhdZZw2p#*8WJ+z_Z{4*!=J%=gy5ioCb}!6aZKC`1rB8=J zbgHBu9h(||VHMx>QrLs!#^v$-XsvUuwmYZbT2|5fu2Vbvkk>w245_9x?wk0<)~oik6+?KfCBu0LfQdiE#hUV8;st?=M@zy6dc zU^->{dWKkEsCl@nrazs_ikE%b>Z?;2zjUNj+m$vq6b}xWqIO7qbN0uzJzVKi{Suq= zx+^qa9ys2!w}UJ7*RpOsyy(ZVEqWuavcp{|K!0`X?X`;@jF=zlQjqFOfBqDPdF>nW za6rLPwf1eU#5KLQQIt7+f6U}7Rr^>2DCqIOGfs6oGmq|ial(7x0Gg4wufL8<*n(@( zIp)h|51{jEtA!Ku_lD*z%<%KvG=Sn>T)40=V~1Gn+ltdS{|%t_o9iV0vZCDU6EF1G z=sJ*E3lD!9a_M$ps^tT#;qrmBMak#iZ>Z@T`FQz1%?ktR$Sv2S>Syn<>JIv}^uIrl z=IpreCB2{9$FOw{O%v(|Qmt(C_uZ1|^Ag%lZoI)A1kVc_d+XrdJL<=KmBwxzMAHK1 z&M2_jd1R*Pj*69~gXn(5+`_NXn>Kw|S1b*GK8VgeIjkA_ff0-je{xn|%Z;{#dfnW3 zsPo0J_!z-PZ8y4jXmy<7r)hz;udjRjGIgV%`y~dGd8JS0KC1Y1VU!yU46!V_6+OZ1 zZiV3!>HaUEal>K9@7pooyaunj#zkA_UFYtpC~+f~6LC|VeQvEU$}3oCb>EHp z7MeAxEuYBR^>5KRxt=@SOgf-$HsHpB1j9QITTI>Q^2qSl|5l6lmE4>1x!Kd5`UYw| z&QA5q9%>YNB6N&99q=j+d~mmVmcfu8IsIn2)86m;j+GV9b_0!?*zf7-wCL=eubQKnR(&r@w&XL*M-8^r4!2XID2iV| zX^@gqLAntX>Fx%}j}AekySqE2ySr2A?vM~f!2krLJEcDU{LSv&+1Z&lv+vz|&Kc<# zgsEghD|8JcexN_w><-=ks${=fml?*$52{lJ$i*cOY-dy~e_vSg1KmFHje4{H&%#f1 zGGZ?LP#Rqrb$~~2>NDQm`XHDeWaD3)5+A?#is8)hI_?8Md^#E<|Dm~tETu*jjfyD% za?0+RyuUTrTnZ`*Fo^|#VZd6jz4@T7l*tE0i%b9-=S?WuE`EO9Uf)Ig@1+1Rua2qm zT-b82;XgVF6%l~ox`tV?f{i0Bq@dbG1pz2q*M9kU9Q5w{_?^vh0x!e z>R%=bL8xw%<9*g0>#BBfsZPW!2y1^@Zk-d`FH$sFr(Vkl!VP-bOO$X?Q{&P#G8SV& zAlYdBR!MX}1y4@IpJ*irFL_;6uGoe@;&FN5$@B;UdJFOy!U{>nN`j>YXP+SSD)nU> z_0eo*1fzb=oDl>w;=JZ4jO)kFE3(h(357sjkQ1p2{ZSP?+t6&mGa=x*>?*t^znrSj zltRwu7Xqyk$?eBkif%IH??_PPgrF69ztBq7Y6d;$M!HJrKE4EeetY2#7`;&~_JrU+zFiI4LSbJ06zRd$V>!iZ)KV8CLe9abi zImpNRlk05h=U-viB20VU7oC#mSMhMz0Z{~KA8%upelt`0;KG9QmP7>dOVrw4jMFrH z*y_MEmlJ`WzZBwo7qQLWEu>bRu?;>!}+r;fFpUm}C0D*rI zT@dUB&l<2+fLyf~sBGaVfXQOMV5(Nw!WNDxFQ;C`D zq2jb5Q6Q|SMh>-=eet*DKx+O_6s*2%o=FdfaWH*cyI27+sEovV>#T%D$j&FQEQ=%t zK4zl4Vg)*PBa(mP_OQi3?6Fu`?dZM%Pn3T&0ihTOw3kK(=#%pmeH(PqWE6uKQs&oU z$tDj*)z-$>JjEaiW#rR)Za%`=JDa~@8DgL!^;K3R!eltx^s!EIml$+zeq(h-8W(Hf z&i!alEDjeKYh$>*>~Gb=>&#Ku3X-tv$`C>OrpB6FHplH+RT8**ErZw!kc+=} zSupKuOM>CIrQ!Av2QTwxrj9NfNw}u2q5k_xwMB|ud`{g#5)!B#A6}9XBuYJPgQFlx zcrl;BHid+&+jWYfg&QgfRJqxy#%KR_9!Oq}2q#JcCZ~zT3cgw|sczHy<2FgC;$%^3 zjT98N6#KrvGc5_|G0avR2WVK7MPDA8tVjZy!^IsBq0BgXr^J@`A4zbe`+7Oe3*kBu+bt;4 zV6^xAIW8w-1{0xw0t%Ki3<+e&l+O7-?b!+E!^Dw>hOvLkx?$|{tM+{n{KV4mOXF^T z$jMXXvYp>i;i)ueb~Bzc2n1KXH{o9Hl#qr|)fdc0`&A(%&bwY+|4BoIEb9?rfAs=}ICY1lA#;}}cj4y!ioYEIp| zXIA%v%7;DrC%PQV6QnYbs7W-c@9RBUft{imB_#tj4cisu^_-{@SETsHwla{FWW1A2 z!u9PN_G#U)y$ndM5z3Qu6UO-lCh%K!$N;0;f`X89TJp2nAFk9rG7zO5__mcaR)*}L zMuhjf45Uvo&=Vr@tDehCMrRSr!p_e&B%7rl{c)D08HrD1p?D)Pl9AJ4VopBrRlTGv z47~0!>#o4kHP&W|vox0lGm#a7*5W^mYFPGYE5owz72hP_lKa%<*GLf5EXcx5VMu>I zosx!q78l`t8X4HWBFI=R4=noLUqu`IQx+-=mSlk%;->=#V9gFN!^^qNr`ale6+usY?Bi<&&VeM$20 z>Jc|9duY;#yM{dYaSu3cueldRc2b6B|CNU-YAp`iyj;XUyWa9~SApzm9LtmD<^@=kS-dpL0k7x?ZX5hs6Xw4Q>-`U^-ENFMs_8 zkE{9>rOiEq<6kMlBbh}{s)S@D<$Nz}+jK>k{XyqWXN%N~kCBKdG_MFQnc5WrFWxP0 zPu_T>94LZfbq%?pC5cEQ-J%W0g(4KLgxlOz(j&z_TgUU|QG!ptV|qdgQ5^3gUi-18 zDFM-7{<4E@%s+xf5qZI0C8!xBEG-==(d}CrP^%YL2A_9g4_^QAHmP}6D<`g}4A!w( zZv2urC?r2zu3Ms%!G)|Zl007D`Vr~k6PH3|$TDL=Llh3NmZX#NKmM%@wk@Rm0v{JJ zHFOI^d-j!~P$SWMSJroZ=If)IZEMFl=y zeiFRx#8$G9wyNE^=dG}?*;WMRRwEKESQ4HsXyfms%&u&I+ww&M)8r1L%)KtOK#GE%sbV=RZj@x|U zo+lP-9v4skdRg5_D*nMl6&~Z3hvT@oT1F1;3QNtZ0=KYiU(X4#%>W(p+W0*?BpCM@Qx3$Eq-P5z4A=Koc8u@q3sQTMfi~e}3X?wnC-9 zw7;ggml0g4YS#(-XG|}e)K~v{r3R#0m+!y6%0OIsov!8}rUoA$)`-o&e^p6^*URUt zrUp_$8-JuIW0sS;AfHm>zTT8i32utI$ zOK7GdLd_~h&IM}V&Y5*A@m>_~Sk$s1>bDx?;JrM5La#S|Ovh8xOQ;ScsPe3 zS{**c;|S}T3Y>)14{KO`R0kVel$_Sy4}CgC8-zmL>Yx>6Z#HcT}q#;Zwph6n1f@xJ^>T-sQ1 zbh0nX?nWKxzt8bMAf@tU^C)heMAZO^1T&Ik)r{d^%u!2*7#i^I#lqk48?boZq{?UsS{wBg3(|{^5 zd6kD4l8xVnAHKl6(*Sp6?SGSP0t`2N7naZHHNm`7oS2A1H~dY&6X!@BP4KMTa(aH~ z+xn!7txnBC^ZvY~7BQIzsi@OHeK6Kj6Z~n>LbE<;2ES|yIv$1(eD zFMaDZVfgy^w=M~pUUcYm!oM9&$W=e<&bz_My2BdPHA49hOgz)2jbBsJ`@c(;qec4< zBx2^~jfO~qcNWmai@p8>y_~d^1aw3dC{nvkhqe*-H z;K$efGYzE7awIK4ePJAbx%Pu#vA#F*(<3d2Nh-ESEcfBfDl@sWe5wWOgu*Bi@g&+9 zU8uhv&}zYt*I2jp-6y*q>MupRRPXEW5~q=fsrcD44tHW>w18ZEaFK75MQuOSBObX{ z3#weZ1L%w;IqCoXoi1tBg8mPjnypINJ{m{l?-{zaApV1wjJNwwxinRirOtjWpeY;_ z&iwu0ng`1^-Rf8igy!dDuGF0qg-LR3Ot7_qzjfctRtQUKe75Z0B!e~x*N3-8ND*&s zAnzr6W@+E2S{)#fj<*`K6=g;U(C9$ecUsS-1qYGd+EnuUWJYjeVLinp`y}CKU9N*F zt^*&9^mve$sZW~AQ_;2MbilX4^7x~WBzu)8#o3~%&V4__MV~5m%`!sJDy`IB2L@8M zDyRzb91I2qpD1PPfX!^c^*m*l54U4>tiqrUR7~A!a51ufH;p)cet4k+o{M5+kKe4( z=FuTZNzvyPT5Lr;D^FhZd;aQe}PyLg%t8Yip=Dv9~nB=x9LvlV@x zCDrs`vig9TZ29Lzt#pmym4+Uu72P!d@s>AR`znmp>!b%sD9?U^jXn`0N3f=p^wMm$_%kDinVFW)tyUdQf_oOv-JDxTw6vnUIgG4=c*rimq79 z4+-gaDE|=agG&`9&AY!P@p8s!GhwRw@O3Jvt>5}NH?M21SedCl49<4_yLxH&b;{p; z$iq(`T0rirLQ@+qKQhsm{wV$Xruy`6(Z&{!_=vsjhD?2E$aksa;}i3szP>|Cy3q&! z&zPCqMmi;EUL2H|Xa>MPtMV}>1oxSXP`3Rtx&iEOjWKNhR7}t6>q9W+H-NYH8|EFI z;$OUr?UJwF7yzdiL52jAjG}5{A&#%60X#tJ^XnuZ+&CAP0beXb2xP*&ZJJp3<48kK z8lo`-rEUW!9A*61&&vAe1C0#9aV$IA4pZajvTRTjuZ2{%%K0?T_Ieqg%zt9jE z_?I2z7pc%M-rjvGtu};Zx!}OJ4`d!bM7NpqvM>TRP8M%gJbju&?aBGuAR{2Vtr>p) zF&FC}n*nN7v=O}7otP~O8jp?kSL0x5F#@T^*X&NUvHSE*YZ;v9Mj+XEDy=%dzEqwV z=eY{TKxfAL&rw5h5=$+-zmU-w&=c_N+cy>HaLS1DgLsUA5hcRGHc9NQU;&W?6kSIds5#+gFdOdxul&Edat&CQpBUKcy^CJ=5~_ok$fBd}-vFWUok z6KL7a+BCKyCT2Fh4x4wpzdwr|FMd5LwHA`ZzPQOA7K_}DcWhmS%H^AY*t-5a zZcF2acFFGnqTeQ9MwwG}Je_JN{_(xyPn;aL7TqfNVo zSv?lZ!xV-h5GK?~lq>6P#xlozOaXiQyczHKb>^e$cB{b%S?V2YQXB&_eWG`%#rXTgd0JJc1?D`{d0J;~^jF3{DB9jhSA&gBPlY zY32`6?ogtCKJ(Ch2YUGJgWMsxl9M6?;;TL1btVV?7yvdECZxZVtwKkug_=WY~umrOW2 z%$vc8(I4i`x2RUPFB&Rm_ROFWIf~oI#>yk}#PYw+b2AWc)oy)Lqi%N`wVP=d{T|x+ zgC^6hJ}*8XSqmrZc@M3NKYnc=m-a-gA`jJCnS(b0Zc*4?;pef6Y9&)|bI`$+F!sO< z*tD7LS-8$NhXrxlmAoIZg*SQ~oc4w0FyB(mLY?&T4>$iaw2>zk5SUd>d-WwyiFmFl zZ9&Wes<})Go(>$yc?;_C#LHVia|Pm2_2ZQUFRqbCU%f2gsr)j?r0vGc)h{oS1X=)n z+@!*$Mma6(uUx;JObhUn`Qb61lGW9;A6PFrWdR#c4|;~!OZ@9cr@S!sEub~!J<9tk zMS|iK%8WlJ7GNW@DE^yStSdN1Dfu~)CD8TDD%!WSA>=p)h(mVk<4eXYarJiqte(0xway0Z+wa<)iqt zD78aN&>|1<@#j$E_K6*s8)mZtsR9H}%U{PYWYRBOh)u1)8}~<*MZ#ULugW;fs+kq! zR$5sU98uHRpnmY6_q2ll1YPw`e(B;ARV-m>$6CP&Q+l5<6&@mD{2O2COso6Y=b<3} zwVKs>PI{^OE-PUA{*z*C#)kW_!NXqYpA`hO$_zitVobUcZ@g?nu!iW#7Wvf0Du;Mt z!3-X9YlxU7GoM#S+9nt>`}8-%8vffqLf3ui7auGy_Qs{s8cKr1h%0BqUr!#sHe~r@ z4gJjh(gd_$UaNgX(A|G+1KuwztEPvquOCUyNX#19fVzCpb20f1U!L1Bz1uh&&aTc6o;}Rhnf37*|eo&K2e=O5!AVP-+8fWvAE!%$|!nVKm6SvR~v9;nq&c(NdQTAc3j`M=V*Z`~iLn2!sMt;81x^X@=k5|MNOKJ;Kcim?i zHI*csTFg#T^0r`Or+pHgt?~r*YwoLCOY74BZ18ailC{aSbh?H-vY(a)8K9_5Ll%_4lb9?irEwBv;n0ct9R5p(vQZ8=W zg5mABi>ku6<9FOS&-3W*pcRYg9LHiS#-y7QJBrT^4rNB1C!3{=U*Y^l1`#_*rmNoE z)%X?>ykVA~s$vIUXO0%B9ywy4CLBMrHMN7D6ufK~QEIV3pVuSAUUq4x3) zvQ~S?*A7zOb-8leVFrfFEx6}(*uksm1(M+hi`ulBz$86p2T@ND4u&*>w*^JyZ9aXs zgFiJV|LGVE1v70eZqV%50nL#gj=5l|SC-pJ5y_<;SkitYeZ%LMFZ1}}6Z9K9a6_Zh zxF3_JSxg}x8|Sfy2+^raE-cmT(5e(%VqSZ2eX*w}pohL?#EwMlsbUY<6!u#Wv7K+_ zo?LHiYuH08&#uo6X}gg%g$<8_xji@zpyl>?xCoE#VwT30*aJnVp@q0j?ZpOffP?5~ zd)Pbp9BSkyx3~-oFZ8DEf%KvKG>3lW1>)>T71^piTm{v!1pH)<;P4`TeXwf}A&!Lf z(Ux(wrijLO?e~I`0`jfHJ_?;5?<)`lEV&&(-tmv?n6&Ub^L<|)-^~G@KiDGnS717S z&vGku(CYxzN%@_|R+5P0ANJZahaEtW7ULzaZbQ>Id;+@o6$g;?^?lo$&x&6EWBg0o zx&vIOwQACmhw~K81vx40IKcJ?`A!%7mRw0p+}GI;9id@4WQ5WnNq}`*(eop|BlQ2b z%6D0I<24`BVSD$)5wMTr^oyVwV z@~I=RcQ3NIAwLq9oJl6l?ub7*!$-PS8}w%_Pl? zB%K(Tiv~kZ(9V1-g=-`fmhkRcgY}yea2)F&-ygz0KOx!;{_)cZ-kyJ2kyHED?d?8v z8cgU6ENO}=<-h*DWbWsBN@wm2nM5;G7ufEf)0Va^#)6zdxP|@qL5k$AriD{?N~ANK z{^)q8Y0iUjsrX8rsNMO#|25(B@>z!zYtw4?mrZ97Kf(Qvmy2W@+e;x=0?7qvCPMrN zYFpP_IpuUi`CRV%Urh)UIP>-lg~xS~N-prRHAD|JPM}oM4VADw(gkXnqv<~&^t!A( zx%5R^b%BPGsVgDp|CGOf7g&ipase*oCS0~!1*L^Dw+Fu93W!7MvHR9+h-s)_oc__e zg8v1fyp02P;*nM6a0s0%P)t1Ks@*kjFMH7mjP9<0KyxBbB4)_S^Lxe)$Ilg7^85}z z=L)!>bM<;*q`N}7xFb84HI_HR&F;F%X(|JaPoO8 z!wt0K>+$H9uOh5RhVFf=+(0>&UW&aeJ!FEn-kopO4bCr%2Q~#8A6HPlv3&Hz9Vp$= z3V6&f8`kg}BhNV8;VpgI{X#xN#yrff7Ey5rH#2E}{I<--;#tU@F0^DP_x&%c$ z9*}U`i#95`@bCS&vH!K22O#M-e-{!d*)D#A+udvA0Y&S=%w4kMdd95ivej=rVE*s@ zca`OtG67Hh0}l^iLqXz3yHC8{t$6FV>hA&SmdlwDGG22vPa58j#d(0MZw`HU5Dy}1 z6IQEXwFeN_5f|{Gc2gjfG}k(nRO57Mak9a zq{a(N87bJGx%2=YnQ0gQK^sib&tc7$*B&5g)h?N%IuS?mDq70eDFtuu&AT<U&kbCtl!0%Y4CGDwc?&Kl&y| z&I^7r+#r8Tpkx0SWVfpB>;>>~xTP~Sh|ud&qY5G33tpL#DDU*9>i_6TEqj;b1&`|= zPf{ErB@x72jMnyeLAfwv(epm@(`Qb9-5q~=K`YAb{bc#d?R@3oM$$dgav zVhdZg-1LGN36dSG&yMT2^^w;2GTxAU3S7U1Loreliet+@dEfUdakbWpa*vOw1k&*j zyg{Xto|ry_?eh|~0L6<_Z-}BWJXY50)_X@ZFvt492R;#z=^MUHh|?sf-SngP0fm+7 z(7L8Nb()Xe$!+RBP(Od7uY`9&^R(L$0VmD}W(Y{pS`q95Fb#bz8smL{JXV~mW^6dp zF<30~N0|@EvTc#ZGxp>(2j`=6H~GM4rHoewH!B0ZU$YufI($H{h@@Sfa~_j^!GHBklK8*HD<5$5udsV@7SI*UNJtiW?Q=grYgf*#flV(WzL_x%4ybZ9o6qqD&!r>C1=RdtYE^IX;Woea_1KwC&OLXk z>PKdjM!im8GXC<--4D<_|D}cX(IWTaM;XR@`hiE`*P<6c{LVU;Sl4*M{2=Je&8EWj)IhA^(-sB zXf+ARAD& ze8Gu#sFDIdsg6=y zt^76&0I{<#ssh)6>VpoCnd9OEK%sj&R#eCJ?IolAZ1imatfVL>3J8d5L(?U@6-^*) zGbc87mJRHmiq16#r3V7Ws-mO2^Ha|Qov?R%d4XV;w1h`k>f+z!KlJn@KM-2=KH$o2 z>$Y--e*d)FdGF%SqiuL$6ZiD7cJvtD%XnLo383;NWqD7DE#O*8P z9g0u!g1}FJu>cQtw(%Qrxm2G9f#c0s$%M$j3{tATr4&UF$R5giG`8Itkm2L`v@!+3 zL7_{|3+43=VS!FgKII_bV|h|g?#5Z5_3p^>Eb{(&T`kGWS5?wWjd`pu6N2C?Y6Hz1 z8dUQ<;rD8j{Xt-Auer*srO!=A)_QmKo}!tRbLlC}{oCBK`7EV|g5hJp^Jlx4zujak?8{s%!Vlg+R4}p#w>+?e$%r zp|7G%2%xhYg;A+lPwcC^`jG^OfK<1_Bi>p=_Tg#pj=2tjFSX$q=N_@W?Z4JCOCE;8 z9lJ8IW5<+?ITB5qG-}S6=?;(Z5qZq$eG#?E%G`wTu zgB-)*RCz?iS;nETZ)0PKb}1Y%KWo@rk|d65^o-H$9fre*2JO(J@EVL~M8|0lUPi!? zvOb7Xdm(+@?1soRKTj27k25B4Bu5)y6!^ z_;>i4h)>a71jqypU%Ch5ykrwh>cf+a1l3I1t-ALV^Wz7ZbcM2!phiM;u9?^s`@tNs zWk4em+LheOsbXFt53jhG`<424fTzaa{y<*Ydy7HlWH8;3GZ$fE$e zX5j(Kvi!0V%g_f!swjx+CjQI!b}5U6i6m-^CklA#yjT^6o93C)W-sJg*se1ZE1NPr`f>%-kr5~xZ+)w+XL2|acM@_Qgvew@~ zlWjB_xXFHwAyYfz-g4`WJ^2+48VJ9#8OhQx(|W&jj9*2=L<+I$Y;;cei@UtdUl0S5 zglrFj(CXJwlRq`kBga6_{$oSUq8Z}*2|Lp$j2LKS-PfHYP`UUU)V%YAJqE-)Q-UPp z37W%{Rd3$K#z1zL!kt2NgQA1_+2gL%7$_pG^+=lupB)kH%+Fqnf$>J2GwKx)vCas# zf#Z8lDYV-9!gtV2y(6Z2u~TsMA{B9nG!|a#6@)+1=$*Zb`W3}S5qq!a z)xfZ5@?(GZLF?By@mPqh#*11-u;UmA`|^5BCl-8ZmE@Q#zA1JdQCn>3$3lsw7#96( zmRoJ7T+5kPEEL9KV3t|qGCQ(kG_q&L0wNkhauy#ePI*~-4p(<9)TQVc&GNXf5E&c( z7Fvr1glm^@N37DlOokYy7{xd+a%Qc+pfsr8PS4*;Qi;3Y|Dle5)n_zqzgeN33XcQ+ z(hjzkx7Dvqgr4T9MaF@Z*=L}&k*kkT-iK_xbXOw8IaZn?SF4gH~ zqL{#Awu&+z2RK5JjtAe$?+pAgTjdx&04olQFDX63PS-cX?}4%(U_Xc4Q7Mo5dlspr z>~pyfpxDC3S6-RHWcjfTNz?cP7@hQR#_OO3Oy!FO7dU$WOvHm1JM;dE zV@@)Cm|4ulemqFjKA;dJWcU;GfH$r6Bp&4Pi}#}2SD$}*v_neGoB)-gSWP@lUv4AO z$;r*t6M#>*{Vacn$3B+bQ(~N6m5>LWXt-g6A zg2_HFiv3GBS~p#`MOV*67!ah>)qO_6$VpJmJ@8{%ZC?u=s@na>j#U{erUt1TfFScr#uwL2zz2`qEXSkBIg#oF~ z-+cz4e5)hMz$RV*UxMM}C|F_axfxo{fv8BflY0M|VYYdH8Im^#OA{(`FKGey8K=iv&Co08K z%If{{6kRfS23SUsl2fYLY^>+Ch$Vv)UZAV4l_rV-HoeuZW-_2&HI#LmcBb{Z0rr|% zGT>X;8WD~^pK53bIZ$#+h9NeUPf6&M$RaCdkFC6u;k6X5ciUFr8E)9#*^9r)U|i;7 zOPiG~gmK8v)lHECMAiqzj(rsVoI1s51Ys!#jTbpNh#C%84;0WVxB z4QPW}2hrzRinIlW1~v`Sppx!%h=bX1xjdia_o!1ENM&q={b-n)n;9l!mvl>m;R_6* z*+-8w|J@Dyl|`n(=#dX=T69%r0=6i>WLX**jd#5c&yW!#-qn3iIhO`snz%lZZcSEB z+Uid!|4M_$wfi0;H@-;w+5ICwchkUrmuP@~TN%4}$Icie(&0MaelDEIb@+|`za1Xc zbfA7DQJeX&QvSN1@+RFe9ct-X_?cvyCFiEsDc79Sfp4jw*KIU=GHrxZrg$SA=F^`l zxW%g@FARP6%sWa40er)q-dGOX5wvHe*;pCi+)gPbl|%T3TQ{aKjVI$iX199RK+nDT ziumfGes~6)sJ;>+6MD$AME#q4GBX2G1K+1A@-yXO^ZwX3ZOwoZ{9n@=RhS}X!I(}) zpEDrv)yhf|g)c@#EyW5sVJ2AB59nCntkp}*ak_k9$%Hya#F9|18qF$z{7 z+sXp}C^3W<3F_bNsHT-X7g>;vF``IkGcx>8lxSv-JR1tq<373i{`Xd?r1C+&a5gmZ z#F$XkJ{as=(U0(cpA8s=bLlenws<9UBad3cvq8nl1ILE!*@jHi;;Q1kt(R=nLhiH} znKtu_&VM!I+0fRpP-m%)E<0hkK$5nd4bQ(hv6%kbB*n+|e*cj@2MDMPrEnZ4HD|Dp ziofyXz-~*R`Ge-FG@~2L9b)Mm_}N?hU*c8V=*Ld(Y%ZM~sAecy8rRikYq<3qGS1Hd zJe-)WQJZqH)YzEQi+f&Y4I6!L;9PiRaQ6$bA_uI;e*MCo2I!iPxd4uBq~(9Ojrze$1WGN zZX#IemE_XCFSK!uHRM8XBNLxw48NBf7it-0V}_u7}S75NCWIDy@jEe}q%ogd7W z&vvI@IoaUr=D|>bvg*l0Gx`uyp9eTjc_2eW`+;OuwM1&zJnJYc4=}xOllePu>r?IMEdVz02McIZR(uOaYs3DE}3}lA>l7 zO~~6v1FDoh0dEVydhg83>yY}ji9*%co7MtIf4(WZFlCvLd9Z#Aj zRt&dgDLFj-&!tsmS^DT{ilKvqHq6zsRjfIc;h*c4X#l3y|vL&G0F zB~w!t<&7u3)k>1ZklniOOLo25C+qq|<;18MBCOSAo8=DVB>zpm-OewD9Y>o?IYIl{ zZn728mk&ySOE=x+KR-O_^y5AmTFDY13hCHWa72@PYRP!r?pOj^F5Ack^5O+ZSp(Pa zi%Q@tHU_~^i{-R{fIih(M+w9nj&v|9zt6?pZjmwCDS>I}C%MT7g^v?s`BWJZOX2oq z-fy{U1zHlOu4*b(bpI1YmJ2tW-m*jmSiO1FOLed4KKOe zDODNFt#Xs~EtTX=1kmfepn7y-TLyZLg5N@>KX_;Ui(yjKVSaF^y|i3=5X<7Yq|DvsAAT7g-z-5x_OQ$m2;>Z z=5IwdOGQ)!+(P{c!Cx1s!(NG>XO|E3nKOQv@5`!IgRT9 z1^^fK4YG~5h6P-o+FQ=oJ*XR>>^?j&@cwAju+3;7F5T$?O)sSxy+bsU~U@uj17w3_5 zHI#YcTIG&&+^IO1y0HgT!%$`>UjXjivo<;9Ezg*05PmGGGP;vOM947RyEayRpI*^k zrnHyA5_=JbFgsoiGhUcI6P6LL1t=Ch6H#k`nCPM4hnr$XrcOHCT=p9H^EjJ$FrVYm zuU6yqRPh>M3GP^m?DhZg8l#QMP7l!>;YjWIhSmTBAH{RYr0!BVRAQrX=fYoYxangv!Jkjvy4WH4KMXV_9)sO&usp-PNw}fBD9u!ih0k zUk8T@ec9wOd=*tbl_K69b%3eyp``!syGPWz)Ks(EbujpINh2t@f$WFEKk-49dU(Q1 zkz@WWt-)nL#;rxC9^!RoRy2vcKJdMyX8+?<4~3zwa*tne;+@A5Xv!4UgUX`%;cE@i z(0QWVQNPl9U`1ucy6&}pc(Y7|Z&*_gM5E8G(wCoT@u$ZinJ(6YJkpa26H&q~^N zQP3J78|U0$h)3BX*u&Y1hP(mVzqh-tyH$lL{B}V4Y1#nV=pS20(F4pjZPx3 z&A+$wG#lLozp|IqqZ@#*+@>{=wN7D-hOVZkp#hLbFlp`ukPECbPR<8s4NxXIp@biT zo9bOFGhBz*2nT4-u-#01@bFay6{j#7;kD;i<9(C^9ljb823wj&c#=_Q)C8_{_O0VtxHf-=aLH+qo8UllOf&kDa9H>I zv4I#y6PVQQM*w7l+H&ODJbf;Rdl+w(+I*BxA_RpPGgyj z4k9+Vp)(|1*&hKjxWt!>gqA&s;DbVP-bbk0@;g|%S_~PAYB)b!{0P;rGzSSb27U&9 z4BDl9^$C18oBuo-rL)Cq_nHk9gZr?li5HiM@a?V^?P?D96N z>6O5{X84&sNfZ6wfb&dJN9=3wW~ftZpm%=Wx%_xLG}FJh8QN2BE^37N5@MvB#GC4y z;b=^};?`_eQo7~(ssp11*ndO@+IjFHw>N#EG$L$){}k@Ef3Y9Gd@&9TJAc&zoX?rA zxg-9TzaBHiV4k9bT-g@*x96%Wa4yY4SZCbgY1RVe8LnJ2R53Cd zv=VwRU0Z;M^>irhV<&@5_+jpre+#U?LEou&@zChz8ppxSXn_Y7ysy3-TGOC>VNeK2 zY6VR>pOE)>h9_uf^xJINtw6=@@jQ&&m*Bs(SbE2zR!B0twz1MGBODSicu>{T3ePX{ za6V}TeTw|0vCr3kUtfXJIyj`G#djJ%UdPl1*fQ@8Sn4R+a{Zl@7ZJ4})M^*MD?xkUSbHQA%r4p&Mj zi~b160`tqx`fu&p!C?Ag;-oL}dO<-#v8FanA$^9+$o2Z{$A~Rg-~52eeT?OAn#KY`|z-)#VN9 zfQ5K#9mJ?N^X)0}>9ZLf(CJk3Rn@zi!t>n-<4{Eh^v{eil(iqDHvZ;|W9_+relBuz z!p#@LYP2|JlHm?;WqLGkubI7%CNE)cKi&ZuUV6yUQw3^5-A7V#lO2E>=Va%}8evS6 zBUKB3I$(e=-Y=2ls%h!DWiAp^0k;=g!;U{85TX4LXdDEuv3 zvZS!mD6ts-I7YDR{ye4box?OfO{k+UpIJ~Bm{IOAAYhm+yC|uB3h3>E;WX~%REcTa zJDL;C-p_w;bC?)z2h(5n zKsQ*|9aR5%>NAMC^=eC(up1P21O8q7LTY(})!6bps2i#xhfrUlNSD2jeXNNS(+$;Q zRpcT8FY*uA!eTPwy1^vHGjel^Be$AE_)s#j8`k*4GluDMMEM{7{aT&e4OV9o<&Onz zF&^FCRH_wsLulg*!K~BB4XyedN8I&ppxl!+jm@eiLg5RE5LeDU6=Gt4_VRd==K1vgyMn&jZnOF|N6}H-5!`X zq>-iWa_CDSvuc{B>jmg|+r+ZQNlGnOOWRzhZ9i6}&EQS`E^O)rs(0=M)#?&PI-y|?liPYhzeTzgmvPNzr~~Wy z5?vpt37BEMQ;bWU)lV%Zu;_!L@sLi5x}qyF1hNx!hdvnv-r-rSSdu*y$|x3 zNXLHtjrk}9tA3Dl=e&wV~^bv}Y1aYAb-0R=7cK);Zqx_5F zRom>V0dOj)Jhwu3im`u499qZ>Z^n+m-kT9jc#Nxc{aH=b|MIMIGPsE<}tur_@jBj|AwTB@bxq~tB>RlgB z=Bd4v{V?=-7c=qCC8#(|{42(F90r_2;R3&d^#!5c#T=6OVUT{3gOF%_bxSm(rG1w& z3@Lca;{o`qdrqJ6k}tc40Xw6^#jVbq&tyoxvtoQ0!hWjSC-Ql0@RcD14lWKu?5uRn zB$p7mma2~@$;mJj5}Xhym9y^1rp?m-<{1Ho-z807q-78XPZoxVhWCE`8UeqXY>%_oXAg3Rmb~A>C=@M{R+=d8i9dPxlY|g) z6gc}E`Fa#7E3p=DI`J_^!D3W33GXj~-J9CC-S|YKAm#N9#aFx8cswMf3X5hGG`(%y z@|l|y&UrAszZ#DM51rNL=UGfkFhqQc<1-31I@Ni3PxyYwVOP}P++jM+}XDTYZ1x!^-^gUWYi(?dh?5JtFr-J~^|e7niD&4%RrJq1wqvi|Btw z=DhnmMKOM#15=@Eo?|*GxHH4fEH(~Z&O^JJWQ*t{m=k(6_T9ND%!2yxN=gtf;I?ge1F!W`Wjv`JAHQMBr*tXUqxp4b}J#n zb}d=scn?CX5@*c~W*nLqNWU#7h=yMDAS`aNj(t8+c$@MiG(%8iA**fte@y$`E$(Cw zv_lXbkI7zKld{z3EI&qG?jgvkYmf76a3#-9GQn3!WC(IgNW&xg<&=}$%X_ZjG6d;t z2AqttU1xLsNE2I%8G_1(*n1}iil@h=x|!7H&VVhF{Dd*V?#J z1+zk_n?12`hM@o+uc;85rBSK)yeoUtVdycZq2o>q^Fzg^stc;qFw|eh(^s=;E?dUC zX4v+581g!+Ct%vDOyqbUPQKtX49UVjOVBeMMtt)UdKVov44Kqz7e-A^>B9{~Z_3vU zLtlI2K1PjS+<0KwBB-E^K!^UU7{*%3W<1Q4SG`0dP?CjfsjA3Lpt1k!;^@nHMu3+w)j8dR^X=Q!`pbH**Ubb| z^@ULmvyu8oqmbU#IGfMS?^g?dmrk8v#-MkGnU+RaErbQ~S08k6#~>zCwQh4c2RF1| zhylO(#~`Lf1k%V#RIf(I&b~1me zX22qkBzgRWA7mGi0>kw)+uK5B_s2K{C+aqcpry8GgoO-+UyVZ#R^CCT2HQ^`CfcKR zuE!xtJ0^3yJf6Fl4x52oq6z3(QK)dKbR&bhduHH_VFEhSfoqiOEdS*khc9lSIsq;D zZew^V`)=}07f<1vPe7A=?hNH*$Y=|2e|V)UCLowvR&($8tKPrDD2chf6AC}C{D^Bg(Pf`3+FV>_e*@SuZG0&|9(tI&f z5H#gW)gy1$4!0JsvYI;uE#v5%Df%|%+8$Xc^UO^_obC}Fg)V-2)Qy zjjC3?c9?YoKkze|_LoKS`YdCWlL8IF87LninE|Coq=+^W*jYUxG4Q`j2?T3W*{aff&7rk zA^Np#6ub4!8R)5FcV!2kcC#5yCp%u*_i=S{1|Lk!gf6i~J&LX#RH=66-&;SdZsUhY9O^&!9dB zvC;cAU33xo&j~4Y5x$#)7~V;}LBfb3UI}by9_~)VME|nFOWu-<#%9c7r z@p-6(8@&DH0hA=b`N3^!DnX&M+ij!UK6r=OKl3 z=URN3<>HZVH&TjC^AN?X`UN%D2VFco79q){`4|7kw+va?W$R76F3ArF3y{F){!5=u zPMVefgy$|f7hay%jyKA@3G*M^ITW*6fL?LQe-P&(`C}*C$oti40Yc5$u7nj%63?}8 ztsn7NfH)ltnssHfcHEQV-s;3IKzUHqpCBz-h4N~#Q0k)v2;F=}O0>Y>?Y%UTo+;`g z#7MNEvz^u1u`+P${P z2l;)f>;iv=qD6>zGA=WLBchaAzT*c>>mr10P(Ny?9g}2Iz5QFTZ4vrNK)TO8pT!q) zJkwIPy$Bhpv?mX~-u!C(J;9~#ZV`HmnESC;XNe#@+%A6q^AcpQ>Dit+q}f;g5*H91 zw*=7%MWno?Al(XZL{j1@S%QX#r^AYkzE|0NDYLiiT7t+ntf|;Tk^2#XrpghXmmvK{ ziu^mnpJBMVB*Jbo%aHA>E{}FgwWo_*AHvyh%aA0&$ebFVNUfqAM!j{?GE_}YIaMMN zz3`3n&ozGLGL#+m4_0$zs@ISRrfKAE8G3NPHt%alfVym%M$V~MpuejM&j&PzuxGON z0SGT;8TJeX6LwRjyh@o!kEzrOL~)P(?1Y9=RKZt8nfi7G;uw48`7nV#B__okVNtXK znQC*lM%W>*lT)h->9?&w$?3^ek{ExlePn9T0ykG6l|EP0o$6#910$otvaJ=U{UP(s z5JRr(m6Lgk?e+?!JgyWPJmxaT>w*=ka<>ABa>|9qLYO%pnw2hQA66iPXPGLL1^KR` zlwnI9DJ|(VWN{)K}_;|08<1%HFbRE&0vM_>g<>cKAv!x4*KwQS2HdAop)4+lxK=xoWvx zG;Iy~)T15#!XED6;wYA}`nd+Ff8}8FaW1pq$iq7|tX+HApO6!TqAq0u0)N?gge12k_@)Gm6yz9`kSGnGHcp+(oWDfXbz7DBmeKnI3 zOSRu(%X{kXeZi?}HW)h(Up~$;q4dwKLu=uK{5mP}JLqf~HRUiHkZ=rqC;rn7@ERW^2XGH(eVLeXGRJ-G6Y@>3+cs4G$ZTcfa5w z7s+QvvSyfZPn1n)g=N6=SK36D)(QR(Ec8uiXK$<9nX+2vP+y;CM`9Dw8eOT`)02B7 z_jZ2n(%OX17VBf4_81}{mZ(!GXA?>;ejQYmyF;vNM8hESXA`=qZcyTs6$-pO`VgvI zw+VS{!NbmxwT|j%Iw*bU*o6KYYyaD9HHe%;J}>*S+%yupZxr zW*ca~q6H}IseUaWN8;{4|9&CPo6NkSeFxWMQPn-v;DYDk=AgSC% zi0?x8Au4(Z?`-E~pJAj+WHo$h})3H50a)fkl%+i6gE`F zCEn{CYmY#$mG&V@lT7lsmhQPKl3`gH(|rgj?z#WACgozeC<~s&c^|5My$o`LCh-m( zEb`*r_91KpDbbz1KgMpE8`xc*`_O9IW9Yw64wB1xB`D}V`%pJG%j@66!}aMQK9N7J z_Myxm{I`kY)d(>vBvCJOjSEl`O<1t z`wbpK#gezJ1Q6%bUjM_BEY=Ye>rjQUHSqvz)e|geWP1d`&g*9@l2Qv9^!*Khvpa%B zM>y>tNIFaQGalk)oQ|NUMUVadk$RN6P$>l7pre;uawC?XPC;h^L-K=PPM$CKkc{AC070%4^@-Vvl*fH`TWJ5r-FeTuaE_XuM5S_trXXs|$X z)C%T9JBFg)!Zi8O5ROQT{~ZkAIfi74?W^)8eMbmjTFbs@9z%WCG+2GYW!|M1<|H^; z$I#=ot$BBtaI31Fa-VU}F?7E6Mu1kIO>U^oMmUD}1d0fO3Z?}Trw?c;BtJ=>K+UY@ ze4H8aoY7pwJ}0?qlsF{Ab;6ekX?$Xuzo0Nv9HvRyfhPUf1~ql8K{`u<>ABFkY%{5bslgj;t4WdO0f3xbp`3i>fvewtHgKQy*qfln#z*6M=A ziuM%Rk)k0FSM}QZMESVYDRv6=jQkSi_nqMrZlgSll0AjKs0Hz^CRT-tl)Iw^TAxC1 z))dpVFwxpdofe$jznnrE?~n=d`fTTX{^D=7eLIC@TVJo?m#7}-Y3@0-O`X2z_1%ko zIrysvD84h%MV_#(wVVps`;m3N6$M}zzo~%B&m}k&hrVLC_dQFf= zgo^Sh^%?Y?nISvJ>w{La>oNts&>2+4O01BdWI9uPi`>+udIm+)q4)1t2-Y~PU0I2% zpFv$H9|&&K|I#S9f2_5BcLuo!=F*0t56YYBHu&&-JA*6?iGtQr;_(hGjzcIEi|#)XHXIAn9#Ypci6s0>2vDd8HBNtVnq|y*lWZQrvNIU$)dfIy>SL*vYM5A~u7l4wYIha83 z{U+-iihUAsgIX_G!=$qCC^yd`EcWZ2mB7sgq`Z(sW62AM1Fn#|o@--t)q|YaKH~y9 z9?;!wn^T##$*pr>|9b)Xbt4}9j&o|h^fAo0JG_8W`3ly(;8ueI5F+PhZZ2LN7QVry zn#!dydG#yOVP8UTHh-X}*LZKPmC;ar|8NNz2O_#5buG|Uy>TOx3cZAMZ9;#7b+I{H zd?69I*h}cq_C4u)uGQDVN{R8Xsh2PQi*S%v?U#_W%!!zpXlfEX#;>RCfr(e9@IS5B*HEt7m1wiE8cTFD z`{We=HB?WKi{>SkFEv?7JeDAH4Yhr`f@Vmtc6P0wXSN-#Aq8HW6)a}fHY;(jy|esl zsH%i-h1tld^V;vu+F|S(!fi68K=U7{-!8$h^3QhHC_L z%k>GP-^OCy+udD54+Iy|?FW=3-;=fc7;$f)UQBX+DcB4*qH=R=N3t8pf&29ERKR-y z{o}SZ74HqS(>?>YBN~=qSbMf<8hZojc?{>~CQ_E`NBA`H|@*;dr^?=w^7o_wFUcS;6EJ zf;Q>VTFBVN^Bt5%$?O~cxid?fQTT^g>^)TDFzlV1u;?R*?{WH^a}NoX|L7&}GrM%T zxV%p*zK4D{v;IY->c7b%@=+TZy@xD|IZPkx&Mf5H%PptQ@1c~w`t#R#+7c0@=1WMl z4-lW}{9o|}u7?_rKV1LOKS1^{c*QZ#dupK$b#QFl572AR4j!iL-^2gqamkOXK0t!5 zs=OwyF^=tjr=Gif9w79w)MmZ{r;G^mt-7PW2Pjs$=p5J3hXp+&HMQON5jwVM78CQ) zB0WvipqtBkgzV-xhFT=DvKJoxmDXAxA>KnAawV^dQODMjje!0~C{0MkdazJ-IGyBn zzIEUc8hsL_$kv*T8=5ywB|dqCaKw0puUgh|1%E4{n!I{~==6R6F&j60bS7}&XzYA~ z(hJ|q5#=Ij@qd=1L*PCA)+{1!iLA#sf1_fRBB2c#}2`w+Q!W>@a`EBG5WdI zK&Hjd_cf7ckRAeG4p^VP)-~R5RiEpbb3$M@?8jl=@9ha6!erF|1ql4qEqZugq7y;v z565O@1A#_`y5GD;dqI5B8weBsLBLgpM6-2)bIk|UBBu2l1RgibO&nxPT>>kz)K=mk zfMCYJGScUnu==m`ZRrmPc$ZpFw{ves1n8)GOXWe}J8hb-dCsrWx9(~~x-YorS^Js3 zHE2Jx8~x8o9|Vk4(u3H?bDf9}x@A6{LO}eyjqmAUQHt{Yidhyc050qvzg7EKw55A{ z)z1_FXd&XRXS~%ZZ>Uge6;}hm4es0bUcb71_jWEM0Zjmibln?-Jnb&S;}ngCG60z5 zMtyZe;9q!`@0fX<2S6GH(?c?x@Sk_yrN3Zi0Z1?`U`qCE*v?^L(*1q`00kF*3UXfO z=%>X&tqKkpa8~(3wcFyOD_~D6h*gCFtDA8=3+`Qt1}j$xPI@q41+K{gwG{23U?(c2 z-2w&}A)&<7e!Zb3rQf``^nwA@FoGy{`}gQ5rqhM^XE4C@>+R1T&sXm#d1;RA$`)xj&%PG2Qq1R;m;$Fl8gu=@xUvm`%kdDMBXP;*E<84)N*g_NnU@PSEQf1(@CH$Jx5!HeK z?5wL$mO9khJy)qxE?^LW(4y)}c7+mE=r38XX;?%M8GQReu309Z4wb|^4H*&G;b6KW z?7B9$_x-{mXGa8knC73jlC*^b`}38N#Sp=|smuNnbt2z|;ew!)FCzFNcJ16s+Py(- zAS7iNga|zQ;%Cr&jTgL4=5IxQA_6jcli9Ei8#!N%u9BTnM3CF)@ufkEvU#w0fmU!7 z5v+LJn*~nA{vr890V6Jt1lX#Pm$mDIt_eQ-w^=D8f%deEgxQ8k6X^$&fT$HD@T1Q* zUCA`hqe18&&)gLfNcS4sxh+0I_nyqZ=7C2Bg@|2V0{w$R<_r^v78uAt@q==Nk~kkT zewtteEQwcJ;P1gA7sGqsxmEj8Ml_Eo~iM#3mL$~+!KDZzPWM_b-+X$Lk2(C zhlS##yfxTmT!Pmpkik-aqro}lWuW=5ZLO?DWWcd?Zh`j090PWHjT`kPjyw1@ennU| zbEU%h(M=~I3NT)LQhp=2_&#f; zULLc;UkM^2KuxxQprn>bB#Eu9nYE{hx9MP;G@ z*f+VoRG+^4!z!Aw4CbJKYEJLMGE@QRy_t@G_2RBdHQb1xh7&=@U@4JvS4*<9aj7SP^JI$HZ3f(lgiTUZyZTUs88t8+4P zP=Q2M2ubr@8<%68%!kcQRG`36)+BMm$53u6kGgt}3M%5xBX5aJS&K?R4;CC6fXBA; zsb5d6$7;nEePBfc!**tv&+(cmj|4tS^Ac!)fV<*03EQ;(W>pHsb8l#RlGqa zLI-AA=3iuxWR@mf-r6%%B_6?;8$b%(+nbkMP1i`b6Zk7?w_*WFuy4jO_z z`}MzOgsvX`5coTX4s27Sc9K7JM@or8((7z&`!g~zhi)gur%P~I5CmyKoE(zgaKaMcis}#bt087>XpqiV1lf0 zd;$?bmK@%T(QCChh?3;oA&2gC*GObDXGBem;XH2?jC0}OTNPWO^`tZcOWD#8PBKw(te=DxzU zfuF{DuH?6u_ca#0cVG2AI=r06&3wTqBa?MCmD6um*}j*drs04jLzq)Wp zHsXM(IFzV#^b9F@9HZBQ<2Zo7`*CT5vDqhE?%hf23+95j85o1A?%qiVddBbJ09h|1 z*h}=ys|mCk{{lN)AfHNaKiN?@G@c@?KU<6ocsVj!Et+6q=E%^S^lEVd?xCuomUf9< z87$V9+6G);u_`=Dvh38yG!aZnsEh}^X+?3ochOF%C}%jQyzs#7jjbWyqTBsc=TT01 zBp&$2l;uPx=z|-^5uls>2M<`C%@R=Xwlj}(tS{?I;saGhEx8@uMnz*XT zaaav*{F=FB-mzW5ngD!5_GKTRzXIZfoH zZGyMExX&>D5&)J&b@If-+q%QkBL2Kq0^l=n8_hDLXKd=8vVW~Y2x6MbA175WhNtId zZ3lG-0cllT*r*ZB!zWEA-ajpb00*0tVA@ND{&0MydUk>kAa9$E9O3txusYlBY@-o@ zooRK-#B3})vW8no7lR16onVAao^sv|a2DpWNe}@zm|>-Hxe%P-ei92LLn5%;ci)hq z>|^hvLgqVZLImnt9fk(looYIWC9xeNiGWJTyg&t{9kyPV-eX-%1jd^Q{}GgPzKK99 z_%T^R1bjaJ3{5R_%$_EVg7ax40+IC{aZftV;;M4sGb1%I5KLMMOfD9_zB&<4c3>k0 z^Cly&TP!t1yjFFw2l$DBH6jh~qi{H9#76rsRYzjLF17oN)tEf}-{;Ypw0h!~{nJCK z@N{VH^##A)#tktryuwRB*;3?A!saCsdmsiI?`#wQb!GBx4_{8lzhKuWvB&p#Ey0y@KICN4-Ky9pyO>bsx6Q&a0adj;T zNMz2?zM71cjkXp=*B&GRqIABGrCC!du07#DV{S-*qLc!`PV20BZ2;H94GAewI>pDaPilo{ApNhKtOUZls`ubl5G}8Y7aXR#6tpA_cq8GD)Y#oxGDc z$Qc>gq(F)=VQnKdOT$a6{$pr8DPX^5sK^U&ojo$VK@|T-3PuFJ=c_YeyokWUH-Dd! z0y~S?Xu=?Rp9J$EM?nlSU{C1JQot@bp)(esm550O*v&qZ%s(TmRJzbu*pZR}lXs8m zK4j-Ms!l86ZER$KFIIdcaocLucG8EsRGSRc_81rco50o&$tZU>h$jQp+L4=Rnn=X)WmZZe>Vha{8wq{;Luh5l@>hYYB;l+EKF!ekIz6y}gm zk%65#btN80Yya>BMn2*hGH}t^{L*4#PPC6Gi1oN91MyLM+sMg5g<}@j?(A~pV5{CF zhq0?zxR?8TVx}KCph3Aiq)j#GACv;5z1`z0k}SQNlZXA}>?#KPC$A5s539|cfR z{6yl!48QCAyGO#rl>+?yr#s98Phe?}EO+-ljsirWOT{ZKJiR_CND;X&q5#=`(r*JN z;q-g`{&>RFQh*TNZk^Vb1Nvh1{da3*N^sqjtu)&hj4AL*$1LLor^u#5o3@tgGqpd~ zQPEy-4^c*{_^zv}yUO96G$jy5ANsP+Hx$E{cK>I^h7wS9!bt`4H#?7iZVXv$r34t{ zlOB`Y*vci{)QiW{lpu_HdLtz~esRF5UFVdM3LNB6Qw_upRGX-j?uDzW>NX%|#8SVNL0pB61KNCBCvnic$kg z)XdyH!4ozBXd&@A#8_Fmh*G`bzTkDoH&t%V znF2i6G@v3lC4STN)~sj8B1fNy1~By>A6&Nf*~6scS{$*_fP+A*S%|!A{@-}^6=ygN zxC}|kN`EJ8H@RKCN|;0gf^Cra2W=u&$t+l=&XZ{Xa%Cqi)d5Kf9(w)smr5FtZM^=I zG%U@L-I&qx<1h{I?L+GLX|yb`=jYzzHctblfAb75BURXAp9`r7z|n#UpORgz3+6Y? z_T74@g0vvz-`1@|F^;jVd`|@=NedK<$XO)+tMle&UOGKep#_!^1s~?+jF^LW17gJ- zX#v^FEeXR1yjPOcQQDMww7_>1`|LW&_}xsHe@4tCEyzsNsKos&}iwq zDVYwqeLqNf|8vjgPd9B`d?y`1Eg3sC@|<%qcIiO9AE5)D`~CRx=~XQ`dLQrErsx2j zFx74JZytHJNLQTVeL4_5Qr1SIi^?`%flm5N_zKu%e=)k2Kf1n;uxcwKeFb7}lOvgk znPW;0)~h6xUID6@SM|%Ce_Jfw)-nSeUIF`Wb+E;Eh+-45M8WuZuYeC(Sf!QT#1GOO zHdM9NS3r7c$Tnwr4R;6?A(gcM75M8ZlznTVPV#5GH0j0R8`OP^5jC=_9fW5MM_|5t z1tJxtH_%a(=FztIH;s+xfi|xEBWXs%%9x<(*>fm8C}jB3i_VE|-^_M75g9`dIvc+F zXo@DIO5jA*?Oz*z*Wb6i`b)|Ha`jIXs?6sxb)#U$!pImvFwg8&bL2-8 z>_^h^b2SE_m=WN{3GIy&%qn9USuubjy|LS`a7lPuvRVJ~0~o-VRVN&)H~(Vr-{!Nq zbOx{+LTr<+tP#-^#ksn9!vKDK7I~fEyrXQR5!&jb`5N$F8_=bjv!-aA(b=GszXqiO zVNr)G$we|=0p9T)ufa9j;%kgj<<2ivdn@Ccufe=zVuX3!OW{Bb^pu~$2kg;2RmZG$waA=--?)<|DCgRy(y90$*R`|HF zMjjYJEe>Ho{w0PoVACI5M$w{8T`f84MxeUK1g?lr`SCu;!#Ng9UdC^A@<`7MA5I zFJ&qgfL~9i{UK)R=fi2q+fr5*a9O+9HizPE)-h+n1;fn(ZWx^2NO#&Ix02!tY6!9b zbnH{Qx?g`sqcKg!oZqp4d98cgv~8hpe`g$(u6OtnLkX3aCrTNZE^sm-l__4}g; zBbP;v6)T8f9I$@#umwX<)NOU|&k6+ZA*v7bepF$Pq}C$AtbjW8b#&Iki9KZ{DfxN= zE0CVsRFJ>p_%;VC^}(&473j`&rYHJ8%$DRe3iHpif{qUrvIC9AD@CksOWy0OK(n*`(QCsR!{!Zfya zFE#+LA`Si&%kpwe5zYk@u)j1MW4>==pq|LcZ{hvnWCv2II9E$9`ZrwFf&{C=>|ik) zLJj)d{bRFJUCvjT9k43>M6=`zm4nNhttoV22hBdy2$EE?)#_{Rc&|d)!TCYil+JHt zpF9+Ef1Ka!K$>y2LjO39Z{hVjR*EWiKq>c2_H9rD&QWj4U#wboU>HM#E6~XsFfOR| z?_h!*2oN8ebVa|4UUUk;_FiQNpJQIMYqFc~elao1vr=<_BXohcI7zLO%*gbUZ|ONe zDp%5@4_!6>BvUItha?BE3e&9c{+&;<`MjQiq00gM66HemmGFPQq2_WrcH#iSy1ZlF z+gY3Z6aU2rWN`o&?fVJ#%#;0F?y#GgdJbUnOzBE0GI7;{RqwL1!2#lZs}@V6gZ#_k za^j*eIRTrxDanb%kGcCoi-SK@oFEJnWqficS4R4C4;hUHCqVLV#L@^+DKVmm`sioE z2?Xk9{G6hH=7mnRRW5$y1hS1E*@M@Ww=IHcws=-JL1n5R&F?sRUO4^M`iC7(V9SW1 z#dglYFL9AEHn_(LmORtDC&S3FZs#*T{W#ZIa^;qEY4UObb1w&`8fEsw z1lF0+=~FJS^e>b63lm$cmtNDS36j`hQ}wbB+)snkvJfZotyUP9sn+vy%5 z1!6c}00c_EsI(7Am!63R83^-&fewv-*iP1run6;-kx~3u)@dqy; z<&G=qR7!R-D^4BY&*BA#J-nB${vm0~&D~L0b-W<7;=}`8j(Q?Jwc^lZjTfAHzQHQ~ z=()!M$9Ex!%m?!09YRESkXw zPWMmazBM|>bK!Dho7V6Fs*uY&9~<*iL30ry!#+M>6|Gwq_9J}(SH6KA3*rZ#4h6V> zQi~aX6VWt8e#H-hgUEhIPOT9HDoANKG4lf~A5Wf!>XctiiBE8_{rsQ^4YSGWzBGtO z)#@gUT>yy87C)jIO78LgXVkPICji2H`|bparbQOMW5Xr62mo|AI@pdIC*z#2Ia35V z0^pq-=DPl0xj*;Zn#1F(0)Q=yJT5TortE3&XB^U{0PyL{FG)I0GD7|QUTN-H02uD8 zYKJ1Vys3j_Z7sJK1PYfsR8?Rk^pn2nPZJE@@K)L4ilnDhWAh z-PyFl%yX$AaM|&5@iu5-vzWvF0-*_kIVpt~pMJANA2Djdd=VjFp@X8WF%~xU77nS> z+E)mCTAfHf&k_-@&Ue#0$`t~1pH-xm_iYXqug(6=ObdZVrbrHDnTd0u-giu`r0atPp}}Dojlh@dcVZ!a#T`sl~!5asn*}?VE&*FgUT9vnjQs z#OTPKwjVJN1`z)`zrud6^e|71z3!Ya0LMi1#f`TmTEq0%=oBL0??ns4#8Jl?#qH9P zm6`~srTHl|77aW4pG)X3G#?QVq1#YVfAMWWoyqW=`32X9W?PFjb>N*nk$M07A_7uW zQNA(+xJzqGA5-4?i-3eKC%KmM2JV(#BelX_5#YQcfhX%6vogjNk8_JG3jCcnS7hOg zUavY2PNj2-f|H^-q-$^ZRyKb#epc*FPy~IvX)hKoJ9ITGyK`$hV=1YckYpEMlNo%y8MBkjnhqXnq`uh8Wn~8?Pn9 zvWA^usQ(YqL=04GB};@vo&ATMS3!pFD+az-34Ly0?u|_>I-|-i6$AcC8&+tat_5Zc zZzMldi2-JsOwA9cxF^4Y(36%2glDoOeul29R!Ppb$oPDAf%bU%PJxNP(pgag?`ftvz6bA+GIwC+Ev|n=a zp1=&^IiHZ0GXD_=Krg-CL01`ms{ZUFAKAo*i zPLDb@rUbyn#!2r^{aR(vLhGJSBLP%TNPe6TF^Z4ZoZI}NmjK=tLyGd#6WAU|1WPBP z5`ZtpoBGM@Zi?Kq%Lz_S0^kXo7TB3qe&J%`uV2-a0RMThBSb_vv6`33FQb`D0DO4t z{RUBLN^(Yo*?R{GfVnONYENssFa1(mWYQ!+=vFzQe)A8HcJ%pO)j|o70_fRh@>h}zkBlzN@wwJmGWm;~tjuVeRI$~=@U59995u>@e;-p3zmpYDIdJEz}& zA^~dC#{@oC&)94qwyw(b(h(O{8xh1}didP}t}H3g!yWD_Delzc;_%cl zpCbjdEMfTGZo1M|WcD!_R7rtlnPxQMiAuDbprRh7At}JzUf9-+XQMN4p+8mqMjCt* z%ba$Zt5}#>)@X2vmIm~*I{KlojAllA+xNOkGGHo#z6IXp6HY>8Vu$dF47kFY6!tRP zd9c)-Kf`#E0i3UBYvH1NxoLY>;FCmU!Gv+qa4Zh?PlHM?*>wq7fVUe>^&zkDn3LG( zxL#Hkd<;|w;N?VEqRs!zAuTTpu+rJ(C?6H9xoc5}>2zg58@%AC_*d8jiV4R*ZQ-&Y zNFyW0ZOtcM@(BOlEb|4wlP9bj+3A&KwfGr%DGPR!F7XX`lkAhm0)LH=$N|P?3r_=V z3Y%cEBVONTIbe()VLV?n;(9;*m7r%(4wNOi`n{6nu=gXAmL^)21AL!mtm9ao^Abc8 zH-b*&z?btL&RLYHH?#raTuWzi;5BwnS|A_&Hq2o~QV)_mxUs!`c%G>}&1m9Bry-FC z!*f4n-Ax{BCi9u< ze;Gd4y~QYVPnHLQ?g<ptJOf3%`)2sE#l2z1@MltjJIt3j;lC+%-j8+ z0_cwJpLbRbpv8Ai(URFz01};|MTI>U$0+VW1VY;i;7j~%y~bAp^o&V-7E%O7FsjGu zu}&Xe(-2KHpgCclb+0K&J0LwIi%}YUW zN?_l`^jCc>v2t#0+mofW5>OwDjmg-x8#-&Xn^xXY0+TuUKmQ^sJOwzm<1UaYgR=6> zt|S;*IuXL@SLVXX;0Fv_&xxt;s7FGXw~Dkf5FgC{xtOVv*TDKlpwwO&6la?(#}Qx; zS=Wlye(Y8T@QcHREHvVp11-!e5%WiFk<>i1E_iHp(1(@9a^3@1#kDOV#3)L2?;0pHU_Ul|H%yO>a z=iES5@R%)Zh)HtWrS*V0vX!I?hjKff_*J|F4hZ zzg?Z`3q+fA6E%RZ^L5gr!lCrf-6O_wfEw^$pj*VYKoL9Pv(zmPRs%Zi2|`A^XhOE> z+$s0{YJkAikB|S>i^+C+XDj1c4cwW`|6q5#>ySCIGKH^G2Q)&b?Kt%5H-9Cq3!Jyr zLA&iMiO$V~rn6|rZEqS4(7eRZ(W8}POiN+C%2=lX#;RdMdUcf*o{L~bnGQ9;%&*a! z`@HSWYBO~qWH?O_wZ@rsA{aLB7x7_on?Vz}QNAIYo&P?k!KmMK<){hN-9FHsw3MH4Xd=^jkb{NQHqsQoZ>qY3`QKW%I(G#?gypV_$aUJDQ? zuCB-?sqG(kvr|zuY5~$F_gBR=E%51I{VPiRi}~R9&PTHcS|E_Xq}Jo~^P6F2VmePMZIDK5r?O^KiCI<@ znXE0L4H706WuN69N8xTitsZ-515aF1CKwzqn}9Gc+tFxk5Z`@X-x|S`MYr`#9&n}& zcrXIw{xP3Rxb7Zzwm!eiKTb34(oT)V#Xc0Vht~lzC*mm{__`GaixO(8_&T7S715ew zMeA9bnM-q=S_gP&y0_oXCuSWLJ)tQn>i{%O$!Hk{&tSrBtCZ#sI-vH|AGPwJ>PsDo zHB9(M9Z*~}Jwe)faVAtnl*7fP3j$7E4zZ)quYc(NnooDs1+CBf(`oy+cDF?{_!}>H zUasJ~p2_;LQi&vQsJAX)&gl7Vmm7=nS{oiQ%3l`*4N5BrMYg>b`ts#9Rk$u#e6P%w zzi+aa-^YH)60Hl&OX!&`Zc?(Q36wimQ*?n7Wvf;pk-`=dQ$1wFs|SKud3H&c4tHK< zcEIiN>Al?d%dZdgJJE<&yJp!d>j9d^&k6IseJE@vQ@Y6Jdf=T&kgcg^)HL@G*w6IN zdY}Tn3!QqpTbV5TL))>J9uTBf?20}$PmysyIx7#<199^kB5ir4_p5bCQiWA|;I9C^ z)fbNO`|{+O1H*MaAk^{Z1G-mQ($t^Lpo~_c$MSkZeUKW&o_q z+tB%C-!h;{eI3u2H30v(8=c#qHSHF}-1^jY3;@;~In^X}2v;cHsT8|~0YI=lT`=3d z+y2Uh!b)Q{Km^u2Yd~|yL|QsOv&$iFt@WyEro{Q zUx+l@7dbca`yPru+24j>=aPVGJv1>(yDvQ!0a@Pr}I#})gd zTT7rmMM z!!jh5Zv+yVe#@aNbH)VLYq28b8H4D+{}Nn@&v#Q6r(sO)jKO4)R6(m`C&5EtdUWf( zG3b1bOHrFnOz^i1+d~dF0a1Z(J5ZXON+K&g$#RlSz^aHk%PDcH_BO0dQVO&-6aPR$XU9Lo=l9?%3jfyuU`XFcd zI_V5i@S`aZ`lYG=4}V_urtv3J)PJUcE&+puF7oq=(ZYY~QOTwtX!7;eSfd%Kav)qD z{9jX`U=cc!ExO+<;BJ>@LtqAM*34>7EelJBlJAh)T+IN+^2m*SMwzs}5M6UloEhjJ zEMZp6C=0{;o@=|4}OE$yQx%)p?c8KixP zSxhIg>%Q|~1}bF9qeXx1U7*{%;c#U)2VRb|RmTFmc7C^{s}0i(JiH|=Xf4@Nbn zTp}}bFx9cW@g_IN37PYCWp=4KK#TrjG@ZLA+)6b#s{CLM@-$n#HE@UOLWG5w5j`xx z0?JUxiG<96bVa&4p|=GX4)zpHPd+_C_~eY_P*q&cyN&G}aG*p}eqe>w#G)fR$&??SBh2rYpp%T3^^V7dd3 zV6(LsCD!IsGF%V&0!(# zOTdn48S-U&n{}%u9i|k{3WV1q@?3epc`ZhP|G39&1wY3{n_{>4w@cLud>s6F5t;k%a|}>omwIOfwp5*2ARlG6 zN)X!*<6{LLuLBa9>7*-?cFtyLgRMY;f#Kv2k~zcK8m)ZK6f0oSxF68szIuu4h4>*f z#|lg|vNf%`bD#GD?MQ|bD}eB>|1hISpfikJ=8qbxHMsLKGfxvg&6aTP`ov^z4MLoX zFt1;69S6Nr|DU0=iVAXxqOgbV2BjMbK^g?=RFSQ|RM!X)h)~Cr`YpX0-P+1<8esk zARcK=a*Nnu<$OgH*f}!=4)$y*zwW+m(Z}qg5Uo4TsDj@ z@#Wx{nEbL2*fN8r3mt|MwSM8OO*jZ9Fb4yMgTVN{U9vf3T=8)G z96h|k!zg|hS7HulRHTZMZ-o`#j^r6XX)^~#>vWx$!Oe(C#=bW>)8??R*=9(_v4u-f zcEKS?ZUKi+Jbq6jy|~+%GPo0eW&xUAsek^krR9vo;80`)TfpvV$PdEZRZ4Yz`JwoB z3n12{=C9rIDQmne-k|(t0koa|xQ&Mw!S!;1+KJefkS<~^^+)I$r`PsX@T8C>;F&(R zvPy61T3=Rd*9)+OEb@!SH_E`5qN4~9 z^7)!!qHYBW--e#DFKS_GAWAEfXj=il4)VXdmp&sM`#-C=+^j(MM5YBR>yMTTDL*=C zxfRedejf=`D;ORcGUlnSwSpIg-0?_qhynD!Y%{HUt-!%AdgNx6<7(#8$KdgR6<8Pg z`|O}R%cg1y+;p9@f|-S+j+lr9d-}t-UtRuL0iny(xZPQaT(=nRWSII#cK~Im=v*$zg)-dq9%&vDOfNpc-9A&iA8m6!A2Bp;su>T2Ua8}gX(|FVu_+;c!NHCKPWY}PJMIRmtIOZRa9xK^Ejy6v(Ew!7>bD`Rs zV`Uo{&OLfGkQtr*Mb@o3{JjkvIKK;Jov_9IXJP{?MEK7aFAy^~QKpqQ%xvIM z$zG+pK5?bo>f7Rv4L0yeeEL}uBBp#(=$9qdRvUQvXzP^#bM?U-$&dh6hYhF^S4cle zBNZ7jM{UWRvVpCnPxd<0VsDBbK4+1CU8Tac?fqkBxz#rQCPgP6qD z4ytvSR_y2M-^5;O>wK)XgT)&&4yx{)@cT*BN|wEL@Wq5^D`Kpmh)s67J^{fVG}fIq zFj^K`n^+l%O7QJrW4~Er-JycGBtY8GiP#>H0yr!py6<*kRPfN~AKL@6|Bl|=K!@>R z;;|@`lszbuFTTZeVY=FR&Va{cYY#3y?=QC8E_H4g|0%Bo*@O6CHU>tCVM5A)Vn9-l zJ!~)L-p{2d*{GG&k9jEc35w#b+#G1wI)%6UgsfhD0#2sesH6-B4}o2?Cz)!WK#?Bv zJ>`CGGIs{rg|_u4U{{F6r?tAOt8>#{sjT`00^|dWkA*0 zIS0T}Q%PN3|D@)ih;C#e^#VYaapCQ55`rqN^-k9u=SdNeGXVA0cLf>0cl?u*CrfYcr8O~9w z++4HbXvu7w^s$UT!z-gq*R$Qiw(sJUbUvn^VZJ}^Fom3`7L_5T*VF1V$mC$@N$9&W zc6#d~&xd{nqF#Rbap#M-Iv9eS=PjS1On)Z-ig1yE%eu*|P|gWncVZ|a-M?Yc@&+@$ z)O3Pd&qnN-!Z=2BU9_)+#!eu?jCGqMD!lteKjKQL-3iV-$G6iRT(M)_hS5=ao#5ik znKjqcedrwjMAu{72@18kwSouq$`HJyg6S8WKvY7P_my;QC z{hMqO-w``Q8e+FLwSezcbkR+IX&Mjm;UxI~54`AC0voa3D7s z2s^`*)kjEm zSY(J?;M?BoxhazI$BR~o*G(iYkdEL-M;t9t|EOlJm*Jrc_%i>V?6z_`yej0&4RmvX znXT#VBI9gbl9y4`Yo0E^n7sPuu>UqUfIS%Z*^vu$-k>eS9nxk!{ChR0h~x@?yGM?` zRg?BkxX=Dq&gKfe1aJ0ni7Ui}JQNW5wF|%N zDhwFk4~@*p2~u~gYO2)TtkeT2$9fRGQt!i4qBXrLTh!eg~ z$p28!syiR5nz}*H22!uG3hULwhv9@8E^g4Mwov#{y=6XAb;;j9-wn{$<#CDKvZMR1 z7P?{xzCvXL``(q+^P4VX!hC8F@TQukz7)1Nc5t z{zCFDR=077-(pIfG`KX^yKGla@F(42#REBSSc|!q<>^u2i{tzK4Y>RWxx#r-=z6zz zZ`~pKqCopk^$Qmq%5Rgch#v4mK6k_@k^BeSmq2CV_a5*at*0wtbH6qu^~;Gzn+Lom z;N_n9;kvglyb&gV>j`?wT;=0^$2<}E6s!AOp75czFwX7EXzQ&`>S9r)CrCSU5@@I& zHftN~Ao$gL!at5y1)LROQDN84$dBWmKsogK7O5;f&=xD1aCgNMZX>d=YuK*m_DdL+ zM1Oe#txWOrtKC9j4dy8){2JPmg#Rbm>%J zr&qZRtMucx7c`0@-H0>ag|+BCFA>J}h9L1|s}F)ZI?cuP@*Nc3kY!P>EXi%mqFHcJ z;Pk~C!cm-~EGOhy>?h^(GGe@8R*Cm@wtNV)sV{~T->^4i&QQya>yI<3#V~S8Zh6DQ zPk7No-fM^tmh;8FF!+ETb;CP7D`kXM#rClV9UnM7yVWq&dts)VQF?#e`2hN)%!kb2 z9HC8t1VzCBA2`stED0a2=e(JnC$9VM1OLb)euoT9UzOpkQI8Gyz;lXT7s6QY7qxf{ z=7Lzh@F)Dk$6aRq=#;fQd0I+e_+Eso)kkOGuz;;oTm97+zA3(cvsm6Hj{kvUBRb0$ zZiY^7e+9fci`)7YQ&s5;O>@R6*+GQ&LZsyXkdJ&pyxg{&?4b98YEZDr53ud8+VQ!Ve6*6ZtY z{fai7*-KMA1-B!Az$=lZ#vw(n;7oE*TE$iO;W?2B z1b|`Lm5xX<<_DGE4M(*~0g!5QZlGzbeEv-AJfe?EfTAda6Jnyh&0eTTaGeyB03C&#eX@uI)iGs za#Qt{`hNpqp>%h7krdtMfsiNTiBk|TYG+}dWz~;Mxv`nNO$ma6`RT_!U;Pkne~mcC zR0aXB^ha88J9H!d>Lae=lOT99GhvEqC_Purr(^QwGzgGJv9gFzP&E}oh^3y~2Ei~= zt&>Wk?K5I^C-gF`V0h}qlh{;%T>shCjx(Jk7%(dE6ygqUQ6_Ur3*wD}A@cTtN|h&- zgjYZSf{9ZwjC#fgxBa_{i}vr^c~}|@bt&eUL1vu{R)jT=vl@dTBd@FCZIhRgJGSA( z@mes@WoWFSx^Xw4GGA2pF@=D!$kZ_Txr1h7Lnb=q`w*ZHoAlVF#ElSfp(e*_2!U2( z@>YsHWXz7*)+LX=5GaVjP>G)6S7JT(8EPL60jJ5Yx&h>RV*_<~(J12~VA;gYTTcE9 zfyY^>eqtsB)|77PE0ZOSUF00YUmk^k1Rez^kH&6JT{O0}0!JulY6@m@)i7nNq}UiH z34}uAI>|3RzjWDE+EN6vx1kX0r93*tPI${qaGe~Z6$(fwZ(%=2jE~rDktgz&JfEjjw-|C9=gPi||?E5F>&3s`X?~NbRlBXN6;=u6JH6RQ) z<`jv$b>53a3G5{D1%^Q``43;DjTEWjCOSjkA7OB{Ilb-kR9>)oL^LzxDh%jdQqJzD z&=X(I-aO~w2#1TUs`K|Ggh$WU9y|jbv zCe-WXaCnO1VL^h9t7fc1DKps}4wkiYne5-=BCWr^QKnc62kZIfGGs@ClBbau?Xf%I zaIigmKJB|y>XY2`7zrXEg7y@R+1az*;%(+31!V-d$$#p6e)TC@@Kw?FbKwXWa>1AT zM9g+rgiSkW>JkA)29Etmys>L>TknWRgCZadNBhsK+~WeGF79Q8tOzhE+xudV+K)sx zaX1lQ9sveWM~we0F{|VU9pY(U1T?X&=3BO{Q-&B^2-}N9!q8KVY_N~6s645wMU{^P zqQaA99x*eVPId~aMC(Y%C=XmTND5UIGk?8<Q~jLmM@Puw_e>;QKgwwn z$}Eo%zf$QN38<6-oYyka7GJwGWD3(F;jz%rEX(L5NlOeaHS6>*>(I+&#ZF z)IZ82rPpHi_0&bskAmR0&RKI5DeD^}IFdUw(eNi9lYZ+vvmlfHU81XXG}z5YBdnUg zGxlBe8Gh~(4Zc-oqp*|Pg1S-{du`hek(RUTT(IH zf3%`V(8tecqA2OQ9z6HFg%Oe5GJf;AN;hCTB?i#H zY|RKCi7-@HsE0X>#DMJl3vqic4d*Fu!G*6cV}Wl*a_#k#bGv7q%mS;EPy zneg|A(xF_vSZK{~LTh#AwfvZ+rB3Y}3oR`uAwjT(I8nOXx`~(6#jmH=C)?v7Q@_Ig!SJD_@7zXmrzQVIs4;rdk|K z$fl7gis)QL*>auGe2jy?k-rp(cu@TFM5jokzsA9fW@TL;vq$a^eK*X1_{H7p&m9xP z@_U;n62jRnv*TdF55)z2z>c{zq_4eWB@Rev(a)<2Jhtk5Pkn|j<3Ph~u)sf#wD67p zM|4Y$c;L57Yd!mxbL6(39Wu%r58EWve}0k26n%6wW|~0Oga@|KKo{fY9_#(b~XX# zyt3#AM#@b^3kIr!t`mT4Zf`SJ8_Vd~`>~Jl?1><(NGRx!f*9h=LheP)od{W{ju$Uy z{d)`DUd-ozNrZ#aS~F^)x7$74?$?dciLlt`({a7gqN?|Z_I~zoBGB{_R7A|nRr)+A zW$Ii_gl)+Nmp4Q7VwaJQ4|UEH;U_aXV|2w}%D=DoCNKFU2u+?zEQky=eNL{c9pjb+ zcp|T!;!0dzA6KN>Rr)5uMfeAkoO1rsY6ZVE2sXr7#B`HATt9J}!K+Jys1~Mg zF|%%=XgLaFx9sWQo7By-Xc{zzH=e%b{VpBe1@*6PmIRTs^Q6X>o~FY@k4c!aGqaGF z{f2+qSvo{Dd(J+_Uf<=P5<*SW$^iMIbz-BEf~p@o^d1=D8KC`vx+DdCIXS<&^VxD; z2F$T^Q1_)-?7pY{9hY~M0o3+$`UwO&g3%bGe5Q=wVC8FJ(dZPJ@9RbUpZHI{0sF7b z(;i%^|5n1<=W*1&!TRwZr5`%NVkI@pok#40@W4fr=RRS+VZx=1S8 z4$SUZdAhJ)T)tYfks&NXfg}^6QMbijwZ}4ke_ES4|Lmzjn(4(!$f2V&1ZByGPse zTfSM4p{`7Oh0$+UPma!!8=M6NCh4^e+*b9x(v92GBU!-gjTHGN!tdMAZT+3rVix>8 zZ`hVAWWwZIEZAOU%ZB~+YTKBq_hM>XA?SwBvmxjktK|n_tch0p{g-6&*`Ps&_R3fH z>HIh<^0WH4+3-~Aw|oA(3}d%TO>q*ZY$%8ii182HRE&ZQjqA;;NpMfrfqJl|V zpEaKDd9K*1<$#N`A7S=1-;fN|caj6E99U#g2%n*u))3E2qNTUVx%ab8et0Ey{I*V> ziSX~|9GF*&Y)pz*#nH3oX+ZSIfyYQm<5VY0T!U6szvC-%?){!6Yc-FyHZW_>1CP5IVfF^}y0BuWsl59DkV$ z*I!R59DIoO^IZ)qM7Z)m@@<9o&ld5_sGjJaOqo1r<{v@Cum35L@qL6T!Y&VP(f4u% zpW@pdDlVkIb?3F-3yrSO}yWKoEsLv<8On>N}*m2zKf4oGMft^-m003$=^Kgk=Fap%iRK)wlb~% z=^uLF*RdJXVp9lF+;c)QWuBMUJ%sdn4uvp=ZoTb!Kr%?`eyRW7r4Vd87!lX+Cc-|* zr+Qb97Q&y%Uni5@n>JXcW-C$~gz#b1X@$mPqqUlF{gfdv7}`1_OZgFZrF5u|I*7}qS2 zyh8BYx#DOlf`NsuPEWh2{Wswh!4GAN0ZlZKX>4}*h7pNM_0FLf2zdM!<#Udk_|HBo z$T=2+CaOJ?@Spmrl&fn_6Zc|ZsZmiP|AxG}MvhDSrllBS`qK4^A~aaMdHdD+SBfDm zrz4gx$fQYxn#Zvea-EGjmx7l?^Cjb94Z4TH>pZW+*xw@+4btM&A?FR_-;mVp=M&c;!F^5a);EhK+(l)-O{ z8O8u7)WV^rlAVVy%kKT0eK&pI+;V$=-%*Ik+9O8+2etVM+!CCg%Jshmv-}6;u`3 zU3+Bo^Msyqz`yd9tDK%~zmVM1QeG&B7x7)q>B@R!RWOyXaGo>Jn?dWz^* z5z-1+H4B^KHQ}@WfcH~ ze099061N)m@h!3l-{D5-i{N3-+xsUkte!ct@8B7+sALd!$k8#}clCn&JH*nRn%}Gv zM_qUPdMfqqJ5X1XydIou{hBV+ko3FqJ3KV_?dg~i_<%>UG)}PkzTU`_dh5b8OYTam=FMJ_2uUWKN7j~<_gh~+I zt-d6ExpbXeX0eHxQ3(=%dyjF1U(R($%?Kt{R07#1;eXx z3mFZKEt}rGmGHpS;_H_a>VE?(0ec>Mm9QSgvM60D>wdINgdcZZ2?57WI1jULmb&!G z`2_L)gD;u7w$I++8TqKrc}K|n2Q0O;m&#$s)uvxazNVP`2du$TXHN+hDw9GPcKoyd zgEF*}3^CDF%>1aFhfW9oK}7UM9>>*+n7e!H3tXsz>cY+MZia+=SM3*#`%kKXMKOZE zzh7VEXXtBm7R@R!ZAdK9W;lB+9?iybr(Fdp@;tTFt1LFh?k`t}W2&H;V-P7QHbJW> zoa}2{Min$X?!wayCJZo$XEW6JRs}AT;>rUS7ikZ_m>^zeRzXaL^Gv!WRPc(@&GsNw zL$iR2r1-NJBLNpFOcj{bz_Ta){P}in-?GHhcg`}^5R|`UF(iyC?@T4N`R)CEeV5=8 z>4B>9^i%#K>7!~mHRa4u5XNR_{(eU+ja~z$b)?R-Y@4YLr|}Z`_l#ns$o#Ha{OPSD zt63*z4e+XDV3c}}+m zZUvg9Mb@i^>dA=psDo<29Wf#==bwYP2X2A_W_S(6Etv{`)VnR3_oBBN{#FA{weBs{ zJd_;WX2S>0xiygU_e5trnr49h*4f5%u?C7ySFumn)ZM7kJ`xxIsez_i5jI>=J)K0N z&*jo*HPDTWmCYHoq56x*Pur2Q7S4*zzVA8ST6zSn^=$LhLV`kUEuxkU2eqLn9lC8T zsCJR?j&E~cmrL1sd)n8+mv!59n_<+?-LnefMy|D>vB2^>?4#FY>UE<95E1VcWU8rSSM0Jt1&hmEA8~mWi3b(>?mZS2~Tp- zWDL!t*1`3a@PnD}>WCZH$L!a1b&zeeVy$|9wjK09C`=+e3 z{s0~m6Qhy-TEaY%SptiuAHYPKTU()v@{+MepWX|x9{iL1E^qdH=Sscv!n{%HA#iwz z19$Jpc_vAB@$ykU$PQQO63IG0F?ABcXXmPi&&iKFmkOdgr-cPQc=YO_#_}=7yHy0N zBBO$rs`m9j&c#t9PFsezm$^N}uw4%ulKlvenCy66oB4|WV`zZbL`5ojUX-&Nb;HXo z*#;Q*SG*<&&$5vVU7r=zYJk9BDHo?PXrrZsfBvI4Y5+vH(E3O&<<_8$3T2Fh23Qjh z`isA)$Z+sIm7goS0nBy&+dIRzdJ%S*Vx?Bl0KOSPSEnITV>7!Cq>W1N>nZd^gNvGN zM`#1^_r@APW`~0P^$q_qdZgc9YoQK$bwoeq1r%};pi`9eVPvcWcAD)rTaq@O^W6^!ZLm)^at(|yPP?I+M- zKFP*k&0xrVXm9_c^(QPGa(5fFeManz?Zb}#d*9!g`(zA7Dv0;kD)_HN6Fe9a_0Dd2 zkLg~F{Z7!T2~wH7ck-MCE=3Xb?TcNTfM;xTN-5)S74HBGp~2TC$U`l~d8DUD&Sosd z%$C>$Rc$GsJKxudY?D<8z8!3WK-SmXs$bLbY^rEuyXTrfPgJ%TFZc5&R#T(J;f*Gs zpi}xyo4NBzOb6c;ZL0~YyS1MR_!18%3S8i4(KmyAh0|)#=wcrl)pyhio@QA7mB2Fp zozEkD0y|GIz8NAbFvzNjzv~#iY&GaiZH8SNoN(^{_;U$E1@%TakavtWdL{C>ap90=aWnsysdyN?xo$*+3lJ!lA1at*$Qf6jZUjCJN4^z z_*9j{S|PyI41JjB1NN>1P1K8}R-h{1$`IiFyC-p0kS%-I3LlI}#gWoX1DF+0B%+ks z0QoAK0-3FzLf`?x=AL^Sp>@Y74ng57nR166&+ay8j*Mbw z_Iv&J!}In9$JK}L?w;8$x5LserTJIf?+i1{8nbRt zIv}0kevB>Wu9V3AC2Uwt2Nbc*qd)nQ+1zcjFUfY$aqmaqwa565E=<~LRuFL20iB$4 zQ?~@sx~kaxxP^$Ffc@H?Ug`WF&)348l@|6+pp;xXs{8}B-<7gnok(|rQClYSmH#iw zlOy!nG^JUg5AL)ca3krsU``lqvZ_$6Uqn$87?-%vw>MM%zEwAv- zSSKXOYs){gRc1RsI^x8b?F6hxINhlMn;7!6IW!Gtols39LhtUbInn-Wn1blG6J~CG z#>Gg_nqAr1>fMdH;3wr{v4X$v{rxWG_=@j2pXzd81ZStv*=ABW%%=x^#IP@3=7=z!voYOEX z?SctpuC?PAJd6c4CJ5(|x|W94orn_K>D@m8Gk zT&MTON4pykuNNrfobsK72x#nf7rMd9BQA}&Nlqu1ZNckgu^X_I{v#xMNfB{0pK~()+rq!@2HV*VT8(rPN)mA@N?V>DxCo-mQD{>_$x_t9&G{4_RT$@=A=%(H1g(j+VJnW*+vftu`&Np*rzcZ z)6~bg-RyyA9&~>%)UhzSckcY17d@~~tFEx1zxZPG{N2MO$zE`$3M8QtbN*#ZwwMyB z*b6m3xifw(Yjf6fcEp7s^??YPS+HIH`d->_lt&3+AMBQT7Iq$MP;`kZ%~HSUgR9y+ z2Cd#+#i-R7&34N^DE=6c&Y64^C6%U`Ssv2|RAFcp^9Atg)Vw=q&&!Cp=^??MP)XxXB1aFl7mIh=A z^n)yWhcwBQmc0Yb=;>35{`-8NqNd*JPQ{#QLYp($ehBkvkzyDZYMRjzQnh;158|2F z|Kc+?KZ$%+r@l7o2RW;E)LeNX-BSsaXVD4$AhXWCs`d?GhwQVo`E+|f5T6RU6GT}y zuyxzzm`(S?0!L)67Ke3E+a85U#h-q-A>4ChrSY)EygB&Gi9P@l%Qdd7rH|$VX_g*6 zB^&^*bla)^Uxl_OCa2}zL<1l-L4H#768S+*RcX+hhXWAV_TWWsW<*LY-xP8Y*#Lx; zIfr2kSvn?nTe2Ec4ZzW{s|wRzg6(cDK`D;#0N~yfCuj)NJlRg~;c|F207k$Yz#}Ji zY0K1w^x)F~TuRlYKFUA+$+_d;+m|%}3-tNvnw^_gA~)WFWZC!oiwUjxDd)D1yQ%)o zTOWYTN8;>So2E#lf-9EIXoFyxAbRpFsA7+L4RLu3V-V_2RQ^rHeGG5MWuC_vy^ z+Ni@Y;r@~FCu$#VgNNj#I`J^{EXM~iiVNvz)mtuqqaTJ7d?m@}jRyQ;ZK>*!g2V80 zpK^^^W6 zwNoU5E#k;Mj}A@TjNo<`8;b=7$43oAd(hbNYNS5@?=dQmoB3gwH4Q&-`k?v7(=?dX zn`#6Cp3$PYC_j^%i;uiC;TwTy;<5CgmA}M)&Qxg0}=~cf^m`GAJI!8fWhvhq+VeE*H2nW3Mca6N3^s~ZDR(|3$tUrvV7rYWo+ zBaee;K{}?0=`@y3Eqiu{&Nygnc0bY@FpF8&7r$oyJPxOE-r=J~s9KeO#@<2maa`iZ@;Ju?Na=lTVQU{W);E)%x9B;p`8Cp zd@yS#&d-&6Fa_A~*D(;zL{id<2|5V<*^ zwg`v(^pR0Q=0WZ^U5EM=j!XW<#y?M^Aemrcx&z#80&S0Sn)EG?qsuFF>Hfd7kX|5nSu6N1J*AZPzlRU!pg#)N zir{J0cLoBCB`F{J*I*nP^E8RJW)}ukN3jIl& z<&nr^Xg>!P-53pF%TkrW(^x|0F>`P$NtLCSF($H=Atv#!Yz~rH=l`MAeED9nFUh&T zea{77OmF++PHZRR|Lzk8(mK4^FY>%+5{YqSLj{|VZ(flJ=#bW^~>xUC5UIvHg z&Z|Vx2QR?2w>Ho3PQ>j)X;r?y=miKc*WAN(FH&Dgbc9%~1Y6$+t6AbP?{ z#Y#D!TJtYSkECD`T=awAUgfgzQ1$4Q$#yM*grdb4%B3yz8!tJ#r&Fj&kH&?lJ@=Gw)Q2!`gl##9~UZ2P= zeF@S~e;W53s@L&T3fbk>F2TtZxjs|Pnm-C-af8bC5^#(Q-=X&({`oIAj3?x93DhIw zdn?IG6Z~w5xkU(;A#styF^|*Kd?u#zG?922-tXTsgr8NL)o4igoG32CvHr`1{9q_! zXRpzBdbOvpT+NXfFfZ6^rnnpph{WtWoYOhh^Z~K=eXU>}1vb&wIJ+ z+cNyfx?GZc)8^FXdD2vxy$qHrHHlHtyyp_1d|Y2PF2l!S!QQ3V8jq(9nU!7r%h1K! z^XNBa1Oo=kM`VS8W%xYUBzV|1QYA%%}3^aYey2WQ@>e;Sz5SAcoi zZM@8LyJIjfO}2A%1v*XdgX2hMJh-!cgkO@Zf+FS9Ps*0mu1J-hXggY~!1eL1UinY- z^jKsCf=Y{3a6+`pbNcC-D^VcrG`hM9T~DVPZNlzk)k_btIkDH^R@2bzo95NhGla@w zCE_*sZQaeYZ=#A8HP<=LM!N>tv0t<8EarIj;-x|E@ zLgq|-^KKKT?_&v`!y51-gx{vn=_&I>GxPF!tO3r;F`EYSQtrnu?4yIj*Ptfr<%wFX zqv`s1wdPvl8oW$hJLiv%D;XnOErDA`(k$z+R{Hr9+TX`ekQd zF!tpd+>j3r9Q?+2qN)04g(JBRdwCb}Bm?o7xS6L!c`w(Y{9ml*N=F87VS!fUn(8`G zRiHB>SnRTpsm9UUeO(8skf1l&^UlBS=<@f4s)avH^V-eELX)a<5zUaH&%mH^5ww+v_jcHrf8lsJget1{}Y5W;$zXem|0= zse;UV186D5No$JyOp}sPLY8tiK)!`Z(YEjEInS4rbl=VmNLG3Nxh`)={#AK)U+?zD zy`Kba{loO7dnAplkHpaibTl^|AYMg}e`wWhk~q2NPmVKo9TEdN%@ueYn42)NGHm!- z*#3xpaQDY^noW4!v%}8zo`0mSTuOIE^nRTK#gr*A`{Nc9qwmtIO^E1Y4k>)|D;A-ive>J)dlJaEVJt<}4op9o4nkaSvAN_%au+_gPBE*G=eYzc(sQ0Wg z%hE^ktNko%$FKuz3a)8d>wHCn?n{gn+&e(OdGX1PR5zb5;Fmg`*A7&_M0&wRNjZI# z1zB-EJMd|z#PRFQ`p%{uEjxGW4yc*!Gj58zTChqg9o6UVfTQ2q+#2hEG%bs7h;`u( zymgVCrDh1Y;C%gnLTvtizYVVUW1?P)AH|nDBVZSz{CDVvh@?wjb5>#s@$JG;2Z3cF zL0xdK?DM|~&vv0H(h%2pNZo3Fr?K2!Y8S*_U&vRj@fdxX`1eS|Y8P5OGH7d})>uia znlP4Kc43dDenCL%=?ZgM3=~2R+NKg#RUKP?L$84pjxr@g(``M>cnl>K1iR2 zt_#_DTu(M>cSlw11I78j(*!aO0b7fry1>qTka%|?c}ZF4B0QcxSHHOrE|?GFI!@g8 zxG=bU1^4zrQ__uZeLt=aEr6)uP+Ib(-&J&FK3w!aDGjGItJSY9DXEJQ~5i) z>4&(k$AIIr`0o)>bh9b*20B67G5FH6ow~HR$!o*zG5_i@d@*Wy`%#{%{_bm@da&g$ z_#^%EKWSsMKPn^!4q4xR!BaIlai*?Y-jJL;xxma{uvEgL=sNaZZRN1Gob<;pXrLL= zE7p=CYJEr_i*fM_!oFK1yjw5}%=SwnY<>P49^-|Ld%w<5R6#dlHB|Wx7=6^yrtvRE zxK*~&)~xQ=*+ukeIPQkp$;2HqU+FTX*evt>tT;K!4S{kXVP zpZoe+);5JSVva5bD`fQL-;j=GNbS*kG}oH)&h7;H1Z<*8RI;bW@6b=w;=F}U?(;-t zlzMy*@KXnF*C}3{fOQ{%!bR$9?Ee^koR#UEfZ{3gdn|;NlBvPaZE>d)kUK7?ZmQS% zhdFuN!q;^IF>mwEc!qEmK35PnZ7!U^)y)T*50o-bmJ6MS=}t~yI7%A7P+A=^>19+A zmhm4j5j`MYvs$%sXihx+X!ZxXT&;AAok$*a72lFkWc-0R@r;k3hh)){*15C{?=Nb9 zQBB!N+-?Pm{Cmx*H2eo}d>4WvT^$XoJC^Kd*Z+VWX4Qa(y>KS+^HerBF#T8JXehSFVpLg0&ajB(7ic$J>P9eYr2|tu1=r+s# z+mouqQz-s%Rh+)UZ;}_s;5u4!3djG5)lrl!vA$q@$DDza%|_m7d~(&0U;>Ox;;it*E@s7F}DZoct~t^dxj6}4bGs{tH_06I+EQ|Z?4YX@C*c%)T@J@@5F5( z8vkVVI0FQ`!$j;qruDct7XtjTXK*XtQ+O`<*B>ZLJr2EI>*cM9w|uD5t9+GZ}! zfcQ(zC3y<-*3--Av{vMEaEtrfqC|Znz50qalYsUdp8x)L`NL}84($ip;STFL$cz(} z7V7e#Qv`45*$JEjyEVy#_}%cD=B)`^w)Q!M;wa$ESU7ZK;ipV3=$=CY-SOG(JLO0c zewM)zsD>rxYI)|NFQ?HIFO$-g}IG8It2f6r(=YQwYm~+S7HAE`T z@AC{1Q9{HLTe^q# z>E1guW#v=E>BCTO?e;Ud6p!s}tCCZM{PEgqRNC6t&8XmAqQg@}cHw`FV!Pa%UGv4u z`?sfvMC}H);>;6h9v#2a-#tSpOLUx2@stmR{dtqA&3%U8@GHW|^e-y>S6MDbWqXF$ zctc9%f7U3O9?8=n{qPJSrAoajw&Wx2IuRAz_v8#wD>=ZE_VtV4)`-~)$I&x{-X8^} zC(=r6zQ-*TB;c!e;1#~MCIghlEQ-I6WU|C4UE;9faLM81B;=1}Qxfr~)cR~?@t zE{5h9qx4<1Sg!Je3UMwFVh%~MW5s%|Kdu}M6R0l`cPBQ5rZEc>8`?|^cs3V^qjq)_ z;`CrXl;K=oUY8355}gDA|B|&as}fBRZR-W1-eRL7aOkvd`RqSO)!qw4Lz{Q@w_+u- zjt!zo_;i6lbTJ{5H=`))w+4xAZeQH_0Tl^lKTynwuMSz(|L+o!Ro%oiJpb2ySFE^E zF!2&mG>_kvlv&1ASG8v#+#dK^T)Px%j8#x%U8np{RmANEBN~U$+KS}{;uqq z9qS>z+a=*Ddar(k@VIY!@XxC7Vab1LnU52%5Jd-3--*^qejz?ecvdA}A-ozZ_ayD? z`qKM|N{8335O&XnYKQnPuI2k^c3Tdv5VwvKjqC+i7r%x^%&XxV(e|`(e$pX`;j-!1 zOe6g@A_Vo=_?$#m^4)juz9If=MB%5L5W0bdqlAN;AX(XK#I_QDYf?RRt52!q^BbdU z#P1uVgvYwilgx-cKPj1CBTBe+vUh|-zN#lmg+BASMo`B^T_^pwDu7cf7Nit#jhLrv zIU7#8r-Y*US$ZYn8qwNfO8-YzVVTQhpYGf8HG(70ULVcnondcMSkM9L4We=<SnL!Hn4TAjfpaHv(`dQ@U$<*u}-x&+FcoWaNY5nYtxplfhxH}5im`5Zq7x2@4 zkczxPWTfmHp%eJaHi3sPZ~hI!Y+dbRQ<6KidXx5K=H6XAVvRROcFk(@=?qbZl(z`_ z&x&RPjZt`EiPuy%a<>S#3ajFhuHqQ=j;9!XB z-jijEr6&mI6yG8?n`ffdgz$7^$oOhd>u(X&+trWAXl!&}cvfwa^xPseM?Z=#wUjRr zN>KhC7`sK>T>LU<&9Pzrji~rHDUJl%r@_zp_70fh$7dopU6Ek>UHp%-L9Ic|Ig#bj z$4Gz{sk69K1cX<1vUdP#YaJ9Sf`!TDNOgYwCy5M=Z8Ii@FEmO-9^4M;SRezN&N_ESHx<>u z;S!3kEixRw5qMkalrbBs*)LP$hzwO0DILz(v>!*=b}pF$?>IJ)s3&%gP$qg7eeY2x$FJMTf1#U};tcUXj6y+uQ&@9#k&O>XI*@$?uIgVPtD zTlc`cl&h?}J>~sdvObQkKlcDg+bA6m(f7*>06&Tl_ zl=EZ^32QOq%N+@$LhT=~p>RUF@ne6y;Sf_)aQKTyjuB?n?>}wJ8f=FODhUh$NfTIk zeQ$r&uQ#HCwB$I#*r0w$pXYV-$p9)`fA+tiVW1!!;`mOMF@_3R%za(~DWqd~o!w}$ zhp1qyqPzUCn=rqquwjHA4-MoJj^ipGU+2@O3jJ2sMT2i+j{>a?cIEa*gV2cd#8_=SK{ppfOjZOM;EhSM_cxpO zrry-IH|3#0`R$)M1tzt~dlp0uv$bfTm%jL`YeHzPQ|=^Ms1*&k(+AaEqNj|!KdrBh zx1)jXTvZ{_(G%6imv!^A`)F|HsKVp)Dul(N-bcCq7!7c~kcvN=#qcel<7az%b~hgW zA6XMZ9>Q@JKO?ix@5XPe9Zm4xAWvjUPJs|MI`mq}$)~LFy?aTsVR~O29bB~jM%ssN zUB8t3!SzcM9X21Qix_Zu{z7_rSE=rR4s^I>U;6fS{pUmfTxP#S2M0cqw?})nZnH1% zKl*;h(|^;(Fjwk>ZOCrlXSbol!zoJXEKaPp(|={9FWc|p+XYydT4icild<~7b)W-E zwW^w=zfC1~jWh$a%D5H7Yd@L1-G2q_#`dkvB zjYqPPwwskX25_#Weq?pTL&xUcQ9ifA0OBVSl|DZ*@;ANMezJp);-=uIRuey$%c`zZ#v za8{gA1&DIXXW0qyUSa^%P?;|1BK=tU*-;<1YimlM|Zk0-%?{j*5vD(5ww6-o)!f`OD;?xPeVOCp3Or>>eM5| z)5V03*SL|V<;Ddl!$0x!?eF5{1uT}dlO0^WXKoFi#srK4A&HexQmv`PC)+ABn2@bd zfx%mGXEkmXwQMqn36mgK>C}EJ5p3mNL9~Ji^pj?LnTLLl7OQZxx6UzPR95?+urLcR z5fk=Q%_Sz7n*8>cxEQCs?HCJRK*fTm6<3^8&8u8Uf-Sy*=vaV7^0B@z%bN`+zc&V% z77J$gJ03C{p;RO5{Mfwz8Vd$=R5n?hKP9d#bCoa-VS(g)z=cSnvAfOS7^5>XHhkpm zH{R}!Z>3sF%&Wr023)Oy(sN1j1r2#|t{4Gq$WHUqNFs@Rpp-%^hj@k!)OBqYGyW{p z#m@&_wimG>F&*Tie3XpoQkBgD1#p1AHci@CT#$Bh^sIYY2?qoX*3~V)4VjGDq=+{v zaWvEAS^CFLSVi7Or;`%PAuy^RbR ztC4wv=)(ghj?r=4`}LAC6JwBfJdEj(yP%P@*Uh*y*R>b~9B z#e*Q*mtmw0sT2Iw@-xC}_z-l9jY?1+7r(r2$0eYP56`L+*4au-zU!xWpZu}JhlQ$- ziGm|9h!=9r+v)P~LGoU$ZP+*`M?FrP6~7(eH0Rv}*EH#;Z_7b+uw=lvhB(u1;$ zj=#=NPOcC@>%$dg$}Ng?S)_-qVH*UHs4kGdw)Ak+KY;tXVVeNdiA{cQ7ES%fPFerD zj+_v-etAma2E0%;9HJ_|RVIYI-<%AbuG*4A2J!w~)`ZY(rDXTSRbS%tXq=M7j}WL4 zzyCv3;rL~3N%^|XpAab6j~Y#iS*Ug}ne_y+3Be-L@H^I<=gK!;m8ScIz%@Pf^*DpCR45k} z?T-r)e7bL^&%pN0F@(^Rwa14Dsn4T5La&DTZS`friBDu=1TiqH z%(kG0q1w_~n0?dWA%V^FSK*6#--E?IC@NT8g8DP<#Wl-V;n3iY!E30Moty3VPv z^;^Wuzg71kftu!Zh;kRz4n3zoX-yyjsr{GP8IL}@@#Dyv7a@@X_K(25kXD9@xcosy z5)@LHfBh4ooo3;eGGFC5&A>7a+loW(N zP`OnNR7`M<`MmocMG8a*G?=IP?>YGE>Pz0gBn7wlGa6>oH@IuR^U9C5N#XL}@8NqV zYlx+#7Ax-H|KJ<_z@WV_j)Ln>i^;4atuTNL^buii69gJe>Vxu!kz&Z8!@hQVjw-fL5@)Sw_=~LBpUHq!ccZK#b)q}zCxHp-CK;H@)#~qI zvu7Qd=rL7y-3R}KKuYfUfjSbT-q7Rm`w)*IeyiGfMfMC z-B&XLln}Vs-MVlY@y-{AUGt|VCB&(-CX6@Zp5puGChf+7omdESex3m=e5U1_h-E%w5T8g{YBP^32`57T-phxJ{4SO-{ku322&03 zHtx~aPyzSTwUT6A`}4Mf&Us8?YM2-&vv5yUEEl;T^{6$ahDmkFGL3#=vCc*!(Lgh5 z;OS6eQGIhF@zVchmp`8xbT$SeUd1GIC2dByF9W04wCczt|5b)G#JfAB^P^#?UPiZ!xTqBm8y)H%y1IHm@I^xWszGGCq9 zx_C8z{-uUmLz?mzJKT%i^jU`*xHO>gpY~Q6`$uVGNtLE1QX2SMs#_*HFN6^`^Tvmr zod(30pS*rzh$SD6`^WyP91T3uEM#V1iq(3P75l?kkp{9Njp8~Rzf??9^{b;q(tz0t zJ(}u|=lF>`ILi6)H1JlMFu5=9x1lI`zqmpc4FrbZ(PzBeh;ImujIdv%0exYjrMY8X z+uPxHd4oS_AgA`+s$HUwWTPlzD`1NTmWpd65II}&Hjvr8`HKed!fq~ElYTt1cu9XtKPK+Uw8x;qn~2A}uV|A0;Z#)?K}8{#Uc6N(=wg ziQVekQ?VDR-qQ=&)53ce_D~hGkGU*MKQ}YIXknqp;%}3;c%VeWSA2mNv|tx8CO6|^ zi0zN{A7;V~Eih6=yesL#z$|?1LSwvRIzlB6ZNF0xvwJfW51r7UltvN#U!66ZKj0H1?5Dc#H#jQlK4qak=ps&KYMz|J))Y#fz`?Fo_EKqxa`c(F+cHs>c9MgL3cCVG$&>td$#`|m&lRq z`K`H-W*jpxv@looTC0!oJX5Y4&R%bJPB0=bc1N)cD%x*QwuFou)`u16+9 z+@2Kngr*AVn~1W&k4qmmB3e;}M}1=xKh#;^%ui_V(G2x!Y-P$HJSP^&nmP2oAJ40r ztyJv5SIGijzp_}&ga@aYE~#D8uHUsY8?4B?U+kW2(0-01Vui=LpTg&rQ(2xp3mP*e zW`)#b4;JB#^pT2-0I?G%W-WtThsS(BsJPj1~I19QMF2*W47U8VWQKpckiyUae zIDKE0^OzN=Y!%)cjyR>~C>%t6!C?cbKhLCWF}fN3EV$o@aj=0hm&OuFjeM!_S|e|e zJR59=dTYu&(PErZ+8|ihVgpTq@7~ozJq+(Y7S^R&u)%OYI;xy)bh(a{d^~PH8>}IY z6TX+gBEuxsn8XMhurPII4;np-{4P2s<&Mn`%3^dw3c@9xYZF|C931R0wd+Mgc5$b( z9Y*^JRh=CeyfhF)n%ARfLxVnf2J8?@bdmQfi@RjtGv|W32|FBWm3iCO)Etc?`0d*8 zIe^T;Y%r|hyA$o`7q3Pl4)9(&ELDDBzD2(pF}BXb0n{`H+k;>Kc#d#3WZqbFK%}^O zqpl;(Fv5+Pk2ye|Bae7l2T#Mlzh=*p zh7;6`v_$yi0JYHQY&uzx6TUU-n=Fnc#}d-{)NXii!g#&%b)AFX6gCP&`Y0I}Ob=#O ztc<1~C#Yd3KH%koxB^;Qdy|?)WD98Sk>>)V&v$8~h*gnaJcyFq1}>og_|P36gYy9A zQJIi)3m3$aRPLW!%{N=m*8_ApsG{8l9an%xL}Mcl5OXKxfy55sCHe; zTKR&^^9desqrp~LB}&ifRDarsJ;?(SIoYqVls4wMXGd-RBjN=yH{F2Ph;PJeD32|N zHF%*`@P#S)rx>oy`-;EYLwVt}(t3w{q{|TTm61j$n-@3>4f1DOxf~sbUFn@ld11jH z#j|2vEsgo&KF~d;gpd7;SuZZpyG_+Zc)D zjdS@xb!oOYvi(G|yGK;3qL~l4l<0P4m=ZLGvA=xw9pr;M6^)CR6}aphkCtTGkNBX( zQ8|Jn;`1}TXPZgJ*L+~Cy4%6!wroHqb4$7?#t#cFiUsX+Y&mtUKR>ic^25;Q=bhBH z29rar7Zjwf{BZU`{bedE%W$LKLn9{YNr2iC|>hMJN$Hj9|%@XmCYJx86ssQ zeb%J~z+8RIW_$e@=~|O#r^!wLLXuwobr_6^n^6|D$nu1MxAK(D_1A|v^ptB9%hy66QG;a7 za!E1Hs{XxgVpIqQi~~~#5|q|V&>QZIvV_5cyK!;5*g&$wT$ky6u`qakw|uNWzdUTb z@h`8xQW%PM81fqg&E@0TWc#X`gu%_CoVE5IDfyo1OI`hSVW4hL(7?BN?oNZt@S^8R z7>G%^{NEvAz3p*=)(RF8a7>u?Tvx~G9`8$4R`U~q^eD-zsheJY)gkQ(wJZ@hk0^NN z8+fqkf#;xiwkiTjBD1}vq~{3d0)Yw+DN(T9+HVX^xZOj^#Vs&b7X{URAtqwWn+~2> z0{VMSqF|1=Z)%@CVe|RgEAo4-C}d1$s)kp}A~KBg<^1bKAqMY_2YZ-`)%{R{ZlMdff_N)wXm{CqiWQtf`t-jCJj#MuWNJfpUU#7Ve=g7jfjQ*1V>i8z4 zjh^k}6nlf~u?G^c?JD;rbaw#<^J<{FSyuwoI=3<@#hKS7O$Ofl)|Y^XqnM5-e_SN$ z-Il`Jy(K_TGrf!9Em#cXh=)@@lK>&Xj%2Iw22Y};<^->N2^gP6KFD>!qOFuJP2DY) zfM>Spj$c>)5@}lMxn*@o0Kwjqa*}`FaL_w8f4;hr0JE^)s*$C`hdjiTiqV9U;1Fs2 zHt2hNj@%mms-&?b%u^5a(JFHDdm1UN{b`Z}j&~H1W4QmZ1mtXu1@=h-+i6#BHu^=F z`+=2J-jF2RmFe>_E*p>!qrCX)b|?waWTQ#=4RbbMXDbA=jwRt{rI6(5u(LLC)90LU zFDY0tWD)dd0SR7J7<37j0(Lu7%X%aI<%37BX%ds9pyPo&cAeY3=kbHB+eo=m@NZhi z$j^`Um=8x$${1N1*!Q?)gCaBCu`eJ8l~Njfq&L*WOm8i|KN!4^Y9tLW+8a1DI`mPh zFPA;VEu}%Q5r!%ftCPRxV{Iy)Ndt-JKw3zC^7l{I>|H)lGJy8_q4@n&0gfK$1-yh9 z8PM6hwB=e34N*VCwcp5+0bCO;Yg_(aVsG#6ZjL$`IL~}A@Tt9$^Hm66QD~n+a8aq9FuyO ze}CnYgK=feRXm|+x%tkTh$#y>2<~gYZH-zEO}%`qY7!?0Z3glBizz-)1DIYuM-6h& z-OA2>uVg|`K?<`-tXB?}FGt5(aYE|2W6pz(@A&y!vhSjdlGG?_ZCt@B^3Z`?dMr|K zSw7?bNp9C(9yS=odykzG?OyTu-8K}!1w0I{hmTd0HdM<~%wy>>-6FEw}QZlTsYI&`Ne`YTe;Vbx#4r zzQnu5I-t8xH(KZvktx7?(uK$P3~wApB5D2WZTtF!JC+ECCcuRDa3mi4~>*QwG)HW*85G2qxN5s6QycWa*C#DdfCj&EP*6 zILL}Hu`s;!qg3nQyTsFyI2uJ*VGUt6RvJ+7-|^v-5L5(5YW$v{$N0kT>+#uZ@``|d zoxP4q%r=%ck6%7!pa^9u+2pcqFQrSn{@|#aDS}Xkj~x0E8pk)ggX_n&iZHg1*_Pxa zns0V5)a2#5BC!1ZX`QG4#5jgGNxb2{5@7k;QZtD33hsX<-E{U*g5T@7Crph7cb8)i zWQXIF;2OwD$0U3IR11HU^vPF(fa^D}n$mENg6Vwr5;2sa&K&9c1%4Ygs$ZVSG?6mc z_0`_f&>|V_h!6k38ObUnjL3`6xr4Sy0kX ze^R~FOvYr*C1ue4hZ7$DOoe*p`HS(Ab!AvfObG-n+f z`P$9yb0+zFx4%!nWcsOqc?d@aTY}ed=6ZXdTc8TOIAprcGc-r&D1NL~X;Fbn3e^kU zQAY!Rf-7|6K^1sjBX+c&1m}(p{U!XvDnJ{NWF(3Sgudkr{rQejBq9 zcXW2G0-NktA0B!hnOsRb8o#-x3OIz;Nbh3QQ5;T@_UG?Da=#LPXvDtzwMR24zq72N z3PqRhGR|I|vQtOls5Q2#poF$dEE!VUPapF`;=Y3_bmL>YKjk(y=p&(`j(w{N0Sxnn z-@a*CnV#|?KFq6vE)&OYoCZO zhZc1-#A<-2&slSH>uU9WuzmiNS`CgCeXqYiqoDhqEFk!sO$~xqJ7)fbGKemCWJ>jk zsli&QsqxFeI{Ork1@n&%YVbA1_8WfYd z663*5ysifNoSbVe?i={4FTPoPrBsJ;tMuRGuL>-clmedpxnrc`u3GX5!A{)C{L(!? zb$AVp7>v|?}hDF=^Rmx*vAKOd}KJ>@D zXlVe4Eys*qdAXXVu0++RCmOI86TtE#x?1{0)ksR*vIaE%7gUZl>iq3(%Sd9&z6OwP zB3`)ld{?pH{PF9?L=(EAqrB9xi+53C9<90i9JoJ1;g)5DE=<0r!&l= zy`@ysf*eJTr-5UOB`dFx#!U6KVD5*!;Dx~~1t)2$XqKB6cq#Skh;Pq!Nr&`eOrm4*snDiCXPFr9_NgIY@?HtPg$6R-7JYD4>HF)cBNxdi?0xyy^7|?YsPjbj9t4Q`+2rB=$89H z|L^$Bjcv3~S*BA56k;y_b+gcSj@1SWS@r9{c5EzNZsO)}PE)yC{kaZse;dy@Kk=@s ze$kspho=kSyV`77U|BYwn>7+*sSB^n&sg7k?C|_(Ymblg)`b9sLB!eYlYrx`J_^zh zUATw^(}VSF5o;UaeNhzK4<=!IdXQhMPv|wIaP-8dIp)Ew9*F21 zZgz{_lhyVrsw>3R2ilaJUuup)80GxR)V}Qc@S{uHw(Nd>+6NH=g>rd)(6I>CY7+fX?(UAS5#Fzn$qZm%8vXVu3HwPg`i*9|uK`#|TW++MVxwzTjz69DGXRPf zis$<>kM27dh(2VEF#xnNtu0)IoxSfLWJG#j7(h>-O;B8m=gMA_g<$580Z)*jwB1W9;@?ZO>5;+(>Pi^F0F-%K{8@HACX^cim6m^&E)VUxp~hTnNJvss=! zHg_y#cc8uyc&~q0JguC{)ew+1+HD;t6cnW;dP+VX7y`vN@lom+J5#O&(VtarM$p8T zOMuOu1R{{7;O5j0vd`zGYsdQ5a=HZyk`fdlo~;Tib| zY6k;Tg%zbS@Iu?DNAqUll}EJJ{V`*3S`uU~ed9jP$nLawuw)FUiuHW^ERVwL{sdkl zA)COdM4ju&(HG~jU6)fFbQAbQIYOVSO)TFZ>zz+UZvtKo2u_X~@~2LjJ*?$oCQy%Y z&|H{g;Jl%V5^pPS0{ME6p1#xnDrNOn_w}u+3G5Wl(BaPi;@Eq1_^rXl1b8f6URZec z+!p73q<2p-fku1IE;X$z#2dcdL9bjB(5)XzB+|^rPcvV_G0QW7XP7eAHdMymLd$5x z3GF7}t^eTi{&YJM11at1`|dlwE*Bo{{>pdJ{Ux#I(ggCvj<%MHva(qZ2_pyHO@a77 zofacA8J^{7_8pf7Q`p|Ntxyzd+Gr5W(7_*^uM{dDmDC-FG_l^Lw|QkACPQ2lzYA$$I)$qdA4C@Abt zRsT`0A0ImrnuGVhqDcnYWwsyk;Y$+a=1_N@#ZOtXr5lilVi@I{(qw%z^;@V*MMfQh(oGvqgvA_X2& zpDgMuK%`<^py5Ld8pFKpV`#L1I(ZIDM45PgZ+`c8hu0QB<86F5PvVb1j%z3^-0?y< z>(;KNR0~RPQX^A`1=zSJVov4j+$umV^@jV9?K(hWv*;_p0 z_nrIC;0d-R1d&qEwGrPFrM(Q7AE32_DFxem$8@i0LNZP*b%ZTpIK;DF{bKOhd9Z`z zxuhlZrxl-+?Fw~zD5U(xRj~wKW|kb4r|x1R)WZlhUrU%{j$RzOSNdL!fmevD!xCt4 zgGAf^nh6TA`;`!Xu!LpGLvcxG8cP$A@fG7~OYmMhFCRNEsvn3E<3#;o38-=Dzq~Sl zZ=CBTXXT|O^aeH4S7jNv8j3qAyWv{FMYCG6U%S0;t3;~Of`Aox$ew)0`s*1hU1+2J z+0hDYZ`9~W9-Qi*iKnGedRoD{E8myx%2I;z-sPu0cg#4C%X{1$`!;;tFaF|=4f*_H zM!jw0M-j;8lP6YC*qAq(;kVIE|E*`JK-wBmA(s)!>#6B+o?F$WzcozqpX*IVNZ+oR z_bZYQSp(6>BX#H9x(|Ipv63R|)(}}lJwMYHYxkxqXsU+H26*g)7DEVBbpr+uaTFYE zpw@mHS5xeiv96cNqt)F8EK3Y%USUxDx-JNK(b{DL@vpclBzAgD|8wIV``Kdyxmvwf zopoz-5hc-I&U$U&B~9Nu5|WHchl8tn{$U#sSU$|uNec*YitPDTj&2KN2`iY3)jAKb z@&3#S{bviG^E4iy{v}2R=he*&c3VInbT1h?lM?>0+3X=9WD6@9elh3S2FX78s+#2n zw$Pe%)bX8{x)0+^2rPI>IxbW8q36GQC|ifNaQ^U> zhH7&v!)U)JdiMi6ur91e%QWHA zv&$X=8GXP{znPfT)wUsTK+S zP?h+yovon*Bo!z0OFFwg^GZMXLzLkFHP7brpOkBx$XT&k7OhR$pZ zgfN*i*w*3Ip#Kyr&|IsajF5ANu{5T$q8wxW%^K?HPi@Yi){%T9>sEuP`>M)cILHzHo++h#!W#ze(jv%mNIT2wWg8pDWptq{e5?eOX3?(&g@dDUnPt zlQ;{1>%Sc$5f?Dq>;7G!$R3Ei6Ur8L$MT%KiL`FT<5%gntVfD25ama%D`UK&`Xhy1 zYfjGvKJSlYg=e85{V+mvs(j=E4=$XfP8s=Mg_XyXvW>XFyXcO%U-sOC6eBs)t>~`6 zkD>Uf>ZtNl8082Dg@r3nwzu;qsgVh5D@CCl*tvqe_p{5|dTz`4>l+IB1y|T(U8+;1 z1P6L;Enll0S4dxUK}o}*PcCe$%0fDH1$U+Zp0qi_u+HtZ6E!3^(EEKb>(4nGbMm_P z^FFZ~{5to$NhOtW?HLzL;1O|y=}+0*%K}mb9F*&r5=L&YnzKnnw9wj?z2YQg*X{-n z-JDaM*W$fure;t{NZdgL|Mbj#NO>q%fTx5=%N>k43fie0hDyqO(<-q`md%_P6l> zCli^V-Z33vPwUzpn<5Xm2!53Kul~bz&cJ~;(wGNy2s)sCzd(8%@&2?(8P5|qkO-)A zgV&|wYHAD~s(HdsMjCq#F8;5Ky>79qj-F74ALu`~_}#M0SP}27lPA!1Pe=Ic7R1}O zFV5-&dqRV|;GCRs3_)yn3?)&7Cs4#1ymppz9-W_wSw*h&gqgf;zog(HT>W=)m1oVK zu%(Nu!Zf|1;1Mg5YV^hvCX;O}Z#pfiUuECM|DC?;pEk;q;`V{k*zxc014v%*JC@k) zGoq9)4n|85cb;v2Kt15`oLR~@S}R8Yc|hzolC|U}IgI;&_hjV1?p|po`^F*t*ULWe>f1CSxtGMldzwM#D8GGxyJAcH z&Ua;{Gh4*>$CVGv-XpS<&t}HZP#*bD^QkY4N+ECa+S|D#2O_n_-SI!BjTL>*(#R4v zph>~0b}vUtxrn3DTye-3)b)5$C~h@~zW*UH+(h#O^O|HbQnJZ%RJn`YD^fp*V$Y*x zW=5-aQ7ld0mG^_$z5JaYLf7hlQg%OFfdT0N_`U`LqA&Z%?}98%M+xhx$u|f zzY_5M@`J4WCpi-GRGCy0eqCHgevtg7)rmuxngRJ?rC{o%ACwOW?fPs!aQo%Frt=ot zABGwi)fDds7S1lQ4PoH;gSr8)1nSI~K+a6uHh!c(Fb!LxnSRuJS5(ITG{4Co{C7(j zdqw_cMRN-_ejfCPlQ$2~+<)5gSddqKG1>QrLP9lTJNuzn37tR4QfL7XhPad+K$ZQH z6GfS{Mic-IUn~7~-IYc5tgKh=a{+LYeO>N-Cq$hvRrJhP zGY}YF5Ky9GWAH1#c-N}r83+j|r(Lt11+H5}jN+f~3PPBaszg5vTVO=?5D^O?g21sj z*P)!LU`N{zD|tvZ2s}Qk;+Q*ZU1Qlke>EH&1nU8PUaQQJJE2B|r!!$e(B^wocV4bf zR1qoHSCJG1H%2s@oYs1~{g?Ot9VG|BWRLC?8pBV~QUg4VpS?kFrV`Rk&f>z>dyL~) zvlaxmOe=-7>j$;gq|)LMP42&;ckvp!IIa>*oO;x7_1Ma>n=X;8GK14lnsbrkm@8dQ`2WbN6~@1f4=5;iI3k z=YEfkTx3JRxL+usq(qZ8ceK*n@+Z<>1cXAG>Le-JXLSAVvcsqJ)uB)?+awKjr|8Pa z%|9^@LxHAt<5RO$xt;8Idf6AcFfjJv+HXr5^?7kRh)X9C23iT4Z3@cEZG&4VqTSkI zz~#?Lelv}nDE0*_EZ#E=sB)j@?}vNEtUR!=74{B;vDoGp`zUKwvlQ#G1w?e*z@eIEuB?@L{fJ9xhGuP1(fy&eWJF=1aiOF2Z} z`QJ6>1pq7IJ7YnFum)?^`30GNws5-fWvh5-O~l%C3?}#m(xNKfXj+$ zs=2n$F7Nt{VE-fnLOV0xTXxlyO|-~KVQ55xt~h$h-ya3DcsbOu4Uv(6a$j3!_ASc^ z#Ry+n{!k<|c1b=;QQX>+cz`ZHP8J2I8pCeLDr!>GI|LZJLQ#OlFz+nK`BooCn&w#)q&$fTQuz;m zXb~g6&KNBk4%{v1>yuN2NOsSwNJygL`_b`sz|N}-a;hylG_GjS%enPn89r8yqjHi9 zagGMwM=XJykGea}iF~;WT%+OFCN1?f-R#)-RkXeP*J$V&(!&V$p&U<5jek>f8V$Yk zQ5G|&rk|Z*LZ{m+1_J(@*E(!-R^L0j%8v1mfsAdLcAqa3IG0}A1#iP+0PB+!zv3Sg zh7N@xUo3)H_&cRJf_y!qGCr{zl0y><64+{&NBj@Wcdq8&MnuO#_4~EZa@v{4FR<$w z&|+iZ^1^%M9)a;Q21*q{p^R9_sjN&)3cuLdqY|ib9*+eIoN?~xMh1*v(;*c%<2Z01 z6{RDW#Vh6PA6yRhj)Ur?FJ80sGnPfl=w0%DalqWkI-pU^_9J+J=eKEC94P-`%4e(E z@wVjp8_4uH4p?S$RxVD*2L!%7hFz2#S}Z~~yfepfuy{tQJ#o8Wo<}0h zl&ugC)1(YuwhuB%NO7F#vy9>)2iq5=VOwFpe^hN}#VsDH)A!wCsb~Tkrxxya1;#_2 zEgfIABAs#O_m;xHnekw@)OxGQ`-Xtk#b&L4^seB~B6a-RA6tv+CLMQ!i+Dg03{B@M z#-yy``YiPkBLRLQjia5cq#(W`lpsjIIo0hskxb!0y|gn69duv*V2KuP|Lzvq3VRe5Wh&1ZWF zaJpWYVSY5hW0hkO{^ef+knTSuyQ`9R7Tn_pl4hGj7b&j%vibP;zRcp_Li z)n5!+(sEO@PzWCb-4Js0p?CYrRb}@6O!<$W(2^$5#j zz{fcB*0)N-T)a?!D5LloG+i=#P#YGglVx6d;T=7O@l%1+-#c4;wojiq-rPI}LGK=# z66TB*Rg*01Zj(enADKPu`MTi3c#p9_`)MNljko!)eo$qABfrK;raTc8Hpzyla+}q+ zGhS~#u1EwWl9g=Fl>K*q)rws^x)LG(fe1B$llDeVimpS|d?HA%f5O$)Qji{4EB#fC zn*`+SsE^mbVFx~+7?HChOoAub)ygC|F^fyA{@#Z)NpL`$`Kg?8seUt<{r;d)60G@V zNxyYv3>NcW{>^Qc1k{A%*nHgK)AFreb3gBxkCHT-X)CPw#iP_?a4660j23Il&QKnk`#8DY(FuF&-A(sp_ zY#1vhq5`5_H1}Hae3Rjui0K9Nvl z*BuY!_eOc%?7cTh2$2yP*&{PELdvM@?W;&-W$!K7gzUXV_TGDB?~KSEKfgcE=iGbW z|K87i&OOh0Omt9RGJR`2T8AKL*VRbLts1WJX7P@oAPa&66bZge_N%KEOPMJSrXXni zkmiqaoz%Ky)wzEpb+f)=X!R-GLAJ0>gmX#f!gfHyV6pAYE)f+gTV#)mP0)`DM^4YM6^s40!+6SHxlvm z%|h0xLU|oRfcIx^3m3;!0i&0>ennCUd>)Av=`ga_)7hsVT+9stsh-AWd-0zZK3bE# z*b5;LN^HwBBi1aVKCUT0E*=UlN%yobRV8drT;>ww9tzX_-rsr^kS>wGu{lG{p&C*HDTaiYPR=W5;{`7CFzSb}d`t@%-b3Z0WNgd}8 zncsv#$G8#BV1L-Nw#8;;s!w51I2Pw&L>YwTIIXpllotm3W~-=qcdZ6XxwX57n!;d~ zt!vbn=he(?f%C}mKo}6Gan73jY(AHvWNww53xnP&KQ&tcW&*;iTP8~LVer$`-RzN1 z{>FQSkR$iAFwjcZNUUWhCO|#bIQ~y29BNghjlwrQ<8hhOir&5m2R&5+8{)6jhF;9B zj{;wX10ii-Nn-ENCrtgjPbA-kLml1{MHnex8mYOPS(R@%h!HUv>UbrF4V*NNScZiI zgU@xw*GT!Skq@cDy(8hE)IMioa82@GVvQNKGEW3t#?7*peHQ*=Gv~``A{hZ<_9X$t z3CA*aI;yq|FC&0NL^qE^^Od*$h8n5d#|R)`tC}PtY58p2(!MC$90AYYcLkdEe7O*C z4eM}fjex(jBg?NzVtQ<&i4?jfBB0HZnpr@PfXq_wg5Ky56e7&R48?mlPVAmj+g-UXX ziSGti{I{cEykvcs^5QAMp1?ssu5=VcTkS~@%Vj#n1yrodl}3T!&YTD1w^|x68^vOp z_9$qkOm6M4vRrVEdXW~?7j+YJnV%cD_;LxAfeNSTAPVr6zWk|tm-629;|LcQRY8b>$A2hK6XnV<+wNBDXp_c3Ll@>)o~tRR#Xx?X z5M9iT{I|^R*xUm__&vyKD@w?)iAVlQ8(ixRG7$>JtMx zQfxwZPk$&k30w~Jhr~ely((tn5HmewU%se1F$NU8wgxwZbN97WXksMOV?Z7!h_3L7 zzowBvz?=Q=F|ZgyuKxOU;dB0nG=H9V#=xP~yMgPXxecLAiD;g#7_gF|7iQI7#M^nL zwv^Zt12#U4HICh)jgNm9Ro@$nfl9V*Yp&!Xc|#w?CCb?t$hCrHQLp^t8u|T9yQ3Ij zIUy`B6K!JB-4lMW$`%WHfw*7W%h05B1{KQ_!O$i@OKPYFro z?@sK34+kGz6k^td)z@Ryb<^R_)IWX7 zRrjfHYYM4(7I4JDMa|UpOAX{zipV%woI)J@G@`ii0x(((RVIkudJ_i*^fmHSEYaFb zR4n<@=5Y{r6`KDV9o77^(TYA=V;m&BDEjqMf6NT^WqA$m-y8lUxf1)W!@BnobD#fl z9Q^VAp)70YTz);XwZZK;~YL+nVVJ9E)o=yV;0t9WcY)JlZQ z4x*XjMCvlCP9(&`*J+cvxD6>uL+I`SVqf7GmY{V(-KdPfeJ<1h`L7WBzFrH5D1x`y<&E%5rLSQ4XpZQY+6BL4)`FC! z=2y5a871hEs#}^Sf@n}X0W7wZ+COo3 zk8vGeKfiWN0OY+139;wWEdh+Ccjci8aKy^P#YmSu@A9Nx?65fjG8ibE?h$RR@hE)% z+Sif*O5w$MEiXvf^co)S)E_6ng6fyZ9)tlL!7-C=MxhRrJ9wn#Kaw~s> zSFBOrsa&}3$FJZL@|u2wq~`Z{6U7#|zYQv0wnlyfvaQ|5t+vGFK$*Dx#F}p~IMlen zJ%~bf?&}nY+xQKBqdpdSJWy*0RZoP87R|;Es0w zVYr%yU?DHj0OKMNw1>B(oyF2mnYG_$SrI0IAxpScs)`>mqsrcNCQTA-S9`4wpG?uL z_y{X?FeCv@XZOe6w<4{JHD--3IFf)K`&-ad&a8fFA^%TO;UrkZMqC?D7#s}mOHkWB zPJ-_Y!UD&xxlcIkN>MQtlAt#YFRUi&>!0!+5^qKQB%o3=lI<_~kZ-$*{$GMY5|lV` zHI;@4DtdSb<5<2+0=vWZ9n8G9sE9z}?t*&~M_C~hm)?!!V#-rauif*dN2Un=R8^;NN)?&I(F(Yo4*vHI_oEW?rt+7aT5hYQ z!yGEbZlOr$e&=1GiHo=CaL|MOA=Qu}>kHGvFT1ws@NTzZug*((NZ~aO?_Y;>@CuI` zco34w+SBw=?<_qXZkG|+>0^XEUa33yf1@4z7mS{8P2P%EENYOcrtR7IGY zx?q})EYEu2R+jnGiQkDI>4=_bA%#HgnhG zOkl6kjYeCMAy6RvUG+yc6C%cPuef>BL)fATGnE4~0nhKGs8ze=@fWYPnY5HlI2cJp z$KG3~F7gTUkxI{mi!a}2T9PEJox0O-p66#mfQ9v%rMqF{xNTUV;ASRdH-MiH^U!1+QF}{PG!GI2PlpB3??OX0flkc#Q`kVOQ%0PA7i@Tkz zao^!=N$2)oiq1BTgKzOAYu`cA+@Wyy+ADZX-^Qa+Aq&o8q*K0*ze#%-{@=gWfGoge zpdN{eHGXZ^WLwu*n*~F`UQoWojXy2)mpQL43k)1AlY*WZm>TCf6FYQgf#y2fF)P}~ z)B?xO1?`cW^JIwDb8yXhZK8+Q)Go5%mC=b!eK_Uw$FX??EwtJ2E-XY!T(VlnYuCxm-(`a)ZBGPo(ruFnv-ayr&umb3NgsE(cdtUDm^!>9FB^u3 ziZ3tnyTF}K;{0GU8+LxC_i_^yEBvmLX(J%Zf%!CJLwyVJWG#M`^Nu??&_c5jQzZ0& zDi{JQeL>Keyw~~Ae3bCK z_>T!eJbH=^CRqW95=@E6iQyZeCcMHHeo_Fv?>uFN!lyKlJol z0bGR@GLew@zZAWLi4m1s08v-!E)<-MNRG%&KF$-`133=lnT?jc3kN(>~F-M^$)v2F9ss3qvzjlFlDJt0QujHBJEJJS)q4@@KikLfx~e#>6J(cSzSRP*qfNr zRrfa8ep-*#YcDT^54n@{F1dtJQQyL7$C?V^C{$0kAyam#@zW-$%T*zu+tI~Nsa$0= zVxPVnr7wap7GAU5Ijh3AT6uJ0Y(?O=ot)YxXrSBnC5l}(wg{RpkNP@!dE2MLOTxW2 zieNkIrJ52W5_7%yol&u?EG(ptu|#ks^RIDw*`7tFEFLEM2b>YWM;d z9{qj;j~j~tg$AWfxUJ$$?$j8IdA1mG8-*W*EiXMiWUudie5V9f8fCgYf-I)n>*ig|xIu_M8v}X0xTj5;?I_kX|3{72mGDd{uR)on5^YZiZn-T0B!W zlyo(JYHnHz1|JLi;sa})116m5Zd;auyfb5FM>_qnSu%cenZpg=pnDVJH1UXI(M1`Ho477K*!6&y^*Q$F4<16TZ; zNfxZ_+5Dv!8P}#|Fmf=6&Splk%Bi}<6JcHk=t_beOH}hahE~ztpWl~(Tx=g59>-u7 zQFYSxhoCaZ?#$A{4D3Z?-jPf3yuqUg2Jd(w)?jrACP6}E*-d|r=wl<&=jdtqq~|t+ zWq|$W^Se)-8*)Diym*+NmxC&)eVZwRiKC6M?)0zM<#2n+Tztu6jv~tM`(3`b<#2I; zbDMbILvhCQVNq&y`HjE5Ir1SMtAW#tx8*x&q%-|?h3en z8CR;YEbXhal}x1)QURML43nUZu6)0p+u9zx5{howx#v7NjK)b2{PUf%61bP?y%(@A ziGp&YWOF$xfnxiqwXAs6!dD*>*40Oq@GwPft;KOC%(Fj>M%1Sg=3@HUy>be9(4@PjJIt$v>=_i+F719`iN2hXbD zI*fY$l+xGn9cl6VCIzk>J-J%NqSvL9-+rpU zzTfw^jqQ%2k5?5~lFg<~V@*0T^*@jN=)uaXn>d&y+Y~_)DZ<%8y+ZvGP^W*Ll`X+N#iPvZ5Qv)Je?W_U+7&j8` z__h~D)qrHz^_%x(0exN^j)j`#HGo>xbSm)cANIylrKI6m4Oo6G)|E9;uoG^~3SC60 zg?G>L>P-p$Q^F;_Fk;22g}YZ`-l~SJZQg>%tD6M1Ao#Mw&6WIt9!8u4(|f8~2(uoL z)Fvxp*L)DgA=p(5aj`~+d70{Tb~Eu|F*CK0{=T0u)XeeQ{&^h-uyv z>ukh1<5>p^2_+<+Ppej(bteBL_tk;s-6xiG#zPFUlOGrHQ0l=_Yg5+kAG1vIq}3{s zNIe9?S$cT!QrkKKTjKPydf;>-bC5jzy)7U2uYFjr9#o16ggMpx+T!NuyrysP0^zsM zWncME4)Ql?58u>-h)283G`5legW8S}p;JBZhs2!!93bDOw4Pau^REZCw#+ux=p2ey zY|d=@&;V!7j zSF`sHF$q%b<0v>veu8Yd++TW+J1OMlr+*E}8o_EG`#=%n(}#f;k@pIkjqt*jJ9}T| zg#pLI7eUYU8sT{vW82y=`M%c4>>rQKZuT$}^ zFcYUwBaEqL*;MKq>ze2rC+EgCLdJWutKrkTj9(jD*J~;pL9I(pf{KI1gShTeo@}%c zKIs3U?dEf{E3wLZ(>B!zJuQECycbGU1g50$63!c8IAE%{Eu|ZGt&XW5*XRbI9^( zW}!n$6Y!1}(cdxA@-7)hCr=+~0xoSu-s&ghx*3nGp0TerK~8h8laYC#zt5<7PdVSO z8~rJtq2}_FTW3tZ{wtMVa5U;7Ip^oi@J;BA;=90KAQ^~@*8G7pM6xMz;bNsv%!Ln@`~$dCWFL zZYv~5nq85*X-=;H6Dm35YXfWafyLY15wG;aAHn@gB z{q8cyY(MNuYW&zX7*6ulN@(<4`$jOHax1e9FdOVxzjG$J%aK`F>DIJ?gMJ(Pn*5U* z3KA3LllC^?NvPO;y`|T7o;cVTyWIwT4g8&y^1-8b;}}%|y&WdJ9S_N>ejt3l8uHyt z?a+Jo4s%;>AZGerp6KiFc1Sk=W{z9;o3d2*AxeHsJJkBNvrE(nM?`Hb&_7FT2bbia zCeM5_v-s_~= zvU{~f)6N~>lwgHzVyOH(jH_HZGou4^N3SDFTbvDaD#gXz+B(2pWa6dfz6q0Xl$f@` zRR=8oR=HnU%sEq$$2EG>TLL6cb}A7*+B;#l{ic-YIw6g3*eE`=8Pap>gaLnYQ7p+9t{Ny|?O0)*@W%J`ja+rKWSdiXa*)^wL_SxNIDT(4 zm2+M{e^J&6*HZtP+cK|a=Vlmv7w_+cU zy3aeo;&8KCo3T&DFxrfQ*rf~V{Qha-T3Jz9ko5}~MR!5AOzY}Vq}fv=24zmw?_Iz_ zCGOm4{Q6-{>S>qLa2IT0W2|MXWbfDFYeZ6vc7fs_6-NBPnY|-!(%({>U9fL}^8{Vc zJi|(z<_`LK7hG+2YEwpyZL)nR@~NQghWJk1-~WbxloNS`;+s-+gQ#;}=Tna)2NT+j zv{cP*cy(}m>zCw9axM}vMRLP#2u}VUVY|!ttTj081$ufnpxJ?kjN3-kNoL*>c zTh{)v8lqR>{J1)+uopI?OR$*ZalZ#S-v44e(hGgG7uMoRY0ggy#l(G1dqFsTo>w?X z=@U<^tFJOcALt!Td>l}I^udoug1S(q5BMeO^M+#Q+bs_9+NZA|E0;9z?S}!I39zW^p7wHGFCH~c+1wZy@C_gJRD*9m~FFf2! zFti9AW&75|azC(eYO5wD6M46XKK&JhHUI;Qc6OXuKWgJ%ekRJp9RQm1sb!jwWBF7* zQ}aNc0pP}ev#&e7H@4E@B7Mz2041!qxu();+_N*boiPjtfau;M?H+4p3WG00^Yu4a z%gj>D&w5KCaIkV)En@)mE=rfGF9R1+OH(nG+6Mq>bbhB!5aoJ1h_9%ae-OItx_xWCa1_YucC=RfA;(6rFuth-m@^t7_cQRg z_hkpiqo9QuMz-I-W@=5@>x6|r23u*mKCCKkDhoDBS+#e@V3Hc`F`4QG%dgK^)NagU z@Z_#ic$v$7q)`N|;+pUnV4Mp#=(&30*`sF&c;<|OmC{48NzWekWoPLZu2o}@XK#gt zom(MUZ4hrLdol*q{P^kiaXM2kDYYpEka19F(S983c;-n_gD#wpKMuDaU-Ji@r?0Oq zhYWXfj>DsbyMy29pV#LxEklmLIOq`_M0)D}_af_*1#VNHPE)PHG9)TxG?6t8Gs2u^_L!Mm3Y>N+(N zFAHcSR3_lW?{^NRhTR6fXnp-ZwF#i~{5SKI+RY-pD9PpU#RO>Dcq{HP1~?Yd>YxXI zyjgEc_35rE_Xq94pOdFI*gd10){5s`@Lo`;$x`tI=w7+Ybv#KIAonbvMcOBzwzMfA zx+DlAGe(qW;AjFWdOr9wluA!vj%_B4u}*@KM8ZSbrTFl*WPF83vXf9ku!rEt`590V ztu~}HV6Eg1O<<=b_e60hoAoYFgS99lSRE5{e_)JTd31s5syy-_gfz2 z)1#yq4_yoKNB5>+W9#@b{XYH&Y%Xg&JB2CeuK(-PuOGy|+g23a6F3F(czl^h;YkTf z*v*EH4L3aQP~h9bYRz`zFE$VVPC>hP$?Cw#YvY2mTOOwWrhp(L7}atB+{u<4-)mn@ z!HEm|ic zYSQl2`)Lq3A~w;SS50vKckdoo`ZPFk-ju;}m^Zg1PBmln8DQ@1+|Mt$7{RSiXscqL zfsXs}J9eJKLPZ3eGrvS;KoE5!bIbm+;0*P#PNCQg^c%O%s0>M&xkeVc2Px0MyI149 zhw(B#2L%0@Z8kIT>nbpI{IFH9BpQ{<-gf5ZKJ-B4h0RQzqU`%GTplwpD{sTxFc9&6 zDKktG#eW7q`eV8@d92_U!@?JyfEmDR2rzrN<7>}P%|$PhJOdY>SMU8ilD}qDPTGB* zJ_Erol288IFmw8WmV=4kEAEDWdNl8M)XU`Rr>x2R4VF$J4$skpJbi{Bhzt2WOP{WqqrE zh{g`g4f6x$V9~IslzGAJmgVO^ov|5nptiG@6eZ1Y>+7x8Gi1N!U@5??9F3P#hJg!haKa1T19v>oTc@9-wig=EvoYJuI4lP*dRY4I}ZzOEZOcm zmjnK8_rA@)nFoipfA(J=DAep({;}@zmP*mkYoW?weHP?fk9cR#u8m&;ncvxxJX@ z4|WhQh5*Lu1z_c~3BAV~a?2_Y@8#3h1^9;k^og81Ax#6J%%8hG3lOx3XHm;Mtlgqr z@la@Z0qW3nH&&wVu0LPF#Yx{-05mh@p3`S}wHi*QnAF<~KvFbE?z|^{MwGvxU_`YD zlDVi1itF}{<((n9Umq<(MSGy2l50ph!AH6KDOQWH$nKo-_ARTkREyVI@W(|+Dciy^ zeaQdx&HQHle_4xwktS10#J+v$dVnTVTCfNSClPaBV%3s^q_1wwaEoAhp*P;lxN%01 zZ~3#Aa0v#KCkQXef-ruJHCeZ_E&+aqO*^XQyM1YYrQAmGC8#e}H(iw3A#8pbwf9PS z322H;4_&kA28cd$S$4St0{w|U!R=Es{I>=93T_!e@>s8Ff)@7ic7)t)!|BHrU z_s{QKp%q|Dz*(KomHzQP{w?`N@Cxv{g(hsMkjYcCEFp$TH@umA?-7QW2KPmse9YDg z_$m?Y)P*>Nqg=BUj~uK3ia?8t$MQYx|460HS5a3X`7t`tO-)WE)51SC#j^@n9eC-C zUC+h%_+OFzkza+0k8;<76Vim#8^D0%vnWQ-YWQ2Eh%j?#l$%W z+DvVgt^!hr7m|_xRb&}IRWG}26?}i~&x_U$uYQW`r2X-074#nZ)fA>$xp87TRr}zr z!Pb}kO(_mldkjc>x%_br?BfM(mZh$?d42JE9b?ykNh6i*(?SHnz^~3n?e%Ln^=Dpv z>kA`RVNK;_zK%5rS?KY36h=19!1>e1U3Xw(0Y%AL^_0H-T*EtCA5qmp+Gt@kX`LCfJRh+`@R5cXh!*{$GgOCa_KW9~d4f zwx~zAiN43*f-$dsg|cx$k}7`b{wUfl7=6PPeAn^4C-J37!LaNWq?aUSp&{=L_wKI` zr4(*Kvs+MezAbkN#l1amr{*o77-7ynIc1RltUOF}Nkl2aHt#|4VX!Qx{X8#LbS6$nZX%yMH z$s2wtxpbG~35&H!>4EGH%(9%tITfx86xTBm9~kaH#f%%zv$AH2)1Kz*jCVV5?=jJm z*%!*o3fhjNMBg1q>`PZ6cO$pDlXPI49=roTzmkoNhrSm4iN9hK9lHahg`%brC{uKQ zIFd_Ga&|y9cpXE@+r1ODt@qV%>kd3Pjy6e&HsF)k4@`=l*nzu4fedo}v%K zE_jgW>EG5gTn_6^a1%${g?CG>Uz*a~_Z&^k%5F>SLVTryl})iqD<*2oGey~5a81Fs zLQn2NxbPEH?bUZdsoR@roA^t{?4y5v;U2qCE;yO}f-->LdxG`98oyoG>%%LO&aKOP zK66LtG;9}|V?y`pq}WIsR-Di)i*})Zfr4-$LKM|6p>uw3dlx7c-rbl^7ghJ1_|L>H zcfo{d8l9i`?JL(?QOdHf_h7rBBb-otna=*9?C&kRJxI12Ken9QdOVqT#cuH59wd#F z#{bCn4X_9Rx52bMNI^5-czIjXbLm4yyJqJegg989vax?Yed^v^5qWDLZdpI@UHT(& zcauH)jR(m-OvT(vPtUVD_c@r_)N$DdOeY7{g*ne9QWMORLXUlT+M0W*NA@-+jZskS zG+`eaHXC%4aA~pSCvfgHW$l9mS@*@UbDP7xa-1g;m-{#QW)D-)7qJb)D5V5_ga3kR zJ5jCTQ*o{zD=*nai~hn740|qug(Z*AGtM<%NB)8zN|7~TPU6wBLP&Yd#9s(|Sg~u4 zO;1Si((X_bYiGKyjN#TZHp4wHdzh;9mJ5aQZT3C1Tn(yt+G+9ocXQ z3+R*!Qm4Ywl7&B*{RR&qni{SR6b`+8{^Oj>oH_)9pQ#f)&Ta(*F%K*8XAa>ThRZmw zCduWs7sk=v{vlYt7b8jD9e7?BM6Np}`wxgPe~mEOKTA4ePBD*h{0HYEmIJ}2rq7=E zvOJ*k`Ul?Q{=H3O1F46ql?8^)|6o*XoY}APg+0B>pzHU!e~@LHD4KkQa#9=R!?W}I zAC#(5on;wt;fr}L)X1&>1DiISS~I1ns0DeBZH`CcQHXx55#Kj3(0S2{E%hNjuEF>wE+rMA>+&7UuUb@%JkYa*yBx6V?-=FHP2* z&JX4Otsg;qk_pZq?bW%+o&mR|zeh0taz#8|WZrImIh(8i=NNV_ufA~H5-)w@zgBmf z_!w?;kO?Y?+3}u*1mQiWIEEav0NT+}jl}sb?eB4SkD-05abt}yQq6$*EPc=G7*=R6 zTmo=#MI`Z@l{&(Xq0n@XU}EUSeAvq5m4omJYgPF8+z>B&YbNVRllRQ|SE= zY$NgR)4SZmj_slKQy5O@Wxcrc+_`?zC?k7#3eWL%1}@z;Q@jt!MKtrV#vVivP~-@CbwBfEI|rfV>jY1| z&01~61qzR^}Zn(K7|u>(4ZBEM?bj^7Ar>_=Y!$A6J$ z$`4)%I6M^E6Ii@}K(&59>3bnV!e+K7b~2a1IzUuGPB_Uve({?pLh};3?g&g-dyc%k zZ>-5WVtfgd7B8;sqQk>xuJm*mLN9@UlexLtc#OSKMLE`L#yR5r!99E;VaH7c=Uo? z?0{*I(s5p~8S~>6IC_yx{^q*x7IDSe`uWoptoo~*xw-Q`jVI8~e^+<~Z0$N_NtJ86 z;~6>r^%Ga{+7!oPnq-KHC7Q#uYyApTNG>@kHzoJIvK4=}a zleqVM+|6V6rE~w$p&&~-Z$D8H(Qlz!x?w~Xqaa*uPZ<{s<0$Jj%nAQhp&-te@8xU7 zW~KXWg>(LELP2DshI?OCm?jP-W)3(0LP7FeubJpwSwio}2<=ghq9DgDdOCaJCUdK% z=z*EPQIK3S^M>n5afkXV!A6ra6lBjs_P_elN1J~a(zNF3Q4yN2;hu$CO0O%*O8P`N zQITZwdJR`J#mdaD=Nx@Js7NzC*4*Q~QEEY{g%TfLRK%72+MS`%|4f@`fR|eU6``Wb z!yTJWLV0^Ewe(yT6^W7EJNWe>Cble(eAe3l6-mP17=04WR$(Md&G4)W75T=KKCPwj zBrKJb%O+t36~R}TO=|r+WA+p+M~N94Wf7WyjHIo(*5;y4YUKYu zzt#fe5-V0`^ryj{w0$UtSAaBpSVNy-b$Iak$&L=*2q4{LG$+DV6Y3K6VZkI#_Odm{kQivU?y1UNpHaG1>Dm zMbU9l9sFB}$?cMO`VLH?uc3MmNeOQu>eyW2%H)fJES`-E=G3>4PcIQok{O+5A7LtE zG%_^A&$`l))V-;l#V(vyIE7yvA2X_k;AZ>HT-f>+zt)# zXFg*j>nB*;Joy!^?}LVn*J59opXPk*(7q!f7Knx%f4&%FWh<_i(v)tItw2Kr?qKnd zlFPE|uRNvE8b(7jGroMP?pEz$t)FK~SVu$NJo4gR?pRUzygv1hbPEk(rm`;G-QszU zA+1p^#fFYNq@B3nA@-gv)MU12(LqOE1g*AcP!!2$CXDg&n4u%oBtqTIhO>`wT29ld zKB6O|XA<#z+~J;zHFuObtT2$(f-k%%I+qK(vm~Eh*kK^)F$BB?m?J!@c2c;n{=-0m z?+CpbvKpPJRcx(|^20!UhN9GS;vUQ`8TMT`L}MU#3Jkw<7!`#nUMb%XA;m;ASm>Wu zwG|KsuM^~Zh+-m|&)JE7wHWrZIggnR6<{JVK~DP?ZyG-`#(OVzj$$I}FQoXs*~>}a zex*xXw}XiU-r6M46aFHXLGY4@_7D?6d0Od7q;xh&t*^O1c!Y`Is(zefxBaJR{U0&C z;9V?4T(dqh8~@gM*tN~_sXP`EC0b|fJ2h z=Lspg1(Ai_iyfLOKgB|#UyUSeF{e|L4;bIJ1Z*TPgHgYtZm}c9y>(I+2OCK`xQsnm zk(V`u1Y&V2Y$V`uB7JUrTA;p>gh`MjHlju)U48rY;!C$O)OXXi*a*(L;Wf85ZCCPE zg6(-WHnL6lEKl~soi|E{8BX=J*a&qGO7zr*86tLjh+>8a2SK-&Z3@^~$qjrtv53op zgQzfBm}|%wCqE_o8s_bVgIJpKm)w6D#ID6T%m38-%XgwUnbSUMTREUPe#%wE7@_T-W9dr=HLMC`F#?4$+%vtHa{@2}7CkRZwT8N#Y|9i%P|$rkRZ8 zGg&kFpWq{S%#3)EME-<_iCwmls`!YCt&n8tPwXnaL)piS=J-gEY2Vn*|A3gjc!cVy z3qC@3ernp5dxGuUnRSZx1t0mCg<&G}{aM(3A+A1ycznb=EV)jh00_3%th2>wd$M@AcB%t{r8o&8lwgN&^?$Y zMC3z2^qf}B!Me0uEQXp0;o-x%Qd|<6z+ z*?!+BMxNukM&uJARw9++-%_kv@5!XLBz6%Y%)*@evI>+~dRZEF6Z1rfh4f4Q0=z&q z!}{w4+P_4|CdVe9H(mKy>_Dy6J5(H z^_Qq1L7psSI6QmP{#5GDvq;oiq{!;1#s@CXYInDq1{_N~QlznDd*4`HLP_q@zvzO4 z6j5l7C|%QU{jKd@IP^<|6xm95_prsYHXbirDShonim-nQ;QYqAE`oX2RP{206p2Eu zUgtD=@bUd1v-MUlDH8LZsc%1QB+m#HZT{ORDRQJI`RlQO40*=sex!JuJ=E4}q^~DIhKzUZ|7bVQ*4uRHl~p$;Lk6AaEGaeGsShMoOsY1? zkmUuz+p)CBYchESVKY{8M34Aj4u!DHF5_29xCt*g55p*nRYG;pg+iVR%czng6s|$);vw|+(R z@2-#|l<19ET|t%^Z=}$C_SeY~Dl07?@vuSHk)>Ke<@*$fHG_eKmj41PL7G?N^d|}= zdzDXay>Xnl{+3qJdvZ#I>x%pt`ux8nODWErIbKSnGwYuW5rIzCou-j{-(@I~o=-<= z?1ReK5}lvPPt++9`_24qS?#8Gxkp-B60a$dJEU)My=b~^5M4}7rE*F{AM5APay>t0 zB4pIE&QT(!Tpm`GrFvA`rlkIbr<6#1vGA3k^P3zCZsUPTO)6yTovbQB%6EJ%li3&d zrl^p&>n8GY8|_Jw7fFHmJk-eBNdulG%@z84S?7K9pSIX1;=-|67aAm9kEvHjuqMK(i$jAnn+8cO`zTlIOM;T1 zTwfrvMuR*a;oe@aseK*#YCZapix#0kbA0ltrEQ^7=)9p{j~3axMbt<;-m`N4=Fe>b zBU&Wn${cl!XyeyB#UJSkGg<_H=Bpij7_V*-Nf2#>EiIDE@|j^8h1U!w#u^lJv`ASh4^I+a$LgKx>V*nCIz)ZH#N~6i zo2^h5`J=b@>5x#VJ9q1maLZa9J)OmebckzRrgB46y}evb({Q;g9TFL=CiZsePrnCc zu@=4|9YRSPD52?kV;4I2L6%K#_%9FEt`=hx`(_jLm)_AK+>dA((j7nl<+EniS?A)tdC%-Uo9GkGi+8-~za!2D$l$WsuXZa+#EYmY z`%AzD863KXUk(15wrTy9iM@BvOO{p#-beuvxo%ipX{O|`(Vax~_Wh5PnwB}6$I;{v zI`C1ARy8lqbvF~S^({HXu%2LteY(yy2>(kKRZR{ZLSxi(%X#SkzL!4@=p=^-6D|J- z84upjyj9(zStN&}koTfZC`h1jgt%cp=;I0kwS; z5Ip}PIyPwZ_Mrf&+E8AOXc$*Dz)|BvzcP+3)^0Mz5 zOEP0G`~JLOn)yqI-%nF-KcWP3Qvp(B6em)p)W={uG=C#;Du|uw#&fS?cEljm$MKDz zf>J+~o3-@Cdg6DoWyGaa5Gd{P&Tb)Y;%{Bo@`q_EI7C+Prja-p;!yRhzA${e zk=*o8T!|XafBEZw(b`0Avq&+(|3VEKO9oQPbZsl>o+0BTSJbdvPUcn36{yegTh*2D z84X}elbt=s%TA@QFBoPPq=99HO~apQgoWr-Q_2NzY2ey-@}&1}e||hV!hXJz20G^+ zCi0VwT144d%4b#4Ku9>XByOo1-q*5hbL%x4psHd&sQE@-i1d_aMva6Pig4CTuRl2r zhio4=KBS|CmkRwFzx}%fQOn|9(izY~*3=bc@ zIOkX2v?D#6A}4~Lf-t%@p3!QN^{-OYUvF!k0%sI3+57)I+>_$RQfq$-s2O&I!bkO3 zk)FoZrz20nG$X3F*e+b#nZ0L^;pbCWj=%M~efibCr};?(<>6BZIAzelbDiKfbmY6J zzjz9HCA^Qn&aF)K`#2GDE6_oA=xiTW!S}R0*P*s#B|5mRbL153&VSIao zKM?6_WFXUn`^4=R*FARa#Zed2StfeesinnVK3N>sLubx3l9XX%$1WAa;O;g(INqY?y=H!d)DiG1Qip^AOio2y`qQ5b zAk(UlkJ~Xou#WlGbQI#tk7dF`B=!stB}W`_!H3vS+pSJ5wH)$w08U4RPNf*uwe+I}%F_g1TCy5^{Z4&b+WdJUOWA0BuCM1G>CFyaE3^2AH zY$1`p+&J9cW+SoA04YYy->u($#>=9QSj^vH0G;kf=E;XMZgu8r9?kzTLJOl_@ei!$ z)~y_Y)`cRBpr6x;5OO{>l}qxJ<);)QVEcz#&7I>>%k92&`Xs+ocFr-FhA`&twEiRyRhcg!&9d>m5D_h;<8kN+&v7Bh^0#R#TI zq3#&{=bqkp!3-x%L9UFndJ~>${?B(vS-`EDTRl)}mdDM+^5M1`3t%Md{Hm5}+C|Sr zl^@S$fdyo$x_|n4-wEZ_l*KVwfk9@%m3r{!oX8h8Io=XhXpr(C9a?;kT+oqf;rfpi z+*xNDf6cx8^vL8LE&}y4knew%!^=XUO=eD5zb*X?#A^SO&F}qD(8~Wl3~l-uV2@B! zv$4z<%D&h!KK%0x#9e!WdIB2oie#B{FXtzqzy_6h4=975Eh(`GJaZPFE zAqNMD{@@IaDkM_MIS5y1kmP{4Fnl!>mX8$MiipU0mK@Nfy*e>@UM!N*?XP|Fh67e> ze^cRQo6UYD$uw*%MFouEhajY{5CyF&CWFSXK42{6ftk8c=SuhZF&x- zE*6^E1SJ89eRn0eT->lDp?x(-CG%nLbwt6e2RFRW%|=gH)S2|!4i3H);ep89%Bji~ z+}gI}nG+5R9tbl_Ll@LEp`sR1b&0Fz0V6l=>mKyw$kQhaasT!5K=6+xhB!5`GBkr4 zy}T(N_*(dzdX;btyDlF_6ZUuj?Yj-p>3m^F`UAx=q$3`nnrF1}XPN2zCx<}KDa;EB zOJXSob-L~xoXW1RRC%F8i%+~Z-8d;9mvV|zn-`9K+Jj$S8E7=A^{>07^Mc&e8MjK= zpTTF^55_vmcp-qc+Osq(X+4^2eV+E~J!@7m0Fn%LYa=PnJU(!Asc!NhkDiQn~M ziWKSMG}-b4HA9|RVU2xvd(TyQK?grLx#`&T=~Zv-k*ro;(+fZ%l(Cacm*%SwD1Dj` z7l58gb>3fHc5}6+`Tu3T6aYZ{SV5!mL z$_2rEFw=IMjYg_WAf?f%LJ&B@4@|u$iQed6WW&LbAjlzyN{CI4tR&4pR5_j$1m;z2 zRBQD`#eC0&=FK@l2w$maZoJTp78yiH`9&%OvAMFR7{}Mks1)=6NqPx^s(<&D`am1C zMo!=H<60p=vfceiF69v%`!C|D(u5GOpgIW_p?jV+0unHGXws-)h4$($>%MVf+) zT_I5HV1Ho9)YD*QEd=CQSA^N5f-!4ee*ISugn=@Yuc!9#-R3n--e#+kFr*9o z6nYt@Nsfs_rR`xM3>k9Ty-{nQP87hAjq`V=j;{br?WoGCZjCE%ge z*Px_~5Ye}BTRn4~67W`>f;(l%Ibey67bz!H5*DTNbm+qDl^$FNa`1ObLfuCDqf(3q zbAI%FYI^gMkPukZnQ?tJ7E7YUt@lR~xDM3yy%v8%$42FsWD+T;i&gyUT>R*9Qy7W2 z#1ko~r^zg>WS+4iW>zyFr;q}5&w)2jRB=1rzS~N%)0P7B88O+@rFYS1%=WK(?4>|* z`=`JTN23dmd$(3kmJ~!v{Dv5xtR0=Vx#~ehQt)wK+>Y8rXI(}Jg!tXC2aTu`qUdSJ7^?JJT=C(kBfFMgC9XN*emG`uZD3gDG*5zbvVczJL!fVY?o(iYWKn{(&^h3*bEPdGEq) zN&9=pCR2*%1q{94yBVn^e6Ms`5$O6TyiE|&jhuUTh zibOKvvVe@LlehoL|GOm5-onJ0EHL~x`GV!OffWv?ABC-|90*-!5BuoIR76fAtkea_ z!M8rN_{Y>T&6;A|q~0-dpziXpj{GYtSB)aE^xnQ4829v(uL);zbe23zgW*#al6`S>I~6DD+(aSb2?%+N%??SJ-BvwRRNTt>S|s_=wUE&ce=%e z0$>d1KEX7IknPSm7I|@_098|~J;%Zn0w%161nwA$fMWXCycT)!$|)4#R}PLMaDAge zK~qhA8>VpQE}E= zJS%xt_D>O1{WcdT742l+QHz)*BPhY9U7~(P#m~u&i0{#-_iXf6E@uY2Qt7aPaE_Tt z3DOG0m>;U3@*dXe3FgEq!E4HeEjNk$(=YVpuGTwBK(e(!y((-Kj!iLNpMaqZ_VuH` z#*kh9*~d|hh~g@P*F+Mde}3anIN1?gB2fl5Go!98o**Yhx)U|lIA!>u{WnL*SMWM7 z>&1!SiZWoV;-kLB=-)WX1>sph{D6_~4JUW;P->7$EXVVypp0*T!M$2SkMznix0cD|cZfwnEv z_I%u#A;;V`4X|4Y8@txruIPWvbw*{hUe@G0la1rz56dTon#yCycb8hEAFOSIZJC zqXv^)Y|Y=#ls~@PkrHwXJ2fs5L@dm+}MY=U$03mXlHDK=cw=bXl)?^_xoPu74dZZfQs>YOL?QSvBs zl^XDqQUOisZn+1~lJmu8jRsgLaG@}B4`v$XVZOUY&;&Q1`~AWC*{#6uT>_2{rr%w`9|iEo1ohzh-PS;fujsC_hG*TaNeDoI|W83?+pqyrPiS zG0tME{MxArb*#c9W4sz!RzL0WF@I~qs@cCM_|6)qqcV?gt1-3U=Crc|(e#&RxY?x9jc-UtD=E&+HhZZd2ekBUeNk4f+8i&Xwq6JtX z?yXapc=WFYUlMShOiSh{K}P4o$sY2} zfY&t1Z9uygRJUVDPbUedD&Jd&=e}rx_Sx#Fl=OkL$bW69tHWBb+wP^b^BDO+VYc|{ z@1hpaOv`+^<;t6ErRU(I)OiVp?q8w?QaDIi9ieefW~S!;EO;OX$9{ zeT_8r(;}PW4qvL`C5W``cMvl*Rc0fu5NFQ61V)i$${#Y?GZ|^E2^j?1kkU(+ZqH2_ zR!BxE5c@}EO>ZWL6j)}QD9^1arECrtR9ty2rnEaE=2 zM1^YuAAj3_8=coRH_RP|n={&ggl9n&MZf&vIDQD_@}4!VtmqstpHIK6mvxWc(FU@- zgBgPlAN*~TPubtxX@lgsNu=4AiihH#*Wda-(t(lS^{{8LeP$Fj>%K>{I`CLWWv67- z$dM=Y+io?t4)EzG{2ro>-+oll+GfqC15SF z@UDsuP}xfPbmO46D}QgV|DvY@f^otS*Sy(x_R<@j&`t;122?jhD7QE%l8lB99ChG^ z=hXA=pLV3mGq;q4Ivp@;wREdD9N$Bfv80U{)PeK27>9WNoG$*yy)Qo@=mMpe^mjH& zmkqX)deT9BU6ATXTVPYN3M zm`8Ns{K#;c)kQT2WyyCea7P#Z{q;+W3B0MCK$pT(z0w72k%d|06WA$2^nhCtiL+PSL!JP|dMhPX4~nwye)DVh z+=l!dIiXF`15_>XU`$*RZktcrtq%+I!1|};vkx5S#ueOo?e%?nz73&vn!f^?Y?e*cPp=Qy8$eyK;0Z~+GQ6J)~eGzFt z^LWS#hKQfH`OAQ70ng~5Y6P>o^0nE+`5y$PnKo?J~~74aSI4rNmYJd-P;WA z^;AsO9>an&++*r{Ow$ISH}ollp6`s|5QQse?$`ikoRP6^N}Jz2GNcxVV;&=6-a zd?WkSi}2_7i4DPy&%3GgprMJgJ*S%fi6O)WPF5EVDJ%*^t5kgqG=zQexgYM1EhPy! zh}^m5hCtt2K424}rQRito!8Z12vp4Sq*nYggwk9-spZXvz&XwQ?m^R)Kn?m2<`4JW z?-BE1bPU(B-Rx1;j~+wVeMI?QAX;zIN%k@B?w}zocjRe&kQrO_lyAU$wPXm$RD7e= zPZ+g7`uUD~tQdlZ@9#O>Hq{@W%EjyO?+hVS=|#TU@pnD%#^z=saw8zRik8&H0N zE8rl^u*K1g<74QW6)mHC1q#LdN%-MfCO?zJ3k@4zL4uv1kjByb(ylXKrQ()XKr=IV zp7gJV<EqCvmcHKkqerIKcgd4+~r;h(=RE2X)KPV>A zuQ!I&1NM-iu8u962mVi~KNv%Eny-8@i*eb3mS)Dzu`zUbt0ps~T)=u9S`E#)F)V2+ zVpvZzW(lD`FU}G)f%NfDn1_gCdsopeCo-ZYaGZX7F{a|AJXafjo#SQ#X%21((kh<+ z;!qlsF}zH`tD$E6izZIdHx|urN)aaTnsb84Y~mo14hfmvJJtj!cd0jQ&fMSSnpzN> zr zr|pOdLjcu*M9^9bZywg z)=_Ap#)jrlSaoTBMfKuh@L|N)P8V~a<(*EUm^OrzQz*fRB*l)J~RlRUUr_>XtM0PG%FpXn`=4DDR7s@Eudgc@r*ZELF$ghLJ{_X=zYv9 zT~Ln|cqs=z<^R$eclq9F*mTDVXx})+9&9Fh$Qp}p-jQ3w&Cw3ys$h`nH`1LIPg!fI zQY{_N2=7}uWn^ETaCPJ?8sKL*BUM>b?z3c z%|cB~3z6HIZNTKr{Zyt~K1k$gJ4L&@4a7vfAz5#aW6O9u>iHwh25R%35;;{Iu$D?_ zNRbuTKxm(ZNU2BMD)x0bgV-k|p#S=j=`_Ut=t zywS@iLb~~G(YDacg~s~snCi_+v56^JqbOFb`#jevS$q547Ft|=yFY$>9c^QlUxj;V3-kHQ{;vt?naya`o+Z=S zL1(t>Kt)$H#(G!g{h-$lg2FVu5u-`pJt?Lb&^EV&!*QqY6=bX8S`s^}1I~89gy~3Z zI3=xKwG(xo7i9-`7bE%Cj6)rjtqU6EId(vVnqf@ul6hmfI zkrgZ9We@r0oWG6vg+Z>5SysK}f2;u&&S*2nB2xK4h9?T<5cfU@O_Kne%wT@2~X zmcd0Z*Fh6zP{XA$eILjG~0p?t>$sSK(&*R+b9p4ov?B21k&7ud<22XEuz9nCwK%=Lqt$=*&El z$^T_u&}Kh0y00@vg$WQ%bx615mOgfNgc`5twAL2cScg92$+J^Oc&{Zmxke4MG>T*TDR-H2{!#B1Mr;g(86>#-bWrO`UUvF4_knv^+V0xH@kR!%2K zs-N_zaVcr{R4Y$im2`pv|AE~{x*BbSIByYBJ8HU!h(Ju45FQ`oM6vXR{Wz_b4#vQtne(FGn~!^y(w0!=0$$B zcD}9b3|TWuCtvz3oJXZtQaD4L0Zq+aH;9Zm?$NLv!}FicF!OHns8ge{li?$(wb9mn zok}gnP}%j46e|(y0^0>nOY3gFB(em#FMRktN$UbWA?MX2#+rF~FAH05p5519@HSJA zSvdY< z^ZL6&-GWTLTGo$mt~Qut(*>?zn)*gjIKi2G+SA8t>zyn3g`58(UAotWh^lE8HMv4N ztHF3*hOYCg6f%*PZ>|s&O{V(ixm>}I_9`!{3s>-berh?QKT_E6(${sG#0{)07|C;f zNOq&WS<1>$b%Q0!*Zg8W#qO*j~6Sdlt**U%K2AtY<4W>bH>y%x? z^?`Wq&|B31HU`t}?fP<QVB&-Lwt zU{?<~JhA;opYzOe^_QOFb({xG=^TphK6T=fJv_HV&+-61W_e0YY3GQKDthj5zdhi_ zs7Lzt_md5F^AXwI|2*MSXqv^JwGCaHh25@HYEQ^0gs^E}y7PZgtMWpEo?v?D+7YX3 zevHD3@dZ`d6aI`wJoS7N^A9EZCGWvoPjE|DPUc~`T=u|g@SN@T1joz*OuXQHpQm#h zN8uBm5Thp+Ffo@O485a$Xa9LYqs%NiR=BXO^6QLdr7SP_Jd;x4bgf%VBJ{8O_LCQ^ zW@blQTYp{VoI543+wg+n$tVkzn4iSRB%irxj=Vr+f1&^VZ_Uy}M#I`ysIMXM=0F?a zLtJ}uS3wdz#%r+FR75?R>GMXJ{3RGe`Wm{&f)GRN5$LeQaXzqFzXq2tlE8zk(;MAP z+gRfE8VFxrM?6}e3ey*Ivgv7f4cVCPdtR=&Y>JAO#be{I;ne`Hzs}!lV~?*Tqv+J$ zV7PVk=crtN$Sqzlzt-3rXhxqZ*L${oGuux)61DOM9c-CdLcQj+S$VgjMGE;^55)aC!Bv{#lt-lExPbqp7*3zQ0T0_=tme#ODkAZ0Tf18Sg_g zo(l}73Hk!dW%nX33(_1vx8jpq72o^+hcOowjFFrJlnv2HVLv!sicI@-@}B+88)l{y z2S0Ed3OLXFy4f>I{G6vX*bj1DKJoCm9!DAXz6fW}^n<8y7R_ZMEO?o&P6)kBn9F zw6pGXI!S++eUvIIqB2abK2V%4C+`pP&(+=AJB8O)@sQf#nPOP!u9NR zmp_z}EA(GbU3Xh>DoOA22Y|TAT9T}yk^%Qep;!F^0gxQ)*%I4D&`m?^z2vVF06W#2 zYoFirk)0wPSo_h8-bN&a9H1jb_9Hr(6-87QF^zwBdzfYjFATC;s% zqRL2o@p*a>>~if^RX*$7R4-_5ofl+4r6{uG*7uQi{Ka3}JxD z!TZ=o@R2+6<%1+T(Xji+$O{PsxuJtV9hsJV^)SHU`OBk=1k?j;#tgYmVX#}(w5Fcu ziI16VI7{sl2E3X!-xThM1d5#A$@3J3!ShUQLT&W7hDr!43B(P(7D4vMvT&%*)zJZ#H`ls_;fnr9k8C>%1-^+m?x@RweAZ%eJb2#4jJ ziP2Alg`~K*`%Oaf;b8CTSz{7;uxsgBzn^a(4#?~?ZhQ3&3%)(dQwxFN!0=~5XsLLl z1ml=VVr@JeP#-lQYI$EAF=Lr~hFEhSM8L#@ zIW@OG?%^lj8?mL(BO&<9C0Fdpe?{e77HJdFz3V6E5c^fbTLL)73( zZaFCu(%H?6TY9Wql?oPjr8Xns{&QZ|AO;SLU~<;I<4B0)G%nZqVSlY;bRNcc83{Q5 zwK^6IEtgTJ`S)Y8L;;P4)O)%mYUvj914;+BD41a&tM9^R4tX?fjz|_11(7HydPExU zWA^RCmC&-Hpaj>7m2P+3-~7c_F1(T`C~dY%_=9V;F1Hhxw^|wn*IpX%A>zVkPt|M=2TQ8gO;;!E9<#w408Zc_#SnMT8j zrM)q=za_^vPvpgCvC%LQR*!V$c6d@s7IXOPFdB}{M!!z*HnZC!NL4MKMnmy|5YmUR zW0v2MrrPMlF<|&%c*}ulF1Ls?)cX&43>XpA#uCdV4dpcbeo@L0109TZsmvo+T>l?M z`LV=602cR`Xt;Rweckp&u#e7TYaljl3#KD7K{6Cka_0@K!_MWFQ#X*C3 zrgc|?qTqwI@#bxoI3RX*#4T0Ak{lL`U3BJ+1Ni~3yW$W}n>`5)#tY#%z%WoNq9lGF zm+jv#!Dbf+JtrsMTjJGH_bXB|p8LmvH(fZjP|}ZIX5*y^0~v8(>doB$n4EauX8Bgx zw;~SibgdbMCsiHlM{AsM1ma;!bNcuF@3>&72(hD`LN)N%)G|gctCcX>HKhy&Kf3FijWCzXj@e2{tZUwy1)8GW? zMGZ*6$wK%W&hu|iB{~6u35Jz8ua{l~{Z5rlN=N`H=^T}kZy1`b;d^KsvkCC#wxgW$ zLEF8KOhQlOTfEr!b+TgWw;LWhA3}5}5oK$}9D>>kmG! zI+koy67W@s{kDu9jK64AR2wTug75|n*$>#|J3Kfv%MUt|;E!(=Ma_T83w)XP@2TDQ z{W`ZllNCCBpA@=Oq+H+gvgeP-y3roib+O(hNpIj=o7y|S;q6N14?9^_$!{QvQND8U zEs~J=yn}04)f;%#6G`GbI8#W{dLTkn^9C;6iGSlcbW*TnkV>_DeFKL%Tj}o`(3l-1 z(bqp9Cj)XthDMwIfd!7{mvL?7WSE-}M=@1?XSFJZ&|_tn4DDm8Yr@gv^;z}qjS(x! z;C-<+7I5=gvFox-EN(R!7+0d6rN7odMbv#h=X;(EQ~xPR$iCKC$~Y~U%=bzGEq|-R zzwJJEH|o6617A~M=|G;+j=pwCyI$IYXfy?S3jBr%=bmVXl;7F4VWmP(2PE)|_tw`B zopt0tN`=7BSLs$hI!m;#)V`egqyj0v?6dummzf*1xTF0QsSvDOK;p~6n=)h=hG1Nk z3TwaQ(2uGU|2`Lf!p`263Mk@_0YUibPmAkeI-0>$cul17sa&CXXr-PLtL7*bZtI38 z=DzlSiG=rQy{DJ>7^fA=J!g2xgX@hJys^%2Owz|QI-Z2Rte%|d&$EmeJ( zdyy`d4o%_;q4D_RU;mzD<>G6k1EvsiP=6W=uH*Z0BMIMh;0|fV{?;JxXS~msXHb_8 zS#ETg2{Qe=tN27V^?m6OVC7lL^y@n^f%xCsn8kERd?sAukK8lFHlLA__ahy0ZNy3o zwJ=XTo*2yD?xh3D(AV3oJX_N!i-wPCI2rK7r|_G{mlY$#2(P&wf($?z$Z=R5{#X5G zCmpeaB?FwBf2z9?K;^@pSU+9C4A7D5cjMogs8Mzy61_0V09x8KtJ2x|er#fIH(##| zxa8KmW+7^{(jl#JR`<&Q1oo~C=ERQgFMr!)#0O-6c;{IC-$(l$80a5MzJ_Ih_OZMK zUqkA7cx-ZSc6Qb8iUCA< zGd-Tw3~2hs6mYvS`Xer^5B>Z>CP-uI7baaMAX>`|!E4#?D^?R!mjA(;Q zh)g*>Zq>p375dq|NBeyy1dG~z4Y|-_>-D+Cp#PK!tV1+`-^<@-;7NusH}+;iF5z!1 zgfg?_4c67FEQTy-Wu!iTi_m2tWd9ITg*ywvUpb?B*Nlz0p|K|kn`gl!&0l?<`l%?d zm^`#F%dGp@sFuyFF(Zq2DQMXV?pffLys+k+w`D36dnU3_ngx6P0WAtdGcTlsW3dVL zvf$AZZBcTZfeCu+;jJR`Z1^p|yD%M%W*D^pcV;Cq8*rRh^a9T9UmmD+FFZ)fhU)H7 zoPZvNC%qLbzsB!bPW|Wu$&nfNlbFF^g{5q;WJxR|!Ya@i&-kRjhM5E0%IXGVQbUP- zj8*cV2y=i5r;Gmaw(4o>I(qefRu15{<2h-p;Pb|#KlIU_$bs=;Mx;QF zIZ$Bfif`*k>{oj_gd~KN3+a-Xv!X6e*0$y!vsv(SL4fqVL0<5I;C!T674g$tnByhB zF(Q1Jl*r+bHO`m|Jf(EA_9^Ud6KclWQ>Al3(~SN^ddk4vJqL{}!8I4MJProU2}?iq zpN)~nzRLw0*M`@IzbO9cJVZLs+{lG6oBhQ`Cu5rFLeC~T>^%4$<{Z=HwsGfl+s(R! zn+MW^oePQ|@Y}BU=g7z`^B^$jEM(vpB~H6r(SPkBc>qtbeH?EM3!8t<+hXu=Vk+Uxcnco8R|Jjn91_Ns-2qs_2pM$ zOv}%!?&|p<^1veBamx++v$dqRgjPOq{j0x@#vpj#hsj^@vFmFGcJz zIpo8o<)k`J`M zwe#G6*Ens<@9f2p6oAiJ(9%b2DrLukmPS&u0tipAC$&IG5FL4qV!`cJ0NK^1EE1^U zV;ySd3U(d^P{-rw()~2bj}OB-%SKn3#&yuxhBaGhy6}K~2nLKsA(5xpyTF_hIOwPj9wdu<0_~<$IyhN#0reSI0`et4PmD@-M)ibt&?zb#HrgX({jyan< z=U{95Ea3dvT}m;$zV+{zIOj*FI?=T3NG%3s{KpT7n8!WZ!`e>`ii)9d%5h>}3XN+5Wa-$R04-2N5cXCYR-th<%y;Em4I{nUCkrqB5r=yM8k{0 z5@;Q=py{J<)cCdgZpCz_1QH7+ZqwW(5e-pGg}xA!LSw7crjTgVU;Zn;ymPKn2&gJ_ zD^P7}p3-^EiYQ(R!!vLGLnX##`gWWj`$oAG$`4#j<+&NDbZ@*&2F*%=O{{!xhuc91 zznOh_J)sl^@4AQu)5q8!`Mf|D?I?wjw91Mo50#X@cMPpm^WdCNEyVFV3Q9?%Un`v%b$8FmjSndK$gG~z3B=o>2p#2GQgt2 zL2qMTFC);kj!QPUXR|JRM4y;vQ`UVhkV*{QZY7h0!m?NJ7H=51mA`&dZ2 zC`GxE_e@FLuWQ+xkaVs3u<%nz891=K66t4&TA@v&KXVBy1O2?Rz{~3Ote#3Evw_Sq zklQ2s@7o@#2_SbX)8QYZfsh)v2tojaOAvd3R9BW8Is+pYXw|5@u{QxOvx z@`muEjVak&v~vgWrQ>e|~-H#AmMr!pw=E6mC>9 zCOsQI54bBqu4!@YwRN#irJxh7I!`4i6UcOKXSzlk{o~ov7OjM(thIjH4`lYs+iF*n z8kImCw$>#@YNrx6f(=#nl~AK-D9s`HcbeCG3^+{2fW&vSNCuR5p}f30))! zr#NjvO-DUr8z#k-z)*@B6}5u#UzkD6$mP3A@c1mE#a6eyY4~l*KDMqB43!t@Up73y zch%gyZ0@Oq$m&XsZSv0!RhAw*nZ1>;5-?;Cd3}Z$E1;r}JyQunb4>Tc6BT(TQJN&u zrAkQh*LPq1%qWN!aB5ulpbFS9`J(y5UZZCDIQ{qaWflB!xbjPw^1D%3|7FmdRt4m= zZ?gniVwBezt4}T~s-U-%jT@IIR$h5YA)Wmy2=?$L4lryKAr`+f3FoK=m!OWThgB5=4}+rv1pKREATjtOyBHdF{M(?p=(QO&hh$PM> zWi6CAwEz9{lWWjb?{*c*q!!rAoYEz^E^hsJ5?lY8*MbT)?#s=FQKI(xQ@o(GTIjmC zr4)EjeZ8kAtVEqz3tS1g51!O<80deVG}|bxg;AD=c{O)79vagVHG-dNp+RACFd}@! zyVc8_R}}jlWEOcp!uU4fw{Y()eth)~POYEasi#^?x&F}BML?+o>xQSVDkNsfK9)Y) z)1s*ZN)BA{QWhucCU_F>FIWeUJblh;(;nHhoHgL@IM+eN?RN!4cUv`*(a+WDE_IOX z7nJ_=-75KCc@Kk_=sM^l;iB%njCx~byDk}*RtL>usq$k_yQ#!G1;iR7`z zzn8Svt+Q)*^$_1fD^8VI?Bip4WMluN9=^s@2v2>=emncCTI`i*-g* z$10511ADD$7d|I*-_S!-=BNKPfHQLX>}gnYF1A;;<_N((ccE@qYKJ!t?| zuOt>cTkgUI!96@0i3WHqb;|vR>|!S={$X@ybORLAwD$z_5Txf2qAAQ|Ho!Tp76zF; z!8~^F`Og`dMkpN;CTtNu{?6woArPzG2)I~byEC2pcv4l0XY$33kf*7L64CZk<8vU> zQ>%eS(0EUcY%1Ezhnap8z|7PH-SiShha3VUAwnK)6zolqRYw}Co*`lRRp57mwR{uE zc0OIk;k^%brn49RSK9=7iUEvQTG$sJTb9HrElp5D?_w1YcG*UQ;~>6>+zjjA7~j-w zTKq1YXexO8xEUH&9?Sd_dzP}TLWhXR(F}H+ZFVg3lalMn!lKLm%|IMA`Z-}(U{`wY zAtlOCGYDc8H%0e;SCM>w{y&P&Iv&ioi^I5Y-OY42(>dKW)21dTrcF%_n`XLZjENcc zGhNf&re->Z>29z0&+BvUzt8hL=YG!h&B&gr0{tf6PH}i^pr~*}UkY6{V4LK39d*IK zNPLH_P|RBm42@I>nqyjjakxpPYsOTALNXH6Mv?W+#ZS%X!gbYP#>m>eFoHDqrh(); z^Ayos6-4~P8)~?8kbWf0xHERH?=4&*pUIlm0HY|K(^BQox zWmM~gQuSL>y|wv2+ZupHhVHznctLCi)|w}BYk*^f2Rq$gC)DDDPdSN=H2}Dwdwu?w zJRCONWkro#3qBoQIIOLFtrccqo3s?H1x#F4ZnoCbvzT;28lpnAfZfsTHq(efRw|e{ zgW0eau!Mj35)!RfhFDK^+7ea^48pzR=+>A&z|3wZ@w8fyMp1D4D)&t^>u=Ur`mtKD z`2_2g+*(>IdNfx_AYvV`r`HHW3!+I!9+K5Ud{hVWs2+#X>$nnO?CrlhGp_?g{|z3N ziI4m=4f_6DA(8A zILdR0^g7V({@R+$0)-kYl4ox5kxL5 z8luI3<6f?(uhBRgfd;*$?DHG`jbI*3CvsB$WO%lT zOj9GU=aT;P6}wsJSy%E&&{-p3WycF8bNJ=9l<^Hyf}sh}PqK*o#Ov12F}+35*ym5hcp%25PNlpeDO*Bd=TC_ijNm`K8eV&-}Qs zetO14pPLZV_p%wBP+SipaE^?Er8yI$8=J@!m*BPLYYfky5Ay}PHJKYkx;}LmW+C67V7wXK zGM(<^T~y-on<9%=pvAU#w<+6|nWG@OO_taSI2*-cm~6W4sa~01P-nG*u?)Y1;IE7s zx>1V=*)6R=gM7+X#0azC=8!B$W40AYI$Yi?i%55=73d9|-L?XGIkFa-``_bCX-2L3 z_pQL4jm40>T5AA@%STujvkiQDBHI4?Rn(f)QlWMJ^EQC{?@ML4>P@zi2L5{_pZh}&B%tM(65 zJh9`Z?)Pp3>qbJt)@q(A>nuzv` zp7)5Yt71n!trLu@EMyTVgtv|;E1UX#?F6ZL9;ucZW@kGjnXaIr6Iduy`V0a-?%jm zMzP&6rce*i*S#Fx3My7VVa@m$F4Y5c9b(BoTl|VDGMVxhFz*31tc$TyBGm#1k=Pui z56pJ;W~$~FQ#?gm#3j3b4`7NUL&$6wl=nq>7Wgf)2joAI)y=4H_f)AN<`InU0VVnJ z*gAU$ndKW=OVgD-;M9ffXI_mj^tW#quUE2gLEtC#z%VV6__wet$M+ry0~aWH2D;X^z_1% zV=u_$FiT(WQU7ZoJ^A)WhXr}L1qT3ge$Joz3b>Z#@f1_4tHq3tNId^)*cgXbv z%#Naq22jmwOwFxs~^-9&YLVfH!O}FvL$Oh?+3P0F@y?P)22ME zsj}@D13-#9;oL&F!ZA{)mNb`P0Fb2srC>%0;>1P14H1gP&qx>x=4#g^1|#gz>cjK;PbRsEIMj86;eUNq{y81edfo zU#U&bEp6JW9WxAqZrqFd4^ti(W7l*8Ok9HidCh(`X9#QekJ49!bB{sLdVQeA{!3gi zhmC&GyJrxLX(}L}W7`@Rv_}h%k_~}({g{uq&aqZDR1zW2w>2L zr0DtR>2$elM(o}Xfzc3cON1ZK+QN|Ca6_IB1BCB}n;F>ueU#`v)(v_;3|w$~y@W19 zlf^N*sS%oo0g`=#c4lWRFV_h5GnSrV@NXajx1FQzzuetk%^a5zK*wTVh>0O8I(zn| ztt(>$ykq{lAMDK#%5iu+p8b6UtdTDx(KskAlj(W!>>i8&&)nl#y&R;u^M8LFCGSUo zPkhgg+u-icLd9tES0bZe<7c+?JL4!3H1-%IOQ})t0~?1U;S@DK>W$Jxo%1Nz=Lu*% zaz(Y*^!%sS<2njzvM`=&ZYkp`d~BTvcs~l*($7k742JOY=V&L?cSZsCQp&t_Qged| z(aX*flrf|bBX_~NWXG6ou*ur&~(?B9iOx4V`< zu;9~m!DbQSS-Mnv+->$TkVwiSQz|1iaxj&{Qx$`fV zFJ6J^{pT@2zH~2F6^ncH!Fu({xArkmOw)#F!h;&XFUU>&-`N=OZ#Ase zTP$RDbAI~bpUKaC`ElTyi$eFLqISxKjlVu5S+G%~I=RlFP9tZv(l^7>E z@5%Z*Z8P$n#=+_Y?e8FQr7|Y_i(Q|xaWKj-C>P>i^=jAiBfZ(iIB0@Wk%8-lZ%zMm z*LFD`2e-b`i#UJFTaeM8A3I%)14|OK$*&o@&*HtD*2sk>z{~ViNfk~Pi#?5hOR*jk zpuFA5$-?+UU$XNjubt9|y0a9U+YDZsTdGL^^6v>SD82jU3!A!$mZio(z`_LJ_*x}6 zB*5QI^b!rxM)?=GwV$1``yC@S&N1eBVektWd2IhY!1GM5XHnfad;bgYmLA{DfAw%F z;C;~%kopTuQHkiQ7#ZJzVugNj>Pf)dm}|mn=!kjvIk5vp_z|Xq_qWh;G!x zu<=>z{Bc{Xtj!dNmkx6YMUBapXb8tpcAI+eS;qwM9#t*Niv0vOUQ?j68l^!4`P;-b z8_iuz;1u|0@dicA`s&$1U&O!h#wn2URu5I?<&BX?N}K`@!Ze6zu%BOi;a&Kjin>)B z=QOaQ)--u?{bcBSdYq1-%QWaSb8a{s6;VO--!mr5ng%2&0S3ms+@`YUQ{x}MO@p{R zJ96Vjx7dhZ?q4SY%b9BrLn zY|~txA@i?J1L9R6_PABeR9B$8HwA45Kv%Ar2;wcDhO6#@di)unmdPH`p*+XGxW)0V z!fys#W<4iDbomxwgwN1hmoo!;M1}H%aN?7NQ~KE2XJI(@-NYp9MzI#`zjtjKLl?)CBFGvw&88)6voFbglU{3;y}8R5nw1c6=-Sgj$jE8$`Y;M|*Y0ZGdF-zKS{PHz=t0-Z^1#&yQN4 zlHO_l4b;c8wZH7)t#@brao%704Mu7OQ<-2~ zP_OE4Wo%OH#f@F&Lgz6DF1dG%*xUAHYx9$*^aAF<+Gdecvqh`Y9xi*@x1c$I8^Jj$ zeEG>WCIwgjP1796!`Ut##UTEk=YKr>zU2?74?G>z9^k&j&H6^%cK-)p`(7Go7IJe` zbSuh5Jevn4zT%=;e`mhiOVd`eyqE_cNBb~VBtNg&rZSY)pUi{RkGe5kUI;NIPBb4< zFcyGB2qL7K)R8tT#P~ESz5tHQnj%qcJR5mW7d~mpEP%Qm#=<$obcP3UCXK!FLr(Jh z*G_1EILUlW@=LK@7J${TWemv)9v0j zIWw^ctp4qt1&0Z_PwlQXII*quW!Z~u`YG{w=IE0?#)}Q8!gIiK=J-^c?tAC(rgQSY9Zm^ z=(CZIvJ76E+9?SWt8M{JXT&AyW$^8^1$E6lvCgN%eXy11A}aMX`54<-?uOVPC;9pw?Ooq2Jm+2t} zs3_l;QV*BG{2Wc_i1hK>S?00bdBhdKe!DOeO6FfLAEmi=KlI}0S`qH=5VruF5as{~A%@ySNeY4^dA(&@%Sb4bb z_hV)+q-6^n`>Up%xB}|WJ`m5epC`Yk*t8}sSOG#t#q$Fc&r&N{7-k3hAL=R3|LAHi zbh;6v$G4xYfPFq%zncc9v)i_V1IdSGp<-MZ|Jhc%qQGvx!-01dP-KXw>9Id#w!1c4 zqsXs<>T`hu@&_C8rEtovh4w0#*~U38KB{_^iY=(;YQG9fuuLeX4Ckko5k`B{YF5EI z{mxxYGV+#!!6@qez$(a}Ocw!IC9ieLUv04rt^)PFSFDu}+AUvpt7tN%ooRb4B-1}fKSxD#ebzWev4-|V}r0T@I~u&#l^7ceg~ zy_dKKaHI0_s;&GEPWm~5ZNIO9&ln{!E(=J{N=3e(BlN8SMmsG}yvkJmxF5HNcpGbA z_4V@vRed315#)^M+K6?K^snxyv-xpXaBvX;QRX_hOqBCpKViRed9(2A`g|Q2n8-?U z8WK0Xm0I!qY`+0^ScHA_C`lXk+c#Q@|Jwiu_#!hUodRmIN&(RI*9OQ?N&9d>Sm?;H z>EJIky8+tvy|r-Oy1YSpcNxXGv;l5T4_h=%JfBMRbwzA#Y=EdyA9-^};&so~8+)<4 z4RE%EAsM=1if1>KrRg#)Yj@stjY-2v9nz=Q&=zJ${xh>zIb$#*_*H$hnUvS?St839Jk74ctSqSQ815^pkr_H<-x zI{GhAqMO!tufdNtB6w$kfwc+Vw_Tik8z%a~ckM|Xm9_~M#N=4@Ulb3NL=={reclB3 zT-i*Oc~d%t9^dwI>o!56H+(hOjP`49`bcy8bQ5SD*5AhCKc3oz7%+-<3v?~61i5OD zTz-8XjXle_1!z4>8=bbzste@e71w#Tz;~BpvNmL9eeK<}I{!n6%M6Oj>kxlT4rMSpwKDQ<(o8y}I- z?D^Q_id1r|MBkuEA^?_$M_FRKHK2EhfcGZW9^EOn77|=|7}3JNXh-HuZ$)e zx0`)FVH@x~>wc^QWy@{p$IB=_ZiB}So9v0A3(?$FbNuxa+u&``%NpJud}Z8<$A2Ro z{sDH2|B`u1_3`XyDpP)TWhF6J&MZ^3>SOThU{Op#1(8GH9(|D~RDYOG$(=-V6qFcTb6E~b4oqgO;f^4d9e#{(cMf)a2HiS_sIVJ;WPs~!&MrV5TPVyt!rIRdWLkZSvU_&e zVXb&#vj;V>@p&T6yZGAWSW~I&2J#eiOyTH8Nb$;;NK}UFR z53CiirmilaWg|FxljoW!2l)TJ!r$KxgOlqUM{M>E-!SBxATq?sVvq^+yMErIiB%(Z}oxLE! zWaat$=#TmVxP0e083JIY00(2t-v_R(a#CyzWk*qx`*Owb;sC_p%$nBQGsSOkLGWdcEnHEAFC#P zkURv^fu3_Zj;$}$H#z@c8Xf}Nyo5z|p-4(EoqGxpa|kri9hAwFzXn_uO~0S(I0Ros zo;~grxp_?br0d&jv?Cz!W(x?3!ggONJ}xwgBM|H7&-(*khJX{@oIJY#I zP~tP%Pqv*eN5F;BUOCe~c-#yxpV@l(2w)1lO$jq7>H6Xj`x6cG7)&!Yg%pUH8M^Wa z&|%>ogH&rh8vBh`4NU$mNcVClZfA{P!RfQ&m}=%odE*`SfEzaes#- z8hIysP^9m>Pjmtd*)SCK#2x5X9Pl{?s82x4P;Ri8LU|oCk(=p=;0ef8RFGkJEGbA1 z4Je{|b^?SFEGL_rrwbl+rDN2;JOSUxIC9>!2JkBoEy-k za6Kh(uEoFj|NH}w?Ugy{4^8ZJVb%-ag{Q{5wZeMex<%tFs(%5tPH7wQmgrP}##8+E zu($v$|D_u)&t~y`W;NY5@Vo&0a&tLdseRgZ`@HP2z83%kk9zj+*I*iQdZ+lJstZ6k zWt4mIX}sT9`OR(W&;{tAkz(b2nE}!=@$pTNE0@g7_KEOOR^%_2=8n zXtnl;OQ1%M!_zsYo=I@4TxL*u3B2)$w+2o3<2%fY zhkR--fssGATi@_)1`F1|kVo~Gpxe7|w}M>xG9|F&z;f~uSTN3hW8|Sk)mKoESUJ1| z^J+Po3RfAa*lfl%hnElazWa;4M0G^h86<@3r&j=@*}F;g*=CbPqP}CL*A*yl>UNo6 zAdUa&cqI-BuK;|$7HZf-n<*3B|C9dj73iy{NT{i%{nQgR zKtarO4OE-|EVusV1$t?L2%k)@K_+Ut)?l!66a_Zf*Y}^VftV{zaZ~y|1N^HT&Rcg4 zdjB{H=N=Rq;5jf>_4Qr@1m7?szlA`Zvzfyi>Dg(>(>K5apNc@b$?cT#p}!A2x&@;FY#2e9dW8oJ97!MPZ$UMe)rO7o4@5}@qNPBd zTR^RseMaOST#?V;Pl>5~3z&?l5Rm_2qV5z(CX6 zY7e9MdcQlItn3zyNhP<=t(W>xjmQzx-ra($ZzUK=F_q$F;JY{m!X4;mF%zEg&EVjP z!Fw5pbq6S-Fx=yA>RpAbJ|D{S-2oTWTPb0g$aS8kjC~5%JK#MS(A1SH_ULSev*;7u zJqY`QP!}%ARm;}i)xsry53v3U?_>;q-N4w`Yx$#b4>}JsXiJv!T9!WJR1inqgDiEz z^01Su0k=!N0fFp$;22G%e&{B$an{C|Az4 z@Xm!Q2?DfIvR`z0Ve9hp#Uz1mAp)#gAi%Hg_MF`17&_LSK!Aj*Nv0tiZlp32Bt1TH}bad=d-qVei5QHJoP|=#3F&IpmV!jmW?41IS2_xn2jtP&*{OkSA+%0 zMM&`Fn&|$PXQM*kE5z~LY9xq|-6gqZ68EUBHgGu!|3PPi@awB~;cC7wy`iZb5rB)F z3>sS`yXc*McIdoJ0HS*ntON%8qg11lcxrB=NbM|!MFIQwCL#ZRxCkFS|0nj5C3ezB*@YH zPc5{dIC$OEM+OD{VsOI2Q~hFySwt7Orhx)67p<{5-&JvNyu2x@vO|Gazj;aP81Ik7 zxbd$MXHlRE@nLpycyS_4>sOIqM5yqI*%HpP=Y6Y|oig9&=}_SSo(ecg$fI!sR$c9R6=XW=s&&1M}w7` zy&|tIXv05U4(z}D4-M`j3r+E#P5ubs+QX4+K!e3<>Igx)Qr9+1@$A=AXpn{%)hO^$ z`&G$Ct?J$;8a&p^L5n2psQ1H*7d*d3gEuC4MuSIA=kjmuzy%UWNr*rKCD2DDBw}f-nq8HI2mpu2Kq9mEpi^Yftn`?Af z5qPVn7Aj3yy`g=2Jso z_anHD0ds?xUc7z8);=n3xY>-331|9)OWB-1A0HJL?@5wkLNX&;uNa-e>bJ%EM}}IM z&}D5-dYVkNqT9OZ?q`V!cg~17l&?}_rT@Ap{c^&DcgW)n zSR0IO4K=BOLGGB)mPl)Cz;f$NwG#hqSvDpd)y7=f99Aj`Z`rJL!Nr1k+Sav9{w|BF z&sy$>M6e(u_ce=qz_yh$8d6lRDHi-400KfF5U4Hi7bUcja)@gs1yN*^E8 z#)hbo7_csc2klSJJK9gi*l@o%u(WQEqd6y{BS6m_8@?;mO8@I4q)4bEj#BZ!1uyoy zZh8bcKzMr+RuMK-B4|sTRipnPoJVUx)r1Ylq5I#X|8kS5k0awUZm{9e7XODpfsi!W z7ozFH%wse*90z_wpo*GisSJ8~F^bdr z?xAjrlZeM7RkpZr&YyzS>42R-=Q#u9 ziNS?(H|@I^nkRBCZF>C@84vYo2_=jv_j;AqXdLA(Tv#7Pvfa}@V&tsPNWagF2UYyH zI^-JJg-n*3yl-^z;NuEj-?x>{{o5Z}Ki!()!I1rA?f{cqg}t!Iqc3)Nux|hJnn{@R zyCQMNBSCMxhyE%=gLl~>cdPNo>GBgE^w3W}5s+2hx5%%_^ZJel!&v7#zEN}h+I7Wd zyjaD9Q}YEJ<$*TQX{HM&m=gFf(Po0KefX&0shia>rvg6IGLBov+)14)e%SC)e2)*! zq}$jYWi~YSs-%2YDZq!rBj%khgS@H;`2Wy3R`4O+*KWiKEw%=iq$CykhoyeaW9F}X zeUs(}LV+E!r}Q@w#B^@9 zy;+KX5x~p_r;%V1!WP|w$AaRM1hBr)5dRIseVM-FWo!`&A*8(HMI#QqoWZ6t+8W0o zgh!XyR5Q)$c;CO!PH>wN!W6BNZB70`myL6W*K;m}Fk$Z8v*C~soi7{lXS*jMv`N9s z)q8Wpx!P-tl-!kl70SXbUmG=;0z9-m2{t!$&j~ zgUsSpqrN5{G1N+CGtG!=XY8^JdN6ko!x8HWQe^@)O{;g3OOhVMP`~nrt7n1j8ZHa;V->~=Q$0;@QYSHCwvi7c-!hX-=InYpD$8KIO<)=4*8DlPU(}tqAtpkmoe&w&IkTM0a2nG1RDuC>+7;z9yTzgKUMY;R)( z5ac#+`Xy%eezdQg~`D zoNOzOX6fNXk%p*F3T1rm&)i}h`mbbJ_^c~QVO}sk{S%yYmxFDKXj61DxHL58|0LeI z3_q9PH|}#XC>9xG77Sx@FWCs)`$A5V zRs1FyOn!z{-}q#c82Ry0T{s3gL=#faq#LLsR}8O|%YQ}=jTAZ#y|lOg3l3d=k7-B_ zDO=YsO{?5?rOpHM9jwVAqLg{QVNcPaU^UMR9D8y&Z9B2e{_`u=N((`apEo%SMJ~C= zDMzm)-mCwk7(xzTNvmRdqR&x2M~cI)jUs<|-jjyWXb{xiA2)q^xKf8)yzwl8Ct-Nk ze_Ys%$H^i7nC>+9rDu<*CXaW>3i(4ntTLjWaN1|cRr+G}j~piEwfi&$1WPxq$UbU9 zcm$6-p44MO_%twoe%qEF{0Ls%85=WuJ8dfpsD@+@K7vmk zKW5)g%ccyE5JKoae*}XDD{N|czv3yd*ZRH^rGUmx6^J8hs&UPq0~lN7DPUu=eyy{> zNrOj61hRxB1=PMkS~Kqs)A%L@9QTloH<8BZ*4C`?USH39ssan-ZeoDjJ;+B2fJ&PdmaWK?&=uU(qdO zwHD0tO?+9Dq=Y+GMBEqe6_GsXJ6uf#pQaIL z*9@9(eI%IIsQXO?1%xH!KfDNB*&m(TB3Ph;5{9poe~$am_eE;(4Qx}v0Na|&M-_-g znoc_gU(TrDgV!dzd4hfcsZhIs7=aoV5s2Z038)VaO5MKA!K8*kjFN)(Hw~I!OxhpI za#BMAT^|CcYS$bqRiXinBx*>kpYLW;NW53Ll&hj%Mh&|*wqv|-3)oqo&=2pD(!jYt z%ai|7%>^}bS&UtkXkdYa1Y(3k)d>CHT`c=LO4{6`oYCXO+{du996ITb|chxUPTKL zXx9iFB4_->gv9KZ>uKTQ&`ToX_ZRe$uOD)hnrUIjL2Ty?nvHkQ2u4Ej04;25EF&Um z&6i`5OHRYWr-RjbNUr4a&dS3xF1`4abPzEoiehuS_h9oC0R{y%9kgWl(zKz0`8e_P zTtn*}9o#=+!DlzaV_LBN!eS9c2mKNZJ_%0ky1LDNBM^$GgFD@0geMXLBi+|4%oMqF z(5mlM6Vu1|$P1j+&Xh_zxEHfV-{-uzpfO0ScTq(LiRHC%V>$(#^y3H-Xs76)L#RAg zr`w_2ndoPI{-xo2$K1=rtX}l=ZDr|)Y_aBVVLt}*mZ_+0qi>=G4zJ(D| z^)Lm5{g^}^Ow{Jg?qh^6OG*Ao37?xs=&gA=BQU{`b(gDf%&^CAi)3>C@GwC=nWUF4 zYL;?qzlBnI&6ps5U-W`>jztr2go@K;v&J|=-GW|;U#HOsB}(f)aAm>23FX2_hqF7A9U*o06ZQkFm-= z8z;80?nD;YrXZT7E4D#?UVLk7^qU3N<&uV6tm#3ir+?ZC)>&ZC^ESGZQ28>gcXFNP zsH||TuCnLd8^sKbRl8+n~#0DWBrOd(a&aCA@!PIWDG0IzVxa2XKFmOz)jBvrAZ(3H7^-Wtw*wJNB!6!Qq{^%u5gK>>)@J^OamK~ zn|@ZVYTarXWOOQ$`I8MY1P?PUHpvZc#?HBqw6Z~=6;jgt$j{YM<)vKNDD2RkjzsLQ z%!i}%$ymdDE_Nu2f+~edukguqEyE_~F+03KCPWq7)@-3C-7R@*!ww@>!KYtdat1Vh zf0-xZ*&)rRk+z(OXVgtTXj{JN>`<1Qj?nITu;sXx`V@_L2K0YzwF;&y!Q>V~_-;VK~q3{@4QB7W^=@-8pN?vjiH?gs7J z#DDA&)7LzAwix7qtL%6-dp8sSmlQ>t z{G9Opad)=a{=X7c6G_R=C{C!~cc>C-%r{3UnrAuoffI5WxQE&oxFCmG58p`@al%0o zgdD>u@`CV1eeYulE_k!Jw;QU^b5b<+CAL7D3qB9MWw8BKv!oq?Yo73)3udDHwwhI{ zmRB=7a*NpFg0-8%KP@f9FfQ{j0=zJ|p(E}^_Qx#>`IO17HUmy>xct*+fE_Q$kcw%H zKEQ$-W;F`xpy&T{vxwJ^P>JM*+{=6twIfoo)v3m2#hKht*4d6k=V`(=0)^~*$wF?p z(zi8%vwZmXKOON&hazs6NI-ufGx|GvNUWSSp_&^e8TDABFWsbv%Zrg3U2wxTc6YCh zu8o zQP@K-R#=J`zTi{;TfR-IglZwIi)6(M1^QK|MWPilswnRxO-+Hivx*+KZo)brgN zj^4a*EsAzZwS3>=1EC7rmjYh6qx#5#4cGfr)t2hdt1rB8@em=Qr1A*i;`tDV#aCYF zhFC&}&g&B01gX>1s(9hoo1P86R^pqRG-DvA!v}4cONh-maXZOIeuKUASdm3akDeDG9$dn{RRh>F#1tN|mQ58AD2(6A(b@2|*8 z&}T5@hhKUlFhcLohIbQ~9Y4GC!-Bw$Uo;g0|K94k*7v^QhtcMB<9gCHP}ObviOnZ| zNS#4tqCtrNU+pE=!ee^FQGyUKEs6XI`*=JP@was{5sze6HSKI=S^&Qs0 zx9~n)roZH7To0B(f#M%+`vxT00&L?28xaCx)E1 zLHP3_@jULW$%o%=PyI}d1>s>lJvwtZOx^8wf2O)D2=Od`yMFBH2^Hu_`SF%k2om=D z=Ivc8z6LkLGPkNiFt5+Pf>6_;8td5oU7wZ^TwBkb!^vjUqPkb+i4PEhF&-IRg7Ro3 z6`J!?O9?_S%!xcJ)Oj#3C5azfc%ee=Y~9poh3nkO4leHVfgNqjG^>^J|=DAXO1 zb_zkG=s!ymWI8Y@a(@aRQ5bH0mR3#W(AJ3J~MJ%Q%YC;5iFJ$*KA=LraEFCt056}F zt*IwWSua*8I7JcK2!v< z3sww>N`3mfG4o1gHcE~#$C_JI-KkspCG19|ct)6Zbg~`^0#z`Jt7wm$Z8)a>x5Ru8?ceV2Mx9H!-WCEyS z(A*sgL=1P|(-AZ2=~9S61~HV8v(XKV)2EYsB~QelxAys>$)0^yn*c&#nXDK*=WHjG zj_1Zl9}F-lc>rV8Wd7rhtTePZy%eEXPQ9@E1~Oq|*87dr>J?;VKDuEHUSp;kqhaS(BE&rt}1&Fs^*2W>sSO z(HwjhYxD%Nq17zqcvbiQE}jYnZ=S%9CfgM6Bcj(m>_xeJ!k<8kz55|y>z)Fk9!WWt zs3%afo$>;c^L6wjIm?shzn(x6z9Stv+T?IO&aUTyS5Kh&tm5s|D8owr#+%kOZAm!% zhB4iThDkb@3cY15R1&HR$?ShzSqQ^*E(zcZlY|i^hw;76Pw(n6U8io=B;hxvv#$MK zzjlhZG)pK)l91{dEmf-g^xeSRXU8H!DHzip)koltaQZsa$C;B!3YPK( z(+#VTg1u!q8Es6$`E3nZaQsvXdVg>i^XFL=p2VNp!9kOTfdr26ighXZk$q2Rq&TIa zc6=*&*k%XgryM^lp9eO3A%Ch!tfKl2XFM*`R~p*kOjjg1;$`anvJU9_E)DOR4_#X% zt_=GGv>0SJrD3VG#x%ZesTYM-7(1!63~XFWQFtF{lVs+RF!P_E4AkEt(rn~o`}5iP z?tmmv2Ig@)zKXr4uqfrx!beP!fsde^2G*ydc#(cy=JIbc&{ICU5M2X(0IwTaCv!yx zT75`AeboKKEw{t2gK|v<3YsXjM5);?a7&L@r0>bV(CbapH~RG}$m8~-qzJO`Ka_Oq zLDCiXaY=$3cO+Sen)XDEBqfKNF`XnNZm2`{u0r2?{N0}Al? z-2Lg8iu3xN4%-j6aRs=dgQJ`o7e=ro%~-XytN^257bqY&tB+j;!@33+)ElO$6Ve#|tERPc8RTi`7P$vE}b@@Vu>ah}hK{!jEruT^}?}i=Um`@4% zg{PwXiKg)s=J_`BI4QyU5X)O&dqXtWeatK}r38fY+~WzDnkb8j~g?X zb_=!M|Ag73m7yR1#Al{^lVkm(GA9`sW#~N6$6?(j+2Tk@FUp&u3?tY6G;5Wi@Zks= zX3AzL!;(8xt-wmPC|+DA`Mx}57#}+qzWcJ8&1z8Q((76oTCEGMAM(aDOY<1&&ZDTn zO4GO_!XYsNVWM2k;|K0V6z&U<%nL|E}H&on(>*qTrQF-B*l0}ShID8+Xx01vdL9pKTQV1GxDHxi_uJf zdrnpO?X1xhmQ4i7g4CJIy$q&*RP#HwZHFMm*tw^kS12p z*G&ZUb73WNwq>*XuA9mm|4jswU_N$x9u5VJ`I!BJAWj4{Z}NZU{OSQRq^&&`MNR~W zXwKVYE_-pYoeLWMQ%(d>qAEeKL9@|zSU0L}RZax#*0v`!$3!d}T(q{Ll1>C>%nyz7 zR9J(sja@mWr%nV%GEBp8I9h-q(7KDv&Q1h5G8hNs+{|oYRl;xw-A)8Szb8?VWl~_} zG)RM~;7$YwwQkA$QLN?-V7NXV;Z6h?A&M4e*ZRt!9{xP-Z1M)m;*_7E8wF^L zK~Ds~mn1~FQD+Dr+)(z+n@XAN0Rbw5)aOMEaA5aAI zK>{romLI6twmbIbCQt;uusSTdUX7N>nTQB0O;7}h753@M9lH0SkPN97Vo(GGzi-RQ zVND#1rFGyGe^3OHFC=*cDeg2x=G$rogHQx`;h6bc_C&W&NJ|^6j!*=oRB}MAf=+d_ zs!d+Kolpdrt+c*eD2#mI`|S0isZazDvW!62O|4;-Lk@?bBqofh}RH^x~SWyJ|)^~wUWJ^@_`-5`Mp-}{4 zg}^Q&-_Qx@7#RCh)lmc~<5Wu-Vp!3^<2>_$0#XF=yzj{3JJ;s;gFh0LAyNbvwoypP z2QW21jIwB2Hc|wL?Ea~qDq`ZI6?LD9pHc)&G{a3tlBAGnEQEk>w^9TlvBka#&8`+u zAAXqp3{wQ@Gzykl%1r-u0Y48qB~t{Y)4ih?3cBXSBi}#tU{eHPrX-c>e4QUl)slvv zV^ajQGp_0@k(I~P&K0!%c2fjGr&`URA-_z_rT;BYj8g>A{M%#_VKjEKCItv*n^Ocy z3VjiS6E%37jwIf@rBei&gBCNdJIHtmF-azcrc(q{1DBfk*hCr9tu&8!=~D#l&J~;# zoep)x5u0^C08|9|$pSaWW~>;<;ulFV5L5&ZPoD_^6SqSHZ=Xkg7*qs&w^IZ~EP^e# zc&Iqf$k=1jmquEK~&cz%fqGhyDY6h7&G*UQ`6n)&??@ljJGy52=K% zgj57v6;@XBIg1G-4afraxl{zAg{a4jE-zN$0o&m>!&C%>CKWi}2{8hDv7}A4&Qt`R zSzUe0913{ij->dr(^LegnHZ-G=ETWVzea|9)Kmn0NW_Ix=MD9SOV!%1H&q1A8NxjN zqQlQIh&0`ha#aNNv=fw@vZ0;s2{+7`gjEE@5eaRtU^FeX5dWuHrBwu{9CKNO&zt(! z^Yf}I{8a>4L7+*u5utH}#Pyv>0#*bk*)*wYPL-tBlt_W$YE}dfn{rRD@#(r|oee%R zkX8hWyo|h1wOk48iGqd?rd9;Rh?@g*5d>My)Hb9*-&O=@%3_3c0!akv13^a%Hp3*7HAdwWF;Y{25UXX0ayec+qMfS@a`}g zjS5!8C|CqHGGq3Z!s0Tx|5({4JXi$6PYOSAJV>C^SdsksV?q2*d;;=1-5SFdJ{0bIOSdam56P1`ct?ueGPygLl6r_{{|5h<>C@ z7*rS>VeV&35K4 z?g6=!uIRRMguMk@s3H5oj=U^9!7(!*t>6XD&p1R-9yu$=zQc*i=IaH4d?#iuY`~UT ztUP@Yob3hoTW;TR+4ZR&KPs%g9`^;B)S04t0H0T&w49RC5dH=HVMNz-rJ~dAEqvMJ zjui$*uX*S>YT{Gf?b%?V0W1bMwd3=9!p7`S5*!b+)-(pUSc`w|%VHp!Gm-eK*hB_# z(=S74b`4B6ba~vD7f=Q)01$2g#!5^cUiT6|Y*Yq-N7v9l>UZEx=;0qA;%NqVh+?F8 z&H<$Edn78E&1(iI+Dg+c#B_i6S45}<>vRUUQ&+h9>HQa*uUPghWOoLH?im-huJ~W6 zNP^Zb{(c6(!K0GTZ{o+H;xzeW4|?GOid7R;j}Ed@m8Jdr)LSuF?Eu`7>_ zN6K%4Ha}kksy7Ef@~w%CkJqE%OlW89TR8`f8`0?soKA@7tL;2hZD0r7sxYd|(?vC? z;jRx#n4|~AxMq2y3Zl24f2*rS7rY0NoY_jh6wbV43+45qrq~A}%f2&AiP~D37F_cE zi|+?@Z;PK{Z{LjIY-3_6;qwPoDm7vd4Q1aqtCyHrw< zC^87>GtsHmrWpua)(9!8AwGTiY9jKCcQXhJ{kP8QD-_fBFlYaXkw*wz1IviSkIw(T zRH-SYok$1(j7kRIo(XVE*Zl?6Sz!p?n3LJZkq0^$B5|gQ*KP>eK0&NT!)=4p@j7uz z5_Aau9T*GY^1$!faD#Zuy+uuk-@z;F$<* z+eiH=<-_Y0ewTd42BQd+nYfIP-I?``40Kmux2*_ZJpKAu%|{VIFk0-!tgi^RnN+le z^i2?K(JUA+i&sC6Rn3AqaTD1+Dk%xinQq5h@=D-`S)qSc2`UMGz>_q* z3h0ul>t|*XLNy8dGuuol*(pv(+^?H@AUX+N;QR4gKxwr4)5tAOT{{WtjNaut1NruO zEas%>tVapwL)ePLH(3pOc*Aj|kX{L)XR)P@dC$~}X1z7s(RvAk9`k06)Ob7sW5p$I z42lW)anEoA$J)OEivy<gGY_+3LFEof@u>+8#3b#VKWD?;JicE{VXz6z#x_nh zgC3$gkEa=K)eQF*^ovt0@f zxph1T^g?pNYWU@r%V`P{mIk{fYNqh1=&^&I}8+Jp8p(9Z8(b|D8Z#9~}$&t@|FTHAp6f*qYmgLmms<6tOV(^P@o2v=V`^ zjU)>P32;$+iz&C_#MXjhZ#N6`j^XdcscHy;r-v5|I6(_h-tq>0m5uiFcR+q#lR*p5 zb>&Bq-5*K$7&Kqs;zJ8$K=KvN5uW4ML3jOqbW97J;a#S2hhH;Lvz`tp2VV=}Tawd& ze}WN|MG5Hv4R#BD>5lck6n*O7{vYe5Ab|@tYob5;waDV>jVjI=7=;VeNXH6Y#A=F2 zz*1rLxQ7c0Pd|d3c((z<6SHC-q?-#I#n-D7Le%zCxH7z5#GDJ^a{}|muU?o@SA_A@ zfT{~xNj5&`-okW{hI|{$U(pL-PRGq6O3RyL&;|E>DANlgweOa5S^6s{RS^SX7vu{U zJrRD+T(TqZF-924#qkRiA^s||LN;E|U$N&@gYpZoH9gIHC3nWV`p>-BG8PP3=eP<# zK50|wGmzFLgcuC-#Lii_A!!A+9+Jz!c^eEAvhXqW(V}Unrlna4nHvn{9vE5=xzUoa zPa4~2Ivfm5jhr-QNy^FRj?faK7b*;FeoSTRAJC_$pf}0F~ zdjBlJ79~`=SN2y@>b?xFM0uWnhob10Iq?>KfZYsY4FZt#H{;wxjLh^C%kd0M-n`Jp zA+wgwDlF%Dv-1qye(A+s1z&4vY?_*=mG=zRkbwhMDX*IV5k~Q;ulfu|Y+2PC$)qi< znUpIa@cImMXUbpgLfv34S0ZpNwGs{Xiiul@JYcndi42;7RGSJSrW@VHl3j35mt>V*K9gLXyL20HKb10xNbOqsAv5GkU`0ADS`sJh=@(gqy2hR96Jdb)#a2RKib6!b&m2jC4c^xYSY1F(J(bV(M4!_2ySl{F4)1Y|FL zyJoJYLyP=N?KKW|LX#HzOr1xPSMoOCJvt7Ry0@1eoA?bLr^l*SNjnZD>Ji<%;Vqiy zQEC-%@JkNrHzq@zKLguZMesGZ=~52iC&d#00RrkTp7aAZb$JerH6E0A!Y(GiXHaa# zB8v`?wbUPN#@X*Wd8lO=6QvHO&)2@#>(p;_2d5#Ze5vOKO|3D!)?Z248a-0uBi<)80g{(p4#F3SA zVyX|p!njS2OUS|QSnJZ0Xu1#lSX#ZdU0(kZhzrL?yv`3WtI#J*sopp+*US@MvfB@y z<@f1x-Tx8{QUEb9_~#GVR|Knt95FJuZ5NG*g6I#u!!!D1LVN2fnRnyDZ14}643dqn zdFuvq%~60HP%jX~Mntgxrou^2$m)+ycrOsI!T8!6-sQOu=5mUQX*>|6+{)v%Ske?^ z98+$y|>of4|mLph8yowX47 z!uYKZE5mur90sDz90w7ZBB`x1OCfKG7i;q%jusL3+apb9huk(asscFoaw!o`qqcae zVAJYS>7d$sVlff4uB3T#$Rqw7YSZBO)He~_M<*W(nu5V_&2bmkNH`I1c*q2Sc;S4W z#HxNJ;ZYHOhKB(;V7mk(S;Tyxk7W^g&w;uRsO>9uE0hX$a%~Z0@s?@s11U?Gl-mJ< z(R2|c1<~E|62k%1DAWEaSx;5X0l9GDI% z@rDxAHmlR17R#e)6L-Pb9F7vs&($GPdAQRsuHYDj1f&vy)!aF^w9?##%3K$4EU^-l z(I#(*Uqq^1*aa7usK^rYG5OrUUYUUVgep0}X4w)|DI+KQXwW!M*8@G*pY9S%MxqXn zhmYvOC~%Ww%JmX;cRt?KhP(Zo4vSl!FZvQ4h0%wI>@xB)-6ioq-dKUqE%2Jh5I+yS zw4{>iqw_vE_wKw_{jd{0vEaJ^Hu}t;Y>#+aZ|xJcCt+(DPQy+wTVuPf)ejVm%rpAx~eKtX`bfFX>L4{BroAEGcGK&Tb#;O#%C2>gU%$w2dIFaMKNw5@e zpBu`c-72FKWA`03&%P8`C!AL+%K zzwc<-31m1a8ru83W3?4V8G4jIOe=HSdd#B0-MJM{42GU*5oScNTz38sPQw*n02`>2 z|18+=ofS=C?9&y4VCHKLUD<*HABwggp!5~WuyA$)nSArS*~4`v&Gr>B$I}IY`dCgu zwY1%lJUJFN{Hw8FZ6@f&$TblxVLld#uizKcU$2ubd~yVAa!wY?#xH>|uR!hxWR}Q) zTWJ<#+i|^o{n%`DT3`1znUWUszCfP&zKxi*BJtOd!kZSk4I?usa+(7&(tB7Z2&WeN znM;)@R#}uA8s-Mvz^xW+_Rv>{L-LVT45%tz*TWXf>*+Xq1H09l{R_n}oF)8TS?+nXhagYd&IBW-+F#nE4haf;IC$wCCVx za-fmW$^aKAEvivAR0G+X^n8W&NFx_6g_7@58IT->o%W36-%A(MHh++7QNa=h1`4ZF z2uv3u)Y7+4GKdby%x!&W;9VCrxRN~UkppYTe1m)5X9Mxk+yhp$;-QP3srLNy;8Cr&h2tv05xUY6}?hFmH=})vnA{L0(F8kTw|U z^qErGit;Wqb(B}sFH;!N{^W()sFf2@fX%y)msS{hx$fithLcZ@gn5Fsv{@MBklM;= zLBB^Ba~-liM_m|+?dhsjJVaao`-VO`U0xWWSf#ZavA+I%b_tn_;cys7mm{bxm1EDW zj8DY{V~`jO8(cbgvjq)vbjFzEXOb9R!kfPCyeP*={Q3(_j*=J$I7CT7cbH`6>bCk< zt)Li4BQR~n!*j8GuGfC=&9)c;LT(DHxpn%-jmLt&s=XL1SOAjFJ!oas!7)~#Cocg5Dzyk^mXHbzA!B z{`=+%0D1r({}vf6#fpI{!0PI%2QyDHm?jx|BG%vK4XoQs^cC{f;VK!#+6%vdE_LF3 zXn&_bAmMHAIW zwp|%G7#4_aTf3j}d;6T?3w#;xMlUAV6ND|jTsuBZpQY>quNdzva`d5&>tEc^yA;% zQQvCAAY)3p{2v<4E}odsbTo|^22Z16fkYa?V_X?-Ys{+~a<@YJkyILjfE9Ic$hqtO zb0Q-4=~xXN-dw54#drfTk0{qURNtGJda8zx|%!suMV0971 z?U))0>-=>xXOJX1rM1>$F`OD*gw0*cu?=wsA$mr7lByb%RMra1a0Z||9&NW6jNuwu z(jcI`+({Mtk#=oRmjfGl&Apo$e)>D~UB%w+y%Zak5OS`})WNDwam8+`W+EFSX$XB{ zAYN>Uo+uM(pd%X-K+Jz6EoaL?o#_$kvnCs_+g`w*#Gn`E0+M}SHZ2=|8aW;kk=PmK zs>1p*cSjp_-=LG2N?nxx(Q!&{UQru^;-noh$BtH!J`V1#7*`v>S=B7}uW)AUhO|M` zfNdLZGEc(CR0*WWy;TPhp1B*NEo){Fyv(r17FyepNxd8YF0NY5K7}HInJh_HZN3{i zyD5FhjywNE1EI@26{47IXE>0JyO z9Y1J0Rp%UvN6f)PX=^nwG`1^VfCwF|MfMcI?F=8sWFG{TU>F@oi>FS6*?s>FJFhhN zJ{uir27^|maR$x4*U534svsRWeBXa}@CeGH+I{*m5F;J9JYDo1#Q2LE`S{CG-&h@h z^^Pvxlcw0_)}Xm+yj&gka}egJm6Crr9m|LuhcZIYd7d%WEAIP1KVe zJ>$eNUIWr0Bby!F3ZPRMjA+eB=l$4ZpPd~Jk4jQvT?yAdnyiDt0mg^m_G84Wfj1O=;{`~oF z$Oaw*UgL}wW@&(Mf-LqPrV<{!pv>@H-aDYQ_3sPM2Nxa)Ru?|1gj>Cq6Ie9HKNuc! zS!!utEBe?9UIIFKMj9TSeW@Xl8B9O$2`7^qML!;s(*aHJ0!yfM6a%)8TOm z*@JbI7T2FKh+rPC#sHU^r@H@B0ap7~Rd*iDuNhyuYW&5O$V4qQW`Z6sQD;LMEb}&= zHsm%=eV86`hzExY!K*6Wx~(2Ni2S!$hw(Bf45J8cGSVJ^^2FGWgp7b~^Ga0Q zG1MNJ^(>>1I`nE|RFzK|;rAZAS|<&PFJna6IO0COt_L5xQGls6&@?3)4jHK52M`}H zUj~$OU=RxOxKybefc0on?JR6B~^9VyY_V? zu1g`}x@&{b1L5H>q$Kn{M^YgO0M1Vev42QVk6eZcMSdaWd&!`N69F+3S&61aV~HW+ zj+P{&-+w5eH7p+;{FNb?Cq-q0&}RUF{=7GhOR6D6Mk=+{K)yXiNKB$YMXVurhfpaU zVyo+FSSEirFR>vX^?95h;*cZ*i5|GCsk0%EK}P19Ld=DubmK19;k_YfA8DpllnGc7 zTULfpals)6j2V6do( zx0T_I?OOYjE)*gkUkPGuWWSl`iPDkTN*E$;D|QIkKJEQM%khxV9W^2q^F)WpjTyUc z?v?wt$~_{--t!kiZ`Z4##a+1~G-)EF`mswncc-0(y8;c2oPr{$srNmI2W@m+kF)-8X@bV((&$f?&UL6MR#3L|oKKCLQt}m^+cBr!h zk}jk$`3fU$mNoGsq=bqtYwbZaDGVc0spGECoe;gUF0%~N&=MozafN{D3*}b2y`_9% zA{Zm3(4OSc?FoaxubK~_;VvUsMO&pgV_vKY=}DaI6+$D1omd(aw2oZH>YGNmzfL1; zLjOvvhSLg1<_Vw@99APinhAFS;qPlQ+e4kvt6(Eq9}4%QV?dF{seQM4gLNZi^Dpn8 z0-8ov@-cD@-+v?Mdj=@CG&U+!B-eC`orojJ`y}6+ay%PMJt@X8e2gPz%5IigQ-Y4) z;{eY9v&aJwU=SH%5}Et(6!LYNx63e_WY1V|(YXSi`O34!pU+M<6L7f&QJnE#NiM%|2P zMVB?kFI*(Y=p|IjU!HQ(y;a&Rk6|QlyCj=2iDSbpg-MDRJZvPQlGQyNni_@rYIiKi zc9$g8uV!l=e-Sh0N_+zK)vhFLYO3dTnrg^W}2|$1}(I;ADI>#h3 zt{tyxv^tW*Vn-zQ!{sFOiH@EV;vOV4Tw%8v5ho=8FWX-AJ+n_Z@W{bYLbF3u; zgQXONNFjuVPT7(mt-~dK`yp9a>H1ZbK`5e`&dVjNU-2Mk)12VOlvnCU3-2Yx)jXQ% z?K*bcROqlix&0+dCM6x9+%oVyjtXBD#sVfaLd?XB?knl;3emcC4GbpBt;*6jl}95Q z&3=c_hZ!b%g63jzAMhCV<{}BgmQg15kKS91Sz!PNmTc5l0a7L&MfXO7?D1@#(;_ie zqHZQOb9=6pjX9jZLX7MJf zu6~V5PRW7Ojy_yR6!Rtp?$k*#(jb?=jO6roOa3OZq`vPitd7NnuDVSoSpX-qfc%cTTVb=i;9a@s5tQ4=*RY$OZ1PqF+G(p1V)dZcQhgyZ$Grc$wu~ z0w{a;4o@eCf=25#SxK^#%EK)e+gvAkT93WDJ5Ul2)h-#m@nR>$tK)~jOOaI^A}=hz~qwB78k`)gnK6| zW4G!larFVGww<*(0)r<8UP(aZqcTXsyx=wk5}hYU%Em0Wfs1;m+YQ05&Zj5So_QnI z?jIg9d%Mbhtg9#GC2N^}!8m^MZno6#p!ty-O+{FG;2nF9_*hnF)GGVz(CQ~BoyGJ^VMRO?K!Umrx(6sy zivjHujgQ9ngCosgObaO4q^yQW+?5b*wQA zkPeBYDjiyxbtEXN*Hv7_6K$LwX#gtlv@R&GKKq($FXD|714nZPi9jgZu?m-aZ~rsy=Ew7?QE7lKrchmy}8V9Eo&$u-W9gmIqc%Bjw%|ol(Q&2OEn$kc*Yi65(V!i z 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 W&wTBVKZ&o&-+=%E2q19%1pWuMlp03> From 96e57f12f589cfb114d97b9f4f216fee088654a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alan=20H=C3=B6ng?= Date: Fri, 7 Sep 2018 15:38:28 +0200 Subject: [PATCH 65/76] Sphinx doc (#47) --- README.md | 113 +--------- docs/Makefile | 155 +++++++++++++ docs/api/dask-sparseframe-api.rst | 24 ++ docs/api/reference.rst | 8 + docs/api/sparseframe-api.rst | 40 ++++ docs/api/sparsity.dask.rst | 42 ++++ docs/api/sparsity.rst | 27 +++ docs/conf.py | 266 ++++++++++++++++++++++ docs/images/.gitkeep | 0 docs/index.md | 41 ++++ docs/make.bat | 190 ++++++++++++++++ docs/requirements.txt | 3 + docs/sources/about.rst | 71 ++++++ docs/sources/user_guide.md | 231 +++++++++++++++++++ sparsity/dask/core.py | 1 + sparsity/io.py | 31 +++ sparsity/sparse_frame.py | 355 +++++++++++++++++++++++------- 17 files changed, 1413 insertions(+), 185 deletions(-) create mode 100644 docs/Makefile create mode 100644 docs/api/dask-sparseframe-api.rst create mode 100644 docs/api/reference.rst create mode 100644 docs/api/sparseframe-api.rst create mode 100644 docs/api/sparsity.dask.rst create mode 100644 docs/api/sparsity.rst create mode 100644 docs/conf.py create mode 100644 docs/images/.gitkeep create mode 100644 docs/index.md create mode 100644 docs/make.bat create mode 100644 docs/requirements.txt create mode 100644 docs/sources/about.rst create mode 100644 docs/sources/user_guide.md diff --git a/README.md b/README.md index 8aa470d..780b579 100644 --- a/README.md +++ b/README.md @@ -5,118 +5,13 @@ Sparse data processing toolbox. It builds on top of pandas and scipy to provide DataFrame like API to work with sparse categorical data. -It also provides a extremly fast C level -interface to read from traildb databases. This make it a highly performant package to use -for dataprocessing jobs especially such as log processing and/or clickstream ot click through data. - In combination with dask it provides support to execute complex operations on a concurrent/distributed level. -## Attention -**Not ready for production** - -# Motivation -Many tasks especially in data analytics and machine learning domain make use of sparse -data structures to support the input of high dimensional data. - -This project was started -to build an efficient homogen sparse data processing pipeline. As of today dask has no -support for something as an sparse dataframe. We process big amounts of highdimensional data -on a daily basis at [datarevenue](http://datarevenue.com) and our favourite language -and ETL framework are python and dask. After chaining many function calls on scipy.sparse -csr matrices that involved handling of indices and column names to produce a sparse data -pipeline I decided to start this project. - -This package might be especially usefull to you if you have very big amounts of -sparse data such as clickstream data, categorical timeseries, log data or similarly sparse data. - -# Traildb access? -[Traildb](http://traildb.io/) is an amazing log style database. It was released recently -by AdRoll. It compresses event like data extremly efficient. Furthermore it provides a -fast C-level api to query it. - -Traildb has also python bindings but you still might need to iterate over many million -of users/trail or even both which has quite some overhead in python. -Therefore sparsity provides high speed access to the database in form of SparseFrame objects. -These are fast, efficient and intuitive enough to do further processing on. - -*ATM uuid and timestamp informations are lost but they will be provided as a pandas.MultiIndex -handled by the SparseFrame in a (very soon) future release.* - -```` -In [1]: from sparsity import SparseFrame - -In [2]: sdf = SparseFrame.read_traildb('pydata.tdb', field="title") - -In [3]: sdf.head() -Out[3]: - 0 1 2 3 4 ... 37388 37389 37390 37391 37392 -0 1.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 -1 1.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 -2 1.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 -3 1.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 -4 1.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 - -[5 rows x 37393 columns] +More information and examples can be found in the [documentation](https://github.io/datarevenue-berlin/sparsity) -In [6]: %%timeit - ...: sdf = SparseFrame.read_traildb("/Users/kayibal/Code/traildb_to_sparse/traildb_to_sparse/traildb_to_sparse/sparsity/test/pydata.tdb", field="title") - ...: -10 loops, best of 3: 73.8 ms per loop -In [4]: sdf.shape -Out[4]: (109626, 37393) -```` - -# But wait pandas has SparseDataFrames and SparseSeries -Pandas has it's own implementation of sparse datastructures. Unfortuantely this structures -performs quite badly with a groupby sum aggregation which we also often use. Furthermore - doing a groupby on a pandasSparseDataFrame returns a dense DataFrame. This makes chaining - many groupby operations over multiple files cumbersome and less efficient. Consider -following example: - -``` -In [1]: import sparsity - ...: import pandas as pd - ...: import numpy as np - ...: - -In [2]: data = np.random.random(size=(1000,10)) - ...: data[data < 0.95] = 0 - ...: uids = np.random.randint(0,100,1000) - ...: combined_data = np.hstack([uids.reshape(-1,1),data]) - ...: columns = ['id'] + list(map(str, range(10))) - ...: - ...: sdf = pd.SparseDataFrame(combined_data, columns = columns, default_fill_value=0) - ...: - -In [3]: %%timeit - ...: sdf.groupby('id').sum() - ...: -1 loop, best of 3: 462 ms per loop - -In [4]: res = sdf.groupby('id').sum() - ...: res.values.nbytes - ...: -Out[4]: 7920 - -In [5]: data = np.random.random(size=(1000,10)) - ...: data[data < 0.95] = 0 - ...: uids = np.random.randint(0,100,1000) - ...: sdf = sparsity.SparseFrame(data, columns=np.asarray(list(map(str, range(10)))), index=uids) - ...: - -In [6]: %%timeit - ...: sdf.groupby_sum() - ...: -The slowest run took 4.20 times longer than the fastest. This could mean that an intermediate result is being cached. -1000 loops, best of 3: 1.25 ms per loop - -In [7]: res = sdf.groupby_sum() - ...: res.__sizeof__() - ...: -Out[7]: 6128 +## Installation ``` - -I'm not quite sure if there is some cached result but I don't think so. This only uses a -smart csr matrix multiplication to do the operation. \ No newline at end of file +$ pip install sparsity +``` \ No newline at end of file diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..e2f3575 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,155 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +apidoc: + sphinx-apidoc -fME -o api ../sparsity +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/sparsity.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/sparsity.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/sparsity" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/sparsity" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/docs/api/dask-sparseframe-api.rst b/docs/api/dask-sparseframe-api.rst new file mode 100644 index 0000000..8149da2 --- /dev/null +++ b/docs/api/dask-sparseframe-api.rst @@ -0,0 +1,24 @@ +Dask SparseFrame API +=============== + +.. py:currentmodule:: sparsity.dask.core + +.. autosummary:: + SparseFrame + SparseFrame.assign + SparseFrame.compute + SparseFrame.columns + SparseFrame.get_partition + SparseFrame.index + SparseFrame.join + SparseFrame.known_divisions + SparseFrame.map_partitions + SparseFrame.npartitions + SparseFrame.persist + SparseFrame.repartition + SparseFrame.set_index + SparseFrame.rename + SparseFrame.set_index + SparseFrame.sort_index + SparseFrame.to_delayed + SparseFrame.to_npz diff --git a/docs/api/reference.rst b/docs/api/reference.rst new file mode 100644 index 0000000..6b74855 --- /dev/null +++ b/docs/api/reference.rst @@ -0,0 +1,8 @@ +Reference +========= + +.. toctree:: + :maxdepth: 4 + + sparsity + sparsity.dask \ No newline at end of file diff --git a/docs/api/sparseframe-api.rst b/docs/api/sparseframe-api.rst new file mode 100644 index 0000000..e3f4798 --- /dev/null +++ b/docs/api/sparseframe-api.rst @@ -0,0 +1,40 @@ +SparseFrame API +=============== + +.. py:currentmodule:: sparsity.sparse_frame + +.. autosummary:: + SparseFrame + SparseFrame.add + SparseFrame.assign + SparseFrame.axes + SparseFrame.columns + SparseFrame.concat + SparseFrame.copy + SparseFrame.drop + SparseFrame.dropna + SparseFrame.fillna + SparseFrame.groupby_agg + SparseFrame.groupby_sum + SparseFrame.head + SparseFrame.index + SparseFrame.join + SparseFrame.max + SparseFrame.mean + SparseFrame.min + SparseFrame.multiply + SparseFrame.nnz + SparseFrame.read_npz + SparseFrame.reindex + SparseFrame.reindex_axis + SparseFrame.rename + SparseFrame.set_index + SparseFrame.sort_index + SparseFrame.sum + SparseFrame.take + SparseFrame.to_npz + SparseFrame.toarray + SparseFrame.todense + SparseFrame.values + SparseFrame.vstack + diff --git a/docs/api/sparsity.dask.rst b/docs/api/sparsity.dask.rst new file mode 100644 index 0000000..9256195 --- /dev/null +++ b/docs/api/sparsity.dask.rst @@ -0,0 +1,42 @@ +sparsity.dask sub-package +========================= + +.. automodule:: sparsity.dask + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. automodule:: sparsity.dask.core + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: sparsity.dask.indexing + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: sparsity.dask.io + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: sparsity.dask.multi + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: sparsity.dask.reshape + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: sparsity.dask.shuffle + :members: + :undoc-members: + :show-inheritance: + + diff --git a/docs/api/sparsity.rst b/docs/api/sparsity.rst new file mode 100644 index 0000000..2636127 --- /dev/null +++ b/docs/api/sparsity.rst @@ -0,0 +1,27 @@ +sparsity package +================ + +.. automodule:: sparsity + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. automodule:: sparsity.indexing + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: sparsity.io + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: sparsity.sparse_frame + :members: + :undoc-members: + :show-inheritance: + + diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..27b9c8f --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,266 @@ +# -*- coding: utf-8 -*- +# +# Sparsity documentation build configuration file, created by +# sphinx-quickstart. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import os +import sys + +from recommonmark.transform import AutoStructify + +import sparsity +import sphinx_rtd_theme + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# needs_sphinx = '1.0' + +github_doc_root = "http://sparsity.github.com/" + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.napoleon', 'sphinx.ext.autosummary'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# Enable markdown files +source_parsers = { + '.md': 'recommonmark.parser.CommonMarkParser', +} + + +# The suffix of source filenames. +source_suffix = ['.rst', '.md'] + +# The encoding of source files. +# source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Sparsity' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = sparsity.__version__.split('-')[0] +# The full version, including alpha/beta/rc tags. +release = sparsity.__version__ + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +# today = '' +# Else, today_fmt is used as the format for a strftime call. +# today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +# default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +# add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +# add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +# show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +# modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'sphinx_rtd_theme' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +html_theme_options = { + "collapse_navigation": False +} +# Add any paths that contain custom themes here, relative to this directory. +html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +# html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +# html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +# html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +# html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +# html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +# html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +# html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +# html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +# html_additional_pages = {} + +# If false, no module index is generated. +# html_domain_indices = True + +# If false, no index is generated. +# html_use_index = True + +# If true, the index is split into individual pages for each letter. +# html_split_index = False + +# If true, links to the reST sources are added to the pages. +# html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +# html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +# html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +# html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +# html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Sparsitydoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # 'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', + 'Sparsity.tex', + u'Sparsity Documentation', + u"Datarevenue", 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +# latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +# latex_use_parts = False + +# If true, show page references after internal links. +# latex_show_pagerefs = False + +# If true, show URL addresses after external links. +# latex_show_urls = False + +# Documents to append as an appendix to all manuals. +# latex_appendices = [] + +# If false, no module index is generated. +# latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'Sparsity', u'Sparsity Documentation', + [u"Datarevenue"], 1) +] + +# If true, show URL addresses after external links. +# man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------------ + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'Sparsity', u'Sparsity Documentation', + u"Datarevenue", 'Sparsity', + 'Sparsity sparse data processing', 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +# texinfo_appendices = [] + +# If false, no module index is generated. +# texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +# texinfo_show_urls = 'footnote' +autosummary_generate = True +html_sidebars = { '**': ['globaltoc.html', 'relations.html', 'sourcelink.html', 'searchbox.html'] } +# At the bottom of conf.py +def setup(app): + app.add_config_value('recommonmark_config', { + 'url_resolver': lambda url: github_doc_root + url, + }, True) + app.add_transform(AutoStructify) diff --git a/docs/images/.gitkeep b/docs/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..8c5703d --- /dev/null +++ b/docs/index.md @@ -0,0 +1,41 @@ +# Sparsity - sparse data processing toolbox +[![CircleCI](https://circleci.com/gh/datarevenue-berlin/sparsity.svg?style=svg)](https://circleci.com/gh/datarevenue-berlin/sparsity) +[![Codecov](https://img.shields.io/codecov/c/github/datarevenue-berlin/sparsity.svg)](https://codecov.io/gh/datarevenue-berlin/sparsity) + +Sparsity builds on top of Pandas and Scipy to provide DataFrame-like API +to work with numerical homogeneous sparse data. + +Sparsity provides Pandas-like indexing capabilities and group transformations +on Scipy csr matrices. This has proven to be extremely efficient as +shown below. + +Furthermore we provide a distributed implementation of this data structure by +relying on the [Dask](https://dask.pydata.org) framework. This includes +distributed sorting, partitioning, grouping and much more. + +Although we try to mimic the Pandas DataFrame API, some operations +and parameters don't make sense on sparse or homogeneous data. Thus +some interfaces might be changed slightly in their semantics and/or inputs. + +## Install +Sparsity is available from PyPi: +``` +# Install using pip +$ pip install sparsity +``` + +## Contents +```eval_rst +.. toctree:: + :maxdepth: 2 + + sources/about + sources/user_guide + api/sparseframe-api + api/dask-sparseframe-api + api/reference +``` + +## Attention +Please enjoy with carefulness as it is a new project and might still contain +some bugs. diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..32c0a04 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,190 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\sparsity.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\sparsity.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +:end diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..f28f12f --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,3 @@ +sphinx +sphinx_rtd_theme +recommonmark \ No newline at end of file diff --git a/docs/sources/about.rst b/docs/sources/about.rst new file mode 100644 index 0000000..63bdfab --- /dev/null +++ b/docs/sources/about.rst @@ -0,0 +1,71 @@ +About Sparsity +============== + +Motivation +---------- +Many tasks, especially in data analytics and machine learning domain, make use +of sparse data structures to support the input of high dimensional data. + +This project was started to build an efficient homogeneous sparse data +processing pipeline. As of today Dask has no support for something as a sparse +dataframe. We process big amounts of high-dimensional data on a daily basis at +Datarevenue_ and our favourite language and ETL +framework are Python and Dask. After chaining many function calls on +scipy.sparse csr matrices that involved handling of indices and column names to +produce a sparse data pipeline, we decided to start this project. + +This package might be especially useful to you if you have very big amounts of +sparse data such as clickstream data, categorical timeseries, log data or +similarly sparse data. + +.. _Datarevenue: https://datarevenue.com + + +Comparison to Pandas SparseDataFrame +------------------------------------ +Pandas has its own implementation of sparse data structures. Unfortunately this +structures perform quite badly with a groupby-sum aggregation which we use +frequently. Furthermore doing a groupby on a Pandas SparseDataFrame returns a +dense DataFrame. This makes chaining many groupby operations over multiple +files cumbersome and less efficient. Consider following example:: + + In [1]: import sparsity + ...: import pandas as pd + ...: import numpy as np + ...: + + In [2]: data = np.random.random(size=(1000,10)) + ...: data[data < 0.95] = 0 + ...: uids = np.random.randint(0,100,1000) + ...: combined_data = np.hstack([uids.reshape(-1,1),data]) + ...: columns = ['id'] + list(map(str, range(10))) + ...: + ...: sdf = pd.SparseDataFrame(combined_data, columns = columns, default_fill_value=0) + ...: + + In [3]: %%timeit + ...: sdf.groupby('id').sum() + ...: + 1 loop, best of 3: 462 ms per loop + + In [4]: res = sdf.groupby('id').sum() + ...: res.values.nbytes + ...: + Out[4]: 7920 + + In [5]: data = np.random.random(size=(1000,10)) + ...: data[data < 0.95] = 0 + ...: uids = np.random.randint(0,100,1000) + ...: sdf = sparsity.SparseFrame(data, columns=np.asarray(list(map(str, range(10)))), index=uids) + ...: + + In [6]: %%timeit + ...: sdf.groupby_sum() + ...: + The slowest run took 4.20 times longer than the fastest. + 1000 loops, best of 3: 1.25 ms per loop + + In [7]: res = sdf.groupby_sum() + ...: res.__sizeof__() + ...: + Out[7]: 6128 diff --git a/docs/sources/user_guide.md b/docs/sources/user_guide.md new file mode 100644 index 0000000..c2302ab --- /dev/null +++ b/docs/sources/user_guide.md @@ -0,0 +1,231 @@ +# Sparsity User Guide + +## Creating a SparseFrame + +Create a SparseFrame from numpy array: +```pycon +>>> import sparsity +>>> import numpy as np + +>>> a = np.random.rand(10, 5) +>>> a[a < 0.9] = 0 +>>> sf = sparsity.SparseFrame(a, index=np.arange(10, 20), columns=list('ABCDE')) +>>> sf + A B C D E +10 0.0 0.000000 0.0 0.000000 0.000000 +11 0.0 0.962851 0.0 0.000000 0.000000 +12 0.0 0.858180 0.0 0.867824 0.930348 +13 0.0 0.000000 0.0 0.000000 0.968163 +14 0.0 0.000000 0.0 0.000000 0.985610 +[10x5 SparseFrame of type '' + with 10 stored elements in Compressed Sparse Row format] +``` + +You can also create a SparseFrame from Pandas DataFrame. Index and columns +will be preserved: +```pycon +>>> import pandas as pd + +>>> df = pd.DataFrame(a, index=np.arange(10, 20), columns=list('ABCDE')) +>>> sparsity.SparseFrame(df) + A B C D E +10 0.0 0.000000 0.0 0.000000 0.000000 +11 0.0 0.962851 0.0 0.000000 0.000000 +12 0.0 0.858180 0.0 0.867824 0.930348 +13 0.0 0.000000 0.0 0.000000 0.968163 +14 0.0 0.000000 0.0 0.000000 0.985610 +[10x5 SparseFrame of type '' + with 10 stored elements in Compressed Sparse Row format] +``` + +Initialization from Scipy CSR matrix is also possible. If you don't pass +index or columns, defaults will be used: +```pycon +>>> import scipy.sparse + +>>> csr = scipy.sparse.rand(10, 5, density=0.1, format='csr') +>>> sparsity.SparseFrame(csr) + 0 1 2 3 4 +0 0.638314 0.0 0.000000 0.0 0.0 +1 0.000000 0.0 0.000000 0.0 0.0 +2 0.000000 0.0 0.043411 0.0 0.0 +3 0.000000 0.0 0.000000 0.0 0.0 +4 0.000000 0.0 0.222951 0.0 0.0 +[10x5 SparseFrame of type '' + with 5 stored elements in Compressed Sparse Row format] +``` + +## Indexing + +Indexing a SparseFrame with column name gives a new SparseFrame: +```pycon +>>> sf['A'] + A +10 0.0 +11 0.0 +12 0.0 +13 0.0 +14 0.0 +[10x1 SparseFrame of type '' + with 0 stored elements in Compressed Sparse Row format] +``` + +Similarly for a list of column names: +```pycon +>>> sf[['A', 'B']] + A B +10 0.0 0.000000 +11 0.0 0.962851 +12 0.0 0.858180 +13 0.0 0.000000 +14 0.0 0.000000 +[10x2 SparseFrame of type '' + with 3 stored elements in Compressed Sparse Row format] +``` + +## Basic arithmetic operations + +Sum, mean, min and max methods are called on underlying Scipy CSR matrix +object. They can be computed over whole SparseFrame or along columns/rows: +```pycon +>>> sf.sum(axis=0) +matrix([[0. , 2.79813655, 0.84659119, 2.8522892 , 2.88412053]]) + +>>> sf.mean(axis=1) +matrix([[0. ], + [0.19257014], + [0.53127046], + [0.19363253], + [0.19712191], + [0. ], + [0.19913979], + [0.19542124], + [0. ], + [0.36707143]]) + +>>> sf.min() +0.0 + +>>> sf.max() +0.9956989680903189 +``` + +Add 2 SparseFrames: +```pycon +>>> sf.add(sf) + A B C D E +10 0.0 0.000000 0.0 0.000000 0.000000 +11 0.0 1.925701 0.0 0.000000 0.000000 +12 0.0 1.716359 0.0 1.735649 1.860697 +13 0.0 0.000000 0.0 0.000000 1.936325 +14 0.0 0.000000 0.0 0.000000 1.971219 +[10x5 SparseFrame of type '' + with 10 stored elements in Compressed Sparse Row format] +``` + +Multiply each row/column by a number: +```pycon +>>> sf.multiply(np.arange(10), axis='index') + A B C D E +10 0.0 0.000000 0.0 0.000000 0.000000 +11 0.0 0.962851 0.0 0.000000 0.000000 +12 0.0 1.716359 0.0 1.735649 1.860697 +13 0.0 0.000000 0.0 0.000000 2.904488 +14 0.0 0.000000 0.0 0.000000 3.942438 +[10x5 SparseFrame of type '' + with 10 stored elements in Compressed Sparse Row format] + +>>> sf.multiply(np.arange(5), axis='columns') + A B C D E +10 0.0 0.000000 0.0 0.000000 0.000000 +11 0.0 0.962851 0.0 0.000000 0.000000 +12 0.0 0.858180 0.0 2.603473 3.721393 +13 0.0 0.000000 0.0 0.000000 3.872651 +14 0.0 0.000000 0.0 0.000000 3.942438 +[10x5 SparseFrame of type '' + with 10 stored elements in Compressed Sparse Row format] +``` + +## Joining + +By default SparseFrames are joined on their indexes: +```pycon +>>> sf2 = sparsity.SparseFrame(np.random.rand(3, 2), index=[9, 10, 11], columns=['X', 'Y']) +>>> sf2 + X Y +9 0.182890 0.061269 +10 0.039956 0.595605 +11 0.407291 0.496680 +[3x2 SparseFrame of type '' + with 6 stored elements in Compressed Sparse Row format] + +>>> sf.join(sf2) + A B C D E X Y +9 0.0 0.000000 0.0 0.000000 0.000000 0.182890 0.061269 +10 0.0 0.000000 0.0 0.000000 0.000000 0.039956 0.595605 +11 0.0 0.962851 0.0 0.000000 0.000000 0.407291 0.496680 +12 0.0 0.858180 0.0 0.867824 0.930348 0.000000 0.000000 +13 0.0 0.000000 0.0 0.000000 0.968163 0.000000 0.000000 +[11x7 SparseFrame of type '' + with 16 stored elements in Compressed Sparse Row format] +``` + +You can also join on columns: +```pycon +>>> sf3 = sparsity.SparseFrame(np.random.rand(3, 2), index=[97, 98, 99], columns=['E', 'F']) +>>> sf3 + E F +97 0.738614 0.958507 +98 0.868556 0.230316 +99 0.322914 0.587337 +[3x2 SparseFrame of type '' + with 6 stored elements in Compressed Sparse Row format] + +>>> sf.join(sf3, axis=0).iloc[-5:] + A B C D E F +18 0.0 0.0 0.000000 0.000000 0.000000 0.000000 +19 0.0 0.0 0.846591 0.988766 0.000000 0.000000 +97 0.0 0.0 0.000000 0.000000 0.738614 0.958507 +98 0.0 0.0 0.000000 0.000000 0.868556 0.230316 +99 0.0 0.0 0.000000 0.000000 0.322914 0.587337 +[5x6 SparseFrame of type '' + with 8 stored elements in Compressed Sparse Row format] +``` + +## Groupby + +Groupby-sum operation is optimized for sparse case: +```pycon +>>> df = pd.DataFrame({'X': [1, 1, 1, 0], +... 'Y': [0, 1, 0, 1], +... 'gr': ['a', 'a', 'b', 'b'], +... 'day': [10, 11, 11, 12]}) +>>> df = df.set_index(['day', 'gr']) +>>> sf4 = sparsity.SparseFrame(df) +>>> sf4 + X Y +day gr +10 a 1.0 0.0 +11 a 1.0 1.0 + b 1.0 0.0 +12 b 0.0 1.0 +[4x2 SparseFrame of type '' + with 5 stored elements in Compressed Sparse Row format] + +>>> sf4.groupby_sum(level=1) + X Y +a 2.0 1.0 +b 1.0 1.0 +[2x2 SparseFrame of type '' + with 4 stored elements in Compressed Sparse Row format] +``` + +Operations other then sum can also be applied: +```pycon +>>> sf4.groupby_agg(level=1, agg_func=lambda x: x.mean(axis=0)) + X Y +a 1.0 0.5 +b 0.5 0.5 +[2x2 SparseFrame of type '' + with 4 stored elements in Compressed Sparse Row format] +``` diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index c42adc5..4f17eb0 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -110,6 +110,7 @@ def map_partitions(self, func, meta, *args, **kwargs): def to_delayed(self): return [Delayed(k, self.dask) for k in self.__dask_keys__()] + @derived_from(sp.SparseFrame) def assign(self, **kwargs): for k, v in kwargs.items(): if not (isinstance(v, (Series, Scalar, pd.Series)) or diff --git a/sparsity/io.py b/sparsity/io.py index 68c8f05..3f5f785 100644 --- a/sparsity/io.py +++ b/sparsity/io.py @@ -33,6 +33,24 @@ class LocalFileSystem: def to_npz(sf, filename, block_size=None, storage_options=None): + """Write to npz file format. + + Parameters + ---------- + sf: sp.SparseFrame + sparse frame to store. + filename: str + path to write to. + block_size: int + block size in bytes when sending data to external filesystem. + Default is 100MB. + storage_options: dict + (optional) storage options for external filesystems. + + Returns + ------- + sf: SparseFrame + """ filename = path2str(filename) data = _csr_to_dict(sf.data) data['metadata'] = \ @@ -75,6 +93,19 @@ def _save_remote(buffer, filename, block_size=None, storage_options=None): def read_npz(filename, storage_options=None): + """Read from a npz file. + + Parameters + ---------- + filename: str + path to file. + storage_options: dict + (optional) storage options for external filesystems. + + Returns + ------- + sf: sp.SparseFrame + """ loader = _open_npz_archive(filename, storage_options) try: csr_mat = _load_csr(loader) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 8ee6888..f73e90e 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -1,7 +1,6 @@ # coding=utf-8 import functools import traceback -import uuid import warnings from collections import OrderedDict from functools import partial, reduce @@ -18,8 +17,7 @@ from sparsity.io import to_npz, read_npz, _just_read_array from scipy import sparse -from sparsity.indexing import _CsrILocationIndexer, _CsrLocIndexer, \ - get_indexers_list +from sparsity.indexing import get_indexers_list def _is_empty(data): @@ -36,11 +34,30 @@ def _append_zero_row(csr): class SparseFrame(object): - """ - Simple sparse table based on scipy.sparse.csr_matrix + """ Two dimensional, size-mutable, homogenous tabular data structure with + labeled axes (rows and columns). It adds pandas indexing abilities to a + compressed row sparse frame based on scipy.sparse.csr_matrix. This makes + indexing along the first axis extremely efficient and cheap. Indexing along + the second axis should be avoided if possible though. + + For a distributed implementation see sparsity.dask.SparseFrame. """ def __init__(self, data, index=None, columns=None, **kwargs): + """Init SparseFrame + + Parameters + ---------- + data: sparse.csr_matrix | np.ndarray | pandas.DataFrame + Data to initialize matrix with. Can be one of above types, or + anything accepted by sparse.csr_matrix along with the correct + kwargs. + index: pd.Index or array-like + Index to use for resulting frame. Will default to RangeIndex if + input data has no indexing information and no index provided. + columns : pd.Index or array-like + Column labels to use for resulting frame. Defaults like in index. + """ if len(data.shape) > 2: raise ValueError("Only two dimensional data supported") @@ -48,7 +65,7 @@ def __init__(self, data, index=None, columns=None, **kwargs): data = data.to_frame() elif len(data.shape) == 1: - data = data.reshape(-1,1) + data = data.reshape(-1, 1) self.empty = False N, K = data.shape @@ -93,7 +110,6 @@ def __init__(self, data, index=None, columns=None, **kwargs): self.empty = True if _is_empty(data) else False self._init_csr(data) - # register indexers self.ndim = 2 @classmethod @@ -133,9 +149,23 @@ def _init_values(self, data, init_index=True, init_columns=True, **kwargs): self._init_csr(sparse_data) def toarray(self): + """Return dense np.array representation.""" return self.todense(pandas=False) def todense(self, pandas=True): + """Return dense representation. + + Parameters + ---------- + pandas: bool + If true returns a pandas DataFrame (default), + else a numpy array is returned. + + Returns + ------- + dense: pd.DataFrame | np.ndarray + dense representation + """ if not self.empty: dense = np.asarray(self.data.toarray()) else: @@ -157,7 +187,7 @@ def todense(self, pandas=True): dense = pd.DataFrame(dense.reshape(1, -1), index=self.index, columns=self.columns) else: - # need to copy as broadcast_to return read_only array + # need to copy, as broadcast_to returns read_only array idx = np.broadcast_to(self.index, dense.shape[0])\ .copy() dense = pd.DataFrame(dense, index=idx, @@ -180,18 +210,37 @@ def _get_axis(self, axis): return self._columns def sum(self, *args, **kwargs): + """Sum elements.""" return self.data.sum(*args, **kwargs) def mean(self, *args, **kwargs): + """Calculate mean(s).""" return self.data.mean(*args, **kwargs) def max(self, *args, **kwargs): + """Find maximum element(s).""" return self.data.max(*args, **kwargs) def min(self, *args, **kwargs): + """Find minimum element(s)""" return self.data.min(*args, **kwargs) def copy(self, *args, deep=True, **kwargs): + """Copy frame + + Parameters + ---------- + args: + are passed to indizes and values copy methods + deep: bool + if true (default) data will be copied as well. + kwargs: + are passed to indizes and values copy methods + + Returns + ------- + copy: SparseFrame + """ if deep: return SparseFrame(self.data.copy(*args, **kwargs), self.index.copy(*args, **kwargs), @@ -227,20 +276,36 @@ def multiply(self, other, axis='columns'): data = self.data.multiply(other) assert data.shape == self.data.shape, \ - "Data shapes miss-match: {}, {}".format(data.shape,self.data.shape) + "Data shapes mismatch: {}, {}".format(data.shape, self.data.shape) return SparseFrame(data, self.index, self.columns) def nnz(self): + """Get the count of explicitly stored values (nonzeros).""" return self.data.nnz def take(self, idx, axis=0, **kwargs): - """Return data at integer locations.""" + """Return data at integer locations. + + Parameters + ---------- + idx: array-like | int + array of integer locations + axis: + which axis to index + kwargs: + not used + + Returns + ------- + indexed: SparseFrame + reindexed sparse frame + """ if axis == 0: - return SparseFrame(self.data[idx,:], + return SparseFrame(self.data[idx, :], index=self.index[idx], columns=self.columns) elif axis == 1: - return SparseFrame(self.data[:,idx], + return SparseFrame(self.data[:, idx], index=self.index, columns=self.columns[idx]) @@ -271,44 +336,78 @@ def _xs(self, key, *args, axis=0, **kwargs): @property def index(self): + """ Return index labels + + Returns + ------- + index: pd.Index + """ return self._index @property def columns(self): + """ Return column labels + + Returns + ------- + index: pd.Index + """ return self._columns @property def data(self): + """ Return data matrix + + Returns + ------- + data: scipy.spar.csr_matrix + """ if self.empty: return self._data - return self._data[:-1,:] - - # backwards compatibility - def groupby(self, by=None, level=0): - return self.groupby_sum(by, level) + return self._data[:-1, :] def groupby_agg(self, by=None, level=None, agg_func=None): + """ Aggregate data using callable. + + The `by` and `level` arguments are mutually exclusive. + + Parameters + ---------- + by: array-like, string + grouping array or grouping column name + level: int + which level from index to use if multiindex + agg_func: callable + Function which will be applied to groups. Must accept + a SparseFrame and needs to return a vector of shape (1, n_cols). + + Returns + ------- + sf: SparseFrame + aggregated result + """ by, cols = self._get_groupby_col(by, level) groups = pd.Index(np.arange(self.shape[0])).groupby(by) res = sparse.csr_matrix((len(groups), self.shape[1])) new_idx = [] - for i, (name, indizes) in enumerate(groups.items()): + for i, (name, indices) in enumerate(groups.items()): new_idx.append(name) - res[i] = agg_func(self.data[indizes.values,:]) + res[i] = agg_func(self.data[indices.values, :]) res = SparseFrame(res, index=new_idx, columns=self.columns) return res[cols] def groupby_sum(self, by=None, level=0): - """ - Optimized sparse groupby sum aggregation. + """Optimized sparse groupby sum aggregation. Simple operation using sparse matrix multiplication. - Expects result to be sparse aswell. + Expects result to be sparse as well. + + The by and level arguments are mutually exclusive. Parameters ---------- - by: np.ndarray - (optional) alternative index. + by: np.ndarray (optional) + Alternative index. level: int Level of (multi-)index to group on. @@ -325,10 +424,9 @@ def groupby_sum(self, by=None, level=0): columns=self._columns) return res[cols] - def _get_groupby_col(self, by, level): if by is None and level is None: - raise ValueError("You have to supply one of 'by' and 'level'") + raise ValueError("You have to supply one of 'by' and 'level'.") other_cols = self._columns.tolist() if by is not None: try: @@ -350,7 +448,7 @@ def _get_groupby_col(self, by, level): def join(self, other, axis=1, how='outer', level=None): """ - Join two tables along their indices + Join two tables along their indices. Parameters ---------- @@ -361,20 +459,18 @@ def join(self, other, axis=1, how='outer', level=None): how: str one of 'inner', 'outer', 'left', 'right' level: int - if Multiindex join using this level - + if axis is MultiIndex, join using this level Returns ------- joined: sparsity.SparseFrame """ - - if isinstance(self._index, pd.MultiIndex)\ - or isinstance(other._index, pd.MultiIndex): + if isinstance(self._index, pd.MultiIndex) \ + or isinstance(other._index, pd.MultiIndex): raise NotImplementedError('MultiIndex not supported.') if not isinstance(other, SparseFrame): other = SparseFrame(other) - if axis not in set([0, 1]): - raise ValueError("axis mut be either 0 or 1") + if axis not in {0, 1}: + raise ValueError("Axis mut be either 0 or 1.") if axis == 0: if np.array_equal(other._columns.values, self._columns.values): # take short path if join axes are identical @@ -412,11 +508,15 @@ def join(self, other, axis=1, how='outer', level=None): self_data = self._data data, new_index = _matrix_join(self_data, other_data, - self.index, other.index, - how=how) + self.index, other.index, + how=how) res = SparseFrame(data, index=new_index, - columns=np.concatenate([self._columns, other._columns])) + columns=np.concatenate([self._columns, + other._columns])) + else: + raise ValueError('Axis must be either 0 or 1.') + return res def __len__(self): @@ -425,6 +525,18 @@ def __len__(self): def rename(self, columns, inplace=False): """ Rename columns by applying a callable to every column name. + + Parameters + ---------- + columns: callable + a callable that will accepts a column element and returns the + new column label. + inplace: bool + if true the operation will be executed inplace + + Returns + ------- + renamed: SparseFrame | None """ new_cols = self.columns.map(columns) if not inplace: @@ -436,11 +548,12 @@ def rename(self, columns, inplace=False): @property def values(self): + """CSR Matrix represenation of frame""" return self.data def sort_index(self): """ - Sort table along index + Sort table along index. Returns ------- @@ -452,9 +565,23 @@ def sort_index(self): return SparseFrame(data, index=index, columns=self.columns) def fillna(self, value): - """Replace NaN values in explicitly stored data with `value`.""" + """Replace NaN values in explicitly stored data with `value`. + + Parameters + ---------- + value: scalar + Value to use to fill holes. value must be of same dtype as + the underlying SparseFrame's data. If 0 is chosen + new matrix will have these values eliminated. + + Returns + ------- + filled: SparseFrame + """ _data = self._data.copy() _data.data[np.isnan(self._data.data)] = value + if value == 0: + _data.eliminate_zeros() return SparseFrame(data=_data[:-1, :], index=self.index, columns=self.columns) @@ -464,15 +591,19 @@ def add(self, other, how='outer', fill_value=0, **kwargs): Parameters ---------- - other: sparsity.SparseFrame - fill_value: float - fill value if other frame is not exactly the same shape - for sparse data the only sensible fill value is 0 passing - any other value will result in a ValueError + other: sparsity.SparseFrame + Another SparseFrame. + how: str + How to join frames along their indexes. Default is 'outer' which + makes the result contain labels from both frames. + fill_value: float + Fill value if other frame is not exactly the same shape. + For sparse data the only sensible fill value is 0. Passing + any other value will result in a ValueError. Returns ------- - added: sparsity.SparseFrame + added: sparsity.SparseFrame """ if fill_value != 0: raise ValueError("Only 0 is accepted as fill_value " @@ -528,20 +659,44 @@ def __array__(self): return self.toarray() def head(self, n=1): - """Display head of the sparsed frame.""" + """Return rows from the top of the table. + + Parameters + ---------- + n: int + how many rows to return, default is 1 + + Returns + ------- + head: SparseFrame + """ n = min(n, len(self._index)) - return pd.SparseDataFrame(self.data[:n,:].todense(), + return pd.SparseDataFrame(self.data[:n, :].todense(), index=self.index[:n], columns=self.columns) def _slice(self, sliceobj): - return SparseFrame(self.data[sliceobj,:], + return SparseFrame(self.data[sliceobj, :], index=self.index[sliceobj], columns=self.columns) @classmethod def concat(cls, tables, axis=0): - """Concat a collection of SparseFrames along given axis.""" + """Concat a collection of SparseFrames along given axis. + + Uses join internally so it might not be very efficient. + + Parameters + ---------- + tables: list + a list of SparseFrames. + axis: + which axis to concatenate along. + + Returns + ------- + + """ func = partial(SparseFrame.join, axis=axis) return reduce(func, tables) @@ -556,6 +711,18 @@ def _ixs(self, key, axis=0): columns=self.columns) def assign(self, **kwargs): + """Assign new columns. + + Parameters + ---------- + kwargs: dict + Mapping from column name to values. Values must be of correct shape + to be inserted successfully. + + Returns + ------- + assigned: SparseFrame + """ sf = self for key, value in kwargs.items(): sf = sf._single_assign(key, value) @@ -586,8 +753,21 @@ def _single_assign(self, key, value): new_cols, new_data = self._add_col(key, value) return SparseFrame(new_data, index=self.index, columns=new_cols) - def drop(self, labels, axis=0): - """Drop label(s) from given axis. Currently works only for columns. + def drop(self, labels, axis=1): + """Drop label(s) from given axis. + + Currently works only for columns. + + Parameters + ---------- + labels: array-like + labels to drop from the columns + axis: int + only columns are supported atm. + + Returns + ------- + df: SparseFrame """ if not isinstance(labels, (list, tuple, set)): labels = [labels] @@ -599,14 +779,24 @@ def drop(self, labels, axis=0): return sf def drop_duplicate_idx(self, **kwargs): - """Drop rows with duplicated index.""" + """Drop rows with duplicated index. + + Parameters + ---------- + kwargs: + kwds are passed to pd.Index.duplicated + + Returns + ------- + dropeed: SparseFrame + """ mask = ~self.index.duplicated(**kwargs) return SparseFrame(self.data[mask], index=self.index.values[mask], columns=self.columns) def __getitem__(self, item): if item is None: - raise ValueError('cannot label index with a null key') + raise ValueError('Cannot label index with a null key.') if not isinstance(item, (tuple, list)): item = [item] if len(item) > 0: @@ -616,7 +806,6 @@ def __getitem__(self, item): return SparseFrame(data, index=self.index, columns=self.columns[[]]) - def dropna(self): """Drop nans from index.""" mask = np.isnan(self.index.values) @@ -640,8 +829,8 @@ def set_index(self, column=None, idx=None, level=None, inplace=False): Returns ------- - sf: sp.SparseFrame \ None - the transformed sparse frame or None if inplace was True + sf: sp.SparseFrame | None + the transformed sparse frame or None if inplace was True """ if column is None and idx is None and level is None: raise ValueError("Either column, idx or level should not be None") @@ -676,7 +865,23 @@ def vstack(cls, frames): @classmethod def read_npz(cls, filename, storage_options=None): - """"Read from numpy npz format.""" + """Read from numpy npz format. + + Reads the sparse frame from a npz archive. + Supports reading npz archives from remote locations + with GCSFS and S3FS. + + Parameters + ---------- + filename: str + path or uri to location + storage_options: dict + further options for the underlying filesystem + + Returns + ------- + sf: SparseFrame + """ return cls(*read_npz(filename, storage_options)) @property @@ -729,12 +934,12 @@ def reindex(self, labels=None, index=None, columns=None, axis=None, avoid duplicating data axis: int Axis to target. Can be either (0, 1). - args - kwargs + args, kwargs + Will be passed to reindex_axis. Returns ------- - reindexed: SparseFrame + reindexed: SparseFrame """ if labels is not None and index is None and columns is None: @@ -756,7 +961,7 @@ def reindex_axis(self, labels, axis=0, method=None, level=None, copy=True, limit=None, fill_value=0): """Conform SparseFrame to new index. - Missing values will be filled with zeroes. + Missing values will be filled with zeros. Parameters ---------- @@ -777,7 +982,7 @@ def reindex_axis(self, labels, axis=0, method=None, Returns ------- - reindexed: SparseFrame + reindexed: SparseFrame """ if method is not None \ or not copy \ @@ -822,11 +1027,8 @@ def to_npz(self, filename, block_size=None, storage_options=None): block size in bytes only has effect if writing to remote storage if set to None defaults to 100MB storage_options: dict - additional parameters to pass to FileSystem class - only useful when writing to remote storages. - Returns - ------- - None + additional parameters to pass to FileSystem class; + only useful when writing to remote storages """ to_npz(self, filename, block_size, storage_options) @@ -840,19 +1042,19 @@ def _aligned_csr_elop(a, b, a_idx, b_idx, op='_plus_', how='outer'): # handle emtpy cases if _axis_is_empty(a): - return b[:-1,:], b_idx + return b[:-1, :], b_idx if _axis_is_empty(b): - return a[:-1,:], a_idx + return a[:-1, :], a_idx join_idx, lidx, ridx = a_idx.join(b_idx, return_indexers=True, how=how) if lidx is None: - a_new = a[:-1,:] + a_new = a[:-1, :] else: a_new = sparse.csr_matrix(a[lidx]) if ridx is None: - b_new = b[:-1,:] + b_new = b[:-1, :] else: b_new = sparse.csr_matrix(b[ridx]) @@ -866,11 +1068,11 @@ def _matrix_join(a, b, a_idx, b_idx, how='outer'): join_idx, lidx, ridx = a_idx.join(b_idx, return_indexers=True, how=how) if lidx is None: - a_new = a[:-1,:] + a_new = a[:-1, :] else: a_new = sparse.csr_matrix(a[lidx]) if ridx is None: - b_new = b[:-1,:] + b_new = b[:-1, :] else: b_new = sparse.csr_matrix(b[ridx]) @@ -956,8 +1158,8 @@ def _one_hot_series_csr(categories, dtype, oh_col, n_samples = codes.size mask = codes != -1 if np.any(~mask): - raise ValueError("unknown categorical features present %s " - "during transform." % np.unique(s[~mask])) + raise ValueError("Unknown categorical features present " + "during transform: %s." % np.unique(s[~mask])) row_indices = np.arange(n_samples, dtype=np.int32) col_indices = codes data = np.ones(row_indices.size) @@ -971,7 +1173,7 @@ def _check_categories_order(categories1, categories2, categorical_column_name, ignore_cat_order_mismatch): """Check if two lists of categories differ. If they have different elements, raise an exception. If they differ only by order of elements, - raise an issue unless ignore_cat_order_mismatch is set.""" + raise an exception unless ignore_cat_order_mismatch is set.""" if categories2 is None or list(categories2) == list(categories1): return @@ -991,5 +1193,6 @@ def _check_categories_order(categories1, categories2, categorical_column_name, ) ) + for _name, _indexer in get_indexers_list(): SparseFrame._create_indexer(_name, _indexer) From 3d10dc8dcab2565c88b97425b516bc806605755a Mon Sep 17 00:00:00 2001 From: michcio1234 Date: Fri, 7 Sep 2018 16:05:19 +0200 Subject: [PATCH 66/76] Require pandas not higher then 0.23.4 --- setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 6cfbcfa..e88b058 100644 --- a/setup.py +++ b/setup.py @@ -13,13 +13,13 @@ packages=packages, cmdclass=versioneer.get_cmdclass(), install_requires=[ - 'pandas>=0.19.0', + 'pandas>=0.19.0,<=0.23.4', 'scipy>=0.18.1', 'numpy>=1.12.0', - 's3fs>=0.1.0' + 's3fs>=0.1.0', ], test_requires=[ 'moto' ], zip_safe=False -) \ No newline at end of file +) From fe33ab0852ccd606134fad13eb7b158deb550f6e Mon Sep 17 00:00:00 2001 From: michcio1234 Date: Fri, 7 Sep 2018 16:51:40 +0200 Subject: [PATCH 67/76] Add BSD 3-clause license --- LICENSE | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..606eeb5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2018, Data Revenue +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file From 87ab3d510d3f842550aed33b49fa013d3f7709e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D?= Date: Fri, 7 Sep 2018 17:30:10 +0200 Subject: [PATCH 68/76] Pypi (#65) * More info in setup.py * Fix link in readme. --- README.md | 6 +++--- setup.py | 26 +++++++++++++++++++------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 780b579..a125ac8 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,13 @@ [![CircleCI](https://circleci.com/gh/datarevenue-berlin/sparsity.svg?style=svg)](https://circleci.com/gh/datarevenue-berlin/sparsity) [![Codecov](https://img.shields.io/codecov/c/github/datarevenue-berlin/sparsity.svg)](https://codecov.io/gh/datarevenue-berlin/sparsity) -Sparse data processing toolbox. It builds on top of pandas and scipy to provide DataFrame -like API to work with sparse categorical data. +Sparse data processing toolbox. It builds on top of pandas and scipy to provide +DataFrame-like API to work with sparse data. In combination with dask it provides support to execute complex operations on a concurrent/distributed level. -More information and examples can be found in the [documentation](https://github.io/datarevenue-berlin/sparsity) +More information and examples can be found in the [documentation](https://datarevenue-berlin.github.io/sparsity/). ## Installation diff --git a/setup.py b/setup.py index e88b058..8efe76e 100644 --- a/setup.py +++ b/setup.py @@ -5,21 +5,33 @@ packages = find_packages() packages.remove('sparsity.test') +with open("README.md", "r") as fh: + long_description = fh.read() + setup( name='sparsity', version=versioneer.get_version(), author='Alan Hoeng', author_email='alan.f.hoeng@gmail.com', + description="Sparse data processing toolbox", + long_description=long_description, + long_description_content_type="text/markdown", + url="https://github.com/datarevenue-berlin/sparsity", packages=packages, cmdclass=versioneer.get_cmdclass(), install_requires=[ - 'pandas>=0.19.0,<=0.23.4', - 'scipy>=0.18.1', - 'numpy>=1.12.0', - 's3fs>=0.1.0', - ], + 'pandas>=0.19.0,<=0.23.4', + 'scipy>=0.18.1', + 'numpy>=1.12.0', + 's3fs>=0.1.0', + ], test_requires=[ - 'moto' + 'moto', + ], + zip_safe=False, + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", ], - zip_safe=False ) From 09728239e82382ceb5c1cafa3acd4c1a1a6335f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alan=20H=C3=B6ng?= Date: Mon, 10 Sep 2018 10:54:19 +0200 Subject: [PATCH 69/76] Add Google Analytics ID (#66) * enable tracking on documentation page * Update documentation link. --- README.md | 2 +- docs/conf.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a125ac8..90176b3 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ DataFrame-like API to work with sparse data. In combination with dask it provides support to execute complex operations on a concurrent/distributed level. -More information and examples can be found in the [documentation](https://datarevenue-berlin.github.io/sparsity/). +More information and examples can be found in the [documentation](https://sparsity.readthedocs.io). ## Installation diff --git a/docs/conf.py b/docs/conf.py index 27b9c8f..1ee0de0 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -110,7 +110,8 @@ # further. For a list of options available for each theme, see the # documentation. html_theme_options = { - "collapse_navigation": False + "collapse_navigation": False, + "analytics_id": 'UA-74267417-1', } # Add any paths that contain custom themes here, relative to this directory. html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] From 43d1a442f541fb3e5a3404f918b779abea474dda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alan=20H=C3=B6ng?= Date: Wed, 10 Oct 2018 18:31:56 +0200 Subject: [PATCH 70/76] Compatiblity with dask version 0.19.3 (#70) --- sparsity/dask/__init__.py | 17 ---------- sparsity/dask/core.py | 41 ++++++++++++++++++------- sparsity/dask/io.py | 5 +-- sparsity/dask/reshape.py | 2 +- sparsity/test/test_dask_sparse_frame.py | 3 ++ 5 files changed, 37 insertions(+), 31 deletions(-) diff --git a/sparsity/dask/__init__.py b/sparsity/dask/__init__.py index 9689a24..62431cd 100644 --- a/sparsity/dask/__init__.py +++ b/sparsity/dask/__init__.py @@ -1,22 +1,5 @@ -import dask -from dask.dataframe.core import _get_return_type as \ - df_get_return_type - -import sparsity as sp from .core import SparseFrame from .io import from_pandas, read_npz, from_ddf from .reshape import one_hot_encode -def _get_return_type_sparsity(meta): - # We need this to make dask dataframes _LocIndexer to work - # on SparseFrames - if isinstance(meta, SparseFrame): - meta = meta._meta - - if isinstance(meta, sp.SparseFrame): - return SparseFrame - - return df_get_return_type(meta) - -dask.dataframe.core._get_return_type = _get_return_type_sparsity \ No newline at end of file diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index 4f17eb0..5ebc14e 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -12,9 +12,8 @@ _Frame, _maybe_from_pandas, apply, funcname, no_default, partial, partial_by_order, split_evenly, check_divisions, hash_shard, - split_out_on_index, Index) -from dask.dataframe.utils import _nonempty_index -from dask.dataframe.utils import make_meta as dd_make_meta + split_out_on_index, Index, get_parallel_type) +from dask.dataframe.utils import _nonempty_index, make_meta, meta_nonempty from dask.delayed import Delayed from dask.optimization import cull from dask.utils import derived_from @@ -25,36 +24,51 @@ from sparsity.dask.indexing import _LocIndexer -def _make_meta(inp): +@get_parallel_type.register(sp.SparseFrame) +def get_parallel_type_sparsity(_): + return SparseFrame + + +@make_meta.register(sp.SparseFrame) +def make_meta_sparsity(inp): if isinstance(inp, sp.SparseFrame) and inp.empty: return inp if isinstance(inp, sp.SparseFrame): return inp.iloc[:0] else: - meta = dd_make_meta(inp) - if isinstance(meta, pd.core.generic.NDFrame): - return sp.SparseFrame(meta) - return meta + raise NotImplementedError("Can't make meta for type: {}" + .format(str(type(inp)))) + -def _meta_nonempty(x): +@meta_nonempty.register(sp.SparseFrame) +def meta_nonempty_sparsity(x): idx = _nonempty_index(x.index) return sp.SparseFrame(sparse.csr_matrix((len(idx), len(x.columns))), index=idx, columns=x.columns) + def optimize(dsk, keys, **kwargs): dsk, _ = cull(dsk, keys) return dsk + def finalize(results): results = [r for r in results if not r.empty] return sp.SparseFrame.vstack(results) + class SparseFrame(dask.base.DaskMethodsMixin): def __init__(self, dsk, name, meta, divisions=None): + if isinstance(meta, SparseFrame): + # TODO: remove this case once we subclass from dask._Frame + meta = meta._meta + if not isinstance(meta, sp.SparseFrame): + meta = sp.SparseFrame(meta) + self.dask = dsk self._name = name - self._meta = _make_meta(meta) + self._meta = make_meta(meta) self.divisions = tuple(divisions) self.ndim = 2 @@ -83,7 +97,7 @@ def npartitions(self): @property def _meta_nonempty(self): - return _meta_nonempty(self._meta) + return meta_nonempty_sparsity(self._meta) @property def columns(self): @@ -792,4 +806,9 @@ def apply_concat_apply(args, chunk=None, aggregate=None, combine=None, return SparseFrame(dsk, b, meta, divisions) +@get_parallel_type.register(SparseFrame) +def get_parallel_type_distributed(o): + return get_parallel_type(o._meta) + + normalize_token.register((SparseFrame,), lambda a: a._name) diff --git a/sparsity/dask/io.py b/sparsity/dask/io.py index b5e673e..417aad7 100644 --- a/sparsity/dask/io.py +++ b/sparsity/dask/io.py @@ -6,9 +6,10 @@ from dask import delayed, base from dask.base import tokenize from dask.dataframe.io.io import sorted_division_locations +from dask.dataframe.utils import make_meta import sparsity as sp -from sparsity.dask.core import SparseFrame, _make_meta +from sparsity.dask.core import SparseFrame from sparsity.io import _write_dict_npz, _open_npz_archive _sorted = sorted @@ -69,7 +70,7 @@ def from_pandas(df, npartitions=None, chunksize=None, name=None): dsk = dict(((name, i), sp.SparseFrame(df.iloc[start: stop])) for i, (start, stop) in enumerate(zip(locations[:-1], locations[1:]))) - meta = _make_meta(df) + meta = make_meta(df) return SparseFrame(dsk, name, meta, divisions) diff --git a/sparsity/dask/reshape.py b/sparsity/dask/reshape.py index 3bc0d68..879d431 100644 --- a/sparsity/dask/reshape.py +++ b/sparsity/dask/reshape.py @@ -88,7 +88,7 @@ def one_hot_encode(ddf, column=None, categories=None, index_col=None, prefixes=prefixes, ignore_cat_order_mismatch=ignore_cat_order_mismatch ).columns - meta = sp.SparseFrame(np.array([]), columns=columns, + meta = sp.SparseFrame(np.empty(shape=(0, len(columns))), columns=columns, index=idx_meta) dsf = ddf.map_partitions(sparse_one_hot, diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index 5ddd6b0..03179dd 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -53,6 +53,9 @@ def test_map_partitions(): def test_loc(iindexer, correct_shape): df = pd.DataFrame(np.random.rand(10, 2), index=list('ABCDEFGHIJ')) + ddf = dd.from_pandas(df, npartitions=2) + ddf.loc[iindexer] + dsf = dsp.from_pandas(df, npartitions=2) fut = dsf.loc[iindexer] assert fut._meta.empty From 47514446bf75488bbad468dc3bb9815a884af4be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alan=20H=C3=B6ng?= Date: Tue, 4 Dec 2018 22:04:16 +0100 Subject: [PATCH 71/76] Refactor/binning (#69) * Implement distributed groupby sum and apply_concat_apply function for SparseFrame * add test for different index datatypes * implement sort_index * implement __len__ * implement rename, optimize groupby_sum and join implements distributed rename method and adds quicker routines to groupby_sum if divisions are known. Adds support for joining sp.SparseFrames onto a distributed SparseFrame. * implement distributed set_index * number of line ouput in __repr__ changed. * Create folders when writing to local filesystem * Fix empty dtype * Implement distributed drop. * Always add npz extension when writing SparseFrame to npz format * Fix metadata handling on set_index method * Add method for dask SparseFrame and tuple divisions type * Support empty divisions * Pass on divisions on sort_index * More restrictive pandas version as .drop method fails with pandas==0.20.3 * Fix bug where empty dataframe would create wrongly sized shuffle array * Fix bug where join with in memory sparse frame would return rows from meta_nonempty * Update dask version in setup.py * Update deprecated set_options call * Fix moto and boto versions * Update test dependencies --- .circleci/config.yml | 3 +- .gitignore | 1 + setup.py | 7 ++-- sparsity/dask/core.py | 37 ++++++++++++++++++--- sparsity/dask/io.py | 3 ++ sparsity/dask/multi.py | 2 +- sparsity/dask/shuffle.py | 2 +- sparsity/io.py | 3 +- sparsity/sparse_frame.py | 3 +- sparsity/test/conftest.py | 32 ++++++++++++++++-- sparsity/test/test_dask_sparse_frame.py | 20 ++++++++++-- sparsity/test/test_sparse_frame.py | 43 +++++++------------------ 12 files changed, 109 insertions(+), 47 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7e1f000..da55074 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,6 +6,7 @@ jobs: - image: drtools/dask:latest steps: - checkout - - run: pip install pytest pytest-cov moto . + - run: pip install boto3==1.7.84 botocore==1.10.84 moto==1.3.6 + - run: pip install pytest pytest-cov dask==1.0.0 . - run: py.test --cov sparsity --cov-report xml sparsity - run: bash <(curl -s https://codecov.io/bash) diff --git a/.gitignore b/.gitignore index da4c630..0084f4b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ build/ traildb_sparse.c __pycache__ *.egg-info +*.npz \ No newline at end of file diff --git a/setup.py b/setup.py index 8efe76e..5b345bb 100644 --- a/setup.py +++ b/setup.py @@ -20,13 +20,16 @@ packages=packages, cmdclass=versioneer.get_cmdclass(), install_requires=[ - 'pandas>=0.19.0,<=0.23.4', + 'pandas>=0.21.0,<=0.23.4', 'scipy>=0.18.1', 'numpy>=1.12.0', 's3fs>=0.1.0', + 'dask>0.20.0' ], test_requires=[ - 'moto', + 'boto3==1.7.84', + 'botocore==1.10.84', + 'moto==1.3.6' ], zip_safe=False, classifiers=[ diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index 5ebc14e..5f38d32 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -39,7 +39,6 @@ def make_meta_sparsity(inp): raise NotImplementedError("Can't make meta for type: {}" .format(str(type(inp)))) - @meta_nonempty.register(sp.SparseFrame) def meta_nonempty_sparsity(x): idx = _nonempty_index(x.index) @@ -53,6 +52,8 @@ def optimize(dsk, keys, **kwargs): def finalize(results): + if all(map(lambda x: x.empty, results)): + return results[0] results = [r for r in results if not r.empty] return sp.SparseFrame.vstack(results) @@ -137,6 +138,10 @@ def assign(self, **kwargs): df2 = self._meta.assign(**_extract_meta(kwargs)) return elemwise(methods.assign, self, *pairs, meta=df2) + @derived_from(sp.SparseFrame) + def add(self, other, how='outer', fill_value=0,): + return elemwise(sp.SparseFrame.add, self, other, meta=self._meta) + def __dask_keys__(self): return [(self._name, i) for i in range(self.npartitions)] @@ -186,10 +191,12 @@ def join(self, other, on=None, how='left', lsuffix='', rsuffix='', npartitions=None): from .multi import join_indexed_sparseframes - if isinstance(other, sp.SparseFrame) and how in ['left', 'inner']: + if isinstance(other, sp.SparseFrame): meta = sp.SparseFrame.join(self._meta_nonempty, other, how=how) + # make empty meta + meta = meta.loc[[False] * meta.shape[0], :] join_func = partial(sp.SparseFrame.join, other=other, how=how) return self.map_partitions(join_func, meta=meta, name='simplejoin') @@ -260,7 +267,7 @@ def sort_index(self, npartitions=None, divisions=None, **kwargs): """ from .shuffle import sort_index return sort_index(self, npartitions=npartitions, - divisions=None, **kwargs) + divisions=divisions, **kwargs) @derived_from(sp.SparseFrame) def set_index(self, column=None, idx=None, level=None): @@ -269,12 +276,31 @@ def set_index(self, column=None, idx=None, level=None): if idx is not None: raise NotImplementedError('Only column or level supported') new_name = self._meta.index.names[level] if level else column - meta = self._meta.set_index(pd.Index([], name=new_name)) + + if level is not None: + new_idx = self._meta.index.get_level_values(level) + else: + new_idx = pd.Index(np.empty((0,0), dtype=self._meta.values.dtype)) + new_idx.name = new_name + + meta = self._meta.set_index(idx=new_idx) res = self.map_partitions(sp.SparseFrame.set_index, meta=meta, column=column, idx=idx, level=level) - res.divisions = [None] * ( self.npartitions + 1) + res.divisions = tuple([None] * ( self.npartitions + 1)) return res + def rename(self, columns): + _meta = self._meta.rename(columns=columns) + return self.map_partitions(sp.SparseFrame.rename, meta=_meta, + columns=columns) + + def drop(self, labels, axis=1): + if axis != 1: + raise NotImplementedError('Axis != 1 is currently not supported.') + _meta = self._meta.drop(labels=labels) + return self.map_partitions(sp.SparseFrame.drop, meta=_meta, + labels=labels) + def __repr__(self): return \ """ @@ -623,6 +649,7 @@ def apply_and_enforce(func, arg, kwargs, meta): columns = meta.columns if isinstance(sf, sp.SparseFrame): if len(sf.data.data) == 0: + assert meta.empty, "Received non empty meta" return meta if (len(columns) == len(sf.columns) and type(columns) is type(sf.columns) and diff --git a/sparsity/dask/io.py b/sparsity/dask/io.py index 417aad7..0c69c36 100644 --- a/sparsity/dask/io.py +++ b/sparsity/dask/io.py @@ -164,6 +164,9 @@ def to_npz(sf: SparseFrame, path: str, block_size=None, if '*' not in path: raise ValueError('Path needs to contain "*" wildcard.') + if '.npz' not in path: + path += '.npz' + tmpl_func = path.replace('*', '{0:06d}').format metadata_fn = path.split('*')[0] + 'metadata.npz' paths = list(map(tmpl_func, range(sf.npartitions))) diff --git a/sparsity/dask/multi.py b/sparsity/dask/multi.py index 81ff1ef..1d267cc 100644 --- a/sparsity/dask/multi.py +++ b/sparsity/dask/multi.py @@ -108,4 +108,4 @@ def _maybe_align_partitions(args): dfs2 = iter(align_partitions(*dfs)[0]) return [a if not isinstance(a, (_Frame, SparseFrame)) else next(dfs2) for a in args] - return args \ No newline at end of file + return args diff --git a/sparsity/dask/shuffle.py b/sparsity/dask/shuffle.py index 2dea823..e42abc2 100644 --- a/sparsity/dask/shuffle.py +++ b/sparsity/dask/shuffle.py @@ -211,7 +211,7 @@ def rearrange_by_index_tasks(df, max_branch=32, npartitions=None): def shuffle_index(sf: sp.SparseFrame, stage, k, npartitions): ind = sf['_partitions'].todense().astype(np.int) - c = ind._values + c = ind._values.reshape(-1) typ = np.min_scalar_type(npartitions * 2) c = c.astype(typ) diff --git a/sparsity/io.py b/sparsity/io.py index 3f5f785..4dbcc6f 100644 --- a/sparsity/io.py +++ b/sparsity/io.py @@ -1,5 +1,5 @@ from io import BytesIO -from pathlib import PurePath +from pathlib import PurePath, Path from urllib.parse import urlparse import numpy as np @@ -67,6 +67,7 @@ def _write_dict_npz(data, filename, block_size, storage_options): filename = path2str(filename) protocol = urlparse(filename).scheme or 'file' if protocol == 'file': + Path(filename).parent.mkdir(parents=True, exist_ok=True) with open(filename, 'wb') as fp: np.savez(fp, **data) else: diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index f73e90e..9574e5b 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -176,7 +176,8 @@ def todense(self, pandas=True): if pandas: if self.empty: - dense = pd.DataFrame([], columns=self.columns, + dense = pd.DataFrame(np.empty(shape=self.shape), + columns=self.columns, index=self._index[:0]) elif len(dense.shape) == 1 and \ self.data.shape[1] == 1: diff --git a/sparsity/test/conftest.py b/sparsity/test/conftest.py index b014bdc..24970f0 100644 --- a/sparsity/test/conftest.py +++ b/sparsity/test/conftest.py @@ -37,8 +37,8 @@ def gendata(n, categorical=False): @pytest.fixture() def sample_frame_labels(): return SparseFrame(np.identity(5), - columns = list('ABCDE'), - index = list('VWXYZ')) + columns=list('ABCDE'), + index=list('VWXYZ')) @pytest.fixture() def weekdays(): @@ -96,6 +96,34 @@ def clickstream(): return df +@pytest.fixture() +def complex_example(): + first = np.identity(10) + second = np.zeros((4, 10)) + third = np.zeros((4, 10)) + second[[0, 1, 2, 3], [2, 3, 4, 5]] = 10 + third[[0, 1, 2, 3], [6, 7, 8, 9]] = 20 + + shuffle_idx = np.arange(10) + np.random.shuffle(shuffle_idx) + + first = SparseFrame(first[shuffle_idx], + index=np.arange(10)[shuffle_idx]) + + shuffle_idx = np.arange(4) + np.random.shuffle(shuffle_idx) + + second = SparseFrame(second[shuffle_idx], + index=np.arange(2, 6)[shuffle_idx]) + + shuffle_idx = np.arange(4) + np.random.shuffle(shuffle_idx) + + third = SparseFrame(third[shuffle_idx], + index=np.arange(6, 10)[shuffle_idx]) + return first, second, third + + @contextmanager def tmpdir(dir=None): dirname = tempfile.mkdtemp(dir=dir) diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index 03179dd..8a42c38 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -9,13 +9,12 @@ import pytest import sparsity as sp import sparsity.dask as dsp -from dask.local import get_sync from sparsity.dask.reshape import one_hot_encode import pandas.util.testing as pdt from .conftest import tmpdir -dask.context.set_options(get=dask.local.get_sync) +dask.config.set(scheduler=dask.local.get_sync) @pytest.fixture @@ -289,6 +288,23 @@ def test_distributed_join(how): pdt.assert_frame_equal(correct, res) + +def test_add(): + df = pd.DataFrame(np.identity(12)) + df2 = df.copy() + df2.index += 1 + + sf1 = sp.SparseFrame(df) + sf2 = sp.SparseFrame(df2) + correct = sf1.add(sf2).todense() + + dsf = dsp.from_pandas(df, npartitions=4) + dsf2 = dsp.from_pandas(df2, npartitions=4) + + res = dsf.add(dsf2).compute().todense() + pdt.assert_frame_equal(res, correct) + + @pytest.mark.parametrize('idx', [ np.random.choice([uuid4() for i in range(1000)], size=10000), np.random.randint(0, 10000, 10000), diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 972da85..3295c95 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -295,34 +295,6 @@ def test_existing_column_assign_number(): assert np.all(correct == sf.data.todense()) -@pytest.fixture() -def complex_example(): - first = np.identity(10) - second = np.zeros((4, 10)) - third = np.zeros((4, 10)) - second[[0, 1, 2, 3], [2, 3, 4, 5]] = 10 - third[[0, 1, 2, 3], [6, 7, 8, 9]] = 20 - - shuffle_idx = np.arange(10) - np.random.shuffle(shuffle_idx) - - first = SparseFrame(first[shuffle_idx], - index=np.arange(10)[shuffle_idx]) - - shuffle_idx = np.arange(4) - np.random.shuffle(shuffle_idx) - - second = SparseFrame(second[shuffle_idx], - index=np.arange(2, 6)[shuffle_idx]) - - shuffle_idx = np.arange(4) - np.random.shuffle(shuffle_idx) - - third = SparseFrame(third[shuffle_idx], - index=np.arange(6, 10)[shuffle_idx]) - return first, second, third - - def test_add_total_overlap(complex_example): first, second, third = complex_example correct = first.sort_index().data.todense() @@ -705,14 +677,17 @@ def test_repr(): assert isinstance(res, str) assert '10x10000' in res assert '0 stored' in res - assert len(res.splitlines()) == 1 + 5 + 2 sf = SparseFrame(sparse.csr_matrix((10000, 10000))) res = sf.__repr__() assert isinstance(res, str) - assert len(res.splitlines()) == 1 + 5 + 2 - sf = SparseFrame(np.array([]), index=[], columns=['A', 'B']) + sf = SparseFrame(np.empty(shape=(0, 2)), index=[], columns=['A', 'B']) + res = sf.__repr__() + assert isinstance(res, str) + + sf = SparseFrame(np.empty(shape=(0, 200)), index=[], + columns=np.arange(200)) res = sf.__repr__() assert isinstance(res, str) @@ -861,6 +836,12 @@ def test_drop_single_label(): np.testing.assert_array_equal(sf.data.todense(), correct) +def test_drop_non_existing_label(): + old_names = list('ABCDE') + sf = SparseFrame(np.identity(5), columns=old_names) + sf = sf.drop('Z', axis=1) + + def test_drop_multiple_labels(): old_names = list('ABCDE') sf = SparseFrame(np.identity(5), columns=old_names) From b27df42bf2893d688dfb29a38cafc312c6f61667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D?= Date: Sat, 19 Jan 2019 14:56:09 +0100 Subject: [PATCH 72/76] Support getitem with Index (#75) Fix behaviour when passing Index to __getitem__ Fixes #74 --- sparsity/sparse_frame.py | 7 +++++-- sparsity/test/test_sparse_frame.py | 9 +++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 9574e5b..6f015c6 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -789,7 +789,7 @@ def drop_duplicate_idx(self, **kwargs): Returns ------- - dropeed: SparseFrame + dropped: SparseFrame """ mask = ~self.index.duplicated(**kwargs) return SparseFrame(self.data[mask], index=self.index.values[mask], @@ -798,7 +798,10 @@ def drop_duplicate_idx(self, **kwargs): def __getitem__(self, item): if item is None: raise ValueError('Cannot label index with a null key.') - if not isinstance(item, (tuple, list)): + if not isinstance(item, (pd.Series, np.ndarray, pd.Index, list, + tuple)): + # TODO: tuple probably should be a separate case as in Pandas + # where it is used with Multiindex item = [item] if len(item) > 0: return self.reindex_axis(item, axis=1) diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 3295c95..44b21f0 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -6,6 +6,7 @@ import numpy as np import pandas as pd +import pandas.testing as pdt import pytest from moto import mock_s3 from scipy import sparse @@ -575,6 +576,7 @@ def test_npz_io_s3(complex_example): def test_getitem(): id_ = np.identity(10) sf = SparseFrame(id_, columns=list('abcdefghij')) + assert sf['a'].data.todense()[0] == 1 assert sf['j'].data.todense()[9] == 1 assert np.all(sf[['a', 'b']].data.todense() == np.asmatrix(id_[:, [0, 1]])) @@ -588,6 +590,13 @@ def test_getitem(): with pytest.raises(ValueError): sf[None] + idx = pd.Index(list('abc')) + pdt.assert_index_equal(idx, sf[idx].columns) + pdt.assert_index_equal(idx, sf[idx.to_series()].columns) + pdt.assert_index_equal(idx, sf[idx.tolist()].columns) + pdt.assert_index_equal(idx, sf[tuple(idx)].columns) + pdt.assert_index_equal(idx, sf[idx.values].columns) + def test_vstack(): frames = [] From 9ff2d91d30520439681ee0d434d80463aeaf6187 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alan=20H=C3=B6ng?= Date: Tue, 4 Jun 2019 12:46:18 +0200 Subject: [PATCH 73/76] Add support for dask persist This adds support for dask persist method. --- sparsity/dask/core.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index 5f38d32..e5e5f4f 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -89,6 +89,14 @@ def __dask_optimize__(dsk, keys, **kwargs): dsk2 = optimize(dsk, keys) return dsk2 + + def __dask_postpersist__(self): + def rebuild(dsk, *extra_args): + return SparseFrame(dsk, name=self._name, + meta=self._meta, + divisions=self.divisions) + return rebuild, () + def __dask_postcompute__(self): return finalize, () @@ -209,7 +217,7 @@ def join(self, other, on=None, how='left', lsuffix='', def to_npz(self, filename, blocksize=None, storage_options=None, compute=True): from sparsity.dask.io import to_npz - to_npz(self, filename, blocksize, storage_options, compute) + return to_npz(self, filename, blocksize, storage_options, compute) def groupby_sum(self, split_out=1, split_every=8): meta = self._meta From 16b3a208606e4a59ae65ae9acdb304709d270a11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alan=20H=C3=B6ng?= Date: Tue, 4 Jun 2019 14:24:58 +0200 Subject: [PATCH 74/76] Test persist functionality --- sparsity/test/test_dask_sparse_frame.py | 11 +++++++++++ sparsity/test/test_sparse_frame.py | 1 + 2 files changed, 12 insertions(+) diff --git a/sparsity/test/test_dask_sparse_frame.py b/sparsity/test/test_dask_sparse_frame.py index 8a42c38..ddf1944 100644 --- a/sparsity/test/test_dask_sparse_frame.py +++ b/sparsity/test/test_dask_sparse_frame.py @@ -1,5 +1,6 @@ import datetime as dt import os +from distributed import Client from uuid import uuid4 import dask @@ -460,3 +461,13 @@ def test_set_index(clickstream): res = dsf.set_index(level=1).compute().todense() pdt.assert_frame_equal(dense, res) + + +def test_persist(dsf): + correct = dsf.compute().todense() + client = Client() + persisted = client.persist(dsf) + + res = persisted.compute().todense() + + pdt.assert_frame_equal(res, correct) diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 44b21f0..04a02f7 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -58,6 +58,7 @@ def test_empty_init(): sf = SparseFrame(np.array([]), index=['A', 'B'], columns=[]) assert sf.data.shape == (2, 0) + def test_groupby(groupby_frame): t = groupby_frame res = t.groupby_sum().data.todense() From 3226610d96ea24e653066a70d6ad44ca402d041f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alan=20H=C3=B6ng?= Date: Tue, 4 Jun 2019 14:59:09 +0200 Subject: [PATCH 75/76] PRETTY rename import --- sparsity/dask/core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index e5e5f4f..3acc633 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -216,8 +216,8 @@ def join(self, other, on=None, how='left', lsuffix='', def to_npz(self, filename, blocksize=None, storage_options=None, compute=True): - from sparsity.dask.io import to_npz - return to_npz(self, filename, blocksize, storage_options, compute) + import sparsity.dask.io as dsp_io + return dsp_io.to_npz(self, filename, blocksize, storage_options, compute) def groupby_sum(self, split_out=1, split_every=8): meta = self._meta From 23f091bd5ae1e9b9c58e5597fcc49f4ee39d4f69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alan=20H=C3=B6ng?= Date: Tue, 4 Jun 2019 15:45:02 +0200 Subject: [PATCH 76/76] Rename io modules to io_ and fix some version conflicts (#78) * Rename io modules to io_ and fix some version conflicts Numpy 1.16.* is not compatible with sparsity 0.20.* thus we need to fix the setup.py. When using Scipy<1.0.0 empty column access does not work, thus the dependency had to be adjusted here as well. This also renames the io_ modules to avoid issues with pythons internal module. * Fix incompatibility with numpy>=1.16.0, potential security issue. Due to a security issue (CVE-2019-6446) numpy changed the default value of allow_pickle in np.load to True, this led to error when reading sparse frames from npz archives. This commit fixes it by allowing pickled objects, thus reading sparse frames from unkown sources is still a security risk. --- setup.py | 2 +- sparsity/dask/__init__.py | 2 +- sparsity/dask/core.py | 2 +- sparsity/dask/{io.py => io_.py} | 4 ++-- sparsity/{io.py => io_.py} | 2 +- sparsity/sparse_frame.py | 2 +- sparsity/test/test_sparse_frame.py | 8 +++++++- 7 files changed, 14 insertions(+), 8 deletions(-) rename sparsity/dask/{io.py => io_.py} (98%) rename sparsity/{io.py => io_.py} (99%) diff --git a/setup.py b/setup.py index 5b345bb..16bd79b 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ cmdclass=versioneer.get_cmdclass(), install_requires=[ 'pandas>=0.21.0,<=0.23.4', - 'scipy>=0.18.1', + 'scipy>0.19.1', 'numpy>=1.12.0', 's3fs>=0.1.0', 'dask>0.20.0' diff --git a/sparsity/dask/__init__.py b/sparsity/dask/__init__.py index 62431cd..c99aae6 100644 --- a/sparsity/dask/__init__.py +++ b/sparsity/dask/__init__.py @@ -1,5 +1,5 @@ from .core import SparseFrame -from .io import from_pandas, read_npz, from_ddf +from .io_ import from_pandas, read_npz, from_ddf from .reshape import one_hot_encode diff --git a/sparsity/dask/core.py b/sparsity/dask/core.py index 5f38d32..abc788f 100644 --- a/sparsity/dask/core.py +++ b/sparsity/dask/core.py @@ -208,7 +208,7 @@ def join(self, other, on=None, how='left', lsuffix='', def to_npz(self, filename, blocksize=None, storage_options=None, compute=True): - from sparsity.dask.io import to_npz + from sparsity.dask.io_ import to_npz to_npz(self, filename, blocksize, storage_options, compute) def groupby_sum(self, split_out=1, split_every=8): diff --git a/sparsity/dask/io.py b/sparsity/dask/io_.py similarity index 98% rename from sparsity/dask/io.py rename to sparsity/dask/io_.py index 0c69c36..b6c05ae 100644 --- a/sparsity/dask/io.py +++ b/sparsity/dask/io_.py @@ -10,7 +10,7 @@ import sparsity as sp from sparsity.dask.core import SparseFrame -from sparsity.io import _write_dict_npz, _open_npz_archive +from sparsity.io_ import _write_dict_npz, _open_npz_archive _sorted = sorted @@ -130,7 +130,7 @@ def _npz_read_divisions(paths, level=None): divisions = [] assert len(paths) > 1 for p in paths: - archive = np.load(p) + archive = np.load(p, allow_pickle=True) idx = archive['frame_index'] if level is not None: idx = idx.get_level_values(level) diff --git a/sparsity/io.py b/sparsity/io_.py similarity index 99% rename from sparsity/io.py rename to sparsity/io_.py index 4dbcc6f..1e900bd 100644 --- a/sparsity/io.py +++ b/sparsity/io_.py @@ -124,7 +124,7 @@ def _open_npz_archive(filename, storage_options=None): protocol = urlparse(filename).scheme or 'file' open_f = _filesystems[protocol](**storage_options).open fp = open_f(filename, 'rb') - loader = np.load(fp) + loader = np.load(fp, allow_pickle=True) return loader diff --git a/sparsity/sparse_frame.py b/sparsity/sparse_frame.py index 6f015c6..c3c588e 100644 --- a/sparsity/sparse_frame.py +++ b/sparsity/sparse_frame.py @@ -14,7 +14,7 @@ from pandas.indexes.base import _ensure_index except ImportError: from pandas.core.indexes.base import _ensure_index -from sparsity.io import to_npz, read_npz, _just_read_array +from sparsity.io_ import to_npz, read_npz, _just_read_array from scipy import sparse from sparsity.indexing import get_indexers_list diff --git a/sparsity/test/test_sparse_frame.py b/sparsity/test/test_sparse_frame.py index 44b21f0..ac377b3 100644 --- a/sparsity/test/test_sparse_frame.py +++ b/sparsity/test/test_sparse_frame.py @@ -11,7 +11,7 @@ from moto import mock_s3 from scipy import sparse from sparsity import SparseFrame, sparse_one_hot -from sparsity.io import _csr_to_dict +from sparsity.io_ import _csr_to_dict from .conftest import tmpdir @@ -58,6 +58,12 @@ def test_empty_init(): sf = SparseFrame(np.array([]), index=['A', 'B'], columns=[]) assert sf.data.shape == (2, 0) + +def test_empty_column_access(): + sf = SparseFrame(np.array([]), index=[], columns=['A', 'B', 'C', 'D']) + assert sf['D'].data.shape == (0, 1) + + def test_groupby(groupby_frame): t = groupby_frame res = t.groupby_sum().data.todense()

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‘MvA%)5RW>w=$lK=gVBd7YttL%rYgJcD&)%X97 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�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 z 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 {@w=V?~A<=Es2y-I@s$)v5rhvPo>1W5U~A76w;c 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 he%-06l*y}mi3HF$NGdtkib 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%0DL1krCa7gc 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