# StateMap

## Description

This operation transforms each state in the input FST. The transformation is specified by a function object called a state mapper.

For instance, `ArcSumMapper` combines arcs with the same input label, output label and destination state, ⊕-summing their weights.

A list of available state mappers and instructions on how to create them are given here.

## Usage

 ```template StateMap(MutableFst *fst, StateMapper *mapper); ``` ```template StateMap(MutableFst *fst, StateMapper mapper); ``` ```template StateMap(const Fst &ifst, MutableFst *ofst, StateMapper *mapper); ``` ```template StateMap(const Fst &ifst, MutableFst *ofst, StateMapper mapper); ``` ```template StateMapFst:: StateMapFst(const Fst &fst, StateMapper *mapper); ``` ```template StateMapFst:: StateMapFst(const Fst &fst, const StateMapper &mapper); ``` ```fstmap [--opts] in.fst out.fst -map_type (Map operation, one of: "identity", "arc_sum") type: string default: "identity" -weight (Weight parameter) type: string default: "" ```

Note `fstmap` also includes arc mappers.

## Example

(TropicalWeight)

### `StateMap(&A, ArcSumMapper(A))`:

```StateMap(&A, ArcSumMapper<StdArc>(A));
StateMap(A, &B, ArcSumMapper<StdArc>(A));
StateMapFst B(A, ArcSumMapper<StdArc>(A));

fstmap --map_type=arc_sum a.fst b.fst
```

## Complexity

`StateMap:`

• Time: O(c*V)
• Space: O(m)
where V = # of states, c = cost of processing one state by the mapper and m = total memory usage for the mapper.

`StateMapFst:`

• Time: O(c*v)
• Space: O(m)
where v = # of visited states, c = cost of processing one state by the mapper and m = total memory usage for the mapper. Constant time and space to visit an input state is assumed and exclusive of caching.

For instance in the case of `ArcSumMap`, we have c = O(D log(D)) and m = O(D), where D = maximum out-degree.