{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Lecture 10: Sparse direct solvers" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Recap of the previous part\n", "\n", "- Distributed memory for huge dense matrices\n", "- Sparse matrix formats (COO, CSR, CSC)\n", "- Matrix-by-vector product\n", "- Inefficiency of sparse matrix processing\n", "- Approaches to reduce cache misses" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Plan for today\n", "\n", "Sparse direct solvers: \n", "\n", "- LU decomposition of sparse matrices\n", "- fill-in of $L$ and $U$ factors\n", "- nested dissection\n", "- spectral clustering in details" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## LU decomposition of sparse matrix\n", "\n", "- Why sparse linear systems can be solved faster, what is the technique? \n", "\n", "- In the LU factorization of the matrix $A$ the factors $L$ and $U$ can be also sparse:\n", "\n", "$$A = L U$$\n", "\n", "- And solving linear systems with **sparse** triangular matrices is very easy. \n", "\n", " Note that the inverse matrix is not sparse! \n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[-2. 1. 0. 0. 0. 0. 0.]\n", " [ 1. -2. 1. 0. 0. 0. 0.]\n", " [ 0. 1. -2. 1. 0. 0. 0.]\n", " [ 0. 0. 1. -2. 1. 0. 0.]\n", " [ 0. 0. 0. 1. -2. 1. 0.]\n", " [ 0. 0. 0. 0. 1. -2. 1.]\n", " [ 0. 0. 0. 0. 0. 1. -2.]]\n", "[[-0.875 -0.75 -0.625 -0.5 -0.375 -0.25 -0.125]\n", " [-0.75 -1.5 -1.25 -1. -0.75 -0.5 -0.25 ]\n", " [-0.625 -1.25 -1.875 -1.5 -1.125 -0.75 -0.375]\n", " [-0.5 -1. -1.5 -2. -1.5 -1. -0.5 ]\n", " [-0.375 -0.75 -1.125 -1.5 -1.875 -1.25 -0.625]\n", " [-0.25 -0.5 -0.75 -1. -1.25 -1.5 -0.75 ]\n", " [-0.125 -0.25 -0.375 -0.5 -0.625 -0.75 -0.875]]\n" ] }, { "data": { "text/plain": [ "array([1.75000000e+00, 7.67644213e-17, 5.66270826e-36])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "import scipy.sparse as spsp\n", "n = 7\n", "ex = np.ones(n);\n", "a = spsp.spdiags(np.vstack((ex, -2*ex, ex)), [-1, 0, 1], n, n, 'csr'); \n", "b = np.array(np.linalg.inv(a.toarray()))\n", "print(a.toarray())\n", "print(b)\n", "np.linalg.svd(b[:3, 4:])[1]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## And the factors...\n", "\n", "$L$ and $U$ are typically sparse. In the tridiagonal case they are even bidiagonal!" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1. 0. 0. 0. 0. 0.\n", " 0. ]\n", " [-0.5 1. 0. 0. 0. 0.\n", " 0. ]\n", " [ 0. -0.66666667 1. 0. 0. 0.\n", " 0. ]\n", " [ 0. 0. -0.75 1. 0. 0.\n", " 0. ]\n", " [ 0. 0. 0. -0.8 1. 0.\n", " 0. ]\n", " [ 0. 0. 0. 0. -0.83333333 1.\n", " 0. ]\n", " [ 0. 0. 0. 0. 0. -0.85714286\n", " 1. ]]\n" ] } ], "source": [ "from scipy.sparse.linalg import splu\n", "T = splu(a.tocsc(), permc_spec=\"NATURAL\")\n", "print(T.L.toarray())" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Interesting to note that ```splu``` without ```permc_spec``` will produce permutations which will not yield the bidiagonal factor:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1. 0. 0. 0. 0. 0.\n", " 0. ]\n", " [-0.5 1. 0. 0. 0. 0.\n", " 0. ]\n", " [ 0. -0.66666667 1. 0. 0. 0.\n", " 0. ]\n", " [ 0. 0. -0.75 1. 0. 0.\n", " 0. ]\n", " [ 0. 0. 0. 0. 1. 0.\n", " 0. ]\n", " [ 0. 0. 0. -0.8 -0.5 1.\n", " 0. ]\n", " [ 0. 0. 0. 0. -0.5 -0.71428571\n", " 1. ]]\n", "[0 1 2 3 5 4 6]\n" ] } ], "source": [ "from scipy.sparse.linalg import splu\n", "T = splu(a.tocsc())\n", "print(T.L.todense())\n", "print(T.perm_c)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 2D-case\n", "From a matrix that comes as a discretization of a two-dimensional problem \n", "everything is much worse:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import scipy as sp\n", "import scipy.sparse as spsp\n", "import scipy.sparse.linalg\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "n = 20\n", "ex = np.ones(n);\n", "lp1 = sp.sparse.spdiags(np.vstack((ex, -2*ex, ex)), [-1, 0, 1], n, n, 'csr'); \n", "e = sp.sparse.eye(n)\n", "A = sp.sparse.kron(lp1, e) + sp.sparse.kron(e, lp1)\n", "A = spsp.csc_matrix(A)\n", "T = spsp.linalg.splu(A)\n", "plt.spy(T.L, marker='.', color='k', markersize=8)\n", "#plt.spy(A, marker='.', color='k', markersize=8)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "For correct permutation in 2D case the number of nonzeros in $L$ factor grows as $\\mathcal{O}(N \\log N)$. But complexity is $\\mathcal{O}(N^{3/2})$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Sparse matrices and graph ordering\n", "\n", "- The number of nonzeros in LU decomposition has a deep connection to the graph theory.\n", "\n", "- ``networkx package`` can be used to visualize graphs, given only the adjacency matrix. \n", "\n", "- It may even recover to some extend the graph structure." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import networkx as nx\n", "n = 10\n", "ex = np.ones(n);\n", "lp1 = sp.sparse.spdiags(np.vstack((ex, -2*ex, ex)), [-1, 0, 1], n, n, 'csr'); \n", "e = sp.sparse.eye(n)\n", "A = sp.sparse.kron(lp1, e) + sp.sparse.kron(e, lp1)\n", "A = spsp.csc_matrix(A)\n", "G = nx.Graph(A)\n", "nx.draw(G, pos=nx.spectral_layout(G), node_size=50)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Fill-in\n", "\n", "The fill-in of a matrix are those entries which change from an initial zero to a nonzero value during the execution of an algorithm.\n", "\n", "The fill-in is different for different permutations. So, before factorization we need to find reordering which produces the smallest fill-in.\n", "\n", "**Example**\n", "\n", "$$A = \\begin{bmatrix} * & * & * & * & *\\\\ * & * & 0 & 0 & 0 \\\\ * & 0 & * & 0 & 0 \\\\ * & 0 & 0& * & 0 \\\\ * & 0 & 0& 0 & * \\end{bmatrix} $$\n", "\n", "If we eliminate elements from the top to the bottom, then we will obtain dense matrix.\n", "However, we could maintain sparsity if elimination was done from the bottom to the top." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Fill-in minimization\n", "\n", "Reordering the rows and the columns of the sparse matrix in order to reduce the number of nonzeros in $L$ and $U$ factors is called **fill-in** minimization.
\n", "\n", "Examples of algorithms for fill-in minimization:\n", "\n", "- **Minimum degree ordering** - order by the degree of the vertex\n", "- **Cuthill–McKee algorithm** (and reverse Cuthill-McKee) - reorder to minimize the bandwidth (does not exploit graph representation).\n", "- **Nested dissection**: split the graph into two with minimal number of vertices on the separator (set of vertices removed after we separate the graph into two distinct connected graphs).
Complexity of the algorithm depends on the size of the graph separator. For 1D Laplacian separator contains only 1 vertex, in 2D - $\\sqrt{N}$ vertices." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Gaussian elimination for sparse matrices\n", "\n", "Given matrix $A=A^*>0$ we calculate its Cholesky decomposition $A = LL^*$.\n", "\n", "Factor $L$ can be dense even if $A$ is sparse:\n", "\n", "$$\n", "\\begin{bmatrix} * & * & * & * \\\\ * & * & & \\\\ * & & * & \\\\ * & & & * \\end{bmatrix} = \n", "\\begin{bmatrix} * & & & \\\\ * & * & & \\\\ * & * & * & \\\\ * & * & * & * \\end{bmatrix}\n", "\\begin{bmatrix} * & * & * & * \\\\ & * & * & * \\\\ & & * & * \\\\ & & & * \\end{bmatrix}\n", "$$\n", "\n", "How to make factors sparse, i.e. to minimize the **fill-in**?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Gaussian elimination and permutation\n", "\n", "We need to find a permutation of indices so that factors are sparse, i.e. we build Cholesky factorisation of $PAP^\\top$, where $P$ is a permutation matrix.\n", "\n", "For the example from the previous slide\n", "\n", "$$\n", "P \\begin{bmatrix} * & * & * & * \\\\ * & * & & \\\\ * & & * & \\\\ * & & & * \\end{bmatrix} P^\\top = \n", "\\begin{bmatrix} * & & & * \\\\ & * & & * \\\\ & & * & * \\\\ * & * & * & * \\end{bmatrix} = \n", "\\begin{bmatrix} * & & & \\\\ & * & & \\\\ & & * & \\\\ * & * & * & * \\end{bmatrix}\n", "\\begin{bmatrix} * & & & * \\\\ & * & & * \\\\ & & * & * \\\\ & & & * \\end{bmatrix}\n", "$$\n", "\n", "where\n", "\n", "$$\n", "P = \\begin{bmatrix} & & & 1 \\\\ & & 1 & \\\\ & 1 & & \\\\ 1 & & & \\end{bmatrix}\n", "$$\n", "\n", "- Arrowhead form of the matrix gives sparse factors in LU decomposition" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Original matrix\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "L factor\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "U factor\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Column permutation: [0 1 2 3]\n", "Row permutation: [1 3 2 0]\n" ] } ], "source": [ "import numpy as np\n", "import scipy.sparse as spsp\n", "import scipy.sparse.linalg as spsplin\n", "import scipy.linalg as splin\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "A = spsp.coo_matrix((np.random.randn(10), ([0, 0, 0, 0, 1, 1, 2, 2, 3, 3], \n", " [0, 1, 2, 3, 0, 1, 0, 2, 0, 3])))\n", "print(\"Original matrix\")\n", "plt.spy(A)\n", "plt.show()\n", "lu = spsplin.splu(A.tocsc(), permc_spec=\"NATURAL\")\n", "print(\"L factor\")\n", "plt.spy(lu.L)\n", "plt.show()\n", "print(\"U factor\")\n", "plt.spy(lu.U)\n", "plt.show()\n", "print(\"Column permutation:\", lu.perm_c)\n", "print(\"Row permutation:\", lu.perm_r)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Block arrowhead structure\n", "\n", "$$\n", "PAP^\\top = \\begin{bmatrix} A_{11} & & A_{13} \\\\ & A_{22} & A_{23} \\\\ A_{31} & A_{32} & A_{33}\\end{bmatrix}\n", "$$\n", "\n", "then\n", "\n", "$$\n", "PAP^\\top = \\begin{bmatrix} A_{11} & 0 & 0 \\\\ 0 & A_{22} & 0 \\\\ A_{31} & A_{32} & A_{33} - A_{31}A_{11}^{-1} A_{13} - A_{32}A_{22}^{-1}A_{23} \\end{bmatrix} \\begin{bmatrix} I & 0 & A_{11}^{-1}A_{13} \\\\ 0 & I & A_{22}^{-1}A_{23} \\\\ 0 & 0 & I\\end{bmatrix}\n", "$$\n", "\n", "- Block $ A_{33} - A_{31}A_{11}^{-1} A_{13} - A_{32}A_{22}^{-1}A_{23}$ is Schur complement for block diagonal matrix $\\begin{bmatrix} A_{11} & 0 \\\\ 0 & A_{22} \\end{bmatrix}$\n", "- We reduce problem to solving smaller linear systems with $A_{11}$ and $A_{22}$ " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### How can we find permutation?\n", "\n", "- Key idea comes from graph theory\n", "- Sparse matrix can be treated as an **adjacency matrix** of a certain graph:\n", "the vertices $(i, j)$ are connected, if the corresponding matrix element is non-zero.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Example\n", "\n", "Graphs of $\\begin{bmatrix} * & * & * & * \\\\ * & * & & \\\\ * & & * & \\\\ * & & & * \\end{bmatrix}$ and $\\begin{bmatrix} * & & & * \\\\ & * & & * \\\\ & & * & * \\\\ * & * & * & * \\end{bmatrix}$ have the following form:\n", "\n", " and \n", "\n", "* Why the second ordering is better than the first one?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Graph separator\n", "\n", "**Definition.** A **separator** in a graph $G$ is a set $S$ of vertices whose removal leaves at\n", "least two connected components.\n", "\n", "Separator $S$ gives the following ordering for an $N$-vertex graph $G$:\n", "- Find a separator $S$, whose removal leaves connected components\n", "$T_1$, $T_2$, $\\ldots$, $T_k$\n", "- Number the vertices of $S$ from $N − |S| + 1$ to $N$\n", "- Recursively, number the vertices of each component: $T_1$ from $1$ to\n", "$|T_1|$, $T_2$ from $|T_1| + 1$ to $|T_1| + |T_2|$, etc\n", "- If a component is small enough, enumeration in this component is arbitrarily" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Separator and block arrowhead structure: example\n", "\n", "Separator for the 2D Laplacian matrix \n", "\n", "$$\n", " A_{2D} = I \\otimes A_{1D} + A_{1D} \\otimes I, \\quad A_{1D} = \\mathrm{tridiag}(-1, 2, -1),\n", "$$\n", "\n", "is as follows\n", "\n", " " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Once we have enumerated first indices in $\\alpha$, then in $\\beta$ and separators indices in $\\sigma$ we get the following matrix\n", "\n", "$$\n", "PAP^\\top = \\begin{bmatrix} A_{\\alpha\\alpha} & & A_{\\alpha\\sigma} \\\\ & A_{\\beta\\beta} & A_{\\beta\\sigma} \\\\ A_{\\sigma\\alpha} & A_{\\sigma\\beta} & A_{\\sigma\\sigma}\\end{bmatrix}\n", "$$\n", "\n", "which has arrowhrad structure.\n", "\n", "- Thus, the problem of finding **permutation** was reduced to the problem of finding **graph separator**!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Nested dissection\n", "\n", "- For blocks $A_{\\alpha\\alpha}$, $A_{\\beta\\beta}$ we continue splitting recursively.\n", "\n", "- When the recursion is done, we need to eliminate blocks $A_{\\sigma\\alpha}$ and $A_{\\sigma\\beta}$. \n", "\n", "- This makes block in the position of $A_{\\sigma\\sigma}\\in\\mathbb{R}^{n\\times n}$ dense.\n", "\n", "Calculation of Cholesky of this block costs $\\mathcal{O}(n^3) = \\mathcal{O}(N^{3/2})$, where $N = n^2$ is the total number of nodes.\n", "\n", "So, the complexity is $\\mathcal{O}(N^{3/2})$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Packages for nested dissection\n", "\n", "- MUltifrontal Massively Parallel sparse direct Solver ([MUMPS](http://mumps.enseeiht.fr/))\n", "- [Pardiso](https://www.pardiso-project.org/)\n", "- [Umfpack as part of SuiteSparse](http://faculty.cse.tamu.edu/davis/suitesparse.html)\n", "\n", "All of them have interfaces for C/C++, Fortran and Matlab " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Nested dissection summary\n", "\n", "- Enumeration: find a separator.\n", "- Divide-and-conquer paradigm\n", "- Recursively process two subsets of vertices after separation\n", "- In theory, nested dissection gives optimal complexity. \n", "- In practice, it beats others only for very large problems." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Separators in practice\n", "\n", "- Computing separators is not a **trivial task**.\n", "\n", "- Graph partitioning heuristics has been an active research area for many years, often motivated by partitioning for parallel computation.\n", "\n", "Existing approaches:\n", "\n", "- Spectral partitioning (uses eigenvectors of Laplacian matrix of graph) - more details below\n", "- Geometric partitioning (for meshes with specified vertex coordinates) [review and analysis](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.31.4886&rep=rep1&type=pdf)\n", "- Iterative-swapping ([(Kernighan-Lin, 1970)](http://xilinx.asia/_hdl/4/eda.ee.ucla.edu/EE201A-04Spring/kl.pdf), [(Fiduccia-Matheysses, 19820](https://dl.acm.org/citation.cfm?id=809204))\n", "- Breadth-first search [(Lipton, Tarjan 1979)](http://www.cs.princeton.edu/courses/archive/fall06/cos528/handouts/sepplanar.pdf)\n", "- Multilevel recursive bisection (heuristic, currently most practical) ([review](https://people.csail.mit.edu/jshun/6886-s18/lectures/lecture13-1.pdf) and [paper](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.499.4130&rep=rep1&type=pdf)). Package for such kind of partitioning is called METIS, written in C, and available [here](http://glaros.dtc.umn.edu/gkhome/views/metis)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Spectral graph partitioning\n", "\n", "The idea of spectral partitioning goes back to Miroslav Fiedler, who studied connectivity of graphs ([paper](https://dml.cz/bitstream/handle/10338.dmlcz/101168/CzechMathJ_23-1973-2_11.pdf)).\n", "\n", "We need to split the vertices into two sets.\n", "\n", "Consider +1/-1 labeling of vertices and **the cost**\n", "\n", "$$E_c(x) = \\sum_{j} \\sum_{i \\in N(j)} (x_i - x_j)^2, \\quad N(j) \\text{ denotes set of neighbours of a node } j. $$\n", "\n", "We need a balanced partition, thus \n", "\n", "$$\\sum_i x_i = 0 \\quad \\Longleftrightarrow \\quad x^\\top e = 0, \\quad e = \\begin{bmatrix}1 & \\dots & 1\\end{bmatrix}^\\top,$$\n", "\n", "and since we have +1/-1 labels, we have\n", "\n", "$$\\sum_i x^2_i = n \\quad \\Longleftrightarrow \\quad \\|x\\|_2^2 = n.$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Graph Laplacian\n", "\n", "Cost $E_c$ can be written as (check why)\n", "\n", "$$E_c = (Lx, x)$$\n", "\n", "where $L$ is the **graph Laplacian**, which is defined as a symmetric matrix with\n", "\n", "$$L_{ii} = \\mbox{degree of node $i$},$$\n", "\n", "$$L_{ij} = -1, \\quad \\mbox{if $i \\ne j$ and there is an edge},$$\n", "\n", "and $0$ otherwise.\n", "\n", "- Rows of $L$ sum to zero, thus there is an eigenvalue $0$ and gives trivial eigenvector of all ones.\n", "- Eigenvalues are non-negative (why?)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Partitioning as an optimization problem\n", "\n", "Minimization of $E_c$ with the mentioned constraints leads to a partitioning that tries to minimize number of edges in a separator, while keeping the partition balanced. \n", "\n", "We now relax the integer quadratic programming to the continuous quadratic programming\n", "\n", "$$E_c(x) = (Lx, x)\\to \\min_{\\substack{x^\\top e =0, \\\\ \\|x\\|_2^2 = n}}$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Fiedler vector\n", "- The solution to the minimization problem is given by the eigenvector (called Fiedler vector) corresponding to the second smallest eigenvalue of the graph Laplacian. Indeed,\n", "\n", "$$\n", " \\min_{\\substack{x^\\top e =0, \\\\ \\|x\\|_2^2 = n}} (Lx, x) = n \\cdot \\min_{{x^\\top e =0}} \\frac{(Lx, x)}{(x, x)} = n \\cdot \\min_{{x^\\top e =0}} R(x), \\quad R(x) \\text{ is the Rayleigh quotient}\n", "$$\n", "\n", "- Since $e$ is the eigenvector, corresponding to the smallest eigenvalue, on the space $x^\\top e =0$ we get the second minimal eigevalue.\n", "\n", "- The sign $x_i$ indicates the partitioning.\n", "\n", "- In computations, we need to find out, how to find this second minimal eigenvalue –– we at least know about power method, but it finds the largest. We will discuss iterative methods for eigenvalue problems later in our course.\n", "\n", "- This is the main goal of the iterative methods for large-scale linear problems, and can be achieved via few matrix-by-vector products." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of vertices = 34\n", "Number of edges = 78\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import networkx as nx\n", "kn = nx.read_gml('karate.gml')\n", "print(\"Number of vertices = {}\".format(kn.number_of_nodes()))\n", "print(\"Number of edges = {}\".format(kn.number_of_edges()))\n", "nx.draw_networkx(kn, node_color=\"red\") #Draw the graph" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "The 2 smallest eigenvalues = [-4.14058418e-15 4.68525227e-01]\n" ] } ], "source": [ "import scipy.sparse.linalg as spsplin\n", "Laplacian = nx.laplacian_matrix(kn).asfptype()\n", "plt.spy(Laplacian, markersize=5)\n", "plt.title(\"Graph laplacian\")\n", "plt.axis(\"off\")\n", "plt.show()\n", "eigval, eigvec = spsplin.eigsh(Laplacian, k=2, which=\"SM\")\n", "print(\"The 2 smallest eigenvalues =\", eigval)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Sum of elements in Fiedler vector = 8.743006318923108e-16\n" ] } ], "source": [ "plt.scatter(np.arange(len(eigvec[:, 1])), np.sign(eigvec[:, 1]))\n", "plt.show()\n", "print(\"Sum of elements in Fiedler vector = {}\".format(np.sum(eigvec[:, 1].real)))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "nx.draw_networkx(kn, node_color=np.sign(eigvec[:, 1]))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Summary on demo\n", "\n", "- Here we call SciPy sparse function to find fixed number of eigenvalues (and eigenvectors) that are smallest (other options are possible)\n", "- Details of the underlying method we will discuss soon\n", "- Fiedler vector gives simple separation of the graph\n", "- To separate graph on more than two parts you should use eigenvectors of laplacian as feature vectors and run some clustering algorithm, e.g. $k$-means" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Fiedler vector and algebraic connectivity of a graph\n", "\n", "**Definition.** The algebraic connectivity of a graph is the second-smallest eigenvalue of the Laplacian matrix.\n", "\n", "**Claim.** The algebraic connectivity of a graph is greater than 0 if and only if a graph is a connected graph." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Practical problems\n", "\n", "Computing bisection recursively is expensive. \n", "\n", "As an alternative, one typically computes **multilevel bisection** that consists of 3 phases.\n", "\n", "- Graph coarsening: From a given graph, we join vertices into larger nodes, and get sequences of graphs $G_1, \\ldots, G_m$. \n", "- At the coarse level, we do high-quality bisection\n", "- Then, we do **uncoarsening**: we propagate the splitting from $G_k$ to $G_{k-1}$ and improve the quality of the split by local optimization algorithms (refinement). " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Practical problems (2)\n", "\n", "Once the permutation has been computed, we need to implement the elimination, making use of efficient computational kernels. \n", "\n", "If in the elemination we will be able to get the elements into **blocks**, we will be able to use BLAS-3 computations. \n", "\n", "It is done by **supernodal** data structures: \n", "\n", "If adjacent rows have the same sparsity structure, they can be stored in **blocks**:\n", "\n", "Also, we can use such structure in efficient computations!\n", "\n", "[Details in this survey](https://arxiv.org/pdf/1907.05309.pdf)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Minimal degree orderings\n", "\n", "- The idea is to eliminate rows and/or columns with fewer non-zeros, update fill-in and then repeat\n", "\n", "- Efficient implementation is an issue (adding/removing elements).\n", "\n", "- Current champion is \"approximate minimal degree\" by Amestoy, Davis, Duff.\n", "\n", "- It is **suboptimal** even for 2D problems\n", "\n", "- In practice, it often wins for medium-sized problems\n", "\n", "- SciPy sparse package [uses](https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.linalg.splu.html) minimal ordering approach for different matrices ($A^{\\top}A$, $A + A^{\\top}$) " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Take home message\n", "\n", "- Sparse matrices & graphs ordering\n", "- Ordering is important for LU fill-in: more details in the next lecture\n", "- Separators and how do they help in fill-in minimization\n", "- Nested dissection idea\n", "- Fiedler vector and spectral bipartitioning\n", "- Other orderings from SciPy sparse package" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Plan for the next part\n", "\n", "- Basic iterative methods for solving large linear systems\n", "- Convergence \n", "- Acceleration" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Questions?" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.core.display import HTML\n", "def css_styling():\n", " styles = open(\"./styles/custom.css\", \"r\").read()\n", " return HTML(styles)\n", "css_styling()" ] } ], "metadata": { "anaconda-cloud": {}, "celltoolbar": "Слайд-шоу", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" }, "nav_menu": {}, "toc": { "navigate_menu": true, "number_sections": false, "sideBar": true, "threshold": 6, "toc_cell": false, "toc_section_display": "block", "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 1 }