diff Implab/Automaton/IndexedAlphabetBase.cs @ 192:f1da3afc3521 release v2.1

Слияние с v2
author cin
date Fri, 22 Apr 2016 13:10:34 +0300
parents c32688129f14
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Implab/Automaton/IndexedAlphabetBase.cs	Fri Apr 22 13:10:34 2016 +0300
@@ -0,0 +1,50 @@
+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() {
+            var map = new Dictionary<int, int>();
+
+            int max = 0;
+            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;
+        }
+    }
+}