{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "4.2 Markov Chains.ipynb", "provenance": [], "collapsed_sections": [], "toc_visible": true, "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "Fn3y44pNQq_1", "colab_type": "text" }, "source": [ "# 4.2 Markov Chains\n", "So how can we do better? Remember, music is a temporal art, and often the order in which things happens is meaningful. The answer: ***conditional probability.*** Conditional probability quantifies the likelihood that an outcome will occur *given that another outcome has already ocurred*. Conditional probability expresses the concept of contingency and is used to describe random processes that depend on something. With music, we often use conditional probability to express the realtionships between the future and past.\n", "\n", "A ***Markov chain*** is a probability system in which the likelihood of *future* outcomes is determined by *past* outcomes. It's a tool for working with conditional probability, and, in this notebook, we'll use Markov chains to model sequence of musical events. Markov chains have two improtant features: the ***order*** which determines how far back past events affect future likelihoods, and the ***transition matrix*** which is a data structure that represents the system of conditional probabilitles.\n", "\n", "Note: Markov chains are implements in the `mai` package, so this notebook is mostly about how to use it." ] }, { "cell_type": "markdown", "metadata": { "id": "wqEXYqA0RDmO", "colab_type": "text" }, "source": [ "## Setup" ] }, { "cell_type": "code", "metadata": { "id": "CRzvLns-NAnB", "colab_type": "code", "colab": {} }, "source": [ "# install external libraries for sound playback\n", "from IPython.display import clear_output\n", "!pip install -q git+https://github.com/davidkant/mai#egg=mai;\n", "!apt-get -qq update\n", "!apt-get -qq install -y libfluidsynth1\n", "clear_output()" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "gRBZXY2_f9jA", "colab_type": "code", "outputId": "192711ae-d473-4d68-9ea4-fecdca46f3fe", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "# imports\n", "import mai\n", "import random" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Using TensorFlow backend.\n" ], "name": "stderr" } ] }, { "cell_type": "markdown", "metadata": { "id": "CTLfUO2kdrlT", "colab_type": "text" }, "source": [ "## Example 1\n", "We'll start with a simple sequence of musical numbers." ] }, { "cell_type": "code", "metadata": { "id": "B7A23OZkXttk", "colab_type": "code", "colab": {} }, "source": [ "# sequence to learn\n", "music = [36, 39, 43, 46]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "1mxBlUBNd1DQ", "colab_type": "text" }, "source": [ "Let's interpret it as a sequence of drum hits. And hear it." ] }, { "cell_type": "code", "metadata": { "id": "ypVjRzSOd4t3", "colab_type": "code", "outputId": "c5aba678-4454-4f58-d068-daa2c83872dc", "colab": { "base_uri": "https://localhost:8080/", "height": 202 } }, "source": [ "# plot it\n", "mai.make_music_plot(music, durs=0.25, figsize=(4,2))\n", "\n", "# play it\n", "mai.make_music(music, durs=0.25, is_drum=True)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 6 } ] }, { "cell_type": "markdown", "metadata": { "id": "vtZehjvVTxds", "colab_type": "text" }, "source": [ "## Learn transitions\n", "Now we'll learn a Markov chain transition matrix. First, we have to create a new markov chain to keep track of our data — this is the variable `mark`. Then we learn the transition table by calling the function `train` and passing our example musical sequence `music` as an argument." ] }, { "cell_type": "code", "metadata": { "id": "ZObq469TXttn", "colab_type": "code", "colab": {} }, "source": [ "# create a new markov chain \n", "mark = mai.markov.Markov()\n", "\n", "# learn a new table from data\n", "mark.train(music, order=1)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "feCzjZzeVL3M", "colab_type": "text" }, "source": [ "View the transition table by calling the function `print_transitions()` --- is this what you expected? The transition table counts the number of times we transition from each state to the next. For each entry of the table, the transition is to the left of the colon and the count is to the right. For instance, `(36,) -> 39 : 1,` means the sequence transitions from the state `36` to the state `39` once. " ] }, { "cell_type": "code", "metadata": { "id": "mqaj8U2jXttr", "colab_type": "code", "outputId": "0b6ac955-d6a9-4586-c41e-452155ae0ae9", "colab": { "base_uri": "https://localhost:8080/", "height": 69 } }, "source": [ "# view the transition table\n", "mark.print_transitions()" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "(36,) -> 39 : 1\n", "(39,) -> 43 : 1\n", "(43,) -> 46 : 1\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "VaeqeFacVQ-y", "colab_type": "text" }, "source": [ "## Generate a new sequence\n", "This is the fun part. Once we have learned a Markov transition matrix, we can generate new sequences from it! The first thing we must do is set an initial state, otherwise the Markov chain wouldn't know where to start, then call the function `choose` to choose the next state according to the transition table." ] }, { "cell_type": "code", "metadata": { "id": "hotHKhewXtty", "colab_type": "code", "outputId": "081f399e-396e-4449-a33a-3390e417045c", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "# set initial state\n", "mark.state = (36,)\n", "\n", "# next choice\n", "mark.choose()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "39" ] }, "metadata": { "tags": [] }, "execution_count": 9 } ] }, { "cell_type": "markdown", "metadata": { "id": "nes3T8FccRWG", "colab_type": "text" }, "source": [ "You can continue to call choose as many times as you wish... until you get an error!!! NOTE: in the following cell we omit the line of code that sets the initial state because we do not want to reset our initial state each time.\n", "\n" ] }, { "cell_type": "code", "metadata": { "id": "SGh5lFSGXtt3", "colab_type": "code", "outputId": "f7d39823-9c99-4f95-ca59-2eda3f806127", "colab": { "base_uri": "https://localhost:8080/", "height": 307 } }, "source": [ "# next choice\n", "mark.choose()" ], "execution_count": 0, "outputs": [ { "output_type": "error", "ename": "LookupError", "evalue": "ignored", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mLookupError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmark\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchoose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/mai/markov.py\u001b[0m in \u001b[0;36mchoose\u001b[0;34m(self, suppress_errors)\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 61\u001b[0m \u001b[0;31m# option 1: raise error\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 62\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0msuppress_errors\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mLookupError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Current state not found in transition table'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 63\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 64\u001b[0m \u001b[0;31m# option 2: random state from the entire table\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mLookupError\u001b[0m: Current state not found in transition table" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "5PsDbcIEe0-i", "colab_type": "text" }, "source": [ "If you call `choose` too many times on this particular transition table you eventually get the error: `LookupError: Current state not found in transition table`. The problem is we eventually transition *to* the state `46` but there is no entry in the transition table that tells us where to go *from* state `46`. This is because state `46` is the last number in the sequence that we learned from." ] }, { "cell_type": "markdown", "metadata": { "id": "rttVZA44fjuQ", "colab_type": "text" }, "source": [ "Click `.choose()` over and over again is a bit tedious. You can ask for multiples choices at a time using `mark.choice()`. But don't ask for more than 3 on this example!" ] }, { "cell_type": "code", "metadata": { "id": "T1ctqX3Vfssh", "colab_type": "code", "outputId": "d5cf0a4b-698a-487a-8c1a-f4a92340124c", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "# reset initial state\n", "mark.state = (36,)\n", "\n", "# generate 3 choices\n", "new_music = mark.choice(k=3)\n", "\n", "# print it\n", "print(new_music)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "[36, 39, 43, 46]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "NNyOYY4cfzFY", "colab_type": "text" }, "source": [ "And hear it." ] }, { "cell_type": "code", "metadata": { "id": "tVWlsYGofz3o", "colab_type": "code", "outputId": "f9b063be-b6f9-4266-cf4c-447c5c0b451f", "colab": { "base_uri": "https://localhost:8080/", "height": 202 } }, "source": [ "# plot it\n", "mai.make_music_plot(new_music, durs=0.25, figsize=(4,2))\n", "\n", "# play it\n", "mai.make_music(new_music, durs=0.25, is_drum=True)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 14 } ] }, { "cell_type": "markdown", "metadata": { "id": "AwyalXxGf18h", "colab_type": "text" }, "source": [ "OK, so how can we avoid that error? Hint, you can do it by adding one more note to the original melody..." ] }, { "cell_type": "markdown", "metadata": { "id": "89KLluGzeFtf", "colab_type": "text" }, "source": [ "## Example 2\n", "Here we add one additional value to our original sequence in order to avoid the error above. We create a loop where the sequence begins and ends on the same value, `36`." ] }, { "cell_type": "code", "metadata": { "id": "01M57CTEXtuI", "colab_type": "code", "outputId": "6df011b6-f06d-4ef3-da31-cbf3bd991bfc", "colab": { "base_uri": "https://localhost:8080/", "height": 202 } }, "source": [ "# sequence to train on\n", "music = [36, 39, 43, 46, 36]\n", "\n", "# plot it\n", "mai.make_music_plot(music, durs=0.25, figsize=(4,2))\n", "\n", "# play it\n", "mai.make_music(music, durs=0.25, is_drum=True)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 15 } ] }, { "cell_type": "markdown", "metadata": { "id": "XhGpa5xHglQc", "colab_type": "text" }, "source": [ "Create a new Markov chain and train it on the sequence." ] }, { "cell_type": "code", "metadata": { "id": "m1wMpqbfglju", "colab_type": "code", "colab": {} }, "source": [ "# create a new markov chain \n", "mark = mai.markov.Markov()\n", "\n", "# learn a new table from data\n", "mark.train(music, order=1)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "xonjtpf_gpfj", "colab_type": "text" }, "source": [ "View the transition table." ] }, { "cell_type": "code", "metadata": { "id": "f3Ksza9_gq-X", "colab_type": "code", "outputId": "c14470d8-2134-4ade-a3b2-5ccf6d807a06", "colab": { "base_uri": "https://localhost:8080/", "height": 86 } }, "source": [ "# view the transition table\n", "mark.print_transitions()" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "(36,) -> 39 : 1\n", "(39,) -> 43 : 1\n", "(43,) -> 46 : 1\n", "(46,) -> 36 : 1\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "RKp2D8aYfTun", "colab_type": "text" }, "source": [ "Set the initial state" ] }, { "cell_type": "code", "metadata": { "id": "dGfCxex8eseg", "colab_type": "code", "colab": {} }, "source": [ "# set initial state\n", "mark.state = (36,)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "xq5LY1MlfV8V", "colab_type": "text" }, "source": [ "Generate a new sequence one at a time. You should **not** get an error this time. What happens instead?" ] }, { "cell_type": "code", "metadata": { "id": "XUMUL6uafao5", "colab_type": "code", "outputId": "55711c17-9a93-4106-9602-c0aeb47e956f", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "# next choice\n", "mark.choose()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "36" ] }, "metadata": { "tags": [] }, "execution_count": 22 } ] }, { "cell_type": "markdown", "metadata": { "id": "bFO0xSiR0Vnb", "colab_type": "text" }, "source": [ "Generate a sequence of 16 choices and plot it." ] }, { "cell_type": "code", "metadata": { "id": "E2GYhhmQgkLk", "colab_type": "code", "outputId": "94d9ba55-20ed-4dd0-c322-dd36a506358d", "colab": { "base_uri": "https://localhost:8080/", "height": 202 } }, "source": [ "# set initial state\n", "mark.state = (36,)\n", "\n", "# generate a new sequence\n", "music = mark.choice(k=16)\n", "\n", "# let's see it\n", "mai.make_music_plot(music, durs=0.25, figsize=(4,2))\n", "\n", "# let's hear it\n", "mai.make_music(music, durs=0.25, is_drum=True)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 23 } ] }, { "cell_type": "markdown", "metadata": { "id": "8hI6hjNVgf5d", "colab_type": "text" }, "source": [ "Not terribly exciting, no. In fact, the new sequence is exactly the same as the orginal, just looped over and over again! Hmmm, why is that? And how can we make it be different?" ] }, { "cell_type": "markdown", "metadata": { "id": "ENBrQxLYfimA", "colab_type": "text" }, "source": [ "## Example 3\n", "The Markov chain in example 2 is *deterministic*. It loops the same sequence over and over and over again without fail. This occurs because there is only one option for each previous state to transition to. How would you change the training sequence to make the Markov model *non-deterministic*? Hint, you only need to add one more note to the previous melody." ] }, { "cell_type": "code", "metadata": { "id": "inGleQeZhY-B", "colab_type": "code", "outputId": "e38f7054-4f0d-45c4-89bb-02ff9ccd7605", "colab": { "base_uri": "https://localhost:8080/", "height": 202 } }, "source": [ "# sequence to learn\n", "music = [36, 39, 43, 46, 36, 46]\n", "\n", "# plot it\n", "mai.make_music_plot(music, durs=0.25, figsize=(4,2))\n", "\n", "# play it\n", "mai.make_music(music, durs=0.25, is_drum=True)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 24 } ] }, { "cell_type": "markdown", "metadata": { "id": "VSBjnUjqhaOs", "colab_type": "text" }, "source": [ "Create a new Markov chain and train it." ] }, { "cell_type": "code", "metadata": { "id": "MxEWdfuiYc9p", "colab_type": "code", "colab": {} }, "source": [ "# create a new markov chain \n", "mark = mai.markov.Markov()\n", "\n", "# learn a new table from data\n", "mark.train(music, order=1)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "uLdXkZVRhgUk", "colab_type": "text" }, "source": [ "View the transition table." ] }, { "cell_type": "code", "metadata": { "id": "oHtPCe_Shhob", "colab_type": "code", "outputId": "b3a77395-9af0-4357-a4a8-5c1116b4e8b3", "colab": { "base_uri": "https://localhost:8080/", "height": 104 } }, "source": [ "# view the transition table\n", "mark.print_transitions()" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "(36,) -> 39 : 1\n", "(39,) -> 43 : 1\n", "(43,) -> 46 : 1\n", "(46,) -> 36 : 1\n", "(36,) -> 46 : 1\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "UThhWBHAkARl", "colab_type": "text" }, "source": [ "**Important:** Notice that the state `36` occurs ***twice*** on the `from` side of the transition table. This is crucial. There are now two possible transitions from the state `36`. \n", "\n", "When we use this model to generate a new sequence, we'll have two possibilities that can follow the number `36`. The Markov chain will choose randomly betwee each of the options, using the counts as probability weights. Try it out below." ] }, { "cell_type": "markdown", "metadata": { "id": "-Z05xL7WhlZn", "colab_type": "text" }, "source": [ "Generate a sequence one at a time." ] }, { "cell_type": "code", "metadata": { "id": "KPQOvw5vgIeA", "colab_type": "code", "colab": {} }, "source": [ "# set initial state\n", "mark.state = (36,)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "iDkmVLkbgJfi", "colab_type": "code", "outputId": "999fa25c-7034-471d-9a9d-d94dafb9fa33", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "# next choice\n", "mark.choose()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "46" ] }, "metadata": { "tags": [] }, "execution_count": 32 } ] }, { "cell_type": "markdown", "metadata": { "id": "VZ7vYAOH000H", "colab_type": "text" }, "source": [ "Generate a new sequence of 16 choices and plot it. How does this compare to the orginal? The new sequence is not (necessarily) an exact copy of the original, but more like cut up and rearranged segments of the original." ] }, { "cell_type": "code", "metadata": { "id": "TU20ZBrdgWyD", "colab_type": "code", "outputId": "162a9e50-5e08-4140-d854-4dcac8759e79", "colab": { "base_uri": "https://localhost:8080/", "height": 202 } }, "source": [ "# set initial state\n", "mark.state = (36,)\n", "\n", "# generate a new sequence\n", "music = mark.choice(k=16)\n", "\n", "# let's see it\n", "mai.make_music_plot(music, durs=0.25, figsize=(4,2))\n", "\n", "# let's hear it\n", "mai.make_music(music, durs=0.25, is_drum=True)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 33 } ] }, { "cell_type": "markdown", "metadata": { "id": "25k0rB5b6i03", "colab_type": "text" }, "source": [ "Hopefully these simple sequence are helping your intuition develop. We'll move onto some music in just a moment, but first, a bonus example." ] }, { "cell_type": "markdown", "metadata": { "id": "lsb--hZBk6zA", "colab_type": "text" }, "source": [ "## Text\n", "These Markov chain objects can process more than just numbers... Let's try text. Text i just a sequence of letters, or `characters`." ] }, { "cell_type": "code", "metadata": { "id": "mCLr2ebxh5Q3", "colab_type": "code", "colab": {} }, "source": [ "# sequence to learn\n", "music = \"How are you doing today? I'm fine, wish the weather were nicer. Hey it's pretty sunny out over here! Oh that's great.\"" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "W3RummMHlC38", "colab_type": "text" }, "source": [ "Create a new Markov chain and train on a sequence." ] }, { "cell_type": "code", "metadata": { "id": "w5r8vWRelGpK", "colab_type": "code", "colab": {} }, "source": [ "# create a new markov chain \n", "mark = mai.markov.Markov()\n", "\n", "# learn a new table from data\n", "mark.train(music, order=1)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "sbRHXRoCm1jP", "colab_type": "text" }, "source": [ "View transition table." ] }, { "cell_type": "code", "metadata": { "id": "prSbDhJ0m0I5", "colab_type": "code", "outputId": "451d37bb-19c7-45c3-c6e7-053c319828e1", "colab": { "base_uri": "https://localhost:8080/", "height": 1000 } }, "source": [ "# view the transition table\n", "mark.print_transitions()" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "('H',) -> o : 1\n", "('o',) -> w : 1\n", "('w',) -> : 1\n", "(' ',) -> a : 1\n", "('a',) -> r : 1\n", "('r',) -> e : 5\n", "('e',) -> : 3\n", "(' ',) -> y : 1\n", "('y',) -> o : 1\n", "('o',) -> u : 2\n", "('u',) -> : 1\n", "(' ',) -> d : 1\n", "('d',) -> o : 1\n", "('o',) -> i : 1\n", "('i',) -> n : 2\n", "('n',) -> g : 1\n", "('g',) -> : 1\n", "(' ',) -> t : 3\n", "('t',) -> o : 1\n", "('o',) -> d : 1\n", "('d',) -> a : 1\n", "('a',) -> y : 1\n", "('y',) -> ? : 1\n", "('?',) -> : 1\n", "(' ',) -> I : 1\n", "('I',) -> ' : 1\n", "(\"'\",) -> m : 1\n", "('m',) -> : 1\n", "(' ',) -> f : 1\n", "('f',) -> i : 1\n", "('n',) -> e : 1\n", "('e',) -> , : 1\n", "(',',) -> : 1\n", "(' ',) -> w : 3\n", "('w',) -> i : 1\n", "('i',) -> s : 1\n", "('s',) -> h : 1\n", "('h',) -> : 2\n", "('t',) -> h : 3\n", "('h',) -> e : 3\n", "('w',) -> e : 2\n", "('e',) -> a : 2\n", "('a',) -> t : 3\n", "('e',) -> r : 5\n", "('r',) -> : 2\n", "(' ',) -> n : 1\n", "('n',) -> i : 1\n", "('i',) -> c : 1\n", "('c',) -> e : 1\n", "('r',) -> . : 1\n", "('.',) -> : 1\n", "(' ',) -> H : 1\n", "('H',) -> e : 1\n", "('e',) -> y : 1\n", "('y',) -> : 3\n", "(' ',) -> i : 1\n", "('i',) -> t : 1\n", "('t',) -> ' : 2\n", "(\"'\",) -> s : 2\n", "('s',) -> : 2\n", "(' ',) -> p : 1\n", "('p',) -> r : 1\n", "('e',) -> t : 1\n", "('t',) -> t : 1\n", "('t',) -> y : 1\n", "(' ',) -> s : 1\n", "('s',) -> u : 1\n", "('u',) -> n : 1\n", "('n',) -> n : 1\n", "('n',) -> y : 1\n", "(' ',) -> o : 2\n", "('u',) -> t : 1\n", "('t',) -> : 1\n", "('o',) -> v : 1\n", "('v',) -> e : 1\n", "(' ',) -> h : 1\n", "('e',) -> ! : 1\n", "('!',) -> : 1\n", "(' ',) -> O : 1\n", "('O',) -> h : 1\n", "('h',) -> a : 1\n", "(' ',) -> g : 1\n", "('g',) -> r : 1\n", "('t',) -> . : 1\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "GWlZODYSm4Ip", "colab_type": "text" }, "source": [ "Generate a new sequence." ] }, { "cell_type": "code", "metadata": { "id": "g7L9s9Etm5rb", "colab_type": "code", "outputId": "13b68ba3-9402-4cf2-bade-f92bac0c99a4", "colab": { "base_uri": "https://localhost:8080/", "height": 54 } }, "source": [ "# set initial state\n", "mark.state = ('H',)\n", "\n", "# generate a new sequence\n", "music = mark.choice(k=100)\n", "\n", "# let's see it\n", "print(music)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "['H', 'o', 'u', 't', 'y', 'o', 'u', ' ', 't', 'y', 'o', 'w', ' ', 'a', 'y', ' ', 'f', 'i', 'n', 'y', ' ', 't', 'h', 'e', 'a', 't', 'h', 'a', 't', 'y', '?', ' ', 'w', 'i', 'c', 'e', 'r', ' ', 't', ' ', 'h', ' ', 'y', ' ', 't', 'h', ' ', 'y', ' ', 'I', \"'\", 's', 'h', 'e', 't', 'h', ' ', 'n', 'i', 'n', 'i', 't', 'h', 'e', ',', ' ', 'I', \"'\", 'm', ' ', 'd', 'o', 'u', ' ', 't', 'y', 'o', 'u', ' ', 'p', 'r', 'e', 'r', 'e', '!', ' ', 't', ' ', 's', ' ', 'H', 'o', 'i', 'n', 'y', ' ', 'a', 't', 'h', 'e', 'r']\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "TvwLx0hDm9oJ", "colab_type": "text" }, "source": [ "We can make that look a bit nicer. Don't sorry about the code here." ] }, { "cell_type": "code", "metadata": { "id": "P0H5r_Tvm73X", "colab_type": "code", "outputId": "15b1f58e-8faa-4bd8-d8ad-61d6d77c73f5", "colab": { "base_uri": "https://localhost:8080/", "height": 54 } }, "source": [ "from functools import reduce\n", "\n", "print(reduce(lambda x,y: x+y, music))" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Houtyou tyow ay finy theathaty? wicer t h y th y I'sheth ninithe, I'm dou tyou prere! t s Hoiny ather\n" ], "name": "stdout" } ] } ] }