package dr.inference.model; import dr.inference.loggers.LogColumn; import dr.inference.loggers.NumberColumn; /** * Created by max on 4/6/16. */ public class AdaptableSizeFastMatrixParameter extends FastMatrixParameter { public AdaptableSizeFastMatrixParameter(String id, int rowDimension, int colDimension, int maxRow, int maxCol, double startingValue, boolean lowerTriangle) { super(id, maxRow, maxCol, startingValue); if(maxRow < rowDimension){ throw new RuntimeException("Row Dimension: " + rowDimension + ", is greater than Max Row Dimension: " + maxRow + " in " + getParameterName()); } if(maxCol < colDimension){ throw new RuntimeException("Column Dimension: " + colDimension + ", is greater than Max Column Dimension: " + columnDimension + " in " + getParameterName()); } this.rowDimension = rowDimension; this.columnDimension = colDimension; this.maxRow = maxRow; this.maxCol = maxCol; this.storedColumnDimension = rowDimension; this.storedColumnDimension = columnDimension; this.lowerTriangle = lowerTriangle; } public void setRowDimension(int rowDimension){ int oldRowDimension = this.rowDimension; this.rowDimension = rowDimension; if(rowDimension > oldRowDimension) fireParameterChangedEvent(-1, ChangeType.ADDED); else fireParameterChangedEvent(-1, ChangeType.REMOVED); } public void setColumnDimension(int columnDimension){ int oldColumnDimension = this.columnDimension; this.columnDimension = columnDimension; if(columnDimension > oldColumnDimension) fireParameterChangedEvent(-1, ChangeType.ADDED); else fireParameterChangedEvent(-1, ChangeType.REMOVED); } @Override protected void storeValues(){ super.storeValues(); storedRowDimension = rowDimension; storedColumnDimension = columnDimension; } protected void restoreValues(){ super.restoreValues(); rowDimension = storedRowDimension; columnDimension = storedColumnDimension; } public int getRowDimension(){ return rowDimension; } public int getColumnDimension(){ return columnDimension; } public int getDimension(){ return rowDimension * columnDimension; } public int getMaxRowDimension(){return maxRow;} public int getMaxColumnDimension(){return maxCol;} public void setParameterValue(int index, double value) { int row = index % rowDimension; int col = index / rowDimension; if (row >= col || !lowerTriangle){ super.setParameterValueQuietly(row, col, value); fireParameterChangedEvent(index, null); } } public void setParameterValue(int row, int column, double value){ if(row >= column || !lowerTriangle){ super.setParameterValueQuietly(row, column, value); fireParameterChangedEvent(getRowDimension() * column + row, ChangeType.VALUE_CHANGED); } } public void setParameterValueQuietly(int index, double value){ int row = index % rowDimension; int col = index / rowDimension; if(row >= col || !lowerTriangle) { super.setParameterValueQuietly(row, col, value); } } public void setParameterValueQuietly(int row, int column, double value){ if(row >= column || !lowerTriangle){ super.setParameterValueQuietly(row, column, value); } } public double getParameterValue(int index){ int row = index % rowDimension; int col = index / rowDimension; if(row >= col || !lowerTriangle) { return super.getParameterValue(row, col); } else return 0; } public double getParameterValue(int row, int col){ if(row >= col || !lowerTriangle) { return super.getParameterValue(row, col); } else return 0; } public double[] getParameterValues(){ double[] answer = new double[getDimension()]; for (int i = 0; i < getDimension(); i++) { answer[i]= getParameterValue(i); } return answer; } int rowDimension; int columnDimension; int storedRowDimension; int storedColumnDimension; int maxRow; int maxCol; boolean lowerTriangle; public LogColumn[] getColumns(){ LogColumn[] bigMatrixColumn = new ASFMPColumn[1]; bigMatrixColumn[0] = new ASFMPColumn(getParameterName()); return bigMatrixColumn; } private class ASFMPColumn extends NumberColumn { public ASFMPColumn(String label) { super(label); } protected String getFormattedValue(){ String fullMatrix = "{"; for (int i = 0; i <getRowDimension() ; i++) { fullMatrix += " { "; for (int j = 0; j < getColumnDimension(); j++) { fullMatrix += formatValue(getParameterValue(i,j)); if(j != getColumnDimension() - 1){ fullMatrix += ", "; } } if(i == getRowDimension()-1) fullMatrix += " } "; else fullMatrix += " },"; } fullMatrix += "}"; return fullMatrix; } @Override public double getDoubleValue() { return 0; } } }