/* Copyright (C) 2006 Univ. of Massachusetts Amherst, Computer Science Dept.
This file is part of "MALLET" (MAchine Learning for LanguagE Toolkit).
http://www.cs.umass.edu/~mccallum/mallet
This software is provided under the terms of the Common Public License,
version 1.0, as published by http://www.opensource.org. For further
information, see the file `LICENSE' included with this distribution. */
package cc.mallet.grmm.types;
import cc.mallet.util.Randoms;
/**
* A factor over a continuous variable theta and binary variables <tt>var</tt>.
* such that <tt>phi(x|theta)<tt> is Potts. That is, for fixed theta, <tt>phi(x)</tt> = 1
* if all x are equal, and <tt>exp^{-theta}</tt> otherwise.
* $Id: BoltzmannUnaryFactor.java,v 1.1 2007/10/22 21:37:44 mccallum Exp $
*/
public class BoltzmannUnaryFactor extends TableFactor {
private double theta; // parameter
private Variable var; // The binary variable
public BoltzmannUnaryFactor (Variable var, double theta)
{
super (var, theta2values (theta));
this.theta = theta;
this.var = var;
if (var.getNumOutcomes () != 2) {
throw new IllegalArgumentException ("Discrete variable "+var+" in BoltzmannUnary must be binary.");
}
}
private static double[] theta2values (double theta)
{
return new double[] { 1, Math.exp(theta) };
}
/*
public double secondDerivative (Factor q, Variable param, Assignment paramAssn)
{
if (param != theta) throw new IllegalArgumentException ();
Factor q_xs = q.marginalize (var);
Assignment assn = new Assignment (var, 1);
double p = - q_xs.value (assn);
return p * (p - 1);
}
*/
public Factor duplicate ()
{
return new BoltzmannUnaryFactor (var, theta);
}
public boolean almostEquals (Factor p, double epsilon)
{
return equals (p);
}
public boolean isNaN ()
{
return Double.isNaN (theta);
}
public boolean equals (Object o)
{
if (this == o) return true;
if (o == null || getClass () != o.getClass ()) return false;
final BoltzmannUnaryFactor that = (BoltzmannUnaryFactor) o;
if (theta != that.theta) return false;
if (var != null ? !var.equals (that.var) : that.var != null) return false;
return true;
}
public int hashCode ()
{
int result;
result = new Double(theta).hashCode();
result = 29 * result + (var != null ? var.hashCode () : 0);
return result;
}
public String prettyOutputString ()
{
return var.getLabel() + " ~ Unary " + Double.toString(theta);
}
public Factor multiply (Factor other) {
Factor result = new TableFactor (this);
result.multiplyBy (other);
return result;
}
}