package Salsa.Core.Blas;
import Salsa.Core.*;
import java.io.Serializable;
public class PartialMatrix implements Serializable {
private int _colCount;
private double[][] _elements;
private int _globalColStartIndex;
private int _globalRowStartIndex;
private int _rowCount;
public PartialMatrix(Range globalRowRange, Range globalColumnRange) {
this(globalRowRange.StartIndex, globalRowRange.EndIndex, globalColumnRange.StartIndex, globalColumnRange.EndIndex);
}
public PartialMatrix(Range globalRowRange, int globalColumnStartIndex, int globalColumnEndIndex) {
this(globalRowRange.StartIndex, globalRowRange.EndIndex, globalColumnStartIndex, globalColumnEndIndex);
}
public PartialMatrix(int globalRowStartIndex, int globalRowEndIndex, Range globalColumnRange) {
this(globalRowStartIndex, globalRowEndIndex, globalColumnRange.StartIndex, globalColumnRange.EndIndex);
}
/**
* Creates a Partial Matrix
*
* @param globalRowStartIndex Inclusive row starting index
* @param globalRowEndIndex Inclusive row ending index
* @param globalColumnStartIndex Inclusive column starting index
* @param globalColumnEndIndex Inclusive column ending index
*/
public PartialMatrix(int globalRowStartIndex, int globalRowEndIndex, int globalColumnStartIndex, int globalColumnEndIndex) {
_globalRowStartIndex = globalRowStartIndex;
_globalColStartIndex = globalColumnStartIndex;
_rowCount = globalRowEndIndex - globalRowStartIndex + 1;
_colCount = globalColumnEndIndex - globalColumnStartIndex + 1;
_elements = CreateElements(_rowCount, _colCount);
}
public PartialMatrix(int globalRowStartIndex, int globalRowEndIndex, int globalColumnStartIndex, int globalColumnEndIndex, double[][] values) {
_globalRowStartIndex = globalRowStartIndex;
_globalColStartIndex = globalColumnStartIndex;
_rowCount = globalRowEndIndex - globalRowStartIndex + 1;
_colCount = globalColumnEndIndex - globalColumnStartIndex + 1;
_elements = values;
}
public final double getItem(int globalRowIndex, int globalColumnIndex) {
return _elements[globalRowIndex - _globalRowStartIndex][globalColumnIndex - _globalColStartIndex];
}
public final void setItem(int globalRowIndex, int globalColumnIndex, double value) {
_elements[globalRowIndex - _globalRowStartIndex][globalColumnIndex - _globalColStartIndex] = value;
}
public final int getRowCount() {
return _rowCount;
}
public final int getColumnCount() {
return _colCount;
}
public final int getGlobalRowStartIndex() {
return _globalRowStartIndex;
}
public final int getGlobalRowEndIndex() {
return _globalRowStartIndex + _rowCount - 1;
}
public final int getGlobalColumnStartIndex() {
return _globalColStartIndex;
}
public final int getGlobalColumnEndIndex() {
return _globalColStartIndex + _colCount - 1;
}
public final boolean getIsSquare() {
return (_rowCount == _colCount);
}
public final double[][] getElements() {
return _elements;
}
public void setValue(int row, int col, double val) {
// if (row == 750 || row == 250) {
// System.out.println("********** row ************" + row);
// }
// if (col == 750 || col == 250) {
// System.out.println("********** col ************" + col);
// }
row = row - _globalRowStartIndex;
col = col - _globalColStartIndex;
_elements[row][col] = val;
}
public final PartialMatrix Transpose() {
double[][] leftElements = CreateElements(_colCount, _rowCount);
for (int i = 0; i < _rowCount; i++) {
for (int j = 0; j < _colCount; j++) {
leftElements[j][i] = _elements[i][j];
}
}
return new PartialMatrix(getGlobalColumnStartIndex(), getGlobalColumnEndIndex(), getGlobalRowStartIndex(), getGlobalRowEndIndex(), leftElements);
}
public final void SetAllValues(double value) {
for (int i = 0; i < getRowCount(); i++) {
for (int j = 0; j < getColumnCount(); j++) {
_elements[i][j] = value;
}
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < Math.min(20, _rowCount); i++) {
for (int j = 0; j < Math.min(20, _colCount); j++) {
if (j > 0) {
sb.append(", ");
}
sb.append(String.format("%1$4s", _elements[i][j]));
if (i == 20 - 1) {
sb.append("...");
}
}
sb.append("\r\n");
}
return sb.toString();
}
public double[][] CreateElements(int rowCount, int columnCount) {
double[][] elements = new double[rowCount][];
for (int i = 0; i < rowCount; i++) {
elements[i] = new double[columnCount];
}
System.out.println("Partial matrix size: " + rowCount + " x " + columnCount);
return elements;
}
public void GetRowColumnCount(double[][] data, int rows, int columns) {
rows = data.length;
columns = (rows == 0) ? 0 : data[0].length;
}
//C# TO JAVA CONVERTER TODO TASK: There is no preprocessor in Java:
///#region Row Operations
public final double[] GetRowValues(int globalRowIndex) {
globalRowIndex = globalRowIndex - _globalRowStartIndex;
double[] values = new double[_colCount];
System.arraycopy(_elements[globalRowIndex], 0, values, 0, _colCount);
return values;
}
public final void SetRowValues(int globalRowIndex, double[] values) {
globalRowIndex = globalRowIndex - _globalRowStartIndex;
System.arraycopy(values, 0, _elements[globalRowIndex], 0, values.length);
}
public final double[] GetColumnValues(int globalColumnIndex) {
globalColumnIndex = globalColumnIndex - _globalColStartIndex;
double[] leftElements = new double[_rowCount];
for (int i = 0; i < _rowCount; i++) {
leftElements[i] = _elements[i][globalColumnIndex];
}
return leftElements;
}
public final void SetColumnValues(int globalColumnIndex, double[] values) {
globalColumnIndex = globalColumnIndex - _globalColStartIndex;
for (int i = 0; i < values.length; i++) {
_elements[i][globalColumnIndex] = values[i];
}
}
public final double[][] GetBlockValues(Block globalBlock) {
return GetBlockValues(globalBlock.RowRange, globalBlock.ColumnRange);
}
public final double[][] GetBlockValues(Range globalRowRange, Range globalColumnRange) {
return GetBlockValues(globalRowRange.StartIndex, globalRowRange.EndIndex, globalColumnRange.StartIndex, globalColumnRange.EndIndex);
}
public final double[][] GetBlockValues(int globalRowStartIndex, int globalRowEndIndex, int globalColumnStartIndex, int globalColumnEndIndex) {
globalRowStartIndex = globalRowStartIndex - _globalRowStartIndex;
globalRowEndIndex = globalRowEndIndex - _globalRowStartIndex;
globalColumnStartIndex = globalColumnStartIndex - _globalColStartIndex;
globalColumnEndIndex = globalColumnEndIndex - _globalColStartIndex;
double[][] leftElements = CreateElements(globalRowEndIndex - globalRowStartIndex + 1, globalColumnEndIndex - globalColumnStartIndex + 1);
for (int i = globalRowStartIndex; i <= globalRowEndIndex; i++) {
for (int j = globalColumnStartIndex; j <= globalColumnEndIndex; j++) {
leftElements[i - globalRowStartIndex][j - globalColumnStartIndex] = _elements[i][j];
}
}
return leftElements;
}
/**
Gets the block at the given coordinate but transforms the block before returning it. This is an optimization
method.
@param globalBlock The block to retrieve
@return
*/
public final double[][] GetTransposedBlock(Block globalBlock) {
return GetTransposedBlock(globalBlock.RowRange, globalBlock.ColumnRange);
}
/**
Gets the block at the given coordinate but transforms the block before returning it. This is an optimization
method.
@param globalRowRange The range specifiying the rows to retrieve
@param globalColumnRange The range specifiying the columns to retrieve
@return
*/
public final double[][] GetTransposedBlock(Range globalRowRange, Range globalColumnRange) {
return GetTransposedBlock(globalRowRange.StartIndex, globalRowRange.EndIndex, globalColumnRange.StartIndex, globalColumnRange.EndIndex);
}
/**
Gets the block at the given coordinate but transforms the block before returning it. This is an optimization
method.
@param globalRowStartIndex Inclusive starting row index.
@param globalRowEndIndex Inclusive ending row index.
@param globalColumnStartIndex Inclusive starting column index.
@param globalColumnEndIndex Inclusive ending column index.
@return
*/
public final double[][] GetTransposedBlock(int globalRowStartIndex, int globalRowEndIndex, int globalColumnStartIndex, int globalColumnEndIndex) {
globalRowStartIndex = globalRowStartIndex - _globalRowStartIndex;
globalRowEndIndex = globalRowEndIndex - _globalRowStartIndex;
globalColumnStartIndex = globalColumnStartIndex - _globalColStartIndex;
globalColumnEndIndex = globalColumnEndIndex - _globalColStartIndex;
double[][] leftElements = CreateElements(globalColumnEndIndex - globalColumnStartIndex + 1, globalRowEndIndex - globalRowStartIndex + 1);
for (int i = globalRowStartIndex; i <= globalRowEndIndex; i++) {
for (int j = globalColumnStartIndex; j <= globalColumnEndIndex; j++) {
leftElements[j - globalColumnStartIndex][i - globalRowStartIndex] = _elements[i][j];
}
}
return leftElements;
}
public final void SetBlockValues(Block globalBlock, double[][] blockValues) {
SetBlockValues(globalBlock.RowRange, globalBlock.ColumnRange, blockValues);
}
public final void SetBlockValues(Range globalRowRange, Range globalColumnRange, double[][] blockValues) {
SetBlockValues(globalRowRange.StartIndex, globalRowRange.EndIndex, globalColumnRange.StartIndex, globalColumnRange.EndIndex, blockValues);
}
public final void SetBlockValues(int globalRowStartIndex, int globalRowEndIndex, int globalColumnStartIndex, int globalColumnEndIndex, double[][] blockValues) {
globalRowStartIndex = globalRowStartIndex - _globalRowStartIndex;
globalRowEndIndex = globalRowEndIndex - _globalRowStartIndex;
globalColumnStartIndex = globalColumnStartIndex - _globalColStartIndex;
globalColumnEndIndex = globalColumnEndIndex - _globalColStartIndex;
for (int i = globalRowStartIndex; i <= globalRowEndIndex; i++) {
for (int j = globalColumnStartIndex; j <= globalColumnEndIndex; j++) {
try {
_elements[i][j] = blockValues[i - globalRowStartIndex][j - globalColumnStartIndex];
} catch (RuntimeException ex) {
System.out.printf("%1$s,%2$s", i, j, "\r\n");
throw (ex);
}
}
}
}
}