Skip to content

Instantly share code, notes, and snippets.

@baldwint
Created January 15, 2014 23:07
Show Gist options
  • Save baldwint/8446568 to your computer and use it in GitHub Desktop.
Save baldwint/8446568 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#Using Sympy's `lambdify` with `IPython.parallel`\n",
"\n",
"For a numerical computation I am working on, I need to define a large Liouvillian matrix. Rather than program it in element by element, which is tedious and error-prone, I have used Sympy to construct it algebraically, and then use `lambdify` to make numpy matrices for use in numerical work.\n",
"\n",
"Here I construct a dumb sympy matrix that doesn't mean anything:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import sympy as s\n",
"from sympy.abc import x,y\n",
"s.init_printing()\n",
"\n",
"element = lambda n, m : m * x**n if (n+m) % 3 else y\n",
"L = s.Matrix([[element(n,m) for m in range(9)] for n in range(9)])\n",
"L"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left[\\begin{matrix}y & 1 & 2 & y & 4 & 5 & y & 7 & 8\\\\0 & x & y & 3 x & 4 x & y & 6 x & 7 x & y\\\\0 & y & 2 x^{2} & 3 x^{2} & y & 5 x^{2} & 6 x^{2} & y & 8 x^{2}\\\\y & x^{3} & 2 x^{3} & y & 4 x^{3} & 5 x^{3} & y & 7 x^{3} & 8 x^{3}\\\\0 & x^{4} & y & 3 x^{4} & 4 x^{4} & y & 6 x^{4} & 7 x^{4} & y\\\\0 & y & 2 x^{5} & 3 x^{5} & y & 5 x^{5} & 6 x^{5} & y & 8 x^{5}\\\\y & x^{6} & 2 x^{6} & y & 4 x^{6} & 5 x^{6} & y & 7 x^{6} & 8 x^{6}\\\\0 & x^{7} & y & 3 x^{7} & 4 x^{7} & y & 6 x^{7} & 7 x^{7} & y\\\\0 & y & 2 x^{8} & 3 x^{8} & y & 5 x^{8} & 6 x^{8} & y & 8 x^{8}\\end{matrix}\\right]$$"
],
"metadata": {},
"output_type": "pyout",
"png": "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\nlar7P0jGif8twfCUAAAAAElFTkSuQmCC\n",
"prompt_number": 1,
"text": [
"\u23a1y 1 2 y 4 5 y 7 8 \u23a4\n",
"\u23a2 \u23a5\n",
"\u23a20 x y 3\u22c5x 4\u22c5x y 6\u22c5x 7\u22c5x y \u23a5\n",
"\u23a2 \u23a5\n",
"\u23a2 2 2 2 2 2\u23a5\n",
"\u23a20 y 2\u22c5x 3\u22c5x y 5\u22c5x 6\u22c5x y 8\u22c5x \u23a5\n",
"\u23a2 \u23a5\n",
"\u23a2 3 3 3 3 3 3\u23a5\n",
"\u23a2y x 2\u22c5x y 4\u22c5x 5\u22c5x y 7\u22c5x 8\u22c5x \u23a5\n",
"\u23a2 \u23a5\n",
"\u23a2 4 4 4 4 4 \u23a5\n",
"\u23a20 x y 3\u22c5x 4\u22c5x y 6\u22c5x 7\u22c5x y \u23a5\n",
"\u23a2 \u23a5\n",
"\u23a2 5 5 5 5 5\u23a5\n",
"\u23a20 y 2\u22c5x 3\u22c5x y 5\u22c5x 6\u22c5x y 8\u22c5x \u23a5\n",
"\u23a2 \u23a5\n",
"\u23a2 6 6 6 6 6 6\u23a5\n",
"\u23a2y x 2\u22c5x y 4\u22c5x 5\u22c5x y 7\u22c5x 8\u22c5x \u23a5\n",
"\u23a2 \u23a5\n",
"\u23a2 7 7 7 7 7 \u23a5\n",
"\u23a20 x y 3\u22c5x 4\u22c5x y 6\u22c5x 7\u22c5x y \u23a5\n",
"\u23a2 \u23a5\n",
"\u23a2 8 8 8 8 8\u23a5\n",
"\u23a30 y 2\u22c5x 3\u22c5x y 5\u22c5x 6\u22c5x y 8\u22c5x \u23a6"
]
}
],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the case of this example, I could have constructed a numpy matrix directly using the same nested loop, but this isn't true of the matrix in my actual problem. Anyway it is nice to see it written out in algebraic notation before plugging in numbers.\n",
"\n",
"I use `lambdify` to get a Numpy matrix for my numerical work:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"numer_L = s.lambdify((x,y), L, 'numpy')\n",
"numer_L(3,4)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 2,
"text": [
"matrix([[ 4, 1, 2, 4, 4, 5, 4, 7, 8],\n",
" [ 0, 3, 4, 9, 12, 4, 18, 21, 4],\n",
" [ 0, 4, 18, 27, 4, 45, 54, 4, 72],\n",
" [ 4, 27, 54, 4, 108, 135, 4, 189, 216],\n",
" [ 0, 81, 4, 243, 324, 4, 486, 567, 4],\n",
" [ 0, 4, 486, 729, 4, 1215, 1458, 4, 1944],\n",
" [ 4, 729, 1458, 4, 2916, 3645, 4, 5103, 5832],\n",
" [ 0, 2187, 4, 6561, 8748, 4, 13122, 15309, 4],\n",
" [ 0, 4, 13122, 19683, 4, 32805, 39366, 4, 52488]])"
]
}
],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Say I want to do a computation involving this matrix (determinant, say) evaluated at multiple values of $y$:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# in series\n",
"import numpy\n",
"s_result = list(map(lambda y: numpy.linalg.det(numer_L(3,y)), range(30)))\n",
"s_result"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\begin{bmatrix}0.0, & 9.9284346199e-51, & 1.17528889921e-49, & 0.0, & 0.0, & 0.0, & 0.0, & 0.0, & 0.0, & 1.32486805867e-62, & -1.46681392565e-30, & 0.0, & 0.0, & -7.24249763767e-49, & 0.0, & 2.48513164374e-45, & 0.0, & 0.0, & 6.83960894448e-29, & 0.0, & 0.0, & 2.98238783422e-29, & -2.62584900178e-45, & 0.0, & 0.0, & 0.0, & 0.0, & 1.22565792285e-25, & 0.0, & 0.0\\end{bmatrix}$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 3,
"text": [
"[0.0, 9.9284346199e-51, 1.17528889921e-49, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.324\n",
"86805867e-62, -1.46681392565e-30, 0.0, 0.0, -7.24249763767e-49, 0.0, 2.4851316\n",
"4374e-45, 0.0, 0.0, 6.83960894448e-29, 0.0, 0.0, 2.98238783422e-29, -2.6258490\n",
"0178e-45, 0.0, 0.0, 0.0, 0.0, 1.22565792285e-25, 0.0, 0.0]"
]
}
],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# set up parallel environment. 2 engines started with `ipcluster start -n 2`\n",
"from IPython.parallel import Client\n",
"rc = Client()\n",
"dview = rc[:]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# in parallel\n",
"# do imports and push our lambda function over\n",
"dview.execute('import numpy')\n",
"dview.push(dict(numer_L=numer_L))\n",
"p_result = dview.map_sync(lambda y: numpy.linalg.det(numer_L(3,y)), range(30))\n",
"p_result"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "CompositeError",
"evalue": "one or more exceptions from call to method: <lambda>\n[0:apply]: NameError: global name 'ImmutableMatrix' is not defined\n[1:apply]: NameError: global name 'ImmutableMatrix' is not defined",
"output_type": "pyerr",
"traceback": [
"[0:apply]: ",
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)\u001b[0;32m<string>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m",
"\u001b[0;32m<ipython-input-5-1f431230550c>\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(y)\u001b[0m",
"\u001b[0;32m/Users/tkb/.virtualenvs/sympy/lib/python2.7/site-packages/numpy/__init__.pyc\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(x, y)\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: global name 'ImmutableMatrix' is not defined",
"",
"[1:apply]: ",
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)\u001b[0;32m<string>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m",
"\u001b[0;32m<ipython-input-5-1f431230550c>\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(y)\u001b[0m",
"\u001b[0;32m/Users/tkb/.virtualenvs/sympy/lib/python2.7/site-packages/numpy/__init__.pyc\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(x, y)\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: global name 'ImmutableMatrix' is not defined",
""
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That didn't work because apparently the lambda function needs `ImmutableMatrix` defined, which I hadn't ever heard of, and is not even the type of the matrix we lambdified:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"type(L)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 6,
"text": [
"sympy.matrices.dense.MutableDenseMatrix"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In any case, I don't want my engines running any Sympy code. The task I want to distribute is numerical, not algebraic, and hopefully lambdify has generated numpy code that can run on its own."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##My current workaround\n",
"\n",
"I inspected the `lambdify` source code and found a `lambdastr` function that ought to show me the code being generated:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sympy.utilities.lambdify import lambdastr\n",
"lstr = lambdastr((x,y), L, dummify=True)\n",
"lstr"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 7,
"text": [
"'lambda x,y: (ImmutableMatrix([[y, 1, 2, y, 4, 5, y, 7, 8], [0, x, y, 3*x, 4*x, y, 6*x, 7*x, y], [0, y, 2*x**2, 3*x**2, y, 5*x**2, 6*x**2, y, 8*x**2], [y, x**3, 2*x**3, y, 4*x**3, 5*x**3, y, 7*x**3, 8*x**3], [0, x**4, y, 3*x**4, 4*x**4, y, 6*x**4, 7*x**4, y], [0, y, 2*x**5, 3*x**5, y, 5*x**5, 6*x**5, y, 8*x**5], [y, x**6, 2*x**6, y, 4*x**6, 5*x**6, y, 7*x**6, 8*x**6], [0, x**7, y, 3*x**7, 4*x**7, y, 6*x**7, 7*x**7, y], [0, y, 2*x**8, 3*x**8, y, 5*x**8, 6*x**8, y, 8*x**8]]))'"
]
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It looks like this ought to work if I just import `numpy.matrix` as `ImmutableMatrix`, but no dice:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# in parallel\n",
"# do imports and push our lambda function over\n",
"dview.execute('import numpy')\n",
"dview.execute('from numpy import matrix as ImmutableMatrix')\n",
"dview.push(dict(numer_L=numer_L))\n",
"p_result = dview.map_sync(lambda y: numpy.linalg.det(numer_L(3,y)), range(30))\n",
"p_result"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "CompositeError",
"evalue": "one or more exceptions from call to method: <lambda>\n[0:apply]: NameError: global name 'ImmutableMatrix' is not defined\n[1:apply]: NameError: global name 'ImmutableMatrix' is not defined",
"output_type": "pyerr",
"traceback": [
"[0:apply]: ",
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)\u001b[0;32m<string>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m",
"\u001b[0;32m<ipython-input-8-f4a5fb6c80d1>\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(y)\u001b[0m",
"\u001b[0;32m/Users/tkb/.virtualenvs/sympy/lib/python2.7/site-packages/numpy/__init__.pyc\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(x, y)\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: global name 'ImmutableMatrix' is not defined",
"",
"[1:apply]: ",
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)\u001b[0;32m<string>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m",
"\u001b[0;32m<ipython-input-8-f4a5fb6c80d1>\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(y)\u001b[0m",
"\u001b[0;32m/Users/tkb/.virtualenvs/sympy/lib/python2.7/site-packages/numpy/__init__.pyc\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(x, y)\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: global name 'ImmutableMatrix' is not defined",
""
]
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I got it to work by pushing the generated code as a string, and doing the eval myself:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# in parallel\n",
"# do imports and push our lambda function over\n",
"dview.execute('import numpy')\n",
"dview.execute('from numpy import matrix as ImmutableMatrix')\n",
"dview.push(dict(lstr=lstr))\n",
"p_result = dview.map_sync(lambda y: numpy.linalg.det(eval(lstr)(3,y)), range(30))\n",
"p_result"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\begin{bmatrix}0.0, & 9.9284346199e-51, & 1.17528889921e-49, & 0.0, & 0.0, & 0.0, & 0.0, & 0.0, & 0.0, & 1.32486805867e-62, & -1.46681392565e-30, & 0.0, & 0.0, & -7.24249763767e-49, & 0.0, & 2.48513164374e-45, & 0.0, & 0.0, & 6.83960894448e-29, & 0.0, & 0.0, & 2.98238783422e-29, & -2.62584900178e-45, & 0.0, & 0.0, & 0.0, & 0.0, & 1.22565792285e-25, & 0.0, & 0.0\\end{bmatrix}$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 9,
"text": [
"[0.0, 9.9284346199e-51, 1.17528889921e-49, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.324\n",
"86805867e-62, -1.46681392565e-30, 0.0, 0.0, -7.24249763767e-49, 0.0, 2.4851316\n",
"4374e-45, 0.0, 0.0, 6.83960894448e-29, 0.0, 0.0, 2.98238783422e-29, -2.6258490\n",
"0178e-45, 0.0, 0.0, 0.0, 0.0, 1.22565792285e-25, 0.0, 0.0]"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"p_result == s_result"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 10,
"text": [
"True"
]
}
],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So, I kind of got things working, but it doesn't feel like the right way to do it, probably due to the way `lambdify` works. Is there a way to generate more parallelizable code from Sympy?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##Versions"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import sys\n",
"sys.version"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 11,
"text": [
"'2.7.3 (default, Nov 29 2012, 17:18:24) \\n[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))]'"
]
}
],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import IPython\n",
"IPython.version_info"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 12,
"text": [
"(1, 1, 0, '')"
]
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"s.__version__ # sympy"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 13,
"text": [
"'0.7.4.1'"
]
}
],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"numpy.__version__"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 14,
"text": [
"'1.8.0'"
]
}
],
"prompt_number": 14
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment