/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.datamodel.types.internal;
import org.apache.commons.logging.LogFactory;
import de.rcenvironment.core.datamodel.api.DataType;
import de.rcenvironment.core.datamodel.api.DataTypeException;
import de.rcenvironment.core.datamodel.api.TypedDatum;
import de.rcenvironment.core.datamodel.api.TypedDatumConverter;
import de.rcenvironment.core.datamodel.internal.TypedDatumServiceImpl;
import de.rcenvironment.core.datamodel.types.api.FloatTD;
import de.rcenvironment.core.datamodel.types.api.MatrixTD;
import de.rcenvironment.core.datamodel.types.api.SmallTableTD;
import de.rcenvironment.core.datamodel.types.api.VectorTD;
/**
* Implementation of {@link MatrixTD}.
*
* @author Doreen Seider
*/
public class MatrixTDImpl extends AbstractTypedDatum implements MatrixTD {
private SmallTableTD table;
public MatrixTDImpl(FloatTD[][] matrixEntries) {
super(DataType.Matrix);
this.table = new SmallTableTDImpl(matrixEntries);
}
@Override
public FloatTD getFloatTDOfElement(int rowIndex, int columnIndex) {
return (FloatTD) table.getTypedDatumOfCell(rowIndex, columnIndex);
}
@Override
public void setFloatTDForElement(FloatTD number, int rowIndex, int columnIndex) {
table.setTypedDatumForCell(number, rowIndex, columnIndex);
}
@Override
public int getRowDimension() {
return table.getRowCount();
}
@Override
public int getColumnDimension() {
return table.getColumnCount();
}
@Override
public MatrixTD getSubMatrix(int endRowIndex, int endColumnIndex) {
TypedDatumConverter converter = new TypedDatumServiceImpl().getConverter();
try {
return converter.castOrConvert(table.getSubTable(endRowIndex, endColumnIndex), MatrixTD.class);
} catch (DataTypeException e) {
// should not happen
LogFactory.getLog(getClass()).error("conversion failed", e);
return null;
}
}
@Override
public MatrixTD getSubMatrix(int beginRowIndex, int beginColumnIndex, int endRowIndex, int endColumnIndex) {
TypedDatumConverter converter = new TypedDatumServiceImpl().getConverter();
try {
return converter.castOrConvert(table.getSubTable(beginRowIndex, beginColumnIndex,
endRowIndex, endColumnIndex), MatrixTD.class);
} catch (DataTypeException e) {
// should not happen
LogFactory.getLog(getClass()).error("conversion failed", e);
return null;
}
}
@Override
public VectorTD getColumnVector(int columnIndex) {
if (columnIndex < 0 || columnIndex >= getColumnDimension()) {
throw new IllegalArgumentException("index out of range: " + columnIndex);
}
FloatTD[][] matrixEntries = toArray();
FloatTD[] vectorEntries = new FloatTD[getRowDimension()];
for (int i = 0; i < getRowDimension(); i++) {
vectorEntries[i] = matrixEntries[i][columnIndex];
}
return new VectorTDImpl(vectorEntries);
}
@Override
public VectorTD getRowVector(int rowIndex) {
if (rowIndex < 0 || rowIndex >= getRowDimension()) {
throw new IllegalArgumentException("index out of range: " + rowIndex);
}
FloatTD[][] matrixEntries = toArray();
FloatTD[] vectorEntries = new FloatTD[getColumnDimension()];
for (int i = 0; i < getColumnDimension(); i++) {
vectorEntries[i] = matrixEntries[rowIndex][i];
}
return new VectorTDImpl(vectorEntries);
}
@Override
public boolean equals(Object obj) {
if (obj != null && obj instanceof MatrixTD) {
MatrixTD other = (MatrixTD) obj;
return table.equals(new SmallTableTDImpl(other.toArray()));
}
return false;
}
@Override
public int hashCode() {
return table.hashCode();
}
@Override
public FloatTD[][] toArray() {
TypedDatum[][] tableAsArray = table.toArray();
FloatTD[][] resultArray = new FloatTD[getRowDimension()][getColumnDimension()];
for (int i = 0; i < getRowDimension(); i++) {
System.arraycopy(tableAsArray[i], 0, resultArray[i], 0, getColumnDimension());
}
return resultArray;
}
@Override
public String toLengthLimitedString(int maxLength) {
String text = "[";
String formattedLabel = "";
VectorTD firstRow = getRowVector(0);
for (FloatTD f : firstRow.toArray()) {
text += f.toString();
text += ",";
if (text.length() > maxLength) {
break;
}
}
// remove last comma
text = text.substring(0, text.length() - 1);
if (text.length() > maxLength) {
text = text.substring(0, maxLength) + " ...";
}
text += "]";
text += "...";
formattedLabel += text;
String dimensionsText = " (" + getColumnDimension() + "x" + getRowDimension() + ")";
formattedLabel += dimensionsText;
return formattedLabel;
}
@Override
public String toString() {
String fullContent = "";
for (int i = 0; i < getRowDimension(); i++) {
// fill fullcontent
VectorTD row = getRowVector(i);
for (FloatTD f : row.toArray()) {
// remove comma for integers
String floatValue = VectorTDImpl.toPrettyString(f.getFloatValue());
fullContent += floatValue;
fullContent += ", ";
}
fullContent = fullContent.substring(0, fullContent.length() - 2);
fullContent += "\r\n";
}
return fullContent;
}
}