Skip to content

Instantly share code, notes, and snippets.

@pelson
Created January 25, 2017 07:48
Show Gist options
  • Save pelson/de90185b70bef45c3a22ee816efc3064 to your computer and use it in GitHub Desktop.
Save pelson/de90185b70bef45c3a22ee816efc3064 to your computer and use it in GitHub Desktop.
Spline interpolation with python-stratify
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are faster ways of doing spline interpolation, but a quick and dirty example of doing so in a python-stratify context follows:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAhQAAAFkCAYAAAB4sKK5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3Xl4lNXd//H3CUTWsCgqLigoKkGQTYGAsq8q0Ra14trW\ntYq0qK0+Qn/aVqzWBe3z4FJtrSsV60IAIRJIQDAgu1oDdQFFdjcIIBiY8/vjJLJDlpk5933P53Vd\nXCOTyeTjkGS+9znfc46x1iIiIiJSFWm+A4iIiEj4qaAQERGRKlNBISIiIlWmgkJERESqTAWFiIiI\nVJkKChEREakyFRQiIiJSZSooREREpMpUUIiIiEiVqaAQERGRKktoQWGMOccYk2OMWWWMiRljssvx\nOT2MMQuMMduMMf81xlydyIwiIiJSdYkeoagDLAZuBg55aIgxpikwEZgGtAEeA54xxvRNXEQRERGp\nKpOsw8GMMTHgQmttzkEe8wAw0Fp7xm73jQXqW2vPTUJMERERqYSg9VB0BvL2ui8XyPKQRURERMqp\nuu8Ae2kMrNvrvnVAPWNMDWvt9r0/wRhzBNAfWAFsS3hCERGR6KgJNAVyrbVfV+WJglZQ7I8pvT3Q\n3Ex/4KUkZREREYmiy4GXq/IEQSso1gJH73XfUcAma+0PB/icFQAvvvgimZmZCYwWPcOHD2f06NG+\nYySOtTBvHhQVwapVsHo1rF0Lxx8P7dpB+/bQogWkp5f7KSP/miWIXreK02u2l6VL4e9/h4UL4bvv\n9vnwSo7jP5zOA6xjE/8ovddyzDE3MXHiE8nNGiJFRUVcccUVUPpeWhVBKygKgYF73dev9P4D2QaQ\nmZlJ+/btE5UrkurXrx/N18xayMmBP/0JFiyAjAw46ST3p0MHV2A88wxs3Qp16sCdd8Jvfws1ahzy\nqSP7miWYXreK02tWavFiuOceGD8eTjkFfvMbdyFw2mnYk0+m2ykX0mTdNZzFPM5nGnP4gCu4nzt4\ngBU0Iy2tMe3atcMYc8gvleKq3DKQ0ILCGFMHaM6uaYuTjDFtgG+stSuNMX8GjrXWlu018SQwtHS1\nxz+A3sBFgFZ4SPnk5sIdd8CSJdC9O0ybBj17wt6/TEpKYNEiGDcO/vAHeOkleOIJ6NHDS2wR2csP\nP8DNN7viv3lzeO45uOwyqL7rbcsAX9YyzGIIY7kMQ4xjOZPHeZciMhnNb/hntU0qJpIk0as8zgQW\nAQtwPRAPAwuBP5R+vDHQpOzB1toVwHlAH9z+FcOBa6y1e6/8ENmTtfDAAzBgADRoAAUF7k+vXvsW\nE+CmOTp2hIcecoXFEUe4wuPnP4fvv09yeBHZw9dfQ9++8PzzrtAvKoKrrtqjmCgzaFBX0tJyAbCk\nsYrjOY1lPMAdDOcRcuznsHlzsv8PUlJCRyistTM4SNFirf3FAT6nQyJzScRs3w433OCuYH7/ezc8\nmlaBWrlVK5g5E559FoYNc70W48dDrVoJiywiB7BsGZx/vuuTmD4dunY96MNHjbqd6dMHU1RkicUG\nALCV2vwxrTPLTziDZ79aBv36wVtvuYsNSZig7UMhSTRkyBDfEaruq6+gTx8YOxZefBH++MeKFRNl\n0tLgmmvcL53Zs+HCC2HbvlOKkXjNPNDrVnEp+ZrNng2dO7sRxLlzD1lMAGRkZFBY+BpDh86ladN+\nNGy4iqZN+zF06Fz+9/18zPTprkjp0QPWr0/8/0MKS9pOmYlijGkPLFiwYIEamFLN5s1wzjluBceb\nb0KXLvF53vx8OO886NbNPW/NmvF5XhE5sE8+gU6d3Ijh+PGVHk2w1u7bM/Hhh26UIiPDFS2NGsUh\ncDQsXLiQDh06AHSw1i6synNphELCaedO16D16aeu8TJexQS4XoqJE2HGDBg82H0tEUmcb7910xyN\nGrkivgpTE/ttwGzVCt55x/VmXHUVxGJVCCsHooJCwul3v4NJk+CVV6B16/g/f69e7ippyhT4y1/i\n//wi4pSUwMUXu+mIiROhYcPEfJ2TT3bTolOmwP33J+ZrpDgVFBI+f/sbPPIIPPooDNx725I46tcP\n/ud/4P/9P7dBFm44VUTixFq45RY3Gvj6626fiUQaMABGjHDN2wUFif1aKUgFhYRLfj7cdJNbn37L\nLYn/enffzc4zzmB9vwGcfmIPmjS5kGbN+jBs2N0UFxcn/uuLRNk//gFPPQVPPpm8PWDuucftUXPp\npW7nXIkbFRQSHps2ufnPbt3c6EQSFG/bxqBNNanz3RZ+80VzVq0az4oVUxkzJousrMEqKkQqa+VK\nGD4cfvELt8IqWapVg5dfdvvTXHaZ+iniSAWFhMdvf+vWpj/77H43uEmEESMeIvez3zOMMVzH3/kJ\nrwOGWGwARUXDGTny4aTkEIkUa93eMRkZbvoy2Ro3dv0U+fnuVuJCBYWEQ16e65148EE48cSkfdkJ\nE2YTi/XnH/yS1/kJT3ED9dgIQCw2gJyc2UnLIhIZL7wAkye76Q5fm0317g0/+5lr8N60yU+GiFFB\nIcFXXAzXXuuWc15/fdK+rLWWkpI6uBMDDMP4K3XYwh08UPoIQ0lJbTVqilTEmjXw61/D5Ze7paI+\nPfig+/3yxz/6zRERKigk+O64w+2I+fe/V24XzEoyxpCevgV3DA2s4nge4VaGM5rjWQlY0tO36OAh\nkfKyFn71KzjsMHjsMd9poEkTuOsul2XpUt9pQk8FhQTbzJnucKD774dmzZL+5Xc/eAjgAe5gE/W4\nl5GkpU0hO/vspGcSCa2cHLe/y5gx7kC+ILjtNjjhBDdqotHGKtHW2xJcsZg7EbRaNSgsTOroRJni\n4mKysgZTVDS89OAhw408zhiGcslJHXl28VQyMjKSnkskdHbscJvQHX88TJ3qO82eJkyA7Gx44w13\njk8KiefW28lplRepjFdegQUL3CiFh2ICdh08NHLkw+TkPEJJSW3yqm9m/aYj+NcJtahet66XXCKh\n8+yzblrhpZd8J9nX+ee7TfJuu839d5JWkUWNRigkcKy1mB9+gBYt4Iwz3BBpQPx48FBODlxwgTud\nNJG7dYpEwdat0Ly527zq5Zd9p9m/xYuhXTu3AuWKK3ynSRodDiaRU1xczLBhd9OsWR+aNLmQPx3T\nmtjnn7Pl97/3HW0PPzZgDhrkdtu76y7Nu4ocyqOPusbqe+/1neTA2rZ1pwz/+c/a7KqSVFCId2V9\nCmPGZLFixVQ2r3qOm779mmfsADr9/K5g7kZpjDsPYPFit0eGiOzfV1/BAw+41R0nneQ7zcGNGAEf\nfRSoUdEwUUEh3o0Y8RBFRbf+2PR4J/dTk23czd+DvRtlr15uiPTBB30nEQmuUaPcKN7Ikb6THFpW\nlpuWKcssFaKCQrwr240S4Di+5Dc8ykPczlqOCfZulMa47cCnTnUjFSKyp5Ur4fHH3V4yRx7pO035\njBjhmsHfftt3ktBRQSFe7bkbJdzOQ2ylNg9xe+kjAr4b5cUXu63ANUohsq/Ro6FOHbfHQ1j07g1n\nnQX33ec7SeiooBCvdt+N8gi+4jqe5n+5hc2U7e0Q8N0oq1eHW291S1w//9x3GpHg+PZbd/7OTTdB\nmJZXG+NGKWbOhFmzfKcJFRUU4l3ZbpRD+T8Mlv/llh8/FordKH/5S6hXL2lHqouEwhNPuM2sbrnl\n0I8NmkGD4PTT3Q69Um4qKMS7UaNup/1pD3ILj/A01/I1jQBLWtpkMjNHc++9t/mOeHB167qrsKef\ndldlIqlu2zZ3PsbPfw5HH+07TcWlpcHw4W6fmRUrfKcJDRUU4l1GRgbvXN2PBmYzrx6/kOOOu4Cm\nTfsxdOhcCgtfC8fW1rfc4q7GnnzSdxIR/55/HjZscDtPhtWll0JGBjzzjO8koaGdMsW/H37YtYve\n88/v2o0ybK65BqZNg08/deePiKSinTshM9Ptcvvvf/tOUzU33wyvvw5ffAHp6b7TJIR2ypRoGTvW\nLS/73e8AwllMAFx/vWvMDNrBRyLJNH48fPyxW1IddjfcAGvXusPD5JBUUIhfsRj85S/uQJ5WrXyn\nqZqOHd1pik8/7TuJiB/Wup/n7t2hUyffaarujDOgc2dNZZaTCgrx6+233Va3paMToWYMXHedOzhs\n7VrfaUSSb/58mDs33L0Te7vxRjfq+OmnvpMEngoK8euJJ9xVwNkBXxpaXldc4fam+Oc/fScRSb6n\nnoITToBzz/WdJH4uuQQaNNDIYzmooBB/vvgCJk50hwaFtW9ibw0but0zn3lGJxZKatm40fVDXXtt\ntJqSa9WCq66CZ591DeRyQCooxJ+nn4bateHyy30nia/rr3fDo/n5vpOIJM9LL8H27W61U9TccAOs\nXw9vvuk7SaCpoBA/SkrcVfyVV7q13lHStatbNqchUkkV1rrGxUGD4NhjfaeJv5Yt3c/1P/7hO0mg\nqaAQP9580zUu/upXvpPEX1lz5htvuM19RKJuzhz44AN3JR9VV1wBeXn6mT4IFRTixxNPuIq/dWvf\nSRLjyivd7Qsv+M0hkgxPPQVNm0K/fr6TJM7gwe427Jt1JZAKCkm+pUtdf0EURyfKNGrkhn9ffNF3\nEpHE+vZbd9ru9de7MzCi6sgjoW9f13gq+xXhf30JrCefdG+4F13kO0liXX45LFoERUW+k4gkzgsv\nuHNsfvEL30kSb8gQeOcdt7Ov7EMFhSTX99/Dc8+5I79r1PCdJrEGDoT69eHll30nEUkMa+Fvf4ML\nL4TGjX2nSbwLL4SaNd2IjOxDBYUk14QJ8N130VxatreaNd0ozMsvu1+8IlGzeDH85z+pMToBUK8e\nnHeepj0OQAWFJNfzz7u98U891XeS5LjsMvjsM7cdsUjUvPSS6y2IcjPm3i69FBYuhP/+13eSwFFB\nIcmzbh1MmeJ2nUsV3bu7dfma9pCo2bnTfV9feqnbbj5VnHee2zvnX//ynSRwVFBI8owd67rAL7nE\nd5LkqVbN/cJ95RXXuCYSFfn5sGaN258hldSq5Xopxo7VVOZeVFBI8jz/vDum/IgjfCdJrssvd9v2\nTpvmO4lI/Lz0EjRvDmed5TtJ8g0Z4pa/L1niO0mgqKCQ5PjwQ7eEMpWmO8q0awenneZ+AYtEwdat\n8NprbnQiKgf7VUSfPu7CaNw430kCRQWFJMcLL8Dhh0frWOPyMsaNUrzxhvtFLBJyNicHioujd7Bf\neaWnu9HWnBzfSQJFBYUk3s6dbsfIIUPgsMN8p/Hjsstg82a3bFYkhIqLixk27G6aNevD1F/8hkWH\n1WPYX1+guLjYdzQ/srPdktlPP/WdJDBUUEjiTZ8Oq1en5nRHmZNPhvbt3TCxSMgUFxeTlTWYMWOy\nKF4xlp7bvuYfP/yJMWOyyMoanJpFRb9+7gJJFwk/UkEhiff8827fiVRs3trd4MHw1ltut1CREBkx\n4iGKim4lFhvAxfwbg+UVLiUWG0BR0XBGjnzYd8Tkq1sXevfWtMduVFBIYm3d6noHrrwyNZu3djd4\nMGzZAm+/7TuJSIVMmDCbWKw/AJfxMm/Tjw0cBUAsNoCcnNk+4/mTnQ0zZ7oD0kQFhSTY5MnuTTSV\n9p44kNNOg5YtNe0hoWKtpaSkDmBozBq6Mptx7P7zbCgpqY1NxT0Zzj/f9YhNmeI7SSCooJDEevVV\naNMmdbbaPpTBg92c6w8/+E4iUi7GGNLTtwCWn/AGO6lGDtm7PcKSnr4Fk4ojkMcf73qjNO0BqKCQ\nRPr+e5g4ES6+2HeS4PjpT93haPn5vpOIlNugQV1JS8tlMK+RT0++5fAfP5aWNoXs7LM9pvMsO9uN\nxOoiQQWFJFDZdIcKil3atIGTToLXX/edRKTcRo26naxT7qc7BbzGT0vvtaSlTSYzczT33nub13xe\nZWfDxo3wzju+k3ingkIS59VX4YwzNN2xO2PctMebb7q5V5EQyMjIIO+Wi0kjxsImL3PccRfQtGk/\nhg6dS2Hha2RkZPiO6E/btm7qQ9MepNARcZJU33/vegXuvNN3kuD56U/hwQdh1ix3GqlICNScNAnO\nOYd5M2dirU3Nnon9MQYGDXIFxaOPpvRqNo1QSGJMmaLpjgPp2BGOO07THhIe330HeXludA1UTOwt\nOxtWrHA7Z6YwFRSSGK++Cq1bu6WSsqe0NPjJT1xBEYv5TiNyaJMmQUmJG12TffXsCbVru9cphamg\nkPgrm+7Q6MSBDR4MX34J8+f7TiJyaK+95kbWmjTxnSSYatSAHj1g6lTfSbxSQSHxl5vrDsJSQXFg\nZ58NDRuqkUuCb8sWN4VZOt0hB9C3r+uLSuGt9VVQSPyVTXe0aOE7SXBVr+6Ocp840XcSkYObPNm9\nSaqgOLi+fWH79pRePqqCQuLrhx/cPKLmWg9t0CBYsgS++MJ3EpEDe/11t/z75JN9Jwm2li3h2GNT\netpDBYXE1zvvuE1eLrjAd5LgGzDAjVRolEKCascON0Khn+dDMwb69Enpw/9UUEh85eS4TV7atvWd\nJPjq14du3VwDq0gQzZ7tlowOGuQ7STj06wfvvw/r1vlO4oUKCokfa11BkZ2d0pu7VMigQTB9umti\nFQmaiROhcWPo0MF3knDo08fd5uX5zeGJCgqJnw8/dJu7ZGcf8qFSatAg13eSwvOuEmATJsB557m9\nU+TQjj7a9Zuk6M+zvkskfsaPh4wMtx5byufkkyEzU9MeEjwffwzLlsH55/tOEi59+7qCwlrfSZJO\nBYXET06OazSsUcN3knAZNMitjNGumRIkkybBYYftGsaX8unbF1avhqIi30mSTgWFxMfq1TBvnqY7\nKmPQIFi/3r1+IkExYQL06gV16/pOEi7nnOMuqlJw2iMpBYUx5mZjzHJjzPfGmDnGmLMO8tirjTEx\nY8zO0tuYMWZrMnJKFUycCNWquc2apGKysuDwwzXtIcGxcSPMnKnpjsqoXdvthJuCy0cTXlAYY34G\nPAzcDbQDlgC5xphGB/m0jUDj3f6cmOicUkU5Oe6H6PDDfScJn7JCTAWFBEVurtuDQgVF5fTtCzNm\nuIbrFJKMEYrhwFPW2uettUuBG4GtwC8P8jnWWrvBWru+9M+GJOSUytqyxS2T0nRH5Q0a5Nava9dM\nCYKJE932+SfqWq5S+vZ1vxfnzPGdJKkSWlAYY9KBDsC0svustRbIA7IO8ql1jTErjDFfGGPeNMa0\nTGROqaKpU90e9tr8pvL69XMjFVOm+E4iqW7nTnjrLY1OVEWbNtCggZs2SiGJHqFoBFQD9t42bB1u\nKmN/luFGL7KBy3EZ3zXGHJeokFJFOTlu6eMpp/hOEl4NGrheismTfSeRVDdnDnz9tS4QqqJaNTcF\nnGIFRXVPX9cA+12ka62dA/w4TmSMKQSKgOtxfRj7NXz4cOrXr7/HfUOGDGHIkCHxyCsHYq27qr78\nct9Jwm/gQLj/fjfvethhvtNIqpo0CRo1go4dfScJt27d4A9/gJISSE/3nQaAsWPHMnbs2D3u27hx\nY9yeP9EFxVfATuDove4/in1HLfbLWrvDGLMIaH6wx40ePZr27dtXKqRUwfvvw5o1bv8JqZoBA2DE\nCHj3XW0OJv5MmQL9+7urbKm8bt1cH8WiRYEpzvZ3kb1w4UI6xGlr9YROeVhrS4AFQO+y+4wxpvTv\n75bnOYwxaUArYE0iMkoVTZ4Mdeq44T2pmrZt3da96qMQX9audW+AukCouvbt3RLSGTN8J0maZKzy\neAS43hhzlTGmBfAkUBv4J4Ax5nljzH1lDzbG/N4Y09cY08wY0w54Cbds9JkkZJWKmjLFbX6j3TGr\nLi3NXRmqj0J8Kds7oV8/vzmiID0dunRJqT6KhBcU1tpxwG3AH4FFwBlA/92Wgh7Png2aDYG/AR8B\nk4C6QFbpklMJkk2b3PHGupqJn4ED3TTSqlW+k0gqys11J4sedZTvJNHQrRu8845bOZMCkrJTprX2\ncWttU2ttLWttlrV2/m4f62Wt/eVuf7/VWtus9LHHWmsHWWvfT0ZOqaBp09zmNyoo4qdvXzdSkZvr\nO4mkmp073fdd//6+k0RH9+5u19EPP/SdJCl0lodU3pQpcOqpcNJJvpNExxFHuAYuTXtIsi1c6JaL\n6gIhfjp2dCu2UmTaQwWFVI617k1v4EDfSaJnwAC3WdiOHb6TSCqZMgXq1YPOnX0niY6aNaFTJxUU\nIgdVVAQrV+pqJhEGDnTDpCm2ba94lpvrjioPyJ4JkdGtmyso7H63XooUFRRSOVOmuOq7e3ffSaKn\nQwc39aHlo5Is334LhYXqn0iEbt1g/Xrs0uivK1BBIZUzebLbfKlWLd9JoqdaNS0fleSaNg1iMRUU\ncVZcXMxvX5/ODgx3drmUZs36MGzY3RQXF/uOlhAqKKTitmxxQ3ia7kicAQNck9z69b6TSCrIzXXn\n8eh00bgpLi4mK2swjzzdg4WcSevvWrNixVTGjMkiK2twJIsKFRRScfn57rwJNWQmTp8+7jYvz28O\nib6y83h0gRBXI0Y8RFHRrcRiA5hJN7rjdsyMxQZQVDSckSMf9pww/lRQSMW9/TY0barTRRPpmGOg\ndWu32kMkkT76CL78UtMdcTZhwmxiMfeazqQbTfiSE/kccEVFTs5sn/ESQgWFVFxentuAyRjfSaKt\nb19XUKRAd7h4lJvrGqy7dfOdJDKstZSU1MEdrA2FZAHQ+ceDtA0lJbWxEfvZVkEhFbNqlVsyWjYk\nL4nTt++u11skUfLy4Jxz1GAdR8YY0tO3AK5g+Ioj+YSTdysoLOnpWzARuyhTQSEVM22au+3Z02+O\nVNCtm9tlT9Mekijbt7vTMHWBEHeDBnUlLW3XFvqFZJFFIQBpaVPIzo7eCc0qKKRipk1zx2wfeaTv\nJNFXu7Y7Fl4FhSTKnDmwdasbDZO4GjXqdjIzHyEtbTJgmUNn2rGIWmY8mZmjuffe23xHjDsVFFJ+\n1rrhUV3NJE/fvlBQ4FbViMTb1KluE7U2bXwniZyMjAwKC19j6NC5NG3aj8+OHMdhlDDqohwKC18j\nIyPDd8S4U0Eh5bd0KaxeDb17+06SOvr2dft+FBb6TiJRlJfnfp7T9FaQCBkZGTz22D0sXz6Vt76c\nCrVqMbzz6ZEsJkAFhVTEtGlun/9zzvGdJHW0a+euIDXtIfH23Xcwb56mO5LEHHYYnHlmpM/oUUEh\n5ZeXB126QJ06vpOkjrQ0N8WkgkLiLT/fbbetKczk6dw50qONKiikfHbscL+A9Msn+fr2dVeS33zj\nO4lESV4eNG/uNqmT5MjKcpuIffml7yQJoYJCymfBAti0Sf0TPvTt6xpip0/3nUSiZOpUXSAkW6dO\n7nbuXL85EkQFhZRPXh5kZMBZZ/lOknpOOAFOO03THhI/n38OH3+s/olkO/ZY9/Mc0WkPFRRSPtOm\nuc2sqlf3nSQ19e3rzlARiYe8PNefow3qki8rK7KNmSoo5NC2boXZszXd4VOfPrBiBXz2me8kEgV5\neW7FQcOGvpOkns6d3RRyBPeWUUEhhzZrlvvm13yrP927uyvKsq3PRSorFtMGdT517gzbtsGSJb6T\nxJ0KCjm0/Hw4+mjIzPSdJHU1aOCuKFVQSFW9/z589ZX6J3xp186d0RPBaQ8VFHJoBQXQo4eOK/et\nd2+30iMW851Ewmz6dHdceVaW7ySpqUYNaN9eBYWkoM2bYf58V1CIX717w4YN8OGHvpNImE2b5g6d\nq1HDd5LUFdENrlRQyMG9+67b1Kp7d99JpEsX9yagaQ+prJISmDkTevXynSS1deoEy5e7C4QIUUEh\nB1dQAEcdBS1a+E4itWpB164qKKTy5s93o44qKPw680x3u3Ch3xxxpoJCDm7GDDc6of6JYOjd2/2b\nlJT4TiJhNH061KsHHTr4TpLaTj4Z6td3BV6EqKCQA9uyBd57T/0TQdK7t7vCnDfPdxIJo+nT3QWC\nNqjzyxhX1C1Y4DtJXKmgkAMrLHT9EyoogqNDB3eFqWkPqaht29wGdZruCIYOHTRCISmkoACOPFL7\nTwRJ9equwFNBIRVVWAjbt6ugCIozz4SVK2H9et9J4kYFhRxYQYH6J4Kod2/35rB1q+8kEibTp0Oj\nRtCqle8kArv6WCI07aGCQvZv61bXP6HlosHTu7fbCn3WLN9JJEymT3eHgaXp134gnHSS2wFXBYVE\nXmGhW0mg/ongadkSGjfWtIeUX3Gxu0DQdEdwlDVmRqiPQgWF7F9BgRsebdnSdxLZmzFulEIFhZTX\nrFmuwVoFRbCceaZGKCQFzJgB3bppeDSoevaERYvgu+98J5EwmD4djj8eTjnFdxLZXYcO8OWXsG6d\n7yRxoXcL2dfWrTB3rqY7gqxXL3dI2MyZvpNIGEyf7r5n1GAdLGU7ZkZklEIFhexr7lzX9KeGzOBq\n1gxOPNG9UYgczDffuNEsTXcET9Om0LBhZPooVFDIvt55x3Ufa3lZsPXqBfn5vlNI0M2YAda6aTIJ\nFmMi1UehgkL2NWuWO4RK/RPB1rMnvP9+5E4slDgrKHBLFE84wXcS2Z8IbcGtdwzZ044dbsno2Wf7\nTiKHUnbFOWOG3xwSbPn56ocKsjPPhFWrYO1a30mqTAWF7On9993hUyoogq+sa199FHIgGzbABx9o\nuiPIIrRjpgoK2dOsWXDYYbu6jyXYevZUH4UcWNkqII1QBNeJJ8IRR0SiMVMFhexp1izo2BFq1vSd\nRMqjVy9YuhRWr/adRIIoPx+aN3ejWRJMETrKXAWF7GKtW+Gh6Y7wKLvyLCjwmUKCSv0T4aCCQiLn\ns89cY5AKivA4+mg4/XTIz8da6zuNBMn69fDRR+qfCIO2bd0oY8hXbKmgkF3KTq/s0sVvDim34uJi\nZlSrzef/fIkmTS6kWbM+DBt2N8XFxb6jiW9lo1YaoQi+tm3d7ZIlfnNUkQoK2WXWLLeZVcOGvpNI\nORQXF5OVNZi/ftCfE3d8T7VVf2XFiqmMGZNFVtZgFRWprqAATj0Vjj3WdxI5lJNPhtq1VVBIhMya\npemOEBkx4iGKim4l3w4nhqEn+YAhFhtAUdFwRo582HdE8Sk/X9MdYVGtGrRurYJCImLDBrdaQAVF\naEyYMJsV/zNkAAAgAElEQVRYrD/fcjhLaEMvdu1HEYsNICdntsd04tWaNe7nWdMd4dGmDSxe7DtF\nlaigEOfdd93tOef4zSHlYq2lpKQO4E6PzKcnPSgAyhozDSUltdWomarKdk9VQREebdtCURFs3+47\nSaWpoBDnnXegSRPt9x8SxhjS07dQVkDk05MTWEkzlpc+wpKevgWj46pTU34+tGgBjRv7TiLl1aaN\nO/qgqMh3kkpTQSGO+idCZ9CgrqSl5QLwDuewk7TSPgpIS5tCdrb+PVNWQYH6J8KmdWt3G+I+ChUU\nAlu3uk1VVFCEyqhRt5OZ+QhpaZPZSH0W0Y4eFJCWNpnMzNHce+9tviOKD6tXw3//q+mOsMnIcKs9\nQtxHoYJCYN48N9TWtavvJFIBGRkZFBa+xtChc2natB/z635Hn2qvMvTmORQWvkZGRobviOKD+ifC\nq21bjVBIyBUWQt26bg8KCZWMjAwee+weli+fyg1jH+WYndt5bNiVKiZSWUEBtGwJRx3lO4lUVJs2\nrqAIaTO1CgpxBUWnTm4ttISWOeccSEvT6aOprqAAunf3nUIqo00b+OYb+PJL30kqRQVFqrPWFRRZ\nWb6TSFXVr+8OGdJBYalL/RPhFvItuFVQpLpPP3WbWqmgiIYePdwIRUiHTKWKyvonNEIRTk2aQIMG\nKigkpAoL3W3nzn5zSHz07Ol2Sfz4Y99JxIeCAsjMdKfQSvgYs6uPIoRUUKS6wkK3Ac7hh/tOIvFw\n9tmuF0Z9FKmpoEDTHWEX4i24VVCkOvVPREtGBpx5pvooUtGaNeqfiIK2beGTT2DLFt9JKkwFRSor\nLob331dBETXqo0hN6p+IhjZt3M/uBx/4TlJhKihS2bx5EItBly6+k0g89ewJ69bBsmW+k0gyqX8i\nGlq2dNOWIZz2UEGRygoL3VLDzEzfSSSeunaF6tXVR5Fq1D8RDTVrur62EDZmqqBIZWUbWqXp2yBS\n6taFs85SH0UqWbPGjUipoIiGkK70SMo7iTHmZmPMcmPM98aYOcaYsw7x+IuNMUWlj19ijBmYjJwp\nxVqsGjKjq0cPV1CojyI1lPVPdOvmN4fER+vW8J//hO7nN+EFhTHmZ8DDwN1AO2AJkGuMaXSAx2cB\nLwNPA22BN4E3jTEtE501FRQXFzNs2N30btIF8803XPXkeIYNu5vi4mLf0SSeevSA9eth6VLfSSQZ\nCgrcMHnjxr6TSDy0agWbNoVuC+5kjFAMB56y1j5vrV0K3AhsBX55gMf/GphsrX3EWrvMWns3sBAY\nmoSskVZcXExW1mDGjMmiyarriWEYvy6fMWOyyMoarKIiSrp0cX0UmvZIDTq/I1pOP93d/uc/fnNU\nUEILCmNMOtABmFZ2n7XWAnnAgcbas0o/vrvcgzxeymnEiIcoKrqVWGwAWczhI1qyiQbEYgMoKhrO\nyJEP+44o8VK3LnTsqIIiFZT1T/Ts6TuJxMuJJ0KdOvDhh76TVEiiRygaAdWAdXvdvw440Nhc4wo+\nXsppwoTZxGL9AciikHfZtVw0FhtATs5sX9EkEdRHkRq0/0T0pKW5UYqQFRTVPX1dA1Tkt9whHz98\n+HDq16+/x31DhgxhyJAhFU8XQdZaSkrqAIYMNtGKD3mU3+z2CENJSW2stRhjfMWUeOrRA+67D4qK\n3Np2iaYZM9Q/EUWtWsV9pcfYsWMZO3bsHvdt3Lgxbs+f6ILiK2AnsPdOK0ex7yhEmbUVfDwAo0eP\npn379pXJmBKMMaSnbwEsZzKfNCxz2P1AMEt6+hYVE1Gyex+FCoro0v4T0XT66TB2rNt8ME5L+/d3\nkb1w4UI6dOgQl+dP6JSHtbYEWAD0LrvPuHes3sC7B/i0wt0fX6pv6f1SBYMGdSUtLZeOvMcmMljG\naT9+LC1tCtnZZ3tMJ3FXp476KKJu7Vq3kkfTHdHTqhV8/z0sX+47SbklY5XHI8D1xpirjDEtgCeB\n2sA/AYwxzxtj7tvt8Y8BA40xtxpjTjPG3INr7Py/JGSNtFGjbicz8xE6k8M8ziJGNcCSljaZzMzR\n3Hvvbb4jSrypjyLa1D8RXa1audsQ9VEkvKCw1o4DbgP+CCwCzgD6W2s3lD7keHZruLTWFgJDgOuB\nxcBPgQustR8lOmvUZWRkUPjuv+lZ5wOW1v+M4467gKZN+zF06FwKC18jIyPDd0SJt549YcMG10ch\n0VNQAKedBscc4zuJxNsxx0DDhqEqKJLSlGmtfRx4/AAf67Wf+14DXkt0rlSUsXEjbNnMzW++yE3Z\n2eqZiLqsLEhPd+d6qI8ietQ/EV3GuD6KEO1FoUMcUs1777nbjh1VTKQC9VFE17p1rn9CBUV0tWoV\nqhEKFRSpZu5caNJEQ6SpRH0U0aT+iehr1coVjSUlvpOUiwqKVDN3rjthVFJHjx7w1VfwkdqQIqWg\nAE49VRcHUdaqlSsmPv7Yd5JyUUGRSnbsgPnz3RC4pI4uXXb1UUh0qH8i+kJ2pocKilTy0UewdatG\nKFJN7dru31x9FNGxbp1buaOCItoaNYKjjw5NH4UKilQydy5UqwZx2hVNQqSsjyIW851E4kH9E6kj\nRI2ZKihSydy57puzTh3fSSTZevaEr78OzdCpHMKMGa5/4thjfSeRRAvRIWEqKFLJe++pfyJVZWXB\nYYepjyIq8vM1OpEqWrWCTz6Bbdt8JzkkFRSpYvNmd3Wq/onUVKsWdO6sPoooKOuf6NnTdxJJhlat\n3FTl0qW+kxySCopUMX+++6ZUQZG6evRwQ+Xqowi3sqJQDZmpoWylRwimPVRQpIq5c6FuXcjM9J1E\nfOnZE775Bj74wHcSqQqd35Fa6tVzmxGqoJDAeO89OPNMt8pDUlPnzlCjhvoowi4/X6MTqeb000Ox\nMZ0KilQxd64aMlNdzZquOVN9FOG1Zg0sW6b+iVSTmRmKE4NVUKSCNWtg1SoVFOLeiGbMgJ07fSeR\nyigrBrXCI7W0aAGffQbbt/tOclAqKFLB/Pnu9swz/eYQ/3r0gO++g/ff951EKqOgwF2tNm7sO4kk\nU2ama6YO+JkeKihSwfz5cOSRcMIJvpOIb506uakP9VGEk/onUlOLFu424EtHVVCkgnnz3OiEMb6T\niG81arjDwtRHET6rVrkrVPVPpJ4jj4Qjjgh8H4UKiqiz1o1QaLpDyvTsCTNnqo8ibNQ/kdpC0Jip\ngiLqVq6EDRvgrLN8J5Gg6NEDNm6ERYt8J5GKKChwywePOsp3EvGhRQtNeYhn8+a5W41QSJmOHd2R\n5uqjCBf1T6S2zExXUAR4p1sVFFE3fz4cd5x21ZNdDjsMunZVQREmK1fCp5+qfyKVtWgB33/vvhcC\nSgVF1JU1ZIrsrlcv10dRUuI7iZSH+iek7NiEAPdRqKCIsrKGTPVPyN569oQtW3btUSLBVlDgTp1s\n1Mh3EvHlxBPdkm8VFOLFJ5+45juNUMjeOnSAjAxNe4TF9OluVElSV1qaOxQuwI2ZKiiirOzqs0MH\nvzkkeKpXh27d3BuVBNvy5bBihQoKCfzSURUUUTZ/PjRrpmFS2b9evWD27MCfD5Dypk93V6fqn5CA\nLx1VQRFlasiUg+nZE7ZtgzlzfCeRg5k+Hdq3hwYNfCcR3zIz3b5CX3/tO8l+qaCIqp07YeFCNWTK\ngbVpAw0bqo8iyKx1/z6a7hDYdaZHQKc9VFBE1dKlrotfIxRyIGlpbqMk9VEE17JlsGaNCgpxTj3V\n/dwGdNpDBUVUlTVktm/vN4cEW69ebspj61bfSWR/pk93DbRnn+07iQRBzZquL04jFJJU8+a5JUb1\n6/tOIkHWs6fb3Ordd30nkf2ZPh06d4Y6dXwnkaAIcGOmCoqo0gmjUh4tW7rDpjTtETyxmPonZF8B\nXjqqgiKKduyAJUu0/4QcmjFulEKNmcHz/vvwzTcqKGRPLVq4fUm+/953kn2ooIiioiK3HFAFhZRH\nz55uimzTJt9JZDd22jQ3Z965s+8oEiSZmW71z3//6zvJPlRQRNHChe62bVu/OSQcevVyy4xnzvSd\nJOUVFxczbNjdNGvWh2kjHmQWtRj22/soLi72HU2CIsBLR1VQRNGCBW55Ub16vpNIGDRvDk2awLRp\nvpOktOLiYrKyBjNmTBZfrniLTtu38Na22xgzJousrMEqKsQ5/HDX9xTAxkwVFFG0cKGWi0r5GQO9\ne6ug8GzEiIcoKrqVWGwAHVhIBpuZTm9isQEUFQ1n5MiHfUeUoHjjDbjuOt8p9qGCImp27oRFi9Q/\nIRXTpw988AGsX+87ScqaMGE2sVh/AHoxnWLqMh+3UisWG0BOzmyf8SRIunSB447znWIfKiii5r//\ndZsUaYRCKqJsJYGWj3phraWkpA5gAOjNNArowU6qlz7CUFJSG2utt4wih6KCImoWLHC3KiikIo45\nxu1JoWkPL4wxpKdvASy12MrZzCKPPrs9wpKevgVjjK+IIoekgiJqFi6Ek07SyYRSceqj8GrQoK6k\npeXSldnU4Ic9Coq0tClkZ2v7bQk2FRRRs2CB+iekcnr3huXL4bPPfCdJSaNG3U5m5iP05W+soTEf\n0RKwpKVNJjNzNPfee5vviCIHpYIiSmIx15Cp6Q6pjO7d3UmGGqXwIiMjg8LC1xhy5Gzm1IHjjruQ\npk37MXToXAoLXyMjI8N3RJGDqn7oh0hofPIJFBdrhEIqp0EDd/7LtGmBXJKWCjK2byfjq7U0efZZ\nLrzqKvVMSKhohCJKynbI1AiFVFbv3m6lRyzmO0lqys932yr37q1iQkJHBUWULFgAJ54IRxzhO4mE\nVZ8+sGEDfPih7ySpKS/Pba18/PG+k4hUmAqKKNEOmVJVXbq4A6nUR+FHXp4r6kRCSAVFVFjrCgr1\nT0hV1KwJXbuqoPDhs8/cHxUUElIqKKJi+XL47juNUEjV9e4NM2ZASYnvJKll2jS3yqZHD99JRCpF\nBUVUaIdMiZe+fWHzZpgzx3eS1JKXBx07Qv36vpOIVIoKiqhYuNAdFnP00b6TSNi1a+eOSJ461XeS\n1BGLuREKTXdIiKmgiAo1ZEq8VKvm3tjeftt3ktSxZAl8/bUKCgk1FRRRYK3bIbNdO99JJCr69YN5\n8+Dbb30nSQ1vvw21a0Pnzr6TiFSaCoooWL3a7R2ggkLipW9fNwyv48yTIzcXevaEGjV8JxGpNBUU\nUbBokbtVQSHxcsIJcNppmvZIhs2bYdYs6N/fdxKRKlFBEQWLF0PDhu5NQCRe+vVzBYW1vpNEW0GB\nW6KrgkJCTgVFFCxaBG3bgvb+l3jq2xdWrIBPP/WdJNpyc6FpUzjlFN9JRKpEBUUUqCFTEqFHD6he\nXctHEy03141O6IJAQk4FRdh9953bJVMFhcRbRgZkZamPIpGWL4ePP9Z0h0SCCoqwW7zY3aqgkETo\n18+t9Nixw3eSaMrNdft+9OrlO4lIlamgCLtFi9yBTqed5juJRFG/frBpE7z3nu8k0ZSb60aBtN22\nRIAKirBbvBhat3Zz3SLx1qGDW0GkaY/4Kylx221rukMiQgVF2KkhUxKpWjV3+qgKivibMweKi1VQ\nSGSooAizbdvgo49UUEhi9e8Pc+dqG+54y82FI47QGTwSGSoowuzDD2HnThUUklgDBrhtuDVKEV+5\nuW6vj2rVfCcRiQsVFGG2aBGkpbkeCpFEOf549z02ebLvJNHx1VewYIGmOyRSVFCE2eLFbnVH7dq+\nk0jUDRwIU6a4kQqpurItzfv1851EJG4SWlAYYxoaY14yxmw0xnxrjHnGGFPnEJ9TYIyJ7fZnpzHm\n8UTmDC01ZEqyDBwI69bt2vdEqmbSJPeze+yxvpOIxE2iRyheBjKB3sB5QDfgqUN8jgX+BhwNNAaO\nAX6XwIzhtHMnLFmigkKSo2tXt3Ompj2qbudON9pz7rm+k4jEVcIKCmNMC6A/cI21dr619l3gFuBS\nY0zjQ3z6VmvtBmvt+tI/mxOVM7Q+/hi2blVBIcmRng59+qigiIe5c+Gbb+C883wnEYmrRI5QZAHf\nWmsX7XZfHm4EotMhPvdyY8wGY8wHxpj7jDG1EpYyrBaVvqxt2/rNIalj4EAoLNTy0aqaNAkaNYKO\nHX0nEYmrRBYUjYH1u99hrd0JfFP6sQN5CbgC6AHcB1wJvJCYiCG2eDE0aeLWsYskw8CBrilTp49W\nzaRJbimulotKxFR4v2ZjzJ+BOw7yEIvrmzjgU5Q+Zv+fbO0zu/31P8aYtUCeMaaZtXb5gT5v+PDh\n1N9rP/whQ4YwZMiQg0QJscWLNTohyXX88dCqFbz1Flxyie804bRqlet9uvNO30kkBY0dO5axY8fu\ncd/GjRvj9vyVOQDiIeDZQzzmM2AtcNTudxpjqgENgXUV+HpzcUVIc+CABcXo0aNpn0o7zi1ZAtdd\n5zuFpJqBA+H5591IRZpWnVfYW2+5103LRcWD/V1kL1y4kA4dOsTl+Sv8G8Fa+7W19r+H+LMDKAQa\nGGN27xrsjSsO5lbgS7bDjWisqWjWyFq3zv1p08Z3Ekk1Wj5aNZMmQZcucPjhvpOIxF3CLjGstUuB\nXOBpY8xZxpiuwP8CY621awGMMccaY4qMMWeW/v0kY8xIY0x7Y8yJxphs4DlghrX2w0RlDZ0lS9yt\nCgpJtq5doW5drfaojO3bIS9PqzskshI9ZnkZsBS3umMiMBO4YbePpwOnAmVbPf4A9MEVIkXAg8Cr\nQHaCc4bLkiVQpw6cfLLvJJJqDjvMnT/x1lu+k4TPzJmwZYsKComsyvRQlJu19jvcio0DffxzoNpu\nf/8St7pDDmbxYjjjDM1hix/nnw/XXgsbNsCRR/pOEx6TJu1qbBWJIL0jhdGSJZruEH/KrrAnTfKb\nI2wmTXKvnTG+k4gkhAqKsNm2DZYuVUEh/hx9NHTuDDk5vpOEx7Jl8Mknmu6QSFNBETYffeTOAtAe\nFOJTdrY7MXPbNt9JwmH8eHcqcJ8+vpOIJIwKirBZvNgNmbZu7TuJpLJBg1yDYX6+7yThMH6823ui\nlk4RkOhSQRE2S5ZA8+ZulYeILy1bwkknadqjPNaudWegXHih7yQiCaWCImzUkClBYIyb9pgwAewB\nd9IXcK+RMW51jEiEqaAIE2tdQaH+CQmC7Gx3NsWiRYd+bCp7803o1k0H+UnkqaAIky++gO++0wiF\nBMPZZ0P9+pr2OJjiYpg2DS64wHcSkYRTQREm2nJbgiQ9Hc49VwXFweTmui23VVBIClBBESZLlkDD\nhm63PZEgyM52Ux4rV/pOEkxvvukuAJo1851EJOFUUIRJWf+EdtqToBgwAKpXh4kTfScJnpIS97po\ndEJShAqKMFm8WNMdEiwNGkD37vD6676TBM+MGbBxo5aLSspQQREWxcXw6acqKCR4LrrIbXD19de+\nkwTL+PFwwglalSUpQwVFWHzwgbtVQSFB85OfQCzm3kDFsda9HhdeqClKSRkqKMJiyRI3V92ype8k\nIns6+mi3z8K//+07SXC8955rVNV0h6QQFRRh8fOfu276GjV8JxHZ10UXQV4efPut7yTBMG7crkJL\nJEWooAiLWrWgVSvfKUT276c/dasaJkzwncS/WMwVFBddBNWq+U4jkjQqKESk6o49Frp2hVdf9Z3E\nvzlz4Msv4ZJLfCcRSSoVFCISHxddBG+/7ZZKprJx4+CYY9zW5CIpRAWFiMTH4MHwww+pvclVLOZG\naS6+GNL061VSi77jRSQ+mjSBzp1Te7XHu+/C6tWa7pCUpIJCROLnootg8mS3EVsqGjcOjjsOsrJ8\nJxFJOhUUIhI/gwe70zUnTfKdJPl27tR0h6Q0fdeLSPw0bQodO8LLL/tOknyzZsHatfCzn/lOIuKF\nCgoRia8rrnDTHhs2+E6SXOPGubM7OnXynUTECxUUIhJfl17qbl95xW+OZCopcc2oF12kszskZamg\nEJH4OvJIGDAAXnjBd5Lkyc2F9evhyit9JxHxRgWFiMTflVe6A7KWLfOdJDmeew7OOENHlUtKU0Eh\nIvE3aBDUqwcvvug7SeJ98w3k5MDVV/tOIuKVCgoRib9atdzyyRdfhFgMa63vRInzyituyehll/lO\nIuKVCgoRSYitgwfDihVcctxZNGlyIc2a9WHYsLspjtqmV889B/37Q+PGvpOIeKWCQkTirri4mE63\nP8LnHEWfte1ZtWo8K1ZMZcyYLLKyBkenqFi2DObO1XSHCCooRCQBRox4iI+W3saLXMslvEoNtgGG\nWGwARUXDGTnyYd8R4+P556FBA8jO9p1ExDsVFCISdxMmzCYW688LXEkDNpJNzo8fi8UGkJMz22O6\nOInF3NLYn/0Matb0nUbEOxUUIhJX1lpKSuoAhmW0YBZduZEnd3uEoaSkdvgbNfPzYeVKTXeIlFJB\nISJxZYwhPX0L4AqGJ/gVvcjnNJaWPsKSnr4FE/YdJZ97Dk45xR3ZLiIqKEQk/gYN6kpaWi4A/+Yi\nNtDox1GKtLQpZGef7TNe1X39tTtZ9Je/1FbbIqVUUIhI3I0adTuZmY+QljaZHziMv3MNP+ef1DVv\nkJk5mnvvvc13xKr5xz9cD8U11/hOIhIYKihEJO4yMjIoLHyNoUPn0rRpP8YfPZ96bORvvZ6lsPA1\nMjIyfEesvFgMnngCLrnEnVsiIgBU9x1ARKIpIyODxx67h8cec42a5vzzGbJ2FdSt6zta1UyZAsuX\nw8sv+04iEigaoRCRhDPGwE03wcKFMG+e7zhVM2YMtG8PnTr5TiISKCooRCQ5BgyAE0900wVh9dln\nMHky3HyzmjFF9qKCQkSSo1o1uPFG+Ne/3CqJMHrySbcz5qWX+k4iEjgqKEQkecpWRTz+uN8clfH9\n9/D3v8MvfgG1a/tOIxI4KihEJHmOPBKuvRYefRQ2b/adpmJeeQW++QZ+9SvfSUQCSQWFiCTXb38L\nmzbB00/7TlJ+sRg8/DAMHAjNm/tOIxJIKihEJLlOOAGuvBIeegi2b/edpnwmTIAPP4S77vKdRCSw\nVFCISPLdcQesWePOwwg6a2HUKOjWDc4O+ZbhIgmkgkJEku+00+Cii+CBB2DHDt9pDm7qVLd3xsiR\nvpOIBJoKChHx46673L4Or7ziO8nB3XsvdOwIffr4TiISaCooRMSPtm3h3HPhvvtc02MQzZwJ77wD\nI0ZoIyuRQ1BBISL+jBwJH30EL73kO8n+jRoFZ5wB55/vO4lI4KmgEBF/srLg4ovhzjuDty/FvHnw\n9ttudCJNvypFDkU/JSLi11/+4rbi/stffCfZxVq3EqVFCxg82HcakVBQQSEifjVtCrfdBg8+CJ9/\n7juN8/rrkJ8PjzziziARkUNSQSEi/t15pzt06847fSdxZ3bcdpvrmxg40HcakdBQQSEi/mVkwJ//\n7E4inT3bb5YHH4TVq93ohIiUmwoKEQmGq66CDh3g17/2t9nVF1/A/ffDrbfCKaf4ySASUiooRCQY\n0tLg//4PFi1ye1P48NvfuqmXESP8fH2REFNBISLB0bkz/P738Ic/JH/qY9o0GDfOjVBkZCT3a4tE\ngAoKEQmWkSNdYXH55bBxY0K/lLXW/ce6dXDFFdCzp7sVkQpTQSEiwVK9uts589tv4Ve/cntCxFFx\ncTHDht1Ns2Z9aNLkQk5u2ptlZ3YmFovByy9rEyuRStJPjogET9Om8NRTMHYsvPBC3J62uLiYrKzB\njBmTxYoVU1m1ajxXfn42zb/8gmtrNaG4Tp24fS2RVKOCQkSC6dJL4eqr4YYb3CZTcTBixEMUFd1K\nLDYAMPQmj//Hn7iHe3hu5Z8YOfLhuHwdkVSkgkJEguvJJ6FbN7fJ1KxZVX66CRNmE4v1B+BEVvAS\nl5NHH+7jLmKxAeTkeN4DQyTEVFCksLFjx/qOEDp6zSqn0q9bzZrwxhvQqZM76nzu3EpnsNZSUlIH\nMJzOh8ymK5upyxW8SIxqgKGkpPauRk3P9L1WOXrd/ElYQWGMucsYM9sYs8UY800FPu+PxpjVxpit\nxpipxpjmicqY6vSDV3F6zSqnSq9b7dqQk+OOEe/fH+bPr9TTGGNIT99CFrOZSTc2cCRdmc0Gjip9\nhCU9fQvGmMpnjSN9r1WOXjd/EjlCkQ6MA54o7ycYY+4AhgI3AB2BLUCuMeawhCQUkXCoWxfeesud\n/nn22fDAA5XaTfN3rY8ij958QGt6UMA6Gv/4sbS0KWRnnx3P1CIpJWEFhbX2D9bax4APKvBpvwb+\nZK2dYK39ELgKOBa4MBEZRSRE6tVzzZm33AJ33QVZWfBBOX+9LF8O11zDjW+NY05GPc41w9lI/dIP\nWtLSJpOZOZp7770tYfFFoi4wPRTGmGZAY2Ba2X3W2k3AXCDLVy4RCZBatdzhXe++C1u3urM/rrvO\nHTe+9yZY1rpC4sYb4dRTYeJEzEMPcdbny7j2lsU0bdqP4467gKZN+zF06FwKC18jQztkilRadd8B\ndtMYsMC6ve5fV/qxA6kJUFRUlKBY0bVx40YWLlzoO0ao6DWrnLi/bunp8Pe/w3PPweTJ8MwzbkOq\n0093jZxr18L69bB9O9SvDzfdBJdc4gqS5cu5+upsrr46G2vtjz0TH3/8cfzyxYG+1ypHr1vF7Pbe\nWbOqz2Uq0tFsjPkzcMdBHmKBTGvtf3f7nKuB0dbaww/x3FnALOBYa+263e4fB+yw1l52gM+7DHip\n3P8TIiIisrfLrbUvV+UJKjpC8RDw7CEe81kls6wFDHA0e45SHAUsOsjn5QKXAyuAbZX82iIiIqmo\nJtAU915aJRUqKKy1XwNfV/WLHuC5lxtj1gK9gfcBjDH1gE7AmENkqlJVJSIiksLejceTJHIfiibG\nmDbAiUA1Y0yb0j91dnvMUmPMBbt92qPASGPMIGNMa+B54EtgfKJyioiISNUlsinzj7hln2XKumR6\nAjNL//sU+HHtFtbavxhjagNPAQ2Ad4CB1tofEphTREREqqhCTZkiIiIi+xOYfShEREQkvFRQiIiI\nSEFsH9AAAATESURBVJVFpqAwxpxojHnGGPNZ6cFiHxtj7jHGpPvOFjTGmJuNMcuNMd8bY+YYY87y\nnSnIjDH/Y4x5zxizyRizzhjzhjHmVN+5wqT0NYwZYx7xnSXojDHHGmNeMMZ8Vfq7bIkxpr3vXEFl\njEkzxvxpt9/9nxhjRvrOFTTGmHOMMTnGmFWlP4vZ+3lMlQ7njExBAbTA7WNxHdASGA7cCIzyGSpo\njDE/Ax4G7gbaAUtwB7A18hos2M4B/he3hLkP7uC7t40xtbymConSgvU63PeaHIQxpgEwG9gO9Acy\ngduAb33mCrg7cQdK3oR7H/gd8DtjzFCvqYKnDrAYuBm3CeUe4nE4Z6SbMo0xtwM3Wmt1BHopY8wc\nYK619telfzfASuCv1tq/eA0XEqXF13qgm7V2lu88QWaMqQssAH4F/B5YZK291W+q4DLG3A9kWWu7\n+84SFsaYCcBaa+11u933b2CrtfaqA39m6jLGxIALrbU5u923GnjQWju69O/1cJtMXm2tHVee543S\nCMX+NAC+8R0iKEqnfzqw5wFsFshDB7BVRANcha/vrUMbA0yw1k73HSQkBgHzjTHjSqfXFhpjrvUd\nKuDeBXobY04BKN3/qCvwltdUIRKvwzmDdDhYXJXO/QwFdDW0SyOgGvs/gO205McJn9IRnUeBWdba\nj3znCTJjzKVAW+BM31lC5CTcaM7DuOnaTsBfjTHbrLUvek0WXPcD9YClxpiduAvlEdbaf/mNFSqV\nPZxzD4EvKCp5INlxwGTgFWvtPxIcMQoM+5lTk/16HNej09V3kCAzxhyPK7z6WmtLfOcJkTTgPWvt\n70v/vsQYczquyFBBsX8/Ay4DLgU+whWxjxljVltrX/CaLPwq9N4Q+IKCCh5IZow5FpiOu4K8IZHB\nQugrYCfuALbdHcW+lansxRjzf8C5wDnW2jW+8wRcB+BIYIEpOx/cjY51K22Wq2Gj3MBVeWuAor3u\nKwJ+6iFLWPwFuM9a+2rp3/9jjGkK/A+ggqJ8Kns45x4CX1BU5ECy0pGJ6cA84JeJzBVG1toSY8wC\n3AFsOfDjEH5v4K8+swVdaTFxAdDdWvuF7zwhkAe03uu+f+LeHO9XMXFAs9l3+vE04HMPWcKiNvte\nRceIfo9g3FT2cM69Bb6gKC9jzDFAAe4Y898BR5VdGFlrdfW9yyPAc6WFxXu45bW1cb/sZT+MMY8D\nQ4BsYIsxpmyEZ6O1dpu/ZMFlrd2CG37+kTFmC/C1tXbvK3DZZTQw2xjzP8A43C/0a3HLbmX/JgAj\njDErgf8A7XG/157xmipgSg/mbI4biQA4qbSB9Rtr7Up2Hc75Ce599E9U8HDOyCwbNcZcDezdL2Fw\nCxmqeYgUWMaYm3BF19G4dcm3WGvn+00VXKVLrPb3g/ILa+3zyc4TVsaY6cBiLRs9OGPMubhGw+bA\ncuBh9YIdWOkb5Z+An+CG6FcDLwN/stbu8JktSIwx3YF89v1d9py19pelj7kHuJ5dh3PebK39pNxf\nIyoFhYiIiPijOSYRERGpMhUUIiIiUmUqKERERKTKVFCIiIhIlamgEBERkSpTQSEiIiJVpoJCRERE\nqkwFhYiIiFSZCgoRERGpMhUUIiIiUmUqKERERKTK/j8YqI/Xw0uthQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f22718e5a10>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Taken from https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.interpolate.CubicSpline.html#scipy.interpolate.CubicSpline\n",
"import numpy as np\n",
"import scipy.interpolate\n",
"\n",
"x = np.arange(10)\n",
"y = np.sin(x)\n",
"cs = scipy.interpolate.CubicSpline(x, y)\n",
"xs = np.arange(-0.5, 9.6, 0.1)\n",
"\n",
"ys = cs(xs)\n",
"\n",
"import matplotlib.pyplot as plt\n",
"plt.plot(x, y, 'ob', label='real')\n",
"plt.plot(xs, ys, color='red', label='scipy.interpolate')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import stratify"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"class SplineInterp(stratify.PyFuncInterpolator):\n",
" def column_prep(self, z_target, z_src, fz_src, increasing):\n",
" self.spline = scipy.interpolate.CubicSpline(z_src, fz_src, axis=-1)\n",
" \n",
" def interp_kernel(self, index, z_src, fz_src, level, output_array):\n",
" output_array[:] = self.spline(level)\n",
" \n",
"\n",
"class SplineExtrap(stratify.PyFuncExtrapolator):\n",
" def column_prep(self, z_target, z_src, fz_src, increasing):\n",
" self.spline = scipy.interpolate.CubicSpline(z_src, fz_src, axis=-1)\n",
" \n",
" def extrap_kernel(self, direction, z_src, fz_src, level, output_array):\n",
" output_array[:] = self.spline(level)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"result = stratify.interpolate(xs, x, y,\n",
" interpolation=SplineInterp(),\n",
" extrapolation=SplineExtrap())"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f2243cae9d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"plt.plot(x, y, 'ob', label='actual')\n",
"plt.plot(xs, result, color='red', label='stratify')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Just to demonstrate that we are paying a price for dropping back into python at each iteration of the target levels, let's take a look at the execution time."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"100 loops, best of 3: 7.86 ms per loop\n"
]
}
],
"source": [
"%%timeit\n",
"result = stratify.interpolate(xs, x, y,\n",
" interpolation=SplineInterp(),\n",
" extrapolation=SplineExtrap())"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1000 loops, best of 3: 415 µs per loop\n"
]
}
],
"source": [
"%%timeit\n",
"cs = scipy.interpolate.CubicSpline(x, y)\n",
"ys = cs(xs)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [conda env:pre-proc-py2]",
"language": "python",
"name": "conda-env-pre-proc-py2-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment