package matrix.test.implementations.general; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.List; import matrix.AbstractDataMatrixInstance; import matrix.DataMatrixInstance; import org.apache.log4j.Logger; import org.molgenis.data.Data; import regressiontest.csv.DirectoryCompare; import decorators.NameConvention; public class TestingMethods { public static boolean parseToPlainAndCompare(Logger logger, DataMatrixInstance m, Data description, File inputMatrixDir, String method, boolean fileWrite, boolean simpleOutput) throws Exception { long start = System.currentTimeMillis(); long end = 0; boolean filesAreEqual = false; BufferedWriter bfw = null; File exported = null; if (fileWrite) { exported = new File(inputMatrixDir + File.separator + description.getName() + "_" + method + ".txt"); exported.createNewFile(); bfw = new BufferedWriter(new FileWriter(exported)); } if (fileWrite) { writeHeader(bfw, m.getColNames()); } DataMatrixInstance newMatrix = null; if (method.substring(0, 9).equals("submatrix")) { if (method.equals("submatrixbyindexlist")) { int[] rowIndices = new int[m.getNumberOfRows()]; int[] colIndices = new int[m.getNumberOfCols()]; for (int row = 0; row < m.getNumberOfRows(); row++) { rowIndices[row] = row; } for (int col = 0; col < m.getNumberOfCols(); col++) { colIndices[col] = col; } newMatrix = m.getSubMatrix(rowIndices, colIndices); } if (method.equals("submatrixbynamelist")) { newMatrix = m.getSubMatrix(m.getRowNames(), m.getColNames()); } if (method.equals("submatrixbyindexoffset")) { newMatrix = m.getSubMatrixByOffset(0, m.getNumberOfRows(), 0, m.getNumberOfCols()); } if (method.equals("submatrixbynameoffset")) { newMatrix = m.getSubMatrixByOffset(m.getRowNames().get(0).toString(), m.getNumberOfRows(), m .getColNames().get(0).toString(), m.getNumberOfCols()); } for (int row = 0; row < newMatrix.getNumberOfRows(); row++) { Object[] rowObj = newMatrix.getRow(row); String rowString = newMatrix.getRowNames().get(row).toString(); for (int col = 0; col < newMatrix.getNumberOfCols(); col++) { rowString += "\t" + (rowObj[col] == null ? "" : rowObj[col].toString()); } if (fileWrite) { bfw.write(rowString + "\n"); } } } if (method.substring(0, 3).equals("col")) { Object[][] allObj = new Object[m.getNumberOfCols()][m.getNumberOfRows()]; for (int col = 0; col < m.getNumberOfCols(); col++) { if (method.equals("colbyindex")) { allObj[col] = m.getCol(col); } if (method.equals("colbyname")) { allObj[col] = m.getCol((m.getColNames().get(col).toString())); } } for (int row = 0; row < m.getNumberOfRows(); row++) { String rowString = m.getRowNames().get(row).toString(); for (int col = 0; col < m.getNumberOfCols(); col++) { rowString += "\t" + (allObj[col][row] == null ? "" : allObj[col][row].toString()); } if (fileWrite) { bfw.write(rowString + "\n"); } } } if (method.substring(0, 7).equals("element") || method.substring(0, 3).equals("row")) { for (int row = 0; row < m.getNumberOfRows(); row++) { String rowString = m.getRowNames().get(row).toString(); Object[] rowObj = null; if (method.equals("rowbyindex")) { rowObj = m.getRow(row); } if (method.equals("rowbyname")) { rowObj = m.getRow(m.getRowNames().get(row).toString()); } if (method.substring(0, 3).equals("row")) { for (int col = 0; col < m.getNumberOfCols(); col++) { rowString += "\t" + (rowObj[col] == null ? "" : rowObj[col].toString()); } } if (method.substring(0, 7).equals("element")) { for (int col = 0; col < m.getNumberOfCols(); col++) { if (method.equals("elementbyindex")) { Object obj = m.getElement(row, col); rowString += "\t" + (obj == null ? "" : obj.toString()); } if (method.equals("elementbyname")) { Object obj = m.getElement(m.getRowNames().get(row).toString(), m.getColNames().get(col) .toString()); rowString += "\t" + (obj == null ? "" : obj.toString()); } } } if (fileWrite) { bfw.write(rowString + "\n"); } } } end = System.currentTimeMillis(); if (fileWrite) { bfw.close(); File original = new File(inputMatrixDir + File.separator + NameConvention.escapeFileName(description.getName()) + ".txt"); filesAreEqual = DirectoryCompare.compareFileContent(original, exported); if (simpleOutput) { logger.info("\t" + (end - start) + "\t" + description.getValueType() + ", " + method + "\teq: " + (filesAreEqual == true ? "PASS" : "FAIL")); } else { logger.info("Exported full matrix of type '" + description.getValueType() + "' (" + m.getNumberOfCols() + "x" + m.getNumberOfRows() + ") to file, using read method '" + method + "', test equality to original [" + (filesAreEqual == true ? "PASS" : "FAIL") + "] in " + (end - start) + " ms."); } } else { if (simpleOutput) { logger.info("\t" + (end - start) + "\t" + description.getValueType() + ", " + method + "\tno comp."); } else { logger.info("Queried full matrix of type '" + description.getValueType() + "' (" + m.getNumberOfCols() + "x" + m.getNumberOfRows() + "), using read method '" + method + "', without file write or equality test in " + (end - start) + " ms."); } filesAreEqual = true; } return filesAreEqual; } public static int readSpeed_elementbyindex(Logger logger, DataMatrixInstance m, Data description, File inputMatrixDir) throws Exception { long start = System.currentTimeMillis(); int rows = m.getNumberOfRows(); int cols = m.getNumberOfCols(); for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { m.getElement(row, col); } } long end = System.currentTimeMillis(); long time = (end - start); simplePrint(logger, m, description, time, "elementbyindex"); int elementsPerSec = (int) ((m.getNumberOfCols() * m.getNumberOfRows()) / (time / 1000.0)); return elementsPerSec; } public static int readSpeed_rowbyindex(Logger logger, DataMatrixInstance m, Data description, File inputMatrixDir) throws Exception { long start = System.currentTimeMillis(); int rows = m.getNumberOfRows(); for (int row = 0; row < rows; row++) { m.getRow(row); } long end = System.currentTimeMillis(); long time = (end - start); simplePrint(logger, m, description, time, "rowbyindex"); int elementsPerSec = (int) ((m.getNumberOfCols() * m.getNumberOfRows()) / (time / 1000.0)); return elementsPerSec; } public static int readSpeed_colbyindex(Logger logger, DataMatrixInstance m, Data description, File inputMatrixDir) throws Exception { long start = System.currentTimeMillis(); int cols = m.getNumberOfCols(); for (int col = 0; col < cols; col++) { m.getCol(col); } long end = System.currentTimeMillis(); long time = (end - start); simplePrint(logger, m, description, time, "colbyindex"); int elementsPerSec = (int) ((m.getNumberOfCols() * m.getNumberOfRows()) / (time / 1000.0)); return elementsPerSec; } public static int readSpeed_submatrixbyindexlist(Logger logger, DataMatrixInstance m, Data description, File inputMatrixDir) throws Exception { long start = System.currentTimeMillis(); int[] rowIndices = new int[m.getNumberOfRows()]; int[] colIndices = new int[m.getNumberOfCols()]; for (int row = 0; row < m.getNumberOfRows(); row++) { rowIndices[row] = row; } for (int col = 0; col < m.getNumberOfCols(); col++) { colIndices[col] = col; } m.getSubMatrix(rowIndices, colIndices); long end = System.currentTimeMillis(); long time = (end - start); simplePrint(logger, m, description, time, "submatrixbyindexlist"); int elementsPerSec = (int) ((m.getNumberOfCols() * m.getNumberOfRows()) / (time / 1000.0)); return elementsPerSec; } public static int readSpeed_submatrixbyindexoffset(Logger logger, DataMatrixInstance m, Data description, File inputMatrixDir) throws Exception { long start = System.currentTimeMillis(); m.getSubMatrixByOffset(0, m.getNumberOfRows(), 0, m.getNumberOfCols()); long end = System.currentTimeMillis(); long time = (end - start); simplePrint(logger, m, description, time, "submatrixbyindexoffset"); int elementsPerSec = (int) ((m.getNumberOfCols() * m.getNumberOfRows()) / (time / 1000.0)); return elementsPerSec; } private static void writeHeader(BufferedWriter bfw, List<String> colNames) throws IOException { String write = ""; for (String s : colNames) { write += "\t" + s; } bfw.write(write + "\n"); } public static void simplePrint(Logger logger, DataMatrixInstance m, Data description, long time, String method) { int elementsPerSec = (int) ((m.getNumberOfCols() * m.getNumberOfRows()) / (time / 1000.0)); logger.info("readSpeed_" + method + " (" + description.getValueType() + "): " + time + " ms. (" + elementsPerSec + " elem/sec)"); } }