/// <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); }
/// <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); }