#markov-chain #chain #probability

bin+lib markov

A generic markov chain implementation in Rust

35 releases (6 stable)

Uses old Rust 2015

1.1.0 Jul 20, 2020
1.0.3 Jan 27, 2020
1.0.2 May 3, 2018
1.0.1 Mar 3, 2018
0.0.8 Dec 23, 2014

#682 in Text processing

Download history 51/week @ 2024-07-20 175/week @ 2024-07-27 90/week @ 2024-08-03 87/week @ 2024-08-10 49/week @ 2024-08-17 44/week @ 2024-08-24 72/week @ 2024-08-31 51/week @ 2024-09-07 59/week @ 2024-09-14 142/week @ 2024-09-21 76/week @ 2024-09-28 22/week @ 2024-10-05 60/week @ 2024-10-12 37/week @ 2024-10-19 43/week @ 2024-10-26 47/week @ 2024-11-02

188 downloads per month
Used in 5 crates (4 directly)

CC0 license

26KB
461 lines

markov Build Status Crates.io Docs Built with Spacemacs

A generic implementation of a Markov chain in Rust. It supports all types that implement Eq, Hash, and Clone, and has some specific helpers for working with String as text generation is the most likely use case. You can find up-to-date, ready-to-use documentation online on docs.rs.

Note: markov is in passive maintenance mode. It should work well for its intended use case (largely textual generation, especially in chat bots and the like), but will likely not grow to any further use cases. If it does not meet your needs in a broad sense, you should likely fork it or develop a more purpose-built library. Nevertheless, bug reports will still be triaged and fixed.

Examples

With Strings:

extern crate markov;

use markov::Chain;

fn main() {
    let mut chain = Chain::new();
    chain.feed_str("I like cats and I like dogs.");
    println!("{:?}", chain.generate_str());
}

With integers:

extern crate markov;

use markov::Chain;

fn main() {
    let mut chain = Chain::new();
    chain.feed(vec![1u8, 2, 3, 5]).feed([3u8, 9, 2]);
    println!("{:?}", chain.generate());
}

Chains have iterators (both infinite and sized!):

extern crate markov;

use markov::Chain;

fn main() {
    let mut chain = Chain::new();
    chain.feed_str("I like cats and I like dogs.");
    for line in chain.iter_for(5) {
        println!("{:?}", line);
    }
}

Chains can be higher-order:

extern crate markov;

use markov::Chain;

fn main() {
    let mut chain = Chain::of_order(2);
    chain.feed_str("I like cats and I like dogs.");
    for line in chain.iter_for(5) {
        println!("{:?}", line);
    }
}

Contributing

Contributions to this library would be immensely appreciated. It should be noted that as this is a public domain project, any contributions will thus be released into the public domain as well.

Dependencies

~1.5–3MB
~57K SLoC