{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": "true" }, "source": [ "# Table of Contents\n", "

1  Short study of the Lempel-Ziv complexity
1.1  Short definition
1.2  Python implementation
1.3  Tests (1/2)
1.4  Cython implementation
1.5  Numba implementation
1.6  Tests (2/2)
1.7  Benchmarks
1.8  Complexity ?
1.9  Conclusion
1.10  (Experimental) Julia implementation
1.11  Ending notes
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Short study of the Lempel-Ziv complexity\n", "\n", "In this short [Jupyter notebook](https://www.Jupyter.org/) aims at defining and explaining the [Lempel-Ziv complexity](https://en.wikipedia.org/wiki/Lempel-Ziv_complexity).\n", "\n", "[I](http://perso.crans.org/besson/) will give examples, and benchmarks of different implementations.\n", "\n", "- **Reference:** Abraham Lempel and Jacob Ziv, *« On the Complexity of Finite Sequences »*, IEEE Trans. on Information Theory, January 1976, p. 75–81, vol. 22, n°1." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "## Short definition\n", "The Lempel-Ziv complexity is defined as the number of different substrings encountered as the stream is viewed from begining to the end.\n", "\n", "As an example:\n", "\n", "```python\n", ">>> s = '1001111011000010'\n", ">>> lempel_ziv_complexity(s) # 1 / 0 / 01 / 1110 / 1100 / 0010\n", "6\n", "```\n", "\n", "Marking in the different substrings, this sequence $s$ has complexity $\\mathrm{Lempel}$-$\\mathrm{Ziv}(s) = 6$ because $s = 1001111011000010 = 1 / 0 / 01 / 1110 / 1100 / 0010$.\n", "\n", "- See the page https://en.wikipedia.org/wiki/Lempel-Ziv_complexity for more details." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Other examples:\n", "\n", "```python\n", ">>> lempel_ziv_complexity('1010101010101010') # 1 / 0 / 10\n", "3\n", ">>> lempel_ziv_complexity('1001111011000010000010') # 1 / 0 / 01 / 1110 / 1100 / 0010 / 000 / 010\n", "7\n", ">>> lempel_ziv_complexity('100111101100001000001010') # 1 / 0 / 01 / 1110 / 1100 / 0010 / 000 / 010 / 10\n", "8\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "## Python implementation" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def lempel_ziv_complexity(binary_sequence):\n", " \"\"\"Lempel-Ziv complexity for a binary sequence, in simple Python code.\"\"\"\n", " u, v, w = 0, 1, 1\n", " v_max = 1\n", " length = len(binary_sequence)\n", " complexity = 1\n", " while True:\n", " if binary_sequence[u + v - 1] == binary_sequence[w + v - 1]:\n", " v += 1\n", " if w + v >= length:\n", " complexity += 1\n", " break\n", " else:\n", " if v > v_max:\n", " v_max = v\n", " u += 1\n", " if u == w:\n", " complexity += 1\n", " w += v_max\n", " if w > length:\n", " break\n", " else:\n", " u = 0\n", " v = 1\n", " v_max = 1\n", " else:\n", " v = 1\n", " return complexity" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "## Tests (1/2)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = '1001111011000010'\n", "lempel_ziv_complexity(s) # 1 / 0 / 01 / 1110 / 1100 / 0010" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "6.1 µs ± 173 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n" ] } ], "source": [ "%timeit lempel_ziv_complexity(s)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lempel_ziv_complexity('1010101010101010') # 1 / 0 / 10" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lempel_ziv_complexity('1001111011000010000010') # 1 / 0 / 01 / 1110" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lempel_ziv_complexity('100111101100001000001010') # 1 / 0 / 01 / 1110 / 1100 / 0010 / 000 / 010 / 10" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "19.4 µs ± 2.31 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" ] } ], "source": [ "%timeit lempel_ziv_complexity('100111101100001000001010')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can start to see that the time complexity of this function seems to grow exponentially as the complexity grows." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "## Cython implementation\n", "As [this blog post](https://jakevdp.github.io/blog/2013/06/15/numba-vs-cython-take-2/) explains it, we can easily try to use [Cython](http://Cython.org/) in a notebook cell.\n", "\n", "> See [the Cython documentation](http://docs.cython.org/en/latest/src/quickstart/build.html#using-the-jupyter-notebook) for more information." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%load_ext cython" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%%cython\n", "from __future__ import division\n", "import cython\n", "\n", "ctypedef unsigned int DTYPE_t\n", "\n", "@cython.boundscheck(False) # turn off bounds-checking for entire function, quicker but less safe\n", "def lempel_ziv_complexity_cython(str binary_sequence not None):\n", " \"\"\"Lempel-Ziv complexity for a binary sequence, in simple Cython code (C extension).\"\"\"\n", " cdef DTYPE_t u = 0\n", " cdef DTYPE_t v = 1\n", " cdef DTYPE_t w = 1\n", " cdef DTYPE_t v_max = 1\n", " cdef DTYPE_t length = len(binary_sequence)\n", " cdef DTYPE_t complexity = 1\n", " # that was the only needed part, typing statically all the variables\n", " while True:\n", " if binary_sequence[u + v - 1] == binary_sequence[w + v - 1]:\n", " v += 1\n", " if w + v >= length:\n", " complexity += 1\n", " break\n", " else:\n", " if v > v_max:\n", " v_max = v\n", " u += 1\n", " if u == w:\n", " complexity += 1\n", " w += v_max\n", " if w > length:\n", " break\n", " else:\n", " u = 0\n", " v = 1\n", " v_max = 1\n", " else:\n", " v = 1\n", " return complexity" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let try it!" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = '1001111011000010'\n", "lempel_ziv_complexity_cython(s) # 1 / 0 / 01 / 1110 / 1100 / 0010" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "131 ns ± 5.22 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)\n" ] } ], "source": [ "%timeit lempel_ziv_complexity_cython(s)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lempel_ziv_complexity_cython('1010101010101010') # 1 / 0 / 10" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lempel_ziv_complexity_cython('1001111011000010000010') # 1 / 0 / 01 / 1110" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lempel_ziv_complexity_cython('100111101100001000001010') # 1 / 0 / 01 / 1110 / 1100 / 0010 / 000 / 010 / 10" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "259 ns ± 13.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n" ] } ], "source": [ "%timeit lempel_ziv_complexity_cython('100111101100001000001010')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> $\\implies$ Yay! It seems faster indeed!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "## Numba implementation\n", "As [this blog post](https://jakevdp.github.io/blog/2013/06/15/numba-vs-cython-take-2/) explains it, we can also try to use [Numba](http://Numba.PyData.org/) in a notebook cell." ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from numba import jit" ] }, { "cell_type": "code", "execution_count": 94, "metadata": { "collapsed": true }, "outputs": [], "source": [ "@jit(\"int32(boolean[:])\")\n", "def lempel_ziv_complexity_numba_x(binary_sequence):\n", " \"\"\"Lempel-Ziv complexity for a binary sequence, in Python code using numba.jit() for automatic speedup (hopefully).\"\"\"\n", " u, v, w = 0, 1, 1\n", " v_max = 1\n", " length = len(binary_sequence)\n", " complexity = 1\n", " while True:\n", " if binary_sequence[u + v - 1] == binary_sequence[w + v - 1]:\n", " v += 1\n", " if w + v >= length:\n", " complexity += 1\n", " break\n", " else:\n", " if v > v_max:\n", " v_max = v\n", " u += 1\n", " if u == w:\n", " complexity += 1\n", " w += v_max\n", " if w > length:\n", " break\n", " else:\n", " u = 0\n", " v = 1\n", " v_max = 1\n", " else:\n", " v = 1\n", " return complexity\n", "\n", "def str_to_numpy(s):\n", " \"\"\"str to np.array of bool\"\"\"\n", " return np.array([int(i) for i in s], dtype=np.bool)\n", "\n", "def lempel_ziv_complexity_numba(s):\n", " return lempel_ziv_complexity_numba_x(str_to_numpy(s))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let try it!" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ True, False, False, True, True, True, True, False, True,\n", " True, False, False, False, False, True, False], dtype=bool)" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "str_to_numpy(s)" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = '1001111011000010'\n", "lempel_ziv_complexity_numba(s) # 1 / 0 / 01 / 1110 / 1100 / 0010" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "6.16 µs ± 228 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n" ] } ], "source": [ "%timeit lempel_ziv_complexity_numba(s)" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lempel_ziv_complexity_numba('1010101010101010') # 1 / 0 / 10" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lempel_ziv_complexity_numba('1001111011000010000010') # 1 / 0 / 01 / 1110" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lempel_ziv_complexity_numba('100111101100001000001010') # 1 / 0 / 01 / 1110 / 1100 / 0010 / 000 / 010 / 10" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "9.35 µs ± 1.22 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n" ] } ], "source": [ "%timeit lempel_ziv_complexity_numba('100111101100001000001010')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> $\\implies$ Well... It doesn't seem that much faster from the naive Python code.\n", "> We specified the signature when calling [`@numba.jit`](http://numba.pydata.org/numba-doc/latest/user/jit.html), and used the more appropriate data structure (string is probably the smaller, numpy array are probably faster).\n", "> But even these tricks didn't help that much.\n", "\n", "> I tested, and without specifying the signature, the fastest approach is using string, compared to using lists or numpy arrays.\n", "> Note that the [`@jit`](http://numba.pydata.org/numba-doc/latest/user/jit.html)-powered function is compiled at runtime when first being called, so the signature used for the *first* call is determining the signature used by the compile function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "## Tests (2/2)\n", "\n", "To test more robustly, let us generate some (uniformly) random binary sequences." ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from numpy.random import binomial\n", "\n", "def bernoulli(p, size=1):\n", " \"\"\"One or more samples from a Bernoulli of probability p.\"\"\"\n", " return binomial(1, p, size)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1])" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bernoulli(0.5, 20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That's probably not optimal, but we can generate a string with:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'10011100011111111011'" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "''.join(str(i) for i in bernoulli(0.5, 20))" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def random_binary_sequence(n, p=0.5):\n", " \"\"\"Uniform random binary sequence of size n, with rate of 0/1 being p.\"\"\"\n", " return ''.join(str(i) for i in bernoulli(p, n))" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'11100011000111010111000110001110001110010010010010'" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "'00000100100000100000000000000000000100000000000000'" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "'00000010000010011100111010010000000000000010100010'" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "'11000111100001111001100000101011011011011010110110'" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "'11111001110101111111111101111111010111111111110111'" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "'11111111111111101111101111110111111001111110111111'" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "random_binary_sequence(50)\n", "random_binary_sequence(50, p=0.1)\n", "random_binary_sequence(50, p=0.25)\n", "random_binary_sequence(50, p=0.5)\n", "random_binary_sequence(50, p=0.75)\n", "random_binary_sequence(50, p=0.9)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And so, this function can test to check that the three implementations (naive, Cython-powered, Numba-powered) always give the same result." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def tests_3_functions(n, p=0.5, debug=True):\n", " s = random_binary_sequence(n, p=p)\n", " c1 = lempel_ziv_complexity(s)\n", " if debug:\n", " print(\"Sequence s = {} ==> complexity C = {}\".format(s, c1))\n", " c2 = lempel_ziv_complexity_cython(s)\n", " c3 = lempel_ziv_complexity_numba(s)\n", " assert c1 == c2 == c3, \"Error: the sequence {} gave different values of the Lempel-Ziv complexity from 3 functions ({}, {}, {})...\".format(s, c1, c2, c3)\n", " return c1" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sequence s = 11010 ==> complexity C = 3\n" ] }, { "data": { "text/plain": [ "3" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tests_3_functions(5)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sequence s = 00011000000010010111 ==> complexity C = 6\n" ] }, { "data": { "text/plain": [ "6" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tests_3_functions(20)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sequence s = 00111111110000010000100011000010001100110001001101 ==> complexity C = 8\n" ] }, { "data": { "text/plain": [ "8" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tests_3_functions(50)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sequence s = 01011110110110010010101101110000101110100011011101100101001000001100111000011000101000000010010010010100101101101010111010001100011000100111111101101111000010001111001110010000001100011011111001001011101110001000111101100110100111011010101000010100011000010001101101000101111101001011111001100111001010100010010001111000101100110000100000010100111111000110110011110101000100110101000011001010111010101111101100111010101011110001100001111111000100100000001000100100101011010111011001101110110111111110 ==> complexity C = 60\n" ] }, { "data": { "text/plain": [ "60" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tests_3_functions(500)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sequence s = 00001100000110000110100011111111010111110000010110100111111000000111011011000001011101101101011100101110010001010000011011110100001011001011000101100001000000110100110011111100010111000101000011100010010100011110011110011101011101110011110001110110100100111110010010110010100100100101001010110100111111000010011110101011110001010010000110101000000111001010101000101001101000111100001100101111010010001011111111110001111001100011010011101011001111110110011101100011001000001000110101001010000000101011111101010110111110000000001000111000000011110101001110101011111100000101011111000100000000110110011011011111001111101000110001011111011010011100100110010001011011001001100111000001100111101011000010100010111100010000111001111001100001010001010010100110101111001010011010110001100001100011110011101101000110000010010010111110101011000000101110110011100110110011111111010011001101011101010001110001000001000000001111010000000010000101011001111001101110100110000100110000010010011110111001001111110100101000010101001101011111111010010110011000011001101001110010100010111100001011001000011000001000011111001000011110001010111111111100000000110101110110001100010111100101100010001001101010101000110010100101010100001111010001001001111010100010101101101110010110011001010110101111010011000100011110001110011000001000010010000000000001000001011010100010111001001000101000001101100100011100011110011010010010110011000101110011110000010000100110100100000011011100110111101110110101110010111000011110100110001011010111000111001110101110001100000111011100011100000010000101010110010011000000001111100101010101110100111111101011001100101111000011101111010101001000111001110100100011110000110001110100010101001100101010000101101000010110010000011100000111001111101110100010011010111101000010100011011100111001110000001000011110111001110100110010110000010011111101000011101010000001011101011111100110111010111000101110010011110110110000000110110000110010000011110000111000101001001101011101101101010011010100101000011101010110011100000110100010001101110101001011111110100101010011111110100111000110010111010100000100101001010100000000000000101001111111001010010111011000000001100111111011011100100011011100010101000111000000100101100000110111100101100100110010001000000111000010011100001010111010001011111111011101010101101101000100010110101110001110100101001111101111101100110100101100110111001011011110011110100010100010110101110110000111000100000010101011100101010101100001011100101000100110100110010100101100010010010100010100110001010101001011001100001001111110000101000000111110001101010110001000000111111111101100001101011011000110000010111111101111010001100111011100111001100010110111010110011011100111101110010100011011011000001011111111001000001010001010001100011010101011100010000101111111101000100110110110001110111100011011101010100101010100111011111111001001000000001010001100100111111000111010110111100101001101100001100101101000001111010110000010101000010101000110110001100101010110111110111110110110101101000010101000001111101100001100010111111111001101111000111110100111001010111111110000111111100100110010000101011111010100001001101010101010111111110100010010010101000100011100101011101100001010011100011101111111100000100100111101011011000110010011111110000011010011000111110110110110000111010101101100101101100010100101011010001110111011111100010011011100110000000011111011010001101110110000110001101011111110011011110001111100111011001100011111010010000111000000110001101010101011010000110110011111010101111101001100000000110001111010110110001111111010100001100101000011011101010111000010110110010100001010011010010101011011100001010101011100111011110001100110101000011001000010100111000100110001000110111100010100110111011111101110011000100000011100010011001010001110010011011111110111100000111001010110000011011010011010011000000111100011101101110110101010010001111100100011100001101011001010101001100101101101011010011001011001100100011010001011000101011000011000101010110000110000011111111101000001100011100111110110001000111000111111011111110101000001100001100010111001101011100001010011000001110100010011001001101101111010100100001010011110100110001000001010010110111110001011101000000110011111001110011011011100111000101010101010011100100001000011001100001101100011100110101010010011110101110000111000001111010100011111100011101000010101111010001101100010111111110110000101010111000000101111001001111110011110001110111101000010010001101000001011100010000011000000011101010100000101001001100101001001001001001111111101100111001110110001000001100001010011001001110111111101111100011100011101001000000100000010111101001101001100010101001110100101000010110101011100011111100001100110111010111111110010001000011000101110111110010100011111111001001011110010101111101110111101000000001111010000010001100011011010001101110010110111011000110110111100111111011001000101101011000101110010011010010111001000101000111010101000000010111111010011001110010110001010001111011110001101001100000110000001 ==> complexity C = 420\n" ] }, { "data": { "text/plain": [ "420" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tests_3_functions(5000)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "## Benchmarks\n", "\n", "On two example of strings (binary sequences), we can compare our three implementation." ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "16.7 µs ± 471 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n", "249 ns ± 6.71 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n", "7.98 µs ± 236 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n" ] } ], "source": [ "%timeit lempel_ziv_complexity('100111101100001000001010')\n", "%timeit lempel_ziv_complexity_cython('100111101100001000001010')\n", "%timeit lempel_ziv_complexity_numba('100111101100001000001010')" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "139 µs ± 4.33 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n", "1.94 µs ± 83.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n", "22 µs ± 364 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" ] } ], "source": [ "%timeit lempel_ziv_complexity('10011110110000100000101000100100101010010111111011001111111110101001010110101010')\n", "%timeit lempel_ziv_complexity_cython('10011110110000100000101000100100101010010111111011001111111110101001010110101010')\n", "%timeit lempel_ziv_complexity_numba('10011110110000100000101000100100101010010111111011001111111110101001010110101010')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let check the time used by all the three functions, for longer and longer sequences:" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "28.2 µs ± 2 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n", "52.3 µs ± 2.75 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n", "108 µs ± 1.42 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n", "359 µs ± 91.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n", "862 µs ± 64.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n", "3.16 ms ± 299 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" ] } ], "source": [ "%timeit tests_3_functions(10, debug=False)\n", "%timeit tests_3_functions(20, debug=False)\n", "%timeit tests_3_functions(40, debug=False)\n", "%timeit tests_3_functions(80, debug=False)\n", "%timeit tests_3_functions(160, debug=False)\n", "%timeit tests_3_functions(320, debug=False)" ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def test_cython(n):\n", " s = random_binary_sequence(n)\n", " c = lempel_ziv_complexity_cython(s)\n", " return c" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "17.1 µs ± 490 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n", "28.8 µs ± 959 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n", "62.4 µs ± 6.77 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n", "125 µs ± 7.15 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n", "216 µs ± 13.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n", "459 µs ± 16.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" ] } ], "source": [ "%timeit test_cython(10)\n", "%timeit test_cython(20)\n", "%timeit test_cython(40)\n", "%timeit test_cython(80)\n", "%timeit test_cython(160)\n", "%timeit test_cython(320)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.18 ms ± 214 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n", "2.38 ms ± 144 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n", "5.93 ms ± 71.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n", "17.1 ms ± 168 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" ] } ], "source": [ "%timeit test_cython(640)\n", "%timeit test_cython(1280)\n", "%timeit test_cython(2560)\n", "%timeit test_cython(5120)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "52.1 ms ± 584 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", "178 ms ± 6.03 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" ] } ], "source": [ "%timeit test_cython(10240)\n", "%timeit test_cython(20480)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "## Complexity ?\n", "$\\implies$ The function `lempel_ziv_complexity_cython` seems to be indeed (almost) linear in $n$, the length of the binary sequence $S$.\n", "\n", "But let check more precisely, as it could also have a complexity of $\\mathcal{O}(n \\log n)$." ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "%matplotlib inline\n", "sns.set(context=\"notebook\", style=\"darkgrid\", palette=\"hls\", font=\"sans-serif\", font_scale=1.4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's durty, but let us capture manually the times given by the experiments above." ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x = [10, 20, 40, 80, 160, 320, 640, 1280, 2560, 5120, 10240, 20480]\n", "y = [18, 30, 55, 107, 205, 471, 977, 2270, 5970, 17300, 56600, 185000]" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhgAAAF3CAYAAADnzjICAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XdYU2f7B/BvCCFAZAsKiNaqASIiUDc4cKHWgdaBUlwV\ncdZV1L6tu+37Kr6i4sLdouLexV2ttVXrqgQFVJyoIAhhJEAS8vz+4EdeI1uDCXh/rovrMs9zxn3O\nHczNOU/Ow2GMMRBCCCGEaJGBrgMghBBCSO1DBQYhhBBCtI4KDEIIIYRoHRUYhBBCCNE6KjAIIYQQ\nonVUYBBCCCFE66jAINVi7ty5cHZ2Lvena9eu6mXbtm2r44j1W1BQEAYNGqTVbV69ehXOzs44f/68\nVrdbWatWrYKXlxdatGiBly9flrpM165d8fXXX3/gyKpHZXJ48ODBSv3O6Dp3H0rx+bh3755Wt1ub\n3lf6zFDXAZDa6bvvvsOsWbPUr+fNm4f4+Hjs379f3cblctXLhoaGfvAYP3aenp64dOkSLCwsAABK\npRKtW7fGnj17IBQKq3XfaWlpWLduHQYNGoSpU6fC1ta2WvdXU/Tp0wcdO3Ys0X779m1MmTJFXaC8\nnTtSNfv374eh4f8+/ubPnw+BQIA5c+boMKrahwoMUi3MzMxgZmamfm1kZAQul1vqB8mby5EPx8jI\nSCMfCQkJkMlkH2TfEokEANC6dWs4ODh8kH3WBMbGxjA2NtZoy83NxdKlS+Hh4YGJEycCKJk7UjXW\n1tYar2/dugUfHx8dRVN70S0SonNv3yLp2rUrFi9ejK1bt6Jjx45o2bIlQkJCkJ2djZ07d6Jr167w\n9PTEmDFjkJKSol6PMYaoqCj4+/vD09MT7dq1w7fffouMjIxy988Yw/bt2+Hn54cWLVrAz88Pmzdv\nxpsPub116xZGjRoFT09PtGjRAgMGDMDhw4fV/cnJyXB2dsaRI0fw7bffolWrVmjTpg2WLl2KgoIC\nLFq0CG3btkXbtm3x/fffQ6FQaKy3b98+9TItW7ZEcHAwXrx4UWbMCoUCERER+Pzzz9GyZUt07NgR\n//73v5GXlwcAeP78OT777DMsX75cY70JEyagW7duyM3N1bjMfvDgQXzxxRcAgH79+iEoKAj+/v4I\nCgoqse/t27dDJBJpnPu3z+eWLVvg5+cHNzc3tGnTBpMmTUJSUhKAosveffv2BQB8++23cHZ2RnJy\ncrk5Kk9l8h4REQFPT0/cuXMHgwcPhru7O/z8/PDnn38iMTERI0aMgIeHB3r06IFTp05prCcSiXDv\n3j0EBATA3d0d3t7eWLlypcb7QyqV4ocfflC/h7p27Yq1a9eisLDwnY+r2JIlS5CRkYGwsDD1Vb83\nc7d//344OzvjwYMHGutlZWXBzc0Nq1evLnPbsbGxGDlyJDw9PeHt7Y1Zs2Zp5DUnJwcLFiyAj48P\nmjdvjk6dOmHRokXIzc1VLxMUFISQkBAcOXIE3bt3h7u7O4YPH44XL17g5MmT6N27Nzw8PDB06FDc\nv39fY71Ro0bh1KlT6NWrF9zc3ODn54eYmJhyz8elS5cQFBSEtm3bwtPTE2PHjkVCQoK6f9KkSejW\nrZv6dwEATp48CWdnZ1y4cAGA5i2S4lswW7duhbOzM7Zv3w4XFxc8e/ZMY78ZGRlo3rw5IiMjy42P\nvIER8gFMnTqV+fr6lto3Z84c1qZNG/VrX19f1rNnT7Zw4UKWlJTEYmJimLOzMwsICGAzZ85k9+/f\nZ5cuXWItW7Zk3333nXq9yMhI5uzszCIiItjjx4/ZpUuXWM+ePdmQIUOYSqUqM7bIyEjm7u7ODhw4\nwJ48ecIOHTrEmjdvziIjIxljjN2/f5+1aNGCTZgwgYnFYvbgwQO2dOlSJhQK2dGjRxljjD179owJ\nhULWu3dvFh0dzZ48ecKWLVvGhEIhCwgIYBs3bmSPHz9m27ZtY0KhkB05ckRjPV9fXxYZGckePXrE\nLl68yDp06MC++OILdYxffvklGzhwoPr1vHnzWPPmzdmOHTvYkydP2KlTp1j79u3Z119/rV5m//79\nTCQSsYSEBMYYYydOnGAuLi7s2rVrjDHGrly5woRCIfvtt99YXl4e2759OxMKhezq1assMzOTRUdH\nM2dnZ/b06VON8zVkyBAWEhJS5vlcuXIla968Odu2bRt79OgRu379Ohs4cCBr3749k0gkLC8vj129\nepUJhUK2fft29urVK6ZUKkvdlq+vL5s6dWqZ+yrOX0V5X716NXNzc2Njx45lN27cYAkJCaxfv36s\nU6dObMSIEezPP/9kSUlJLCgoiH322WdMJpOp1yvO4R9//MEePXrE1qxZw4RCIduxY4c6hrFjx7LW\nrVuzo0ePsidPnrADBw4wDw8PtnTp0jJzWBnHjx9nQqGQHTp0SKP9zdxlZ2czNzc3FhERobHM3r17\n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\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.plot(x, y, 'o-')\n", "plt.xlabel(\"Length $n$ of the binary sequence $S$\")\n", "plt.ylabel(r\"Time in $\\mu\\;\\mathrm{s}$\")\n", "plt.title(\"Time complexity of Lempel-Ziv complexity\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhgAAAF7CAYAAACQDPJ5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlcVFX/B/DPgIBK7IoCovWUM4jIlruY4m65l4oaWpZi\npmmaS79yQdJSTE3c8EmzzAVTcws1tcUsIzWNUQHFhVUQhAEEZZk5vz985uYIsujAsHzerxcvnXPu\n8r33zDBfzj33XJkQQoCIiIhIj4wMHQARERHVPkwwiIiISO+YYBAREZHeMcEgIiIivWOCQURERHrH\nBIOIiIj0jglGFZk7dy4UCkWpPz169JCW7dChg4Ejrt78/f0xbNgwvW4zIiICCoUCP//8s163W15f\nfPEFvL290aZNG9y6davEZXr06IH33nuviiOrHOVpw71795brM2Potqsq2vNx5coVvW63Nr2vHueP\nP/6AQqHAyZMnAQArV66EQqFAfn6+gSOrWi+99BLef//9KtlXvSrZC+Gjjz7CzJkzpdfz5s1DVFQU\ndu/eLZUZGxtLy86aNavKY6zrvLy8cOrUKVhZWQEAioqK0K5dO4SFhUEul1fqvtPS0rBu3ToMGzYM\nU6dORePGjSt1fzXFyy+/jK5duxYr/+effzBlyhQpQXm07ahidu/ejXr1/v06mD9/PszNzTFnzhwD\nRqVfbdu25XukijHBqCIWFhawsLCQXpuamsLY2LjEL5KHl6OqY2pqqtMe0dHRyMvLq5J9q1QqAEC7\ndu3g6OhYJfusCerXr4/69evrlN29exdLly6Fp6cn3nnnHQDF244qxtbWVuf1+fPn4ePjY6BoKgff\nI1WPl0iqoUcvkfTo0QOLFi3C5s2b0bVrV3h4eCAgIADZ2dnYtm0bevToAS8vL7z55ptISUmR1hNC\nYOvWrRgyZAi8vLzQsWNHfPjhh8jIyCh1/0IIbNmyBX379kWbNm3Qt29ffPnll3h40tfz589j3Lhx\n8PLyQps2bTB48GDs27dPqk9MTIRCocD+/fvx4Ycfom3btmjfvj2WLl2K/Px8BAYGokOHDujQoQM+\n/vhjFBYW6qz33XffSct4eHhgwoQJSE5OfmzMhYWFCAkJwSuvvAIPDw907doVn376Ke7duwcASEpK\nwosvvojly5frrDdp0iT07NkTd+/e1elm37t3L1599VUAwMCBA+Hv748hQ4bA39+/2L63bNkCV1dX\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.semilogx(x, y, 'o-')\n", "plt.xlabel(\"Length $n$ of the binary sequence $S$\")\n", "plt.ylabel(r\"Time in $\\mu\\;\\mathrm{s}$\")\n", "plt.title(\"Time complexity of Lempel-Ziv complexity, semilogx scale\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n6COkpaXB3t4evXr1wsaNG9GiRQscO3YMn3/+Od5//33jUXDnzp3xwgsvYNGiRejTp0+F9+zbty9C\nQ0OxdOlS7N69G19//TWAstOAjz76KA4cOICBAwfe9W956aWXYG9vj40bN+L999+Ho6Mj+vbti1mz\nZlV5VFCZn376yewkLVFRUZg+ffo9t3tNvPHGG1i0aBFOnjyJZs2a4R//+IfJALtly5ZhyZIleOut\nt3Djxg04OTnhkUceweLFi2t0Kve7774DAEycOLHSOvv37zdbLpfLMXToUHz66aeIiIi463bbt2+P\ndevW4T//+Q9GjRoFBwcH9OjRA9HR0cZ1V65ciUWLFmHevHnIzs5Gq1atMHbs2FqbRtfLywtjx441\nngb29vbGhx9+WGly0bVrV3z66adYvnw5xo0bB51Oh44dO+Ktt97CyJEjodFo8PrrryM0NNQ4a6Jc\nLsdbb72F0aNH4+OPPzZOplTeSy+9hGXLlmHixIn45JNPjEeKTzzxBL744guzHVpaWlqV19vDwsIQ\nExOD9evXY8mSJZDJZGjXrh0WLFiARx99FEDZ4NLyf49er0fHjh3xzjvvYNiwYTXenzVhOKOxbt06\nrFmzBnZ2dggJCcHGjRuNZx+6d++OBQsWYM2aNRg1ahTUajWio6PxwQcfVLj06eHhga5du6KoqMjs\npcnyqrNvevfujRUrVmDlypXYunUrXFxcEBYWZpxhdtiwYTh58iRWr16N5cuXo2fPnliyZAkOHTqE\nOXPmICIiwuxU2cuXL8fixYuxcOFC43c1LCwMr776qsllpBq75/sHqMky3Fa3YcMGS4dSqZKSEtGv\nXz+xcuVKS4dS7wy3AZa/hYxqx73Mi1Df3nnnHfH4448LvV5f4bWzZ8+KyMhIC0RVv27evGly26VO\npxO9evUSb7zxhkm99PR00aVLF/H999/Xd4hWgWcAqFEpKChARkYGFi1aBKVSib/97W+WDomozul0\nOmRmZmL//v1Yv349VqxYYXbw39dff2124GljcvbsWYwYMQIjRozAiy++CJlMhvXr1yMrK8t4OTA3\nNxepqamYP38+fH197zr4r7FiAkCNyoYNG7By5UoEBgZi7dq1tTainsiaZWZmYuDAgfD09MT8+fON\nT2C80+uvv17PkdW/jh07YvXq1fjoo48wZswYyOVytG/fHqtWrTJeJnn33Xexe/du9OzZEwsXLqzx\n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\nhQsX4OLiAuBhvzxen5GRAaVSiX79+qFbt25a9YWFhSgoKIBSqWyls3lxKBSKVmt7Xk/6SUlJQVJS\nklbZtWvX0LdvXwDsi9by/fff48MPP0RCQgLefvttTbmTkxOys7O1flUyIyMD9vb26NChg87+qL92\nLC0t8frrr2vNQ1KpVMjKyoJSqYS9vT3MzMxw+fJlTf3FixfRvn37BvM8DNYiUwlNzOTJk+VXv/qV\nlJeXS15enoSGhsonn3zS1mEZvYKCAlEqlbJlyxaprq6Wa9euSWhoqCxfvlyKi4vF3d1dduzYIVVV\nVXL69GlRKpWSlpYmIiInTpwQpVKp+fWnbdu2iZeXl5SWloqIyJo1ayQsLEz++9//SllZmURHR0tE\nRERbnu5z6/GZ563d9ryeGvd4X6Smpoqzs7OcOHFCVCqVnDx5UpRKpaSkpIgI+6I11NTUSGhoqPz9\n739vUFddXS1BQUGyevVqqayslMzMTPHz85Mvv/xSRESuXLkiTk5OcvjwYamurpavv/5anJ2dJTc3\nV0REdu/eLf7+/pKdnS2VlZUSHx8vISEholKpREQkOjpaZsyYIXfu3JGioiKZNm2afPTRRy12bkwA\nDFBQUCCzZ88WFxcX8fLykvj4eKmtrW3rsF4IaWlpMnnyZFEqlTJ48GBZuXKl5ndiz549K2+++aY4\nOTlJcHCw5iKrt2fPHgkMDBQnJyeZMGGCfP/995o6lUolK1askMGDB4tSqZR58+a12K/SvCiGDx8u\nTk5O4uDgILa2tuLk5CROTk5y8+bNVm17Xk8NNdUXu3fvluHDh4tCoZDAwEDZu3ev1rbsi5aVnp6u\n1QeP/rl586b88MMPMnXqVFEoFOLv7y+ffvqp1vapqakyYsQIcXR0lFGjRmm+P6PeJ598In5+fqJQ\nKGT69Oma5EBEpKKiQhYtWiRubm7i7u4uMTExcv/+/RY7NzMRzvogIiIyNZwDQEREZIKYABAREZkg\nJgBEREQmiAkAERGRCWICQEREZIKYABAREZkgJgBEREQmiAkAERGRCTJ/8ipERGSqvvzyS+zZswfZ\n2dlQq9V4+eWX4e7ujujoaPTq1autw6OnwBEAIj0EBQVh7dq1bR0GACA3Nxfh4eFQKBQ4duxYs7Zp\nrfjt7OywY8eORusVCgV27drV4sel1vWb3/wGH3/8Mdzd3bFu3TqsX78e48ePx7lz57TeU0/GiSMA\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.semilogy(x, y, 'o-')\n", "plt.xlabel(\"Length $n$ of the binary sequence $S$\")\n", "plt.ylabel(r\"Time in $\\mu\\;\\mathrm{s}$\")\n", "plt.title(\"Time complexity of Lempel-Ziv complexity, semilogy scale\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nIrJC/wuISOjsFIIB4AAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.loglog(x, y, 'o-')\n", "plt.xlabel(\"Length $n$ of the binary sequence $S$\")\n", "plt.ylabel(r\"Time in $\\mu\\;\\mathrm{s}$\")\n", "plt.title(\"Time complexity of Lempel-Ziv complexity, loglog scale\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is linear in $\\log\\log$ scale, so indeed the algorithm seems to have a linear complexity.\n", "\n", "To sum-up, for a sequence $S$ of length $n$, it takes $\\mathcal{O}(n)$ basic operations to compute its Lempel-Ziv complexity $\\mathrm{Lempel}-\\mathrm{Ziv}(S)$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "## Conclusion\n", "\n", "- The Lempel-Ziv complexity is not too hard to implement, and it indeed represents a certain complexity of a binary sequence, capturing the regularity and reproducibility of the sequence.\n", "\n", "- Using the [Cython](http://Cython.org/) was quite useful to have a $\\simeq \\times 100$ speed up on our manual naive implementation !\n", "\n", "- The algorithm is not easy to analyze, we have a trivial $\\mathcal{O}(n^2)$ bound but experiments showed it is more likely to be $\\mathcal{O}(n \\log n)$ in the worst case, and $\\mathcal{O}(n)$ in practice for \"not too complicated sequences\" (or in average, for random sequences)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "## (Experimental) [Julia](http://julialang.org) implementation\n", "\n", "I want to (quickly) try to see if I can use [Julia](http://julialang.org) to write a faster version of this function.\n", "See [issue #1](https://github.com/Naereen/Lempel-Ziv_Complexity/issues/1).\n", "\n", "**Disclaimer:** I am still learning Julia!" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\"Lempel-Ziv complexity for a binary sequence, in simple Julia code.\"\n", "lempel_ziv_complexity (generic function with 1 method)\n", "\"1001111011000010\"\n", "6\n", "100\n", "10000\n", "778\n", "CPU times: user 0 ns, sys: 4 ms, total: 4 ms\n", "Wall time: 4.86 s\n" ] } ], "source": [ "%%time\n", "%%script julia\n", "\n", "\"\"\"Lempel-Ziv complexity for a binary sequence, in simple Julia code.\"\"\"\n", "function lempel_ziv_complexity(binary_sequence)\n", " u, v, w = 0, 1, 1\n", " v_max = 1\n", " size = length(binary_sequence)\n", " complexity = 1\n", " while true\n", " if binary_sequence[u + v] == binary_sequence[w + v]\n", " v += 1\n", " if w + v >= size\n", " complexity += 1\n", " break\n", " end\n", " else\n", " if v > v_max\n", " v_max = v\n", " end\n", " u += 1\n", " if u == w\n", " complexity += 1\n", " w += v_max\n", " if w > size\n", " break\n", " else\n", " u = 0\n", " v = 1\n", " v_max = 1\n", " end\n", " else\n", " v = 1\n", " end\n", " end\n", " end\n", " return complexity\n", "end\n", "\n", "s = \"1001111011000010\"\n", "lempel_ziv_complexity(s) # 1 / 0 / 01 / 1110 / 1100 / 0010\n", "\n", "M = 100;\n", "N = 10000;\n", "for _ in 1:M\n", " s = join(rand(0:1, N));\n", " lempel_ziv_complexity(s);\n", "end\n", "lempel_ziv_complexity(s) # 1 / 0 / 01 / 1110 / 1100 / 0010" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And to compare it fairly, let us use [Pypy](http://pypy.org) for comparison." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 4 ms, sys: 0 ns, total: 4 ms\n", "Wall time: 7.89 s\n" ] } ], "source": [ "%%time\n", "%%pypy\n", "\n", "def lempel_ziv_complexity(binary_sequence):\n", " \"\"\"Lempel-Ziv complexity for a binary sequence, in simple Python code.\"\"\"\n", " u, v, w = 0, 1, 1\n", " v_max = 1\n", " length = len(binary_sequence)\n", " complexity = 1\n", " while True:\n", " if binary_sequence[u + v - 1] == binary_sequence[w + v - 1]:\n", " v += 1\n", " if w + v >= length:\n", " complexity += 1\n", " break\n", " else:\n", " if v > v_max:\n", " v_max = v\n", " u += 1\n", " if u == w:\n", " complexity += 1\n", " w += v_max\n", " if w > length:\n", " break\n", " else:\n", " u = 0\n", " v = 1\n", " v_max = 1\n", " else:\n", " v = 1\n", " return complexity\n", "\n", "s = \"1001111011000010\"\n", "lempel_ziv_complexity(s) # 1 / 0 / 01 / 1110 / 1100 / 0010\n", "\n", "from random import random\n", "\n", "M = 100\n", "N = 10000\n", "for _ in range(M):\n", " s = ''.join(str(int(random() < 0.5)) for _ in range(N))\n", " lempel_ziv_complexity(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So we can check that on these 100 random trials on strings of size 10000, the naive Julia version is about twice as fast as the naive Python version (executed by Pypy for speedup).\n", "\n", "That's good, but it's not much..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "## Ending notes\n", "> Thanks for reading!\n", "> My implementation is [now open-source and available on GitHub](https://github.com/Naereen/Lempel-Ziv_Complexity), on https://github.com/Naereen/Lempel-Ziv_Complexity.\n", "\n", "> It will be available from PyPi very soon, see https://pypi.python.org/pypi/lempel_ziv_complexity.\n", "\n", "> See [this repo on GitHub](https://github.com/Naereen/notebooks/) for more notebooks, or [on nbviewer.jupyter.org](https://nbviewer.jupyter.org/github/Naereen/notebooks/).\n", "\n", "> That's it for this demo! See you, folks!" ] } ], "metadata": { "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.5.3" }, "notify_time": "10", "toc": { "colors": { "hover_highlight": "#DAA520", "running_highlight": "#FF0000", "selected_highlight": "#FFD700" }, "moveMenuLeft": true, "nav_menu": { "height": "236px", "width": "251px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": true, "toc_section_display": "block", "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 2 }