Exemple #1
0
 /// <see cref="Operators.Print{T}"/>
 public static Matrix <T> Print <T>(this Matrix <T> matrix, IMatrixPrinter printer = null)
 {
     return(new Print <T>(printer)
     {
         Param = matrix
     });
 }
Exemple #2
0
        protected override void DoInference()
        {
            // Default printer
            if (Printer == null)
            {
                Printer = new LogPrinter();
            }

            var matrix = Param;

            // Print an empty matrix
            if (matrix.VectorCount == 0)
            {
                Printer.Print(new List <string>()
                {
                    "+++", "+ +", "+++"
                });
                return;
            }

            // Get all vector string representations
            // as a list of strings
            var strVectors = matrix.Vectors.Select(v =>
            {
                var str   = v.ToString();
                var lines = str.Split(
                    new[] { "\r\n", "\r", "\n" },
                    StringSplitOptions.None
                    );

                var maxCount = lines.Max(s => s.Length);

                for (var i = 0; i < lines.Length; i++)
                {
                    lines[i] = lines[i].PadRight(maxCount);
                }

                return(lines.ToList());
            }).ToList();

            // This is the max number of lines for any vector
            var maxLineCount = strVectors.Max(strings => strings.Count);

            // This is the max number of chars in any line for any vector
            var maxCharCount = strVectors.Max(strings => strings.Max(s => s.Length));

            // This is an empty line (will be used to pad)
            var emptyLine = string.Join("", Enumerable.Repeat(" ", maxCharCount));

            // Coerce all lines of all vectors to have the same length
            // Coerce all vectors to have the same number of lines
            foreach (var vector in strVectors)
            {
                while (vector.Count < maxLineCount)
                {
                    vector.Add(emptyLine);
                }
                for (var i = 0; i < vector.Count; i++)
                {
                    vector[i] = " " + vector[i].PadLeft(maxCharCount) + " ";
                }
            }

            maxCharCount += 2;


            var strMatrices = strVectors.Select(strings =>
            {
                // Create a matrix for each vector
                var sMatrix = new Matrix <string>(new[] { maxLineCount, maxCharCount });

                var chars = new List <string>();
                foreach (var line in strings)
                {
                    foreach (var c in line)
                    {
                        chars.Add(c.ToString());
                    }
                }

                sMatrix.SetData(chars);
                return(sMatrix);
            }).ToList();

            // Contains all matrices of all vectors
            var strMatrix = new Matrix <Matrix <string> >(matrix.Sizes).SetData(strMatrices).Unwrap(UnwrapMode.Expand);

            strMatrix = strMatrix.Wrap().Map(matrix1 =>
            {
                var m       = matrix1.Pad("+");
                var padding = new Matrix <string>(m.Sizes.ElementAt(0), 1).Fill(" ");
                m           = padding.Concat(m, 1).Concat(padding, 1);
                return(m);
            }).Unwrap();


            var current = strMatrix;

            var odd = true;

            while (current.DimensionCount > 2)
            {
                var dimensionTo = odd ? current.DimensionCount - 1 : current.DimensionCount - 2;

                current = current.Flatten(current.DimensionCount - 3, dimensionTo, FlattenMode.Extend);

                current = current.Wrap().Map(matrix1 =>
                {
                    var paddingChar      = odd ? "x" : "+";
                    var m                = matrix1.Pad(paddingChar);
                    var paddingWidth     = 1;
                    var paddingHeight    = m.Sizes.ElementAt(0);
                    var paddingDimension = 1;
                    var padding          = new Matrix <string>(paddingHeight, paddingWidth).Fill(" ");

                    return(padding.Concat(m, 1).Concat(padding, 1));
                }).Unwrap();

                odd = !odd;
            }

            var enumerator = new MatrixWindowEnumerator <string>(current, new[] { 1, current.Sizes.ElementAt(1) });
            var res        = new List <string>();

            while (enumerator.MoveNext())
            {
                res.Add(string.Join("", enumerator.Current.Matrix.Vectors));
            }

            Printer.Print(res);

            Output = matrix;
        }
Exemple #3
0
 public Print(IMatrixPrinter printer)
 {
     Printer = printer;
 }
Exemple #4
0
 public PrimeApp(INumbers numbers, IMatrixFormat tableFormat, IMatrixPrinter printer)
 {
     _numbers     = numbers;
     _print       = printer;
     _tableFormat = tableFormat;
 }
Exemple #5
0
 public static Matrix <T> Print <T>(Matrix <T> matrix, IMatrixPrinter printer = null)
 {
     return(matrix.Print(printer));
 }
Exemple #6
0
 public FakePrimeApp(INumbers numbers, IMatrixFormat matrix, IMatrixPrinter printer) : base(numbers, matrix, printer)
 {
 }