markovchain
===========

Overview
--------

Markov chain generator

Requirements
------------

-  `Python 3 <https://www.python.org/>`__

Installation
------------

::

    pip install markovchain

::

    pip install markovchain[image]

::

    git clone https://github.com/dead-beef/markovchain
    cd markovchain
    pip install -e .[dev]

Building
--------

::

    ./build.sh

Testing
-------

::

    ./test
    coverage report

Module usage
------------

-  `Module documentation <https://dead-beef.github.io/markovchain/>`__

Examples
~~~~~~~~

Text
^^^^

.. code:: python

    from markovchain import MarkovBase, MarkovSqliteMixin

    class Markov(MarkovSqliteMixin, MarkovBase):
        pass

    markov = Markov(db='markov.db')

    with open('data.txt') as fp:
        markov.data(fp.read())

    with open('data2.txt') as fp:
        for line in fp:
            markov.data(line, True)
    markov.data('', False)

    words = markov.generate(16) # generator
    print(*words)

    words = markov.generate(16, start=['sentence', 'start'])
    print(*words)

    markov.save()

    markov = Markov.load('markov.db')

Image
^^^^^

.. code:: python

    from PIL import Image

    from markovchain import MarkovBase, MarkovJsonMixin
    from markovchain.image import MarkovImageMixin

    class Markov(MarkovImageMixin, MarkovJsonMixin, MarkovBase):
        pass

    markov = Markov()

    markov.data(Image.open('data.png'))

    width = 32
    height = 16
    img = markov.image(width, height) # PIL image
    with open('generated.png', 'wb') as fp:
        img.save(fp)

    with open('markov.json', 'w') as fp:
        markov.save(fp)

    markov = Markov.load('markov.json')

CLI usage
---------

::

    > markovchain -h
    usage: markovchain [-h] {text,image} ...

    positional arguments:
      {text,image}

    optional arguments:
      -h, --help    show this help message and exit

Data types
~~~~~~~~~~

+---------------+-------------------------+---------------------+
| State file    | File type               | Data mixin used     |
+===============+=========================+=====================+
| stdout        | JSON                    | MarkovJsonMixin     |
+---------------+-------------------------+---------------------+
| \*.json       | JSON                    | MarkovJsonMixin     |
+---------------+-------------------------+---------------------+
| \*.json.bz2   | bzip2 compressed JSON   | MarkovJsonMixin     |
+---------------+-------------------------+---------------------+
| Other         | SQLite 3 database       | MarkovSqliteMixin   |
+---------------+-------------------------+---------------------+

Examples
~~~~~~~~

Text
^^^^

.. code:: bash

    markovchain text create --output text.db input1.txt input2.txt
    markovchain text update text.db input3.txt input4.txt
    markovchain text generate text.db
    markovchain text generate --sentences 16 --start 'sentence start' text.db

Image
^^^^^

.. code:: bash

    markovchain image create --progress --output img.db img1.png img2.png
    markovchain image update --progress img.db img3.png img4.png
    markovchain image generate --progress --size 64 64 --count 4 img.db img%02d.png
    markovchain image filter --progress img.png output.png

Settings
^^^^^^^^

-  `Text <https://github.com/dead-beef/markovchain/tree/master/settings/text>`__
-  `Image <https://github.com/dead-beef/markovchain/tree/master/settings/image>`__

Text
~~~~

::

    > markovchain text -h
    usage: markovchain text [-h] {create,update,settings,generate} ...

    positional arguments:
      {create,update,settings,generate}

    optional arguments:
      -h, --help            show this help message and exit

create
^^^^^^

::

    > markovchain text create -h
    usage: markovchain text create [-h] [-P] [-s SETTINGS] [-o OUTPUT]
                                   [input [input ...]]

    positional arguments:
      input                 input file (default: stdin)

    optional arguments:
      -h, --help            show this help message and exit
      -P, --progress        show progress bar
      -s SETTINGS, --settings SETTINGS
                            settings json file
      -o OUTPUT, --output OUTPUT
                            output file (default: stdout)

update
^^^^^^

::

    > markovchain text update -h
    usage: markovchain text update [-h] [-P] [-s SETTINGS] [-o OUTPUT]
                                   state [input [input ...]]

    positional arguments:
      state                 state file
      input                 input file (default: stdin)

    optional arguments:
      -h, --help            show this help message and exit
      -P, --progress        show progress bar
      -s SETTINGS, --settings SETTINGS
                            settings json file
      -o OUTPUT, --output OUTPUT
                            output file (default: rewrite state file)

generate
^^^^^^^^

::

    > markovchain text generate -h
    usage: markovchain text generate [-h] [-P] [-s SETTINGS] [-ss STATE_SIZE]
                                     [-st START] [-w WORDS] [-ws WORD_SEPARATOR]
                                     [-S SENTENCES] [-o OUTPUT]
                                     state

    positional arguments:
      state                 state file

    optional arguments:
      -h, --help            show this help message and exit
      -P, --progress        show progress bar
      -s SETTINGS, --settings SETTINGS
                            settings json file
      -ss STATE_SIZE, --state-size STATE_SIZE
                            generator state size
      -st START, --start START
                            sentence start
      -w WORDS, --words WORDS
                            max sentence size (default: 256)
      -ws WORD_SEPARATOR, --word-separator WORD_SEPARATOR
                            output word separator (default: ' ')
      -S SENTENCES, --sentences SENTENCES
                            number of generated sentences (default: 1)
      -o OUTPUT, --output OUTPUT
                            output file (default: stdout)

settings
^^^^^^^^

::

    > markovchain text settings -h
    usage: markovchain text settings [-h] state

    positional arguments:
      state       state file

    optional arguments:
      -h, --help  show this help message and exit

Image
~~~~~

::

    > markovchain image -h
    usage: markovchain image [-h]
                             {convert,create,update,settings,generate,filter} ...

    positional arguments:
      {convert,create,update,settings,generate,filter}

    optional arguments:
      -h, --help            show this help message and exit

convert
^^^^^^^

::

    > markovchain image convert -h
    usage: markovchain image convert [-h] [-p HUES SATURATIONS VALUES] [-c {0,1}]
                                     [-d] [-r WIDTH HEIGHT]
                                     input [input ...]

    positional arguments:
      input                 input file

    optional arguments:
      -h, --help            show this help message and exit
      -p HUES SATURATIONS VALUES, --palette HUES SATURATIONS VALUES
                            palette color division (default: [8, 4, 8])
      -c {0,1}, --convert-type {0,1}
                            conversion type (default: 1)
      -d, --dither          enable dithering
      -r WIDTH HEIGHT, --resize WIDTH HEIGHT
                            resize images (default: None)

create
^^^^^^

::

    > markovchain image create -h
    usage: markovchain image create [-h] [-P] [-s SETTINGS] [-o OUTPUT]
                                    [input [input ...]]

    positional arguments:
      input                 input file

    optional arguments:
      -h, --help            show this help message and exit
      -P, --progress        show progress bar
      -s SETTINGS, --settings SETTINGS
                            settings json file
      -o OUTPUT, --output OUTPUT
                            output file (default: stdout)

update
^^^^^^

::

    > markovchain image update -h
    usage: markovchain image update [-h] [-P] [-s SETTINGS] [-o OUTPUT]
                                    state [input [input ...]]

    positional arguments:
      state                 state file
      input                 input file

    optional arguments:
      -h, --help            show this help message and exit
      -P, --progress        show progress bar
      -s SETTINGS, --settings SETTINGS
                            settings json file
      -o OUTPUT, --output OUTPUT
                            output file (default: rewrite state file)

generate
^^^^^^^^

::

    > markovchain image generate -h
    usage: markovchain image generate [-h] [-P] [-s SETTINGS]
                                      [-ss STATE_SIZE [STATE_SIZE ...]]
                                      [-S WIDTH HEIGHT] [-l LEVEL] [-c COUNT]
                                      state output

    positional arguments:
      state                 state file
      output                output file name format string

    optional arguments:
      -h, --help            show this help message and exit
      -P, --progress        show progress bar
      -s SETTINGS, --settings SETTINGS
                            settings json file
      -ss STATE_SIZE [STATE_SIZE ...], --state-size STATE_SIZE [STATE_SIZE ...]
                            generator state sizes
      -S WIDTH HEIGHT, --size WIDTH HEIGHT
                            image size (default: <scanner.resize>)
      -l LEVEL, --level LEVEL
                            image levels (default: <scanner.levels>)
      -c COUNT, --count COUNT
                            generated image count (default: 1)

filter
^^^^^^

::

    > markovchain image filter -h
    usage: markovchain image filter [-h] [-P] [-t {json,sqlite}] [-s SETTINGS]
                                    [-S STATE] [-ss STATE_SIZE [STATE_SIZE ...]]
                                    [-l LEVEL] [-c COUNT]
                                    input output

    positional arguments:
      input                 input image
      output                output file name format string

    optional arguments:
      -h, --help            show this help message and exit
      -P, --progress        show progress bar
      -t {json,sqlite}, --type {json,sqlite}
                            generator type (default: json)
      -s SETTINGS, --settings SETTINGS
                            settings json file
      -S STATE, --state STATE
                            state file
      -ss STATE_SIZE [STATE_SIZE ...], --state-size STATE_SIZE [STATE_SIZE ...]
                            generator state sizes
      -l LEVEL, --level LEVEL
                            filter start level (default: 1)
      -c COUNT, --count COUNT
                            generated image count (default: 1)

settings
^^^^^^^^

::

    > markovchain image settings -h
    usage: markovchain image settings [-h] state

    positional arguments:
      state       state file

    optional arguments:
      -h, --help  show this help message and exit

Licenses
--------

-  `markovchain <https://github.com/dead-beef/markovchain/blob/master/LICENSE>`__

