/* 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.Maths;
import cc.mallet.util.Randoms;
/**
* $Id: ConstantFactor.java,v 1.1 2007/10/22 21:37:44 mccallum Exp $
*/
public class ConstantFactor extends AbstractFactor {
private double c;
public ConstantFactor (double c)
{
super (new HashVarSet ());
this.c = c;
}
protected Factor extractMaxInternal (VarSet varSet)
{
return this;
}
protected double lookupValueInternal (int i)
{
return c;
}
protected Factor marginalizeInternal (VarSet varsToKeep)
{
return this;
}
public double value (AssignmentIterator it)
{
return c;
}
// I can't imagine why anyone whould want to call this method.
public Factor normalize ()
{
c = 1.0;
return this;
}
public Assignment sample (Randoms r)
{
return new Assignment ();
}
public String dumpToString ()
{
return "[ConstantFactor : "+c+" ]";
}
public String toString ()
{
return dumpToString ();
}
public Factor slice (Assignment assn)
{
return this;
}
public Factor duplicate ()
{
return new ConstantFactor (c);
}
public boolean almostEquals (Factor p, double epsilon)
{
return (p instanceof ConstantFactor && Maths.almostEquals (c, ((ConstantFactor)p).c, epsilon));
}
public boolean isNaN ()
{
return Double.isNaN (c);
}
public Factor multiply (Factor other)
{
// special handling of identity factor
if (Maths.almostEquals (c, 1.0)) {
return other.duplicate ();
} else if (other instanceof ConstantFactor) {
return new ConstantFactor (c * ((ConstantFactor)other).c);
} else {
return other.multiply (this);
}
}
public void multiplyBy (Factor other)
{
if (!(other instanceof ConstantFactor)) {
throw new UnsupportedOperationException ("Can't multiply a constant factor by "+other);
} else {
ConstantFactor otherCnst = (ConstantFactor) other;
c *= otherCnst.c;
}
}
public static Factor makeIdentityFactor ()
{
return new ConstantFactor (1.0);
}
// Serialization garbage
private static final long serialVersionUID = -2934945791792969816L;
}