public Factor duplicate () { return new PottsTableFactor (xs, alpha); }
public PottsTableFactor (VarSet xs, Variable alpha) { super (combineVariables (alpha, xs)); this.alpha = alpha; this.xs = xs; if (!alpha.isContinuous ()) throw new IllegalArgumentException ("alpha must be continuous"); }
public boolean almostEquals (Factor p, double epsilon) { return equals (p); }
public double secondDerivative (Factor q, Variable param, Assignment theta) { double e_x = sumGradLog (q, param, theta); Factor q_xs = q.marginalize (xs); double e_x2 = 0.0; for (AssignmentIterator it = xs.assignmentIterator (); it.hasNext(); it.advance()) { Assignment assn = it.assignment (); if (!isAllEqual (assn)) { e_x2 += q_xs.value (it); } } return e_x2 - (e_x * e_x); }
public Factor slice (Assignment assn) { Factor alphSlice = sliceForAlpha (assn); // recursively slice, in case assn includes some of the xs return alphSlice.slice (assn); }
public void testSumGradLog () { Assignment alphaAssn = new Assignment (alpha, 1.0); double[] values = new double[] { 0.4, 0.1, 0.3, 0.2 }; Factor q = new TableFactor (vars, values); double grad = factor.sumGradLog (q, alpha, alphaAssn); assertEquals (-0.4, grad, 1e-5); }
private Factor sliceForAlpha (Assignment assn) { double alph = assn.getDouble (alpha); int[] sizes = sizesFromVarSet (xs); Matrix diag = Matrices.diag (sizes, alph); Matrix matrix = Matrices.constant (sizes, -alph); matrix.plusEquals (diag); return LogTableFactor.makeFromLogMatrix (xs.toVariableArray (), (SparseMatrixn) matrix); }
public double sumGradLog (Factor q, Variable param, Assignment theta) { if (param != alpha) throw new IllegalArgumentException (); Factor q_xs = q.marginalize (xs); double qDiff = 0.0; for (AssignmentIterator it = xs.assignmentIterator (); it.hasNext(); it.advance()) { Assignment assn = it.assignment (); if (!isAllEqual (assn)) { qDiff += -q_xs.value (it); } } return qDiff; }
public double logValue (AssignmentIterator it) { return Math.log (value (it)); }
public void testSlice () { Assignment assn = new Assignment (alpha, 1.0); Factor sliced = factor.slice (assn); assertTrue (sliced instanceof AbstractTableFactor); assertTrue (sliced.varSet ().equals (vars)); TableFactor expected = new TableFactor (vars, new double[] { 1.0, Math.exp(-1), Math.exp(-1), 1.0 }); assertTrue (sliced.almostEquals (expected)); }
public double secondDerivative (Factor q, Variable param, Assignment theta) { double e_x = sumGradLog (q, param, theta); Factor q_xs = q.marginalize (xs); double e_x2 = 0.0; for (AssignmentIterator it = xs.assignmentIterator (); it.hasNext(); it.advance()) { Assignment assn = it.assignment (); if (!isAllEqual (assn)) { e_x2 += q_xs.value (it); } } return e_x2 - (e_x * e_x); }
public Factor slice (Assignment assn) { Factor alphSlice = sliceForAlpha (assn); // recursively slice, in case assn includes some of the xs return alphSlice.slice (assn); }
public void testSumGradLog () { Assignment alphaAssn = new Assignment (alpha, 1.0); double[] values = new double[] { 0.4, 0.1, 0.3, 0.2 }; Factor q = new TableFactor (vars, values); double grad = factor.sumGradLog (q, alpha, alphaAssn); assertEquals (-0.4, grad, 1e-5); }
private Factor sliceForAlpha (Assignment assn) { double alph = assn.getDouble (alpha); int[] sizes = sizesFromVarSet (xs); Matrix diag = Matrices.diag (sizes, alph); Matrix matrix = Matrices.constant (sizes, -alph); matrix.plusEquals (diag); return LogTableFactor.makeFromLogMatrix (xs.toVariableArray (), (SparseMatrixn) matrix); }
public double sumGradLog (Factor q, Variable param, Assignment theta) { if (param != alpha) throw new IllegalArgumentException (); Factor q_xs = q.marginalize (xs); double qDiff = 0.0; for (AssignmentIterator it = xs.assignmentIterator (); it.hasNext(); it.advance()) { Assignment assn = it.assignment (); if (!isAllEqual (assn)) { qDiff += -q_xs.value (it); } } return qDiff; }
public double logValue (AssignmentIterator it) { return Math.log (value (it)); }
public void testSlice () { Assignment assn = new Assignment (alpha, 1.0); Factor sliced = factor.slice (assn); assertTrue (sliced instanceof AbstractTableFactor); assertTrue (sliced.varSet ().equals (vars)); TableFactor expected = new TableFactor (vars, new double[] { 1.0, Math.exp(-1), Math.exp(-1), 1.0 }); assertTrue (sliced.almostEquals (expected)); }
public double secondDerivative (Factor q, Variable param, Assignment theta) { double e_x = sumGradLog (q, param, theta); Factor q_xs = q.marginalize (xs); double e_x2 = 0.0; for (AssignmentIterator it = xs.assignmentIterator (); it.hasNext(); it.advance()) { Assignment assn = it.assignment (); if (!isAllEqual (assn)) { e_x2 += q_xs.value (it); } } return e_x2 - (e_x * e_x); }
public Factor duplicate () { return new PottsTableFactor (xs, alpha); }
public Factor slice (Assignment assn) { Factor alphSlice = sliceForAlpha (assn); // recursively slice, in case assn includes some of the xs return alphSlice.slice (assn); }