v. 2.1.5 (compatible with OpenFst 1.8.2)
========================================

* Symbol `[0]` now gets assigned the numeric interpretation of `0x00` rather
  than the ASCII digit interpretation of `0x30`, just like the rest of the
  bracketed numeric symbols
* Modifies `epsnormalize` to take a string (`input`, `output`) rather than a
  boolean argument
* Modifies `push` and `reweight` to take a string (`to_initial`, `to_final`)
  rather than a boolean argument
* Removes `int64` (etc.) type shims in place of <cstdint>

v. 2.1.4 (compatible with OpenFst 1.8.1)
========================================

* Adds LM generation script to `scripts/`
* Adds rewriting methods to `Paradigm` class
* Nonexistent `string_file`s now raise FstIOError
* Adds optional bound on number of edits to `EditTransducer`
* Cython fix for building with Bazel on MacOS

v. 2.1.3 (compatible with OpenFst 1.8.0)
=========================================

* Adds `export` submodule
* Adds `examples` submodule
* Renames `acceptor` to `accep`
* Adds `join` operator to `pynutil`
* Iterator classes are now protected (e.g., `_StateIterator`); use
  `arcs`, `mutable_arcs`, `paths`, and `states` methods instead
* Renames `byte` lib's `BYTES` to `BYTE`

v. 2.1.2 (compatible with OpenFst 1.7.9)
========================================

* Adds `lib` submodule
* Removes single-character aliases
* Removes residual Python 2 support
* Adds string-escaping function `escape`
* Adds `default_token_type` context decorator/manager
* Overloads `**` operator to support range concatenation
* Renames `transducer` to `cross` and simplifies interface
* Improves `string_file`/`string_map` implementation for acceptors
* Converts `Weight` class methods `NoWeight`, `One`, `Zero` to snake_case
* Modifies `project` to take a string (`input`, `output`) rather than a
  boolean argument

v. 2.1.1 (compatible with OpenFst 1.7.7)
========================================

* Adds PEP 484/PEP 561-compatible type stubs

v. 2.1.0 (compatible with OpenFst 1.7.6)
========================================

* Python 2.7 support removed
* Renames the `text` method to `print`
* Renames the `stringify` method to `string`
* Improves symbol table lifetime management
* Removes underutilized `defaults` singleton
* Improves consistency of the FST class hierarchy
* Internal improvements to the symbol table iterator interface
* Symbol tables are no longer automatically attached to compiled FSTs

v. 2.0.9 (compatible with OpenFst 1.7.4)
========================================

* Simplifies `replace` backend
* Simplifies `cdrewrite` backend
* Fixes name error in `string_map`
* Adds efficient star-args `union`
* Removes inefficient star-args `concat`
* `EncodeMapper` gains complete reading support
* Removes underutilized `epsilon_machine` function
* Fixes off-by-one allocation bug in string compiler
* Fixes arc-type bug with cross-product of precompiled acceptors
* Merges `input_token_type` and `output_token_type` (as `token_type`) and
  `attach_input_symbols` and `attach_output_symbols` (as `attach_symbols`)
  in `transducer`

v. 2.0.8 (compatible with OpenFst 1.7.3)
========================================

* Simplifications to the range-concat backend
* Simplifications to the string compilation backend

v. 2.0.7 (compatible with OpenFst 1.7.2)
========================================

* Simplifications to the string printing backend

v. 2.0.6 (compatible with OpenFst 1.7.1)
========================================

* Eliminates dependency on re2
* Improved generalizability of `Weight.member`
* String printing methods now respect "symbol" as a token type

v. 2.0.5 (compatible with OpenFst 1.7.0)
========================================

* Single `defaults` for default arc type when coercing strings to FSTs
* Style fixes to CDRewrite implementation

v. 2.0.4 (compatible with OpenFst 1.7.0)
========================================

* Composition-based implementation of cross-product
* Pythonic iteration for MutableArcIterator
* Logging cleanup

v. 2.0.3 (compatible with OpenFst 1.7.0)
========================================

* OpenFst compatibility release
* Improved integration of boundary symbols in CDRewrite

v. 2.0.2 (compatible with OpenFst 1.6.9)
========================================

* Improves SVG rendering code for Jupyter
* Simplifies implementation of cross-product and removes special case
  string-to-string optimization (for faster compilation)
* SymbolTables gain methods for (un)pickling and (de)serialization

v. 2.0.1 (compatible with OpenFst 1.6.9)
========================================

* Restores `ilabels` and `olabels` to `StringPathIterator`, and adds `items`
  (istring, ostring, weight tuple) generator
* Fixes and rationalizes behavior of `closure(x, x)`
* Adds star-args support to `concat` (cf. `union`)

v. 2.0.0 (compatible with OpenFst 1.6.9)
========================================

* Python 3 support! Returned strings are all Unicode (except for checksums and
  binary serializations)
* Removed an unused library flag

v. 1.9.2 (compatible with OpenFst 1.6.8)
========================================

* `string_file` and `string_map` now obey
  `attach_input_symbols`/`attach_output_symbols`

v. 1.9.2 (compatible with OpenFst 1.6.8)
========================================

* Removes obsolete rm_epsilon options to string printing methods
* Renames `iter_itring` (etc.) methods to just `istrings`
* Renames `StringPaths` to `StringPathIterator`

v. 1.9.1 (compatible with OpenFst 1.6.7)
========================================

* Simplifies construction used in `closure` operator
* Removes `containment` operator

v. 1.9 (compatible with OpenFst 1.6.6)
======================================

* Adds optional ability to disable symbol table attachment after string
  compilation
* The `string_file` and `string_map` functions now support one to three columns
* FSTs gain methods for (un)pickling and (de)serialization
* Fixes issues with arbitrary-type FAR inputs

v. 1.8 (compatible with OpenFst 1.6.4)
======================================

* Fixes C++ headers that may have caused compilation problems for some users
* Adds string_file support '#' comments; use "\#" for a '#' literal
* Removes `FstSymbolTableMergeError`; merging is now automatic

v. 1.7 (compatible with OpenFst 1.6.3)
======================================

* Exposes `NO_STATE_ID`, `NO_LABEL`, etc., constants
* Modifies `SymbolTable.find` to mimic C++ behavior
* Modifies `replace` to mimic C++ behavior
* Adds `match` function

v. 1.6 (compatible with OpenFst 1.6.3)
======================================

* Fixes to `closure`
* Adds complete documentation
* Corrects many sundry module-level documentation errors
* `string_file` now properly reads a final line without a newline terminator

v. 1.5 (compatible with OpenFst 1.6.2)
======================================

* Avoids unnecessary arc-sorting before composition
* Avoids unnecessary symbol table copies before binary operations
* Standardizes method names for compatibility with OpenFst binaries

v. 1.4 (compatible with OpenFst 1.6.1)
======================================

* Compatibility fixes for OpenFst 1.6.1

v. 1.3 (compatible with OpenFst 1.6.0)
======================================

* Fixes to `StringPaths`
* Compatibility fixes for OpenFst 1.6.0

v. 1.2 (compatible with OpenFst 1.5.4)
======================================

* Correctly optimizes RHS argument of a `difference` operation: epsilon-removal
  and determinization (but not minimization or arc-sum mapping)
* Removes platform-dependent `HugeBracketedNumber` test units
* Adds optional path-weight argument to `epsilon_machine`

v. 1.1
======

* Correctly handles final weights in `transducer`
* Fixes inconsistency whereby the use of incorrect arc or weight types raised
  `FstOpError` unless the error occurred during string compilation, in which
  case it'd raise `FstStringCompilationError`; now all arc/weight errors raise
  `FstOpError` and `FstStringCompilationError` is reserved for problems parsing
  strings
* Adds publication information and `pynini.pdf` (the Pynini paper)

v. 1.0
======

* Weight objects now support semiring arithmetic
* Fixes bug whereby using an incompatible weight argument to `acceptor` or
  `transducer` would result in segmentation fault
* In any binary operation with a string and an FST, the FST's arc type is used
  to compile the string, rather than assuming the string is a standard arc FST
* Extensive low-level improvements to all string libraries
* Adds traditional getter methods in place of Python properties in nearly all
  ases
* Adds `containment` and `leniently_compose` methods
* Adds `epsilon_machine` function
* Adds `from_pywrapfst` method for downcasting pywrapfst FSTs
* Adds `ilabels` and `olabels` methods to `StringPaths`

v. 0.9 (fifth public beta)
==========================

* Pynini's got a fever, and the only prescription is more smart pointers
* Fixes several null pointer dereference bugs wherein an object referring to
  FSTs or their symbol tables (such as arc, path, and state iterators) could
  outlive their FSTs; shared pointers are used to extend objects' lives where
  needed
* Adds `CHEATSHEET`

v. 0.8 (fourth public beta)
===========================

* All destructive operations can be chained
* Improves `string_map` to use a prefix tree construction; as a result the
  output FST is deterministic
* Adds `string_file` for creating string maps from tab-separated values files
  on disk; it too uses a prefix tree construction
* Following Thrax, `difference` performs optimization on its right-hand argument
  as the algorithm demands that it be epsilon-free and deterministic
* Adds improved `Arc` object and modifies `Fst.add_arc` so that it takes a
  source state and an `Arc` instance as its arguments
* Consolidates compatibility functions and classes into `gtl.h` and `gtl.cc`
* Improves and extends unit tests

v. 0.7 (third public beta)
==========================

* Fixes symbol table handling in `pdt_replace`
* Optimizes symbol table merging for the most common case
* Adds output-projection and epsilon-removal to `stringify`, so the resulting
  string will not be padded with null bytes

v. 0.6 (second public beta)
===========================

* Adds `string_map` function (cf. Thrax's StringFile)
* Adds the ability to use symbol tables as the `token_type` for `acceptor` and
  the `input_token_type` and/or `output_token_type` for `transducer` or
  `string_map`
* Adds some Python 3 compatibility fixes
* Adds `NEWS`

v. 0.5 (first public beta)
==========================

* Fixes platform-specific integer precision nits
* Makes consistent use of `token_type` arguments for string parsing/printing

v. 0.1-0.4 (public alphas)
=========================

* Fixes user-reported bugs
