private static IEnumerable <byte[]> ComposeArray([NotNull] IHeaderArray array) { yield return(Encoding.ASCII.GetBytes(array.Header.PadRight(4).Substring(0, 4))); yield return(WriteMetadata(array)); switch (array.Type) { case HeaderArrayType.C1: { yield return(WriteCharacterArray(array.Count, array.Dimensions.Last(), array.As <string>().Values)); yield break; } case HeaderArrayType.RE: { foreach (byte[] values in WriteRealArrayWithSetLabels(array.As <float>())) { yield return(values); } yield break; } case HeaderArrayType.I2: { foreach (byte[] values in WriteTwoDimensionalNumericArray(array.As <int>(), (writer, value) => writer.Write(value))) { yield return(values); } yield break; } case HeaderArrayType.R2: { foreach (byte[] values in WriteTwoDimensionalNumericArray(array.As <float>(), (writer, value) => writer.Write(value))) { yield return(values); } yield break; } default: { throw new NotSupportedException($"Type: {array.Type}"); } } }
private static byte[] WriteDimensions([NotNull] IHeaderArray array, int vectorIndex) { return (WriteComponent( writer => { writer.Write(vectorIndex); writer.Write(array.Dimensions.Count); foreach (int dimension in array.Dimensions) { writer.Write(dimension); } })); }
private static byte[] WriteMetadata([NotNull] IHeaderArray array) { return (WriteComponent( writer => { writer.Write((short)array.Type); writer.Write((int)HeaderArrayStorage.Full); writer.Write(array.Description.PadRight(70).Substring(0, 70).ToCharArray()); writer.Write(array.Dimensions.Count); foreach (int dimension in array.Dimensions) { writer.Write(dimension); } })); }
private static IEnumerable <byte[]> WriteSets(IHeaderArray array) { HashSet <string> setsUsed = new HashSet <string>(); yield return (WriteComponent( writer => { writer.Write(array.Sets.Select(x => x.Key).Distinct().Count()); writer.Write(Spacer); writer.Write(array.Sets.Count); writer.Write(array.Coefficient.PadRight(12).Substring(0, 12).ToCharArray()); writer.Write(Spacer); for (int i = 0; i < array.Sets.Count; i++) { writer.Write(array.Sets[i].Key.PadRight(12).Substring(0, 12).ToCharArray()); } for (int i = 0; i < array.Sets.Count; i++) { writer.Write('k'); } writer.Write(0); for (int i = 0; i < array.Sets.Count; i++) { writer.Write(0); } })); foreach (KeyValuePair <string, IImmutableList <string> > set in array.Sets) { if (!setsUsed.Add(set.Key)) { continue; } yield return(WriteCharacterArray(set.Value.Count, 12, set.Value)); } }
/// <summary> /// Constructs a command file from the command file header. /// </summary> /// <param name="commandFile"> /// A header (CMDF) containing the lines of a command file. /// </param> /// <param name="sets"> /// /// </param> public ModelCommandFile(IHeaderArray <string> commandFile, IEnumerable <KeyValuePair <string, IImmutableList <string> > > sets) { CommandText = commandFile.Values .AsParallel() .AsOrdered() .Select(x => RemoveComments.Replace(x, string.Empty)) .Aggregate( new StringBuilder(), (current, next) => current.Append(next + ' '), result => result.ToString()); ExogenousCommands = ExogenousVariableSection.Matches(CommandText) .Cast <Match>() .Aggregate( new StringBuilder(), (current, next) => current.Append(next.Value + ' '), result => result.ToString()); ShockedCommands = ShockedVariablesSection.Match(CommandText).Value; ExogenousDefinitions = SetExogenousVariables(ExogenousCommands, sets).ToImmutableArray(); ShockedDefinitions = SetShockedVariables(ShockedCommands).ToImmutableArray(); foreach (VariableDefinition def in ExogenousDefinitions) { Console.WriteLine(def); } foreach (VariableDefinition def in ShockedDefinitions) { Console.WriteLine(def); } }