# Relative-Lempel Ziv (RLZ) [![Crates.io][crates-badge]][crates-url] [![Docs.rs][docs-badge]][docs-rs] [![MIT licensed][mit-badge]][mit-url]

[crates-badge]: https://img.shields.io/crates/v/rbz.svg
[crates-url]: https://crates.io/crates/rlz
[mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg
[mit-url]: https://opensource.org/licenses/MIT
[docs-rs]: https://docs.rs/rlz
[docs-badge]: https://img.shields.io/docsrs/rlz/0.2.0

A Relative-Lempel Ziv (RLZ) based LZ compressor that compresses against a large static dictionary.

This code implements the RLZ compressor, as described in:

```bibtex
@article{DBLP:journals/pvldb/HoobinPZ11,
  author    = {Christopher Hoobin and
               Simon J. Puglisi and
               Justin Zobel},
  title     = {Relative Lempel-Ziv Factorization for Efficient Storage 
                and Retrieval of Web Collections},
  journal   = {Proc. {VLDB} Endow.},
  volume    = {5},
  number    = {3},
  pages     = {265--273},
  year      = {2011},
}
```

```bibtex
@article{DBLP:journals/corr/PetriMNW16,
  author    = {Matthias Petri and
               Alistair Moffat and
               P. C. Nagesh and
               Anthony Wirth},
  title     = {Access Time Tradeoffs in Archive Compression},
  journal   = {CoRR},
  volume    = {abs/1602.08829},
  year      = {2016},
  url       = {http://arxiv.org/abs/1602.08829},
  eprinttype = {arXiv},
}
```

```bibtex
@inproceedings{DBLP:conf/www/LiaoPMW16,
  author    = {Kewen Liao and
               Matthias Petri and
               Alistair Moffat and
               Anthony Wirth},
  title     = {Effective Construction of Relative Lempel-Ziv 
               Dictionaries},
  booktitle = {Proceedings of {WWW}},
  pages     = {807--816},
  publisher = {{ACM}},
  year      = {2016},
}
```


# What is RLZ (taken from {DBLP:conf/www/LiaoPMW16})

The Relative Lempel-Ziv (RLZ) scheme is a hybrid of several phrase-based compression mechanisms. Encoding is based on a fixed-text dictionary, with all substrings within the dictionary available for use as factors, in the style of LZ77. But the dictionary is constructed in a semi-static manner, and hence needs to be representative of the entire text being coded if compression effectiveness is not to be compromised. Furthermore, because
RLZ is intended for large web-based archives when constructing the dictionary, it is infeasible to have the whole input text in memory.

# Usage


```rust
use rlz::RlzCompressor;
use rlz::Dictionary;

let dict = Dictionary::from(&b"banana"[..]);
let rlz_compressor = RlzCompressor::builder().build_from_dict(dict);

let mut output = Vec::new();

let text = b"banana$aba";
let encoded_len = rlz_compressor.encode(&text[..],&mut output).unwrap();
assert_eq!(encoded_len,output.len());

let mut stored_decoder = Vec::new();
rlz_compressor.store(&mut stored_decoder).unwrap();
let loaded_decoder = RlzCompressor::load(&stored_decoder[..]).unwrap();

let mut recovered = Vec::new();
loaded_decoder.decode(&output[..],&mut recovered).unwrap();
assert_eq!(recovered,text);
```

# License

MIT
