A simple form of the linguist. It makes the following simplifying assumptions: 1) Zero or one word per grammar node
2) No fan-in allowed ever 3) No composites (yet) 4) Only Unit, HMMState, and pronunciation states (and the
initial/final grammar state are in the graph (no word, alternative or grammar states attached). 5) Only valid
transitions (matching contexts) are allowed 6) No tree organization of units 7) Branching grammar states are
allowed

This is a dynamic version of the flat linguist that is more efficient in terms of startup time and overall footprint

deallocate

Deallocates the linguist. Any resources allocated by this linguist are released.

Implementor's Note - if the linguist is being shared by multiple searches, the deallocate should only actually
deallocate things when the last call to deallocate is made. Two approaches for dealing with this:

(1) Keep an allocation counter that is incremented during allocate and decremented during deallocate. Only when
the counter reaches zero should the actually deallocation be performed.