/// <summary>
            /// Reads state and appends it into Automaton builder. Returns index in the serialized data.
            /// If <paramref name="checkIndex"/> is true, will throw exception if serialized index
            /// does not match index in deserialized states array. This check is bypassed only when
            /// start state is serialized second time.
            /// </summary>
            public static int ReadTo(
                ref Builder builder,
                Func <int> readInt32,
                Func <double> readDouble,
                Func <TElementDistribution> readElementDistribution,
                bool checkIndex = false)
            {
                var endWeight = Weight.Read(readDouble);
                // Note: index is serialized for compatibility with old binary serializations
                var index = readInt32();

                if (checkIndex && index != builder.StatesCount)
                {
                    throw new Exception("Index in serialized data does not match index in deserialized array");
                }

                var state = builder.AddState();

                state.SetEndWeight(endWeight);

                var transitionCount = readInt32();

                for (var i = 0; i < transitionCount; i++)
                {
                    state.AddTransition(Transition.Read(readInt32, readDouble, readElementDistribution));
                }

                return(index);
            }
示例#2
0
            /// <summary>
            /// Reads the automaton state.
            /// </summary>
            public static State Read(Func <int> readInt32, Func <double> readDouble, Func <TElementDistribution> readElementDistribution)
            {
                var res = new State();

                res.EndWeight = Weight.Read(readDouble);
                res.Index     = readInt32();
                var transitionCount = readInt32();

                var transitionLength = res.transitions.Length;

                while (transitionLength < transitionCount)
                {
                    transitionLength <<= 1;
                }

                var transitions = transitionLength == res.transitions.Length ? res.transitions : new Transition[transitionLength];

                for (var i = 0; i < transitionCount; i++)
                {
                    transitions[i] = Transition.Read(readInt32, readDouble, readElementDistribution);
                }

                res.transitionCount = transitionCount;
                res.transitions     = transitions;

                return(res);
            }
            /// <summary>
            /// Reads a transition.
            /// </summary>
            public static Transition Read(Func <int> readInt32, Func <double> readDouble, Func <TElementDistribution> readElementDistribution)
            {
                var res = new Transition();

                res.DestinationStateIndex = readInt32();
                var groupAndHasElementDistribution = readInt32();

                if ((groupAndHasElementDistribution & 0x1) == 0x1)
                {
                    res.ElementDistribution = readElementDistribution();
                }
                res.Group  = (byte)(groupAndHasElementDistribution >> 1);
                res.Weight = Weight.Read(readDouble);
                return(res);
            }