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));
            }
        }
Пример #5
0
        /// <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);
            }
        }