From 1ca7cbc311578128eff95fc6faad4b8d32a629c9 Mon Sep 17 00:00:00 2001 From: wpk Date: Wed, 3 May 2023 09:02:06 -0400 Subject: [PATCH] chore: update cmomy and module-utilities --- environment.yaml | 4 +- environment/dev.yaml | 4 +- environment/docs.yaml | 4 +- environment/lint.yaml | 4 +- environment/test.yaml | 4 +- .../usage/basic/Customized_Derivatives.ipynb | 132 ++++++++++-------- pyproject.toml | 4 +- src/thermoextrap/__init__.py | 2 + src/thermoextrap/core/_docstrings.py | 90 +----------- 9 files changed, 86 insertions(+), 162 deletions(-) diff --git a/environment.yaml b/environment.yaml index d40d3ae8..23bc2014 100644 --- a/environment.yaml +++ b/environment.yaml @@ -9,10 +9,10 @@ dependencies: - scipy - xarray # - openmm - - cmomy>=0.1.9 + - cmomy>=0.4 - custom-inherit - attrs - - module-utilities >= 0.1 + - module-utilities>=0.2 - pymbar<4.0 - pip - pip: diff --git a/environment/dev.yaml b/environment/dev.yaml index 09803e05..9361d5dc 100644 --- a/environment/dev.yaml +++ b/environment/dev.yaml @@ -3,12 +3,12 @@ channels: - wpk-nist dependencies: - attrs - - cmomy>=0.1.9 + - cmomy>=0.4 - custom-inherit - ipykernel - ipython - matplotlib - - module-utilities >= 0.1 + - module-utilities>=0.2 - nbconvert - numpy - pip diff --git a/environment/docs.yaml b/environment/docs.yaml index ee143f5a..a44d91b7 100644 --- a/environment/docs.yaml +++ b/environment/docs.yaml @@ -3,11 +3,11 @@ channels: - wpk-nist dependencies: - attrs - - cmomy>=0.1.9 + - cmomy>=0.4 - custom-inherit - ipython - matplotlib - - module-utilities >= 0.1 + - module-utilities>=0.2 - numpy - pip - pymbar<4.0 diff --git a/environment/lint.yaml b/environment/lint.yaml index e1b2af8f..db6a9352 100644 --- a/environment/lint.yaml +++ b/environment/lint.yaml @@ -3,9 +3,9 @@ channels: - wpk-nist dependencies: - attrs - - cmomy>=0.1.9 + - cmomy>=0.4 - custom-inherit - - module-utilities >= 0.1 + - module-utilities>=0.2 - mypy - numpy - pandas diff --git a/environment/test.yaml b/environment/test.yaml index f24ac51d..613dbbed 100644 --- a/environment/test.yaml +++ b/environment/test.yaml @@ -3,9 +3,9 @@ channels: - wpk-nist dependencies: - attrs - - cmomy>=0.1.9 + - cmomy>=0.4 - custom-inherit - - module-utilities >= 0.1 + - module-utilities>=0.2 - numpy - pandas - pip diff --git a/examples/usage/basic/Customized_Derivatives.ipynb b/examples/usage/basic/Customized_Derivatives.ipynb index 8ceed6f9..9ea74465 100644 --- a/examples/usage/basic/Customized_Derivatives.ipynb +++ b/examples/usage/basic/Customized_Derivatives.ipynb @@ -17,7 +17,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "id": "9b91eb5b", "metadata": { "execution": { @@ -59,7 +59,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "id": "507012cc", "metadata": { "execution": { @@ -76,7 +76,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "2eb7cb6f", "metadata": { "execution": { @@ -134,7 +134,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "2c27655b", "metadata": { "execution": { @@ -186,7 +186,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 10, "id": "d41c23ca", "metadata": { "execution": { @@ -199,13 +199,13 @@ "outputs": [], "source": [ "import attrs\n", + "from module_utilities import cached\n", "\n", - "from thermoextrap.core.cached_decorators import gcached\n", - "from thermoextrap.data import DataCallbackABC\n", + "import thermoextrap\n", "\n", "\n", "@attrs.define\n", - "class VolumeDataCallback(DataCallbackABC):\n", + "class VolumeDataCallback(xtrap.data.DataCallbackABC):\n", " \"\"\"object to handle callbacks of metadata\"\"\"\n", "\n", " volume: float = attrs.field(validator=attrs.validators.instance_of(float))\n", @@ -221,7 +221,7 @@ " def param_names(self):\n", " return [\"volume\", \"dxdqv\", \"ndim\"]\n", "\n", - " @gcached(prop=False)\n", + " @cached.meth\n", " def dxdq(self, rec_dim, skipna):\n", " return self.dxdqv.mean(rec_dim, skipna=skipna)\n", "\n", @@ -238,7 +238,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "id": "9fa6ec8c", "metadata": { "execution": { @@ -264,7 +264,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "id": "e8e634e3", "metadata": { "execution": { @@ -279,51 +279,51 @@ "data": { "text/plain": [ "DataValues(meta=VolumeDataCallback(volume=5.0, dxdqv=\n", - "array([[0.94609288, 0.95738352, 0.99743824, ..., 1.03739842, 0.95548386,\n", - " 0.97571255],\n", - " [0.91114992, 1.02685701, 0.98239856, ..., 0.93017812, 0.96486489,\n", - " 0.97271714],\n", - " [0.98342243, 0.88254829, 0.95595421, ..., 0.96067677, 0.91552305,\n", - " 0.99106797],\n", + "array([[0.95333026, 0.96419076, 0.98351443, ..., 0.95087517, 0.9441505 ,\n", + " 0.92668131],\n", + " [0.97171016, 0.97415006, 0.94858886, ..., 0.93485776, 0.97703615,\n", + " 0.93181798],\n", + " [0.96664047, 1.00475512, 1.02313804, ..., 0.97929816, 0.95464125,\n", + " 0.97639747],\n", " ...,\n", - " [1.00217994, 0.94249464, 0.97684759, ..., 0.93211171, 0.98501169,\n", - " 1.01106293],\n", - " [0.97962024, 0.98127858, 0.97312977, ..., 0.95930964, 0.96413763,\n", - " 1.00698284],\n", - " [0.96029639, 0.96077843, 0.97138311, ..., 0.98137368, 0.93167537,\n", - " 0.99702763]])\n", + " [0.97672261, 0.91177022, 0.97431233, ..., 0.99589869, 0.93421804,\n", + " 0.98525048],\n", + " [0.98758678, 0.97815204, 0.9709699 , ..., 0.95044282, 0.96719683,\n", + " 0.95511405],\n", + " [0.9509286 , 0.99984375, 0.97658612, ..., 1.01604089, 0.9479066 ,\n", + " 0.96895184]])\n", "Dimensions without coordinates: rep, rec, ndim=1), uv=\n", - "array([[ -946.09288181, -957.38351947, -997.43824228, ...,\n", - " -1037.39841509, -955.48386143, -975.71254542],\n", - " [ -911.14991591, -1026.85700742, -982.39855529, ...,\n", - " -930.17811835, -964.864893 , -972.71713859],\n", - " [ -983.42243117, -882.54829323, -955.95421258, ...,\n", - " -960.67676505, -915.52304688, -991.06796981],\n", + "array([[ -953.33026414, -964.19076008, -983.51443172, ...,\n", + " -950.8751695 , -944.15050137, -926.68130958],\n", + " [ -971.71015988, -974.15005582, -948.58885631, ...,\n", + " -934.8577595 , -977.03615128, -931.81797994],\n", + " [ -966.64047106, -1004.75512482, -1023.13803661, ...,\n", + " -979.29815632, -954.64124936, -976.39747313],\n", " ...,\n", - " [-1002.17993555, -942.49464019, -976.84759411, ...,\n", - " -932.11170975, -985.01168904, -1011.06292879],\n", - " [ -979.62023873, -981.278582 , -973.12977387, ...,\n", - " -959.30963637, -964.13762641, -1006.98284293],\n", - " [ -960.29638741, -960.77843153, -971.38311179, ...,\n", - " -981.37368406, -931.67537439, -997.02762783]])\n", + " [ -976.72260808, -911.77021688, -974.31233102, ...,\n", + " -995.89869197, -934.21803628, -985.25047696],\n", + " [ -987.58677576, -978.15203591, -970.96990297, ...,\n", + " -950.44282077, -967.1968307 , -955.11404688],\n", + " [ -950.92859775, -999.84375314, -976.58611752, ...,\n", + " -1016.0408885 , -947.90660198, -968.95183539]])\n", "Dimensions without coordinates: rep, rec, xv=\n", - "array([[0.94609288, 0.95738352, 0.99743824, ..., 1.03739842, 0.95548386,\n", - " 0.97571255],\n", - " [0.91114992, 1.02685701, 0.98239856, ..., 0.93017812, 0.96486489,\n", - " 0.97271714],\n", - " [0.98342243, 0.88254829, 0.95595421, ..., 0.96067677, 0.91552305,\n", - " 0.99106797],\n", + "array([[0.95333026, 0.96419076, 0.98351443, ..., 0.95087517, 0.9441505 ,\n", + " 0.92668131],\n", + " [0.97171016, 0.97415006, 0.94858886, ..., 0.93485776, 0.97703615,\n", + " 0.93181798],\n", + " [0.96664047, 1.00475512, 1.02313804, ..., 0.97929816, 0.95464125,\n", + " 0.97639747],\n", " ...,\n", - " [1.00217994, 0.94249464, 0.97684759, ..., 0.93211171, 0.98501169,\n", - " 1.01106293],\n", - " [0.97962024, 0.98127858, 0.97312977, ..., 0.95930964, 0.96413763,\n", - " 1.00698284],\n", - " [0.96029639, 0.96077843, 0.97138311, ..., 0.98137368, 0.93167537,\n", - " 0.99702763]])\n", + " [0.97672261, 0.91177022, 0.97431233, ..., 0.99589869, 0.93421804,\n", + " 0.98525048],\n", + " [0.98758678, 0.97815204, 0.9709699 , ..., 0.95044282, 0.96719683,\n", + " 0.95511405],\n", + " [0.9509286 , 0.99984375, 0.97658612, ..., 1.01604089, 0.9479066 ,\n", + " 0.96895184]])\n", "Dimensions without coordinates: rep, rec, order=1, rec_dim='rec', umom_dim='umom', deriv_dim=None, skipna=False, chunk=None, compute=False, build_aves_kws={}, x_is_u=False)" ] }, - "execution_count": 9, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -334,7 +334,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 13, "id": "0172e876", "metadata": { "execution": { @@ -350,15 +350,15 @@ "output_type": "stream", "text": [ "Model parameters (derivatives):\n", - "[0.96604833 0.02732698]\n", + "[0.96612245 0.02673026]\n", "\n", "\n", "Model predictions:\n", - "[0.84307694 0.85674043 0.87040392 0.8840674 ]\n", + "[0.84583627 0.8592014 0.87256654 0.88593167]\n", "\n", "\n", "Bootstrapped uncertainties in predictions:\n", - "[0.00372111 0.00330842 0.00289578 0.00248321]\n" + "[0.00355916 0.00316296 0.00276679 0.00237066]\n" ] } ], @@ -380,7 +380,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 14, "id": "8029bcaf", "metadata": { "execution": { @@ -396,16 +396,16 @@ "output_type": "stream", "text": [ "True extrapolation coefficients: [0.96608173 0.02736471]\n", - "\t With N_configs = 10: [0.96568927 0.07042381]\n", - "\t With N_configs = 100: [0.96655421 0.03073504]\n", - "\t With N_configs = 1000: [0.96509015 0.02912657]\n", - "\t With N_configs = 10000: [0.96602406 0.0244067 ]\n", - "\t With N_configs = 100000: [0.96604833 0.02732698]\n" + "\t With N_configs = 10: [0.96677344 0.09849956]\n", + "\t With N_configs = 100: [0.96706863 0.04272218]\n", + "\t With N_configs = 1000: [0.96523653 0.02528591]\n", + "\t With N_configs = 10000: [0.96650938 0.02585537]\n", + "\t With N_configs = 100000: [0.96612245 0.02673026]\n" ] }, { "data": { - "image/png": "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fDlXwePkyZOyWq1q0aKFpMpH8eTm1v7Zlrm5uU6PBjrfsWPHlJ2dbd9++9vf2vd16dJFI0eO1OHDhx2WhqvTrl07h6+fe+459erVSzabTc2aNdN3331nD7WS5O/v7/B4ovbt2ys1NVVS5fl/HTp0cDhex44dXT57s7CwUPfdd586dOig0NBQ+/t+OVZ1XI3VqVMnh7HO3eBVqrx1REBAADN29eyXy/IwN3f9rAl2ADyia9euat++vcN5XOesXbtWQ4YMUUBAgCSpb9++OnToUK3HOHjwoPr27VvnGtevX68vv/xSN954o+677z6HfVU9FsjL67//rG7fvl0LFy7U66+/rqysLGVnZ6t3794O/4AXFRUpIyPD/nVKSor9/Lw2bdro6NGjDsc/evSo2rRp4zTun//8Z+3Zs0fbt29Xbm6u/X3nxvplXa64Gis5OdnlWKh/VqtVUuU923BpOHehl4+Pz0UdhxsUA/AIi8Wi5557TrGxsYqMjNSUKVNUVlamF198UevWrdO//vUve9/x48frs88+cwhXJSUlqqioUEVFhcrKylRUVCRvb295e1f+s3bs2DFlZmZq+PDhdaovJSVF99xzj9auXatrrrlG/fr105o1a3TPPfdIqnwo+JEjR6oNjrm5ufL29larVq1UUVGhV199Vd99951DHy8vL82bN08rV65USkqKnn/+eS1cuFCSdPvtt2v8+PG6/fbbNXDgQK1evVpnzpzR2LFjXY7l7++v5s2bO533d67eY8eOqby83B4afmns2LF68MEHtWrVKt1zzz3auXOn3nrrLX388ce1/M7BHby9vRUYGKjTp0/Lx8fngsEcTZdhGCooKFBGRoaaNWvm8r/P2iDYAfCYSZMmaf369Vq0aJEeeugheXl5adCgQfrss8901VVX2fvFxsZq0aJFOnPmjFq2bCmp8s7u56543bZtmx599FEtWLDAHopef/11zZgxQ0FBQdXWcP6M1JgxY7Ru3TpNnz5dv/3tbxUTEyOpchYxJiZGw4YNU48ePbRo0SI9+OCDuvvuu/X4449r6tSpTse+4YYbNHnyZPXp00d+fn6KjY3VkCFDHPqEhISob9++6tSpkyoqKnTPPffojjvukCSNGDFCK1as0F133aW0tDT17t1bH3/8sZo1a+Y01pw5czRt2jRFREQoLCxMixYt0urVq+37b7nlFr311lsKCwuTYRjKzs52eH/z5s318ccfKy4uTvPmzVNUVJRWr16toUOHVvv9Q/2wWCxq3bq1kpOTdezYMU+XgwbQrFkzh9Md6spiXMIL+Lm5ubLZbMrJyan/R3wAuCgJCQnKzs7WkiVLLtg3Ly9P/fr1086dO9WqVasGqK5utmzZookTJzqFLOCciooKlmMvAT4+PtXO1NUmrzBjB6BJmDdvXo37hoSE6Mcff6zHaoCG4eXlVeW9GgFXWLQHAAAwCYIdAHjIyJEjWYYF4FYEOwAAAJMg2AEAAJgEwQ4AAMAkCHYAAAAmQbADAAAwCYIdAACASRDsAAAATIJgBwAAYBIEOwAAAJMg2AEAAJgEwQ4AAMAkCHYAAAAmQbADAAAwCYIdAACASRDsAAAATIJgBwAAYBIEOwAAAJMg2AEAAJgEwQ4AAMAkCHYAAAAmQbADAAAwCYIdAACASRDsAAAATIJgBwAAYBIEOwAAAJMg2AEAAJgEwQ4AAMAkCHYAAAAmQbADAAAwCYIdAACASRDsAAAATIJgBwAAYBIEOwAAAJMg2AEAAJgEwQ4AAMAkCHYAAAAmQbADAAAwCYIdAACASRDsAAAATIJgBwAAYBIEOwAAAJMg2AEAAJgEwQ4AAMAkCHYAAAAmQbADAAAwCYIdAACASRDsAAAATIJgBwAAYBIEOwAAAJMg2AEAAJgEwQ4AAMAkCHYAAAAmQbADAAAwCYIdAACASRDsAAAATIJgBwAAYBIEOwAAAJMg2AEAAJgEwQ4AAMAkCHYAAAAmQbADAAAwCYIdAACASRDsAAAATIJgBwAAYBIEOwAAAJNwS7DLyspSeXm5Ow4FAACAOqpzsPvxxx/15z//WcOHD1d4eLhatWql22+/Xe+++67y8/PdWSMAAABqoFbB7vjx45o/f7569eqlfv36afv27brzzjuVnp6uzz77TN26ddPixYvVqlUrjRkzRqtXr66vugEAAHAei2EYRk07v//++3r//fc1ceJExcTEyN/f32W/EydOaMOGDfrggw/06aefuq1Yd8vNzZXNZlNOTo5CQ0M9XQ4AAICT2uSVWgW7X8rLy1NISEidCnTl888/15/+9Cft2bNHaWlp2rBhgyZOnFhl/y1btuhXv/qVU/v333+v7t2712hMgh0AAGjsapNX6nyO3bBhw5Senl7Xtzs5e/asrrzySq1cubJW7/v3v/+ttLQ0+9alSxe31QQAANCU1DnYDRgwQAMHDtShQ4cc2vft26exY8fW+nhjxozRH//4R/3617+u1fvCw8MVGRlp36xWa63HBgAAMIM6B7uXXnpJd955p4YOHart27fr8OHDuvXWWzVgwAD5+fm5s8Zq9evXT61bt9aoUaP02WefVdu3uLhYubm5DhsAAIBZeF/MmxcsWCBfX19df/31Ki8v1+jRo7Vr1y7179/fXfVVqXXr1lqzZo2io6NVXFysN954Q6NGjdKWLVs0fPhwl+9JSEjQH/7wh3qvDQAAwBPqfPFEWlqaEhIS9NJLL6lHjx46dOiQ1qxZo+nTp198URbLBS+ecGX8+PGyWCzatGmTy/3FxcUqLi62f52bm6u2bdty8QQAAGi0GuTiiU6dOmnbtm169913tWfPHr333nu67777tGTJkroe8qJdc801+uGHH6rc7+fnp9DQUIcNAADALOq8FPvKK69o6tSp9q9Hjx6tzz77TOPGjdOxY8e0atUqtxRYG/v27VPr1q0bfFwAAIDGoM7B7peh7pz+/ftrx44ddboqNj8/Xz/++KP96+TkZCUlJalFixZq166d5s2bp9TUVL3++uuSpOXLl6tDhw7q1auXSkpK9Oabb2r9+vVav359XT8SAABAk1arYJeRkaGAgIBqb0zcoUMHffHFF5Kkw4cPq2vXrjU69u7dux1uODxnzhxJ0h133KFXX31VaWlpSklJse8vKSnRI488otTUVAUEBKhXr1766KOP6hQqAQAAzKBWF0+8++67io2N1ciRIzVhwgRNmDBBUVFRDn2++uorvf/++9qwYYOOHz+u/Px8txftLjx5AgAANHb1+kix48eP6/3339fGjRu1bds2XXnllRo/frxSU1O1adMmlZeX68Ybb9SECRMUExOjgICAi/ow9YlgBwAAGrsGeVasJOXk5OiDDz7QRx99pKioKE2cOFFDhgyRl1edL7ZtUAQ7AADQ2DVYsGvqCHYAAKCxa5D72AEAAKBxIdgBAACYxEU9KxYAAOBSlJFyWjmZeU7ttrAQhbdr5YGKKhHsAAAAaiEj5bRmdH9IpUWlTvt8/H306qG/eCzcsRQLAABQCzmZeS5DnSSVFpW6nMlrKMzYAQCAJq+xLo02NIIdAABo0hrz0mhDYykWAAA0aY15abShMWMHAADcjqVR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\n", + "image/png": "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TZ48WRkZGTp48KAGDx6sQYMGaevWrc5677zzjgYOHKjIyEhn2TXXXKMlS5bo2muv9Xjuu+++W2+++abOnj1bYRuOHDmivLw851beo4qqqri42CvnAYCqINgB8AnDMPTYY49pxowZuvfeexUWFqZGjRrp6aef1rhx4/TEE084665evVpDhgxxOf6hhx7S0KFDFRwc7PH8rVu3VpMmTbR+/fpqte+JJ57QoEGDVFpaKkn661//qpiYGGVmZjrDZN++fRUWFqZ58+bp4MGDslgsevPNN9W2bVtdccUVkqSnnnpKrVq1Unh4uDp16qSPPvrIeY1169apYcOGWrRokZo1a6aYmBjNnj1bhmE467z77rvq2LGjGjZsqP79+2vHjh0e25uXl6fRo0crKipKNptNAwcO1M6dOyWVPaNz3rx5+uyzz5x3HEplz/RMTEx0nmPr1q3q16+fGjZsqE6dOun999937pszZ45GjRqlhx9+WA0bNlTLli31wQcfVOtnC6DmEOwA+MS+fft08OBB3XXXXW777rrrLm3cuFH5+fmSpNTUVHXo0KHK1+jUqdNFF0EtT1JSks6cOaPnn39ehw4d0gMPPKC33npLUVFRzrvhNm3apLy8PJelHFavXq2tW7fqwIEDksp6Frds2aLs7Gw9++yzSkhIcO6TpNzcXG3fvl379+/XunXr9Je//EVvv/22JGnDhg367W9/q9dee00nTpzQ7bffruHDh8tut7u1t7S0VBMmTNCBAwd0/Phxde/eXXfeeacMw9Ctt96qWbNmaeTIkc6eyQtlZ2frxhtv1Pjx43XixAktXbpUU6ZM0bfffuus8/e//139+vXTqVOn9Pzzz+u+++5zecYmAN8j2AHwiZMnT0qSyyN3zomNjVVJSYlOnz4tqWz9p+rcSRYREXHRh5C3atVKDRs2dG5vvvmmJCkgIEDvv/++Xn75Zd1000265557NHz48Itec/bs2WrYsKEaNGggSZo4caKioqJktVo1fvx4dejQwWXZh9LSUs2fP18NGjRQhw4d9PDDD+udd96RJL399tuaNGmSBg4cqICAACUmJqpRo0b6/PPPPb7XcePGKTQ0VMHBwfrf//1f7du3T0ePHq3Uz+rzzz9X06ZN9cgjjyggIECDBg3ShAkT9NZbbznr9OjRQ3fddZesVqsSEhLkcDi0b9++Sp0fQO0g2AHwiXPz5TwFj6NHj8pqtapx48aSyh7Fk5NT9Wdb5uTkuD0a6EKHDh1Sdna2c/vNb37j3NeuXTsNHjxY+/btcxkarkjLli1dvn/55ZfVuXNn2Ww2NWzYULt27XKGWkkKDg52eTxRq1atlJ6eLqls/l/r1q1dztemTRuPz97Mz8/Xgw8+qNatWysiIsJ53PnXqoina8XFxblc69wCr1LZ0hEhISH02NWw84flYW7e+qwJdgB8on379mrVqpXLPK5z3n//ffXr108hISGSpG7dumnv3r1VvsaePXvUrVu3ardx5cqV+u6773TzzTfrwQcfdNlX3mOB/Pz++8/qxo0bNWfOHL399tvKyspSdna2unTp4vIPeEFBgTIzM53fp6WlOefnNW/eXAcPHnQ5/8GDB9W8eXO36/7hD3/Qtm3btHHjRuXk5DiPO3et89vliadrHThwwOO1UPOsVquksjXbcHk4d6NXQEDAJZ2HBYoB+ITFYtHLL7+shIQExcTEaNy4cSouLtZrr72mFStW6KuvvnLWHTVqlL7++muXcOVwOFRaWqrS0lIVFxeroKBA/v7+8vcv+2ft0KFDOnnypAYOHFit9qWlpen+++/X+++/r+uuu07du3fXsmXLdP/990sqeyj4/v37KwyOOTk58vf3V9OmTVVaWqrly5dr165dLnX8/Pw0c+ZMLV68WGlpaXrllVc0Z84cSdKkSZM0atQoTZo0Sb1799bSpUt16tQp3XTTTR6vFRwcrEaNGrnN+zvX3kOHDqmkpMQZGs5300036dFHH9WSJUt0//33a/PmzXrvvff0xRdfVPEnB2/w9/dXgwYNdOLECQUEBFw0mKP+MgxDZ8+eVWZmpho2bOjx72dVEOwA+MyYMWO0cuVKzZ07V4899pj8/PzUp08fff311+rVq5ezXkJCgubOnatTp06pSZMmkspWdj93x+uGDRv05JNPavbs2c5Q9Pbbb2vy5MkKDQ2tsA0X9kiNGDFCK1as0MSJE/Wb3/xGw4YNk1TWizhs2DANGDBAHTt21Ny5c/Xoo4/qvvvu09NPP63x48e7nfvGG2/U2LFj1bVrVwUFBSkhIUH9+vVzqRMeHq5u3bopLi5OpaWluv/++3X33XdLkgYNGqRFixbp3nvv1bFjx9SlSxd98cUXatiwodu1pk2bpgkTJig6OlqRkZGaO3euli5d6tx/xx136L333lNkZKQMw1B2drbL8Y0aNdIXX3yhxMREzZw5U7GxsVq6dKn69+9f4c8PNcNisahZs2Y6cOCADh065OvmoBY0bNjQZbpDdVmMy3gAPycnRzabTXa7veYf8QHgkiQlJSk7O1vz58+/aN3c3Fx1795dmzdvVtOmTWuhddWzbt063XrrrW4hCzintLSU4djLQEBAQIU9dVXJK/TYAagXZs6cWem64eHh+vnnn2uwNUDt8PPzK3etRsATBu0BAABMgmAHAD4yePBghmEBeBXBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCS8EuyysrJUUlLijVMBAACgmqod7H7++Wf94Q9/0MCBAxUVFaWmTZtq0qRJ+uijj5SXl+fNNgIAAKASqhTsDh8+rFmzZqlz587q3r27Nm7cqHvuuUcZGRn6+uuvddVVVyk5OVlNmzbViBEjtHTp0ppqNwAAAC5gMQzDqGzlTz75RJ988oluvfVWDRs2TMHBwR7rHTlyRKtWrdKnn36qL7/80muN9bacnBzZbDbZ7XZFRET4ujkAAABuqpJXqhTszpebm6vw8PBqNdCTb775Rr///e+1bds2HTt2TKtWrdKtt95abv1169bpV7/6lVv5jz/+qA4dOlTqmgQ7AABQ11Ulr1R7jt2AAQOUkZFR3cPdnDlzRtdcc40WL15cpeP+/e9/69ixY86tXbt2XmsTAABAfVLtYNezZ0/17t1be/fudSnfsWOHbrrppiqfb8SIEXr++ed12223Vem4qKgoxcTEODer1VrlawMAAJhBtYPd66+/rnvuuUf9+/fXxo0btW/fPt15553q2bOngoKCvNnGCnXv3l3NmjXT0KFD9fXXX1dYt7CwUDk5OS4bAACAWfhfysGzZ89WYGCgbrjhBpWUlGj48OHasmWLevTo4a32latZs2ZatmyZ4uPjVVhYqHfeeUdDhw7VunXrNHDgQI/HJCUl6X//939rvG0AAAC+UO2bJ44dO6akpCS9/vrr6tixo/bu3atly5Zp4sSJl94oi+WiN094MmrUKFksFq1evdrj/sLCQhUWFjq/z8nJUYsWLbh5AgAA1FlVuXmi2j12cXFx6tChgz766CPdfPPN+vvf/64777xTR44c0dNPP13d016S6667Tu+++265+4OCgmp1mBgAAJhTZtoJ2U/mupXbIsMV1bKpD1pUptrB7s0339T48eOd3w8fPlxff/21Ro4cqUOHDmnJkiVeaWBV7NixQ82aNav16wIAgMtHZtoJTe7wmIoKitz2BQQHaPneP/os3FU72J0f6s7p0aOHNm3aVK27YvPy8vTzzz87vz9w4IBSU1PVuHFjtWzZUjNnzlR6errefvttSdLChQvVunVrde7cWQ6HQ++++65WrlyplStXVvctAQAAXJT9ZK7HUCdJRQVFsp/MrR/BLjMzUyEhIRUuTNy6dWt9++23kqR9+/apffv2lTr31q1bXRYcnjZtmiTp7rvv1vLly3Xs2DGlpaU59zscDj3xxBNKT09XSEiIOnfurM8//7xaoRIAAMAMqhTs1q9fr4SEBA0ePFijR4/W6NGjFRsb61Ln+++/1yeffKJVq1bp8OHDysvLq9S5Bw8erIru41i+fLnL90899ZSeeuqpqjQfAACYVF2d81bbqhTs7rjjDl133XX65JNPtHLlSiUmJuqaa67RqFGjlJ6ertWrV6ukpEQ333yzkpOTNWzYsJpqNwAAgKS6PeettlV5jl2LFi308MMP6+GHH5bdbtenn36qzz//XLGxsfrggw/Ur18/+flVe91jAACAKqnLc95q2yUtUGyz2TRp0iRNmjTJW+0BAACo02yR4QoIDii3h9AWWf69CDXtkoIdAACAJ2ae8xbVsqmW7/1jnXx/BDsAAOBVl8Oct6iWTevke2AyHAAA8KrKzHlDzSDYAQCAeu3cnDdPfD3nrbYxFAsAwGWAOW+XB4IdAAAmx5y3ywdDsQAAmBxz3i4fBDsAAOBVzHnzHYZiAQDwAea8oSYQ7AAAqGXMeUNNYSgWAIBaxpw31BSCHQAAJsect8sHQ7EAgMuemee7Scx5qwnHM+2y2/Pdym22EEVH2XzQojIEOwDAZe1ymO8mMefNm45n2nX35GVyFJW47QsMsOqt5ff7LNwR7AAAl7XKzHcjENV9tdmDZrfnewx1kuQoKpHdnk+wAwDgHLMPjZ6b81ZeL6EZ5rzVZtCqyz1otY1gBwCoUy6HoVGzz3mr7aBVl3vQahvBDgBQp1wuQ6O1PeeNoUrvCmxYqIDQYrfyojO+jVYEOwAAfIChyvorr/S0us38l6z+htu+kmKL8kpPS4qp/YaJYAcAqAQzz3nzxXw3hiprQKsC+TV2f4+lp61ev1RacYbHUCdJVn9DacUZ6qFOXr9uZRDsAAAVMvuct6iWTbXg2xd07Mhpt33NmjeukfdG0PKu1Kx9uvbhH2T189CDVmpRatY+tT/Xg1ZSIuXnS2fPlm3nXnsqK+d1fguLdFv57cn38/zZ1gaCHQCgQmaf83Y8065pz/zV/MOUdTVoSZJhSIWF5YeqiwQte2SJrKPK6UHzM2R/NUkaPrrsGIfj0t/gmF7Sbc0v/Tw1gGAHAKhTbJHh8o9ooCLD/Rd1gMXi9aFRn/We1eWgdU5xcZV6ss69tofnyTqsgqD1l5el2ye5BjcPn3dlhY3pJY0qP2iFZZ+SsrPddwQHSw0alG0hIZV/HeWQtLPa7a1JBDsAqIdqe86bERQgBXr4leFwvyvwkq8VHKjSvl1U6iFslQZYZQQHev2atRmypEsIWlJZACooqFLgOm49LeuQ8oPW8f97Vbr3IfdzFHnuqb2YsDG9pGEVBK3MdOnwYc87/f0rF67OL2thkbS3/AY99LCU1Nv1uOBgyc+vWu9PP6ZIRQQ7AIAX1Pact9NZZ1Tap4tk9fBLsKRUp7POeO1aUlkPWlHsGY9Bq+i01es9aJcUss5XXFzpIcTjRUdl7V9B0PrrX6THZ3o+RzV6t4LvGCANiSx//7Ej0q5dFZ+kMgHr3Ou2wZIOlH+uKVOkma94PldAQJXem6T/BK0Kgl1sM+mqq6p+3nL4WxqopNRS7p8Zf0sDr12rqgh2AFDP2E/mymFICg9x2+dwFHt9zlveWYcU5yi3RyvvrBfmLJ3Ha0FLkkpLL9q7dfzUXll7VBCyPl8hJS+8+Nyv4sr3XgbfMUDqX0HQOviLtGnTxU8UEFCpIcSwThGSjpV7mrAJd0gPzC7/PMHBksVS6fdXFrSWlr+/dWupY6/Kn6+OaWtrred2dVFQgPtnXljkr3H9Wtd+o/6DYAcA9czprDMqHd9Ofk1L3faVnvDzeg9aWnBmhUEr7UTvqp+0qKj8YcMjO2TtWkHQSvmbtPTNyg1D5ruvE+dm/FCpR0T5+/ftk1Z9VbX3d5EhxLCOTSVllXt42G2jpLser7iXrCq9W3tSpOLyg1bxlW2V37av/Pz8FBQU5LLvzJkzKsktG/Y3DEPGf3oLL3zdoEEDhYS4/2fDk9zcXB09etT5fdOmTRVw3ns5c+aMTp8+7XJ+T1/9/PzUqlUrtQyP0c6TFfSg5Rr66aefnMdJUnh4uJo1a+ZS96efflJJSYnLNS58LUltYmP1dr/7dTgn2+16LSIaqnuzKy7+Q6ghBDsA8IIV3/xDP5864lbetklzjR94vVevtT1nv659bFe5v8S2H+iu3upa9ROf6926ICDlZR+QNbr8oJW382vps7U6dvKkTmZnqyQ/X8X5+SopKFBxfr6KCwpUUljo/NrU4VDPEtfev79KsksqkbRr/FBFdq0gaO3aJa0oC1onJL34n+NKz/ta6qFsQUCAmoaGOsPRmuJi/TknR4WBVnWv4MfyVWRjPbJ0qUuomv7WW/pm924ZFovzes7X/wk8paWlmjBhgp599lmX81155ZWKaBKnm1T+TSAvfPq5GiXM0I3DhzvLvvnmG918883OQFXRdvbsWQUG/ncu4t+/XKsrhpT/HufMnq1fr9qiwYMH6+uvv3bZ179/f6WmplbwEyqTlJSkGTNmSNJFg9YzDz2lB7bud5Zt375d3bv/91P429/+pl//+tcXvWbTpk2VmZmpfs27SpqjtNwMffjRR/rXee3NOXxa87cOdzt20qRJeuedd1zK+vbtq5MnT170uu+8844mTZrk0wBXHoIdAFP6fPf3+iXrqFt5XKNY3dy5Gj1MFVjxzT+UGrFU1obuv8RSSy3SN6ow3BmGoZKSEvn7u/6T/PPPPysrK0sFeXkqsNvLttxcbc85oqgryw9aJ3Zv0tTn56rI4VCRwyGHw6GioiI5iopUVFysouJiOUpKVFRSolcjItTt3NywggKtkXSPJIekov98jRs/VLfNrCBobdsurfhK/yvptYv9sCSNlvTxuW8sFqlBAz2Zn6+DpWU9kFdJGlvRCXr1krrdIDVooOzcXC145plKXFV69scf1fTKK53f/7J4sT5+5BHF5Wapu0LLPS49P1eaOtWlbN9rr2nrjz9e9JrHjx93Kzt8+LBa2JtIFQS7/PyzclywLEdJSYny8vIuek3JvYcp6Ky1wjlhOYdPezyuKs4/tl/zrsrOTtSjz053q5dz+LROnhfqvKVf867qp676fN9b+mXVFq+fv74g2AGoFd8e+UFpuRlu5S3DY/7zv23v+Xz399pQ9KKsEe6/pNKLLNLup6oU7oqKipSRkaG8vDzl5eXpzJkzysvJUd7p08rLytI3Z46qxS3lB63X331di359nwocjrKtqEgFxcVlW0mJCkpK1CMsTFuuusqlp+yeU6e0ocR9XlvX8Tdp1MggD1f7j9279dr27ZV6b1kFBS7fl0i6MIpc9Ff9NddIcb3l/9VX0vffX/SaJddfL334YVnvV2CgZLHIv1076eefJUmlJRXP2Qse0FfqNUqS5Ld/v1TJYFda6jp0bbVW7o5Xw8NPwGq1ys/Pz7lZLBaPrz0NTV5xxRUKOKMKg1ZoUaBCQ13DZlhYmDp16iSLxVKp7XzdGrXRewt2yb9pmGSRzu21WKSSUw51CWshDW6hbt26ubWnd+/eioyMdJ7z/POf//rK80KzJPVvcbW6lDRza4+lRXOpxdXO4yXJZnO9GaZVq1a64447XOp4+hoe7h6O+/Xr5/b+Xa7/n9d9+/Z1O3b8+PEu4dnTcZ7ea11iMS4lntdzOTk5stlsstvtioio4H+jgAnVZtD69sgP+vTknHJ/iY2KnOOdaxqGis6e1cJ1Hyq7xaflVjv4fmNFfv+Lzpw9q7yzZ5WXn6+8ggKdKSxUnsOhpM6ddWujRs4hyW0nT6rnf0KHJ13H36RRM8sPWp8mFeqHFWsqbHoXST9cUDZMUoqHup3HD9fomeXfdRfxUaxmPP9Khdc75++LF2vYkCHOIcZ127Zp8m9/q8DAQAUEBCgwMFDhA9ppwH3l3xjQuvA3mtJrlN5//339v//3/+Tv7y+r1Sp/f3+X1+e+tm/fXuPHj3c5x4oVK5Sbmyt/f3/9GHRSAV02l3u9LgG/1V0db5AkFRQUaOvWrfLz83OGrfND1/llrVu3dhmePHPmjHJycrTj9H59U/RyuX8+b2z4PxrcuqLB2uqpzb+DqN+qklfosQPqiLoStHaetEjyUtD6jz1HD8gaXH6P1p4N/1A/y25nT1VRXp6yTp1Srt2uK4ODXSbDrzpwQBtPnFBWYWHZVlSkrJKSss0wlCfpqvFDNbaCocNtBw/q3xfMIzpf5gV3I4ZV6127C/DzU7C/f9kWEKDgwMCyLShIVzZrJs2a5TJBftRf/6qrDh9WcGiogsPDFdyggYJDQvTvBmckpZZ7nQbDh2rH2PucwSwgIMDja39/f7eejcEjRujgwYMuZe//mKJdFdzhGBYWLEm66667dNddd1XrZ3N+0Cv78/lduUGrZfh/74gNDg5W//79q3XN0NBQhYaGqlmzZrIdsdV6yDo3dAh4E8EOKIeZg1ZabobHa0llQStt5yb125l28QVQK7G/4MwZnb1tgFRB0Fqx+nMtWvGVslR2n+C5ezobnPf6nC8lvXqR9+d/kX/aytvvZ7EoLChIpaNHS8OGOUNWk6Ii3f7KKwoLD1dYRIRCIyIUZrMprFEjhdps2lKQKWlHude7bext2vHu6koP/Z3zSFfPn/mft3yqgxUEu+Agf49DatV1sYnw5wctbzh/IrynttRE0CJkwSwIdqg3Luug9e9t6ncg+9KD1n9e593QVXq6/AVe8976P+mjDRW22VDZ0GHGedsxD9/bJc2QVNH67umS/u2h/Kwkx4wZCgwPd4asRp9/Ln3qOswaGBCgRjabGjVsqEaNGik85gpVtJTEkEFD9PpjcxQWFubcQkNDFRwc7NaDJUmRkj66/fZyz3d81XLlVxDs/K3WKoe6inRq1lr7KwhanZq19tq1JIIWUJ8Q7FBtl3XQOrhb/U4bVQpTFb3OG9hOSix//ae81/5y0aBVFQWlFS80erBRpP4aF6cMi0UZhqGMkhL1jo7WlKuvdlnyoefcuSryMLn/QmcGD1a4Kp7MHxwcrEaNGrltjmeeUWDYfwdD773+eo148kmXOiEhIS6B7PlVy5Wv1eVeKyo6Stddd91F211ZbZs0V2oFE+HbNvHuw8IJWgDKQ7Azkcs6aB37Wf2Kwqo0RFjh/l7NpIcquOvwpZckL95OX9CrtaTyg11BRCOpXbvqPaz6P6+NkBDZS0vVMCpKStsqVRB8VubkaN4vv7iUnenTR1P+/Gfn9xZJMW+8ocPlPO8xLCxMMTExiomJkawVP9vz7ol3a+b7/6iwzjlXXnnlRe9IuyIoUv+uIGhdEVT+iv/VMX7g9dI3qrV17CSCFgDPCHY16LIOWqcPq1+DKy65J8v59erG0n0VNCgpyatBK69tmKTyg11eA5sUHV3tkOX2OnO3pC/Kb9DkydLrYy7a7sLCQh08eFC//PJL2bZjx39f//KL/P39lZWVJWX/VOWfSUaG+5/lKVOmqKCgQM2aNXOGuHNb2Hm9bEtXfaxDpd+XG7QaFpW/nld19I/ppP97KEKWVu6r8huHinTvok5evZ5U8Tp1AFBbCHY1pM4FrdwM9Svu6J3erLNnpQ5h0qQKGjRnjleDlhr3knSR4ayLhacq7C+w/yzp/5V7qYKpD0rvXjxoVdpG90VMPTEMQ5mZmQoNDXUJTt9++63Gjx+v9PT0iy4wmpWVpejAJkqvoEcrPq6bfpN8g2JiYpyhLTY21q3u7373u0q1u0fElfroj13KfQTWmEneXxPKsjlP8rBiRhWedgkA9Q7BroZUKmipq/sDqqsTuvLzpdb+0h0VNOjZZ6W/fue9N+hfiaAllT3HsLpB67zXeaVHJX1T7mXyZv5O+tsor709bVzlvXNVwsWC1pr/W61lv31Wv/zyi86ePav33nvPZVkJm82mI0fchwHP8ff3V+vWrRUXF6e8vDx1a9Rer87vWu5D3V99eqrat/PenY6NG4XKb8VPUqD7Pzl+jmI1fqT8Vf+rwxYZroDgABUVFLntCwgOkC3Suz2EAFBXEOx85fkXpFWjK/eA6soY00u6o4KgdeEE90scQswLOC2p/KCYN/1p6cPRkr93/ogVXCRoFRSWv3hqdVwsaEUHNvHq9S4WtLZ8+Gfl5f738Vi/XDD/rU2bNmratKni4uIUFxenNm3aOF/HxcWpefPmLndl7tlxQDoQqNJDHu5VLS1VcZ6X/lyex1JYJBW6B62aENWyqZbv/aPsJ3Pd9tkiwxXVsmmttAMAahvBzlfyz7qHusDAyvdsXVjWJF+q6K7Dp5+SXh9SVjc4uOw5MpegLGiVH+wKDD+vhTqp7gWte55uX6XzFRYWas+ePdq5c6f+9a9/aefOnYqKitL7778vSbLZQhR4NFSOQ+7XKykpUpHjjAIDA529bq1bt3apExoaqszMzEq3J8Aw5Ldpl8ceNDmKFWCCB9JEtWxKgANw2SHY+cpjj0kv9ftvMAsJuaQglLflU1UU7PL8gqTGjat9/gvV96BVKYeCVXqo6odlZWVpy5Yt2rlzp3Pbu3eviotdexWjo6P/+zrKpreW3685s+dpy5Ytiotro+bNm+uK5s3Vrl1r9Xh7l2JjY+XnV9FqcFVTmz1oDI0CQO0g2PlKVJR0Qa/LpbAZtgofKG0zyl+MtjrqU9CqDpstRIEBVjmK3N9fYIBVNluIHA6H9u7dq9atW7s8u++zzz7Tr3/960pdx263Ox9+bSlwaNqUB6QpD7i2JTJcUc3rd88TQ6MAUDsIdjUkojSiwqAVUVrxQ3yryuxBq7ad60Gz28uGy7OysvTTvn366aef9PPPP2r4sEHas2ePioqK9Mknn+iWW25xHnvNNde4nMvf318dO3bUNddc49yuvvpqlx67zLQTmtzhsXJ7tJbv/WO9Dz8MjQJAzSPY1ZB2ga30h5crClqtvH9REwetyvSgedunqz/S119/rW+++abCO0537tzpEuw6dOigadOmOUNcx44dFRhY8QK99pO5HkOdJBUVFMl+MpdQBAC4KIJdTSJoec2FPWgXtiU6qvpDzYZh6Pjx42VPSDjP4sWLtXPnTo/HWK1WXXXVVbrmmmvU9YIHtQcGBuoPf/hDtdtTG5jzBgDmRLBDtdRk0Kromt44b2lpqX744QetX79e69ev1zfffKOIiAjt37/fpV7fHv30y85DCgkJUadOndS+fXu1b99e3a69Rv2G9FFwcPAlt8VXmPMGAOZEsDMJXwxVeito1bSSkhLt3LlT69ev17p167Rhw4ayx2qd5+TJkzpy5IiaNy9bCzAz7YQOvHdavS3XSwWStku/bD+hX3RCXwX/U133dlFwy/ob7CTmvAGAGRHsTMIXPWj1wZ49e9S3b1/Z7fZy69hsNg0YMEC5uf/tvbKfzFWxw/Oix8x5AwDUVQS7GkIPWu1xOBzaunWr1q9fr06dOmn06NHOfVdeeaUKCwtd6jdu3FgDBw7UoEGDNGjQIF199dUuT2XwBea8AQC8gWBXQ+hB877MtBOyn8yVw+HQrl27tG3bNm3fvl3b/rVV2QWnJUm33nqrS7ALCgrS6NGjVVJS4gxynTt39upCv97AnDcAgDcQ7GrQ5dqDVhP27z6gh3rMUElRqUu5RRHqbgzSJq1VofL1zTffqLS01CW4rVixorabWy3MeQMAXCqCHeqFN1590y3UnWO1WHXriDG6fsyvNGjQIFku8Tm4AADUVwQ7VNu5odELXcrQ4fHjx/Xxxx9r8ODBuuqqq5zlQ4cO0ZZXfiz3uLlz56pdj7hqXdMT5rwBAOojgh2qxZuPwDpy5Ij+9re/aeXKldq4caNKS0v1P//zP5o7d66zTsuWLb3W9spgzhsAoD4i2KFaLvURWL/88otWrlyplStX6vvvv3fbv3LlSpdg5wvMeQMA1DcEO9SqTz75RHPmzFFqaqrH/e3bt9fYsWM1duxYGYbBfDkAAKqAYGciNTHn7VIYhiHDMFzuUC0uLnYLdV27dnWGuc6dO3sMc8x5AwDg4gh2JuHNOW/e8Kc//UlfbPxMSUlJuuOOO5zlN954oxo0aKBOnTo5w1y7du0uej7mvAEAcHEEO5O41Dlv3vbWW28pV9lauXKlS7ALDQ3V4cOH1bhx4yqfkzlvAABUrG4tv496wxYZroAgz/8vKDFK5FChrFarCgoKZBiGy/7qhDoAAHBx9NjVoLo2582b/vrZR1pX+Kn8jQCXcn9/f/Xuf61embRIo0ePVmRkpI9aCADA5YdgV0Pq2pw3b+vbt6/yjTOSysLcTTfdpNtvv12jRo1Sw4YNfds4AAAuUwS7GlLX5rxV186dO/XKK6+od+/euvfee53l3bp10+23364uXbpoypQpio2N9WErAQCARLAzDW8uB1JYWKiVK1fqlVde0aZNmyRJGzdu1D333OOyFMlHH3106Q0HAABeQ7AzCW8sB5KWlqbXXntNr7/+ujIzM132HTlyRPv371fbtm291mYAAOBdBDsTqc5yIKWlpfrqq6/0yiuv6NNPP1VpaanL/i5duuihhx7SxIkTFR7OIsAAANRlBLvL3OnTpzVy5Eg5HA5nmb+/v8aOHauHHnpI/fv357FeAADUE6xjV0POzXnzxJePwMrIyHD5PjIyUuPGjZMkXXHFFXruued0+PBhrVixQgMGDCDUAQBQj1iMC1ePvYzk5OTIZrPJbrcrIiLC6+evK+vYFRYW6qOPPtKSJUu0Z88epaenKzQ01Ln/hx9+0E8//aRbbrlF/v504gIAUJdUJa8Q7Gow2PnaoUOHnDdDnDhxwln++uuvuyxdAgAA6q6q5BW6Z0zGMAylpKTolVde0WeffeZ2M0TXrl15pBcAACZFsDORf/zjH5o5c6a2bt3qUu7v76/bb79dDz74IDdDAABgYgQ7E/n8889dQl3z5s31wAMP6L777lNMTIwPWwYAAGoDc+zq8Rw7wzBcet8yMzMVFxentm3b6ne/+51Gjx7NzRAAANRzVckrLHdSD+3evVtjx45VcnKyS3lUVJS+++47bd++XWPHjiXUAQBwmSHY1SP79+9XQkKCunbtqr/97W968cUXlZ2d7VKnS5cu8vPjYwUA4HJEAqgHjhw5ogceeEAdOnTQu+++q3Oj58HBwdq7d6+PWwcAAOoKgl0dlpmZqWnTpqlt27ZatmyZiouLJUmNGzfWiy++qP379+u6667zcSsBAEBdwSSsOiopKUkvvPCCzpw54ywLDw/X9OnT9fjjj9fLmz0AAEDNItjVUWfPnnWGupCQED3yyCN66qmn1KRJEx+3DAAA1FUsd1IHljspKChQcXGxwsLCnGXZ2dnq0KGD7rjjDs2aNUvNmjXzWfsAAIDvsNxJPVFUVKRly5apbdu2mjdvnsu+hg0b6sCBA1q0aBGhDgAAVArBzgdKSkr07rvvqmPHjnrggQeUnp6uP/7xjzp+/LhLvZCQEB+1EAAA1EfMsatFhmFo1apVevbZZ7V7926XfUOHDlV+fr6PWgYAAMyAHrtaYBiG1q5dq169emns2LEuoW7o0KHavHmzVq9erdatW/uukQAAoN6jx64W3Hbbbfr4449dyvr06aMXXnhBv/rVr3zTKAAAYDr02NWC8xcRvuaaa/TZZ5/p22+/JdQBAACvoseuFjz88MP64osv9OCDD+r222/nWa4AAKBGEOxqQWhoqNatW+frZgAAAJOj6wgAAMAkCHYAAAAmQbADAAAwCYIdAACASRDsAAAATIJgBwAAYBIEOwAAAJMg2AEAAJgEwQ4AAMAkCHYAAAAmQbADAAAwCYIdAACASdSpYLdkyRK1adNGwcHBio+P14YNGyqsv379esXHxys4OFhxcXF69dVXa6mlAAAAdU+dCXYffPCBEhMT9cwzz2jHjh0aMGCARowYobS0NI/1Dxw4oJtuukkDBgzQjh07NGvWLD366KNauXJlLbccAACgbrAYhmH4uhGS1Lt3b/Xo0UNLly51lnXs2FG33nqrkpKS3Oo//fTTWr16tX788Udn2dSpU7Vz505t3rzZ4zUKCwtVWFjo/D4nJ0ctWrSQ3W5XRESEF98NAACAd+Tk5Mhms1Uqr9SJHjuHw6Ft27Zp2LBhLuXDhg3Tpk2bPB6zefNmt/rDhw/X1q1bVVRU5PGYpKQk2Ww259aiRQvvvAEAAIA6oE4Eu5MnT6qkpETR0dEu5dHR0crIyPB4TEZGhsf6xcXFOnnypMdjZs6cKbvd7twOHz7snTcAAABQB/j7ugHns1gsLt8bhuFWdrH6nsrPCQoKUlBQ0CW2EgAAoG6qEz12kZGRslqtbr1zmZmZbr1y58TExHis7+/vryZNmtRYWwEAAOqqOhHsAgMDFR8fr5SUFJfylJQU9e3b1+Mxffr0cav/5ZdfqmfPngoICKixtgIAANRVdSLYSdK0adP0+uuv6y9/+Yt+/PFHPf7440pLS9PUqVMllc2P+/Wvf+2sP3XqVB06dEjTpk3Tjz/+qL/85S9644039MQTT/jqLQAAAPhUnZljN27cOJ06dUrPPfecjh07pi5dumjNmjVq1aqVJOnYsWMua9q1adNGa9as0eOPP65XXnlFsbGx+tOf/qSxY8f66i0AAAD4VJ1Zx84XqrIuDAAAgC/Uu3XsAAAAcOkIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMwt/XDfAlwzAkSTk5OT5uCQAAgGfncsq53FKRyzrY5ebmSpJatGjh45YAAABULDc3VzabrcI6FqMy8c+kSktLdfToUYWHh8tisfi6OaiknJwctWjRQocPH1ZERISvm4Mq4vOr3/j86j8+w/rHMAzl5uYqNjZWfn4Vz6K7rHvs/Pz81Lx5c183A9UUERHBP0r1GJ9f/cbnV//xGdYvF+upO4ebJwAAAEyCYAcAAGASBDvUO0FBQZo9e7aCgoJ83RRUA59f/cbnV//xGZrbZX3zBAAAgJnQYwcAAGASBDsAAACTINgBAACYBMEOAADAJAh2qBeSkpLUq1cvhYeHKyoqSrfeeqv+/e9/+7pZqKakpCRZLBYlJib6uimogvT0dE2aNElNmjRRgwYN1K1bN23bts3XzUIlFBcX63/+53/Upk0bhYSEKC4uTs8995xKS0t93TR42WX95AnUH+vXr9dDDz2kXr16qbi4WM8884yGDRumPXv2KDQ01NfNQxVs2bJFy5Yt09VXX+3rpqAKsrKy1K9fP/3qV7/SF198oaioKO3fv18NGzb0ddNQCfPnz9err76qt956S507d9bWrVv1m9/8RjabTY899pivmwcvYrkT1EsnTpxQVFSU1q9fr4EDB/q6OaikvLw89ejRQ0uWLNHzzz+vbt26aeHChb5uFiphxowZ+vbbb7VhwwZfNwXVMHLkSEVHR+uNN95wlo0dO1YNGjTQO++848OWwdsYikW9ZLfbJUmNGzf2cUtQFQ899JBuvvlmXX/99b5uCqpo9erV6tmzp+644w5FRUWpe/fu+vOf/+zrZqGS+vfvr6+++kr79u2TJO3cuVMbN27UTTfd5OOWwdsYikW9YxiGpk2bpv79+6tLly6+bg4qacWKFdq+fbu2bNni66agGn755RctXbpU06ZN06xZs/TPf/5Tjz76qIKCgvTrX//a183DRTz99NOy2+3q0KGDrFarSkpK9MILL+iuu+7yddPgZQQ71DsPP/yw/vWvf2njxo2+bgoq6fDhw3rsscf05ZdfKjg42NfNQTWUlpaqZ8+emjdvniSpe/fu2r17t5YuXUqwqwc++OADvfvuu3rvvffUuXNnpaamKjExUbGxsbr77rt93Tx4EcEO9cojjzyi1atX65tvvlHz5s193RxU0rZt25SZman4+HhnWUlJib755hstXrxYhYWFslqtPmwhLqZZs2bq1KmTS1nHjh21cuVKH7UIVfHkk09qxowZGj9+vCSpa9euOnTokJKSkgh2JkOwQ71gGIYeeeQRrVq1SuvWrVObNm183SRUwdChQ/XDDz+4lP3mN79Rhw4d9PTTTxPq6oF+/fq5LTG0b98+tWrVykctQlWcPXtWfn6u0+qtVivLnZgQwQ71wkMPPaT33ntPn3zyicLDw5WRkSFJstlsCgkJ8XHrcDHh4eFu8yFDQ0PVpEkT5knWE48//rj69u2refPm6c4779Q///lPLVu2TMuWLfN101AJo0aN0gsvvKCWLVuqc+fO2rFjh1566SXdc889vm4avIzlTlAvWCwWj+VvvvmmJk+eXLuNgVcMHjyY5U7qmc8++0wzZ87UTz/9pDZt2mjatGmaMmWKr5uFSsjNzdXvfvc7rVq1SpmZmYqNjdVdd92lZ599VoGBgb5uHryIYAcAAGASrGMHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7APCivn376v777/d1MwBcpgh2AOAlpaWl+te//qUePXr4uikALlMEOwDwkr179+rMmTMEOwA+Q7ADAC/Zvn27/P39dfXVV/u6KQAuUwQ7APCS7du3q1OnTgoODvZ1UwBcpgh2AOAl27dvZxgWgE8R7ADACwzDUGpqquLj433dFACXMYIdAHjB/v37Zbfb6bED4FP+vm4AAJjB9u3bJUlWq1W7du1ylgcEBOiqq67yVbMAXGYIdgDgBTt27JAkXXfddS7l1113nTZv3uyLJgG4DFkMwzB83QgAAABcOubYAQAAmATBDgAAwCQIdgAAACZBsAMAADAJgh0AAIBJEOwAAABMgmAHAABgEgQ7AAAAkyDYAQAAmATBDgAAwCQIdgAAACbx/wH+uphDCZdnmwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -462,14 +462,22 @@ "plt.legend()\n", "plt.show()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22da6e82", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "hide_input": false, "kernelspec": { - "display_name": "Python [conda env:thermoextrap-env]", + "display_name": "thermoextrap-dev [conda env:dev-4]", "language": "python", - "name": "conda-env-thermoextrap-env-py" + "name": "conda-env-dev-4-py" }, "language_info": { "codemirror_mode": { @@ -481,7 +489,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.8" + "version": "3.10.10" }, "toc": { "base_numbering": 1, diff --git a/pyproject.toml b/pyproject.toml index 3c0ffd4e..eff3eab3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,10 +32,10 @@ dependencies = [ "xarray >= 0.16", "sympy", "scipy", - "cmomy >= 0.1.9", + "cmomy >= 0.4", "custom-inherit", "attrs", - "module-utilities >= 0.1", + "module-utilities >= 0.2", ] [project.urls] diff --git a/src/thermoextrap/__init__.py b/src/thermoextrap/__init__.py index e387cc84..420fcc82 100644 --- a/src/thermoextrap/__init__.py +++ b/src/thermoextrap/__init__.py @@ -1,6 +1,8 @@ """Classes/routines to deal with thermodynamic extrapolation.""" from . import beta, lnpi, volume, volume_idealgas + +# TODO: move data, idealgas, models to top level. from .core import data, idealgas, models from .core.data import ( DataCentralMoments, diff --git a/src/thermoextrap/core/_docstrings.py b/src/thermoextrap/core/_docstrings.py index 0fd043b0..add8dca7 100644 --- a/src/thermoextrap/core/_docstrings.py +++ b/src/thermoextrap/core/_docstrings.py @@ -2,97 +2,11 @@ from __future__ import annotations +from cmomy.docstrings import docfiller as DOCFILLER_CMOMY + # from .external.docfiller import DocFiller from module_utilities.docfiller import DocFiller -# TODO: clean this up. -# There's a better way to do all this -# - import cmomy docstrings -# - use namespaces - -_docstring_cmomy = """\ -Parameters ----------- -copy : bool, optional - If True, copy the data. If False, attempt to use view. -copy_kws : mapping, optional - extra arguments to copy -verify : bool, optional - If True, make sure data is c-contiguous -check_shape : bool, optional - If True, check that shape of resulting object is correct. -mom : int or tuple of int - Order or moments. If integer or length one tuple, then moments are for - a single variable. If length 2 tuple, then comoments of two variables -mom_ndim : {1, 2} - Value indicates if moments (``mom_ndim = 1``) or comoments (``mom_ndim=2``). -val_shape : tuple, optional - Shape of `values` part of data. That is, the non-moment dimensions. -shape : tuple, optional - Total shape. ``shape = val_shape + tuple(m+1 for m in mom)`` -dtype : dtype, optional - Optional ``dtype`` for output data. -zeros_kws : mapping, optional - Optional parameters to :func:`numpy.zeros` -axis : int - Axis to reduce along. -broadcast : bool, optional - If True, and ``x=(x0, x1)``, then perform 'smart' broadcasting. - In this case, if ``x1.ndim = 1`` and ``len(x1) == x0.shape[axis]``, then - broadcast `x1` to ``x0.shape``. -freq : array of int, optional - Array of shape ``(nrep, size)`` where `nrep` is the number of replicates and - ``size = self.shape[axis]``. `freq` is the weight that each sample contributes - to resamples values. See :func:`~cmomy.resample.randsamp_freq` -indices : array of int, optional - Array of shape ``(nrep, size)``. If passed, create `freq` from indices. - See :func:`~cmomy.resample.randsamp_freq`. -nrep : int, optional - Number of replicates. Create `freq` with this many replicates. - See :func:`~cmomy.resample.randsamp_freq` -pushed : same as object - Same as object, with new data pushed onto `self.data` -resample_kws : mapping - Extra arguments to :func:`~cmomy.resample.resample_vals` -full_output : bool, optional - If True, also return `freq` array -convert_kws : mapping - Extra arguments to :func:`~cmomy.convert.to_central_moments` or :func:`~cmomy.convert.to_central_comoments` -dims : hashable or sequence of hashable, optional - Dimension of resulting :class:`xarray.DataArray`. - - * If ``len(dims) == self.ndim``, then dims specifies all dimensions. - * If ``len(dims) == self.val_ndim``, ``dims = dims + mom_dims`` - - Default to ``('dim_0', 'dim_1', ...)`` -mom_dims : hashable or tuple of hashable - Name of moment dimensions. Defaults to ``('xmom', 'umom')`` -attrs : mapping - Attributes of output -coords : mapping - Coordinates of output -name : hashable - Name of output -indexes : Any - indexes attribute. This is ignored. -template : DataArray - If present, output will have attributes of `template`. - Overrides other options. -dim : hashable, optional - Dimension to reduce along. -rep_dim : hashable, optional - Name of new 'replicated' dimension: -rec_dim : hashable, optional - Name of dimension for 'records', i.e., multiple observations. -""" - -DOCFILLER_CMOMY = DocFiller.from_docstring( - _docstring_cmomy, combine_keys="parameters" -).assign_combined_key( - "xr_params", ["dims", "attrs", "coords", "name", "indexes", "template"] -) - - # add uv_xv_array _docstring_xtrap = """\ Parameters