Mercurial > pub > ImplabNet
view Implab/Automaton/IndexedAlphabetBase.cs @ 179:478ef706906a ref20160224
sync
author | cin |
---|---|
date | Wed, 23 Mar 2016 19:52:08 +0300 |
parents | 0c3c69fe225b |
children | c32688129f14 |
line wrap: on
line source
using Implab; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; namespace Implab.Automaton { /// <summary> /// Indexed alphabet is the finite set of symbols where each symbol has a zero-based unique index. /// </summary> /// <remarks> /// Indexed alphabets are usefull in bulting efficient translations from source alphabet /// to the input alphabet of the automaton. It's assumed that the index to the symbol match /// is well known and documented. /// </remarks> public abstract class IndexedAlphabetBase<T> : MapAlphabet<T> { protected IndexedAlphabetBase() :base(true, null) { } public abstract int GetSymbolIndex(T symbol); /// <summary> /// Gets the translation map from the index of the symbol to it's class this is usefull for the optimized input symbols transtaion. /// </summary> /// <remarks> /// The map is continous and start from the symbol with zero code. The last symbol /// in the map is the last classified symbol in the alphabet, i.e. the map can be /// shorter then the whole alphabet. /// </remarks> /// <returns>The translation map.</returns> public int[] GetTranslationMap() { Dictionary<int,int> map = new Dictionary<int, int>(); int max; foreach (var p in Mappings) { var index = GetSymbolIndex(p.Key); max = Math.Max(max, index); map[index] = p.Value; } var result = new int[max + 1]; for (int i = 0; i < result.Length; i++) map.TryGetValue(i, out result[i]); return result; } } }