cern.colt.matrix.tint.algo.IntFormatter Maven / Gradle / Ivy
Show all versions of parallelcolt Show documentation
/*
Copyright (C) 1999 CERN - European Organization for Nuclear Research.
Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose
is hereby granted without fee, provided that the above copyright notice appear in all copies and
that both that copyright notice and this permission notice appear in supporting documentation.
CERN makes no representations about the suitability of this software for any purpose.
It is provided "as is" without expressed or implied warranty.
*/
package cern.colt.matrix.tint.algo;
import cern.colt.matrix.AbstractFormatter;
import cern.colt.matrix.AbstractMatrix1D;
import cern.colt.matrix.AbstractMatrix2D;
import cern.colt.matrix.Former;
import cern.colt.matrix.tint.IntMatrix1D;
import cern.colt.matrix.tint.IntMatrix2D;
import cern.colt.matrix.tint.IntMatrix3D;
/**
* Flexible, well human readable matrix print formatting; By default decimal
* point aligned. Currenly works on 1-d, 2-d and 3-d matrices. Note that in most
* cases you will not need to get familiar with this class; just call
* matrix.toString() and be happy with the default formatting. This
* class is for advanced requirements.
*
*
* Examples:
*
* Examples demonstrate usage on 2-d matrices. 1-d and 3-d matrices formatting
* works very similar.
*
*
* Original matrix
*
*
*
*
*
* int[][] values = {
{3, 0, -3.4, 0},
{5.1 ,0, +3.0123456789, 0},
{16.37, 0.0, 2.5, 0},
{-16.3, 0, -3.012345678E-4, -1},
{1236.3456789, 0, 7, -1.2}
};
matrix = new DenseIntMatrix2D(values);
*
*
*
*
*
*
*
*
*
* format
* Formatter.toString(matrix);
* Formatter.toSourceCode(matrix);
*
*
* %G
* (default)
* 5 x 4 matrix
3 0 -3.4 0
5.1 0 3.012346 0
16.37 0 2.5 0
-16.3 0 -0.000301 -1
1236.345679 0 7 -1.2
* {
{ 3 , 0, -3.4 , 0 },
{ 5.1 , 0, 3.012346, 0 },
{ 16.37 , 0, 2.5 , 0 },
{ -16.3 , 0, -0.000301, -1 },
{1236.345679, 0, 7 , -1.2}
};
*
*
* %1.10G
* 5 x 4 matrix
3 0 -3.4 0
5.1 0 3.0123456789 0
16.37 0 2.5 0
-16.3 0 -0.0003012346 -1
1236.3456789 0 7 -1.2
* {
{ 3 , 0, -3.4 , 0 },
{ 5.1 , 0, 3.0123456789, 0 },
{ 16.37 , 0, 2.5 , 0 },
{ -16.3 , 0, -0.0003012346, -1 },
{1236.3456789, 0, 7 , -1.2}
};
*
*
* %f
* 5 x 4 matrix
3.000000 0.000000 -3.400000 0.000000
5.100000 0.000000 3.012346 0.000000
16.370000 0.000000 2.500000 0.000000
-16.300000 0.000000 -0.000301 -1.000000
1236.345679 0.000000 7.000000 -1.200000
* {
{ 3.000000, 0.000000, -3.400000, 0.000000},
{ 5.100000, 0.000000, 3.012346, 0.000000},
{ 16.370000, 0.000000, 2.500000, 0.000000},
{ -16.300000, 0.000000, -0.000301, -1.000000},
{1236.345679, 0.000000, 7.000000, -1.200000}
};
*
*
* %1.2f
* 5 x 4 matrix
3.00 0.00 -3.40 0.00
5.10 0.00 3.01 0.00
16.37 0.00 2.50 0.00
-16.30 0.00 -0.00 -1.00
1236.35 0.00 7.00 -1.20
* {
{ 3.00, 0.00, -3.40, 0.00},
{ 5.10, 0.00, 3.01, 0.00},
{ 16.37, 0.00, 2.50, 0.00},
{ -16.30, 0.00, -0.00, -1.00},
{1236.35, 0.00, 7.00, -1.20}
};
*
*
* %0.2e
* 5 x 4 matrix
3.00e+000 0.00e+000 -3.40e+000 0.00e+000
5.10e+000 0.00e+000 3.01e+000 0.00e+000
1.64e+001 0.00e+000 2.50e+000 0.00e+000
-1.63e+001 0.00e+000 -3.01e-004 -1.00e+000
1.24e+003 0.00e+000 7.00e+000 -1.20e+000
* {
{ 3.00e+000, 0.00e+000, -3.40e+000, 0.00e+000},
{ 5.10e+000, 0.00e+000, 3.01e+000, 0.00e+000},
{ 1.64e+001, 0.00e+000, 2.50e+000, 0.00e+000},
{-1.63e+001, 0.00e+000, -3.01e-004, -1.00e+000},
{ 1.24e+003, 0.00e+000, 7.00e+000, -1.20e+000}
};
*
*
* null
* 5 x 4 matrix
3.0 0.0 -3.4 0.0
5.1 0.0 3.0123456789 0.0
16.37 0.0 2.5 0.0
-16.3 0.0 -3.012345678E-4 -1.0
1236.3456789 0.0 7.0 -1.2
* {
{ 3.0 , 0.0, -3.4 , 0.0},
{ 5.1 , 0.0, 3.0123456789 , 0.0},
{ 16.37 , 0.0, 2.5 , 0.0},
{ -16.3 , 0.0, -3.012345678E-4, -1.0},
{1236.3456789, 0.0, 7.0 , -1.2}
};
*
*
*
*
* Here are some more elaborate examples, adding labels for axes, rows, columns,
* title and some statistical aggregations.
*
*
*
*
*
* int[][] values = {
{5 ,10, 20, 40 },
{ 7, 8 , 6 , 7 },
{12 ,10, 20, 19 },
{ 3, 1 , 5 , 6 }
};
String title = "CPU performance over time [nops/sec]";
String columnAxisName = "Year";
String rowAxisName = "CPU";
String[] columnNames = {"1996", "1997", "1998", "1999"};
String[] rowNames = { "PowerBar", "Benzol", "Mercedes", "Sparcling"};
hep.aida.bin.BinFunctions1D F = hep.aida.bin.BinFunctions1D.functions; // alias
hep.aida.bin.BinFunction1D[] aggr = {F.mean, F.rms, F.quantile(0.25), F.median, F.quantile(0.75), F.stdDev, F.min, F.max};
String format = "%1.2G";
IntMatrix2D matrix = new DenseIntMatrix2D(values);
new Formatter(format).toTitleString(
matrix,rowNames,columnNames,rowAxisName,columnAxisName,title,aggr);
*
*
*
*
*
CPU performance over time [nops/sec]
| Year
| 1996 1997 1998 1999 | Mean RMS 25% Q. Median 75% Q. StdDev Min Max
---------------------------------------------------------------------------------------
C PowerBar | 5 10 20 40 | 18.75 23.05 8.75 15 25 15.48 5 40
P Benzol | 7 8 6 7 | 7 7.04 6.75 7 7.25 0.82 6 8
U Mercedes | 12 10 20 19 | 15.25 15.85 11.5 15.5 19.25 4.99 10 20
Sparcling | 3 1 5 6 | 3.75 4.21 2.5 4 5.25 2.22 1 6
---------------------------------------------------------------------------------------
Mean | 6.75 7.25 12.75 18 |
RMS | 7.53 8.14 14.67 22.62 |
25% Q. | 4.5 6.25 5.75 6.75 |
Median | 6 9 13 13 |
75% Q. | 8.25 10 20 24.25 |
StdDev | 3.86 4.27 8.38 15.81 |
Min | 3 1 5 6 |
Max | 12 10 20 19 |
*
*
* same as above, but now without aggregations
aggr=null;
*
*
* CPU performance over time [nops/sec]
| Year
| 1996 1997 1998 1999
---------------------------------
C PowerBar | 5 10 20 40
P Benzol | 7 8 6 7
U Mercedes | 12 10 20 19
Sparcling | 3 1 5 6
*
*
*
*
* same as above, but now without rows labeled
aggr=null;
rowNames=null;
rowAxisName=null;
*
*
*
*
*
CPU performance over time [nops/sec]
Year
1996 1997 1998 1999
-------------------
5 10 20 40
7 8 6 7
12 10 20 19
3 1 5 6
*
*
*
*
* A column can be broader than specified by the parameter
* minColumnWidth (because a cell may not fit into that width) but a
* column is never smaller than minColumnWidth. Normally one does not
* need to specify minColumnWidth (default is 1). This
* parameter is only interesting when wanting to print two distinct matrices
* such that both matrices have the same column width, for example, to make it
* easier to see which column of matrix A corresponds to which column of matrix
* B.
*
*
*
* Implementation:
*
*
*
* Note that this class is by no means ment to be used for high performance I/O
* (serialization is much quicker). It is ment to produce well human readable
* output.
*
*
* Analyzes the entire matrix before producing output. Each cell is converted to
* a String as indicated by the given C-like format string. If null is
* passed as format string, {@link java.lang.Int#toString(int)} is used instead,
* yielding full precision.
*
*
* Next, leading and trailing whitespaces are removed. For each column the
* maximum number of characters before and after the decimal point is
* determined. (No problem if decimal points are missing). Each cell is then
* padded with leading and trailing blanks, as necessary to achieve decimal
* point aligned, left justified formatting.
*
*
* @author [email protected]
* @version 1.2, 11/30/99
*/
public class IntFormatter extends AbstractFormatter {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* Constructs and returns a matrix formatter with format "%G".
*/
public IntFormatter() {
this("%d");
}
/**
* Constructs and returns a matrix formatter.
*
* @param format
* the given format used to convert a single cell value.
*/
public IntFormatter(String format) {
setFormat(format);
setAlignment(DECIMAL);
}
/**
* Converts a given cell to a String; no alignment considered.
*/
protected String form(IntMatrix1D matrix, int index, Former formatter) {
return formatter.form(matrix.get(index));
}
/**
* Converts a given cell to a String; no alignment considered.
*/
protected String form(AbstractMatrix1D matrix, int index, Former formatter) {
return this.form((IntMatrix1D) matrix, index, formatter);
}
/**
* Returns a string representations of all cells; no alignment considered.
*/
public String[][] format(IntMatrix2D matrix) {
String[][] strings = new String[matrix.rows()][matrix.columns()];
for (int row = matrix.rows(); --row >= 0;)
strings[row] = formatRow(matrix.viewRow(row));
return strings;
}
/**
* Returns a string representations of all cells; no alignment considered.
*/
protected String[][] format(AbstractMatrix2D matrix) {
return this.format((IntMatrix2D) matrix);
}
/**
* Returns the index of the decimal point.
*/
protected int indexOfDecimalPoint(String s) {
int i = s.lastIndexOf('.');
if (i < 0)
i = s.lastIndexOf('e');
if (i < 0)
i = s.lastIndexOf('E');
if (i < 0)
i = s.length();
return i;
}
/**
* Returns the number of characters before the decimal point.
*/
protected int lead(String s) {
if (alignment.equals(DECIMAL))
return indexOfDecimalPoint(s);
return super.lead(s);
}
/**
* Returns a string s such that Object[] m = s is a legal
* Java statement.
*
* @param matrix
* the matrix to format.
*/
public String toSourceCode(IntMatrix1D matrix) {
IntFormatter copy = (IntFormatter) this.clone();
copy.setPrintShape(false);
copy.setColumnSeparator(", ");
String lead = "{";
String trail = "};";
return lead + copy.toString(matrix) + trail;
}
/**
* Returns a string s such that Object[] m = s is a legal
* Java statement.
*
* @param matrix
* the matrix to format.
*/
public String toSourceCode(IntMatrix2D matrix) {
IntFormatter copy = (IntFormatter) this.clone();
String b3 = blanks(3);
copy.setPrintShape(false);
copy.setColumnSeparator(", ");
copy.setRowSeparator("},\n" + b3 + "{");
String lead = "{\n" + b3 + "{";
String trail = "}\n};";
return lead + copy.toString(matrix) + trail;
}
/**
* Returns a string s such that Object[] m = s is a legal
* Java statement.
*
* @param matrix
* the matrix to format.
*/
public String toSourceCode(IntMatrix3D matrix) {
IntFormatter copy = (IntFormatter) this.clone();
String b3 = blanks(3);
String b6 = blanks(6);
copy.setPrintShape(false);
copy.setColumnSeparator(", ");
copy.setRowSeparator("},\n" + b6 + "{");
copy.setSliceSeparator("}\n" + b3 + "},\n" + b3 + "{\n" + b6 + "{");
String lead = "{\n" + b3 + "{\n" + b6 + "{";
String trail = "}\n" + b3 + "}\n}";
return lead + copy.toString(matrix) + trail;
}
/**
* Returns a string representation of the given matrix.
*
* @param matrix
* the matrix to convert.
*/
public String toString(IntMatrix1D matrix) {
IntMatrix2D easy = matrix.like2D(1, (int) matrix.size());
easy.viewRow(0).assign(matrix);
return toString(easy);
}
/**
* Returns a string representation of the given matrix.
*
* @param matrix
* the matrix to convert.
*/
public String toString(IntMatrix2D matrix) {
return super.toString(matrix);
}
/**
* Returns a string representation of the given matrix.
*
* @param matrix
* the matrix to convert.
*/
public String toString(IntMatrix3D matrix) {
StringBuffer buf = new StringBuffer();
boolean oldPrintShape = this.printShape;
this.printShape = false;
for (int slice = 0; slice < matrix.slices(); slice++) {
if (slice != 0)
buf.append(sliceSeparator);
buf.append(toString(matrix.viewSlice(slice)));
}
this.printShape = oldPrintShape;
if (printShape)
buf.insert(0, shape(matrix) + "\n");
return buf.toString();
}
/**
* Returns a string representation of the given matrix.
*
* @param matrix
* the matrix to convert.
*/
protected String toString(AbstractMatrix2D matrix) {
return this.toString((IntMatrix2D) matrix);
}
/**
* Returns a string representation of the given matrix with axis as well as
* rows and columns labeled. Pass null to one or more parameters to
* indicate that the corresponding decoration element shall not appear in
* the string converted matrix.
*
* @param matrix
* The matrix to format.
* @param rowNames
* The headers of all rows (to be put to the left of the matrix).
* @param columnNames
* The headers of all columns (to be put to above the matrix).
* @param rowAxisName
* The label of the y-axis.
* @param columnAxisName
* The label of the x-axis.
* @param title
* The overall title of the matrix to be formatted.
* @return the matrix converted to a string.
*/
protected String toTitleString(IntMatrix2D matrix, String[] rowNames, String[] columnNames, String rowAxisName,
String columnAxisName, String title) {
if (matrix.size() == 0)
return "Empty matrix";
String[][] s = format(matrix);
// String oldAlignment = this.alignment;
// this.alignment = DECIMAL;
align(s);
// this.alignment = oldAlignment;
return new cern.colt.matrix.tobject.algo.ObjectFormatter().toTitleString(
cern.colt.matrix.tobject.ObjectFactory2D.dense.make(s), rowNames, columnNames, rowAxisName,
columnAxisName, title);
}
/**
* Returns a string representation of the given matrix with axis as well as
* rows and columns labeled. Pass null to one or more parameters to
* indicate that the corresponding decoration element shall not appear in
* the string converted matrix.
*
* @param matrix
* The matrix to format.
* @param sliceNames
* The headers of all slices (to be put above each slice).
* @param rowNames
* The headers of all rows (to be put to the left of the matrix).
* @param columnNames
* The headers of all columns (to be put to above the matrix).
* @param sliceAxisName
* The label of the z-axis (to be put above each slice).
* @param rowAxisName
* The label of the y-axis.
* @param columnAxisName
* The label of the x-axis.
* @param title
* The overall title of the matrix to be formatted.
* @return the matrix converted to a string.
*/
private String xtoTitleString(IntMatrix3D matrix, String[] sliceNames, String[] rowNames, String[] columnNames,
String sliceAxisName, String rowAxisName, String columnAxisName, String title) {
if (matrix.size() == 0)
return "Empty matrix";
StringBuffer buf = new StringBuffer();
for (int i = 0; i < matrix.slices(); i++) {
if (i != 0)
buf.append(sliceSeparator);
buf.append(toTitleString(matrix.viewSlice(i), rowNames, columnNames, rowAxisName, columnAxisName, title
+ "\n" + sliceAxisName + "=" + sliceNames[i]));
}
return buf.toString();
}
}