HMM(int numVisibleStates, int numHiddenStates, long seed) { this.seed = seed; this.numVisibleStates = numVisibleStates; this.numHiddenStates = numHiddenStates; this.transitionProbabilityMatrix = new DenseDoubleMatrix(numHiddenStates, numHiddenStates); this.emissionProbabilityMatrix = new DenseDoubleMatrix(numHiddenStates, numVisibleStates); this.hiddenPriorProbability = new DenseDoubleVector(numHiddenStates); }
@Override public DoubleVector getColumnVector(int col) { return new DenseDoubleVector(getColumn(col)); }
@Override public DoubleVector getRowVector(int row) { return new DenseDoubleVector(getRow(row)); }
@Override public final DoubleVector subtract(double v) { DenseDoubleVector newv = new DenseDoubleVector(vector.length); for (int i = 0; i < vector.length; i++) { newv.set(i, vector[i] - v); } return newv; }
@Override public DoubleMatrix slice(int rowOffset, int rowMax, int colOffset, int colMax) { DenseDoubleMatrix m = new DenseDoubleMatrix(rowMax - rowOffset, colMax - colOffset); for (int row = rowOffset; row < rowMax; row++) { for (int col = colOffset; col < colMax; col++) { m.set(row - rowOffset, col - colOffset, this.get(row, col)); } } return m; }
/** * @return a new vector with dimension num and a default value of 1. */ public static DenseDoubleVector ones(int num) { return new DenseDoubleVector(num, 1.0d); }
@Override public double[][] toArray() { double[][] mat = new double[getRowCount()][getColumnCount()]; int index = 0; for (int col = 0; col < getColumnCount(); col++) { for (int row = 0; row < getRowCount(); row++) { mat[row][col] = matrix[index++]; } } return mat; }
@Override public double max(int column) { double max = Double.MIN_VALUE; int offset = translate(0, column, numRows); for (int i = 0; i < getRowCount(); i++) { double d = matrix[offset + i]; if (d > max) { max = d; } } return max; }
@Override public DenseDoubleMatrix subtract(double amount) { double[] csjr = new double[this.numRows * this.numColumns]; for (int i = 0; i < matrix.length; i++) { csjr[i] = this.matrix[i] - amount; } return new DenseDoubleMatrix(csjr, this.numRows, this.numColumns, false); }
@Override public double min() { double min = Double.MAX_VALUE; for (int i = 0; i < getLength(); i++) { double d = vector[i]; if (d < min) { min = d; } } return min; }
@Override public int[] columnIndices() { int[] x = new int[getColumnCount()]; for (int i = 0; i < getColumnCount(); i++) x[i] = i; return x; }
@Override public int[] rowIndices() { int[] x = new int[getRowCount()]; for (int i = 0; i < getRowCount(); i++) x[i] = i; return x; }
/** * Gets a whole column of the matrix as a double array. */ public double[] getColumn(int col) { double[] column = new double[numRows]; int offset = translate(0, col, numRows); for (int i = 0; i < column.length; i++) { column[i] = matrix[offset + i]; } return column; }
@Override public Iterator<DoubleVectorElement> iterate() { return new DefaultIterator(); }
@Override public final DoubleVector subtractFrom(double v) { DenseDoubleVector newv = new DenseDoubleVector(vector.length); for (int i = 0; i < vector.length; i++) { newv.set(i, v - vector[i]); } return newv; }
/** * @return a new vector with dimension num and a default value of 0. */ public static DenseDoubleVector zeros(int num) { return new DenseDoubleVector(num); }
@Override public DenseDoubleMatrix multiply(double scalar) { double[] csjr = new double[this.numRows * this.numColumns]; for (int i = 0; i < matrix.length; i++) { csjr[i] = this.matrix[i] * scalar; } return new DenseDoubleMatrix(csjr, this.numRows, this.numColumns, false); }
@Override public double max() { double max = -Double.MAX_VALUE; for (int i = 0; i < getLength(); i++) { double d = vector[i]; if (d > max) { max = d; } } return max; }
@Override public double get(int row, int col) { return matrix[translate(row, col, numRows)]; }
@Override public DenseDoubleMatrix subtractBy(double amount) { double[] csjr = new double[this.numRows * this.numColumns]; for (int i = 0; i < matrix.length; i++) { csjr[i] = amount - this.matrix[i]; } return new DenseDoubleMatrix(csjr, this.numRows, this.numColumns, false); }