/* Copyright (C) 2003 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 java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.IOException; import java.io.Serializable; import cc.mallet.types.LabelAlphabet; import cc.mallet.util.PropertyList; /** * Class for a discrete random variable in a graphical model. * * Created: Thu Sep 18 09:32:25 2003 * * @author <a href="mailto:casutton@cs.umass.edu">Charles Sutton</a> * @version $Id: Variable.java,v 1.1 2007/10/22 21:37:44 mccallum Exp $ */ public class Variable implements Comparable, Serializable { private String label; // name of this variable private LabelAlphabet outcomes; /** Number of outcomes for a continous variable. */ public static final int CONTINUOUS = -1; private static int counter = 0; private Universe universe; private int index; /** * Creates a new variable with the given outcomes. */ public Variable (LabelAlphabet outs) { this (Universe.DEFAULT, outs); } public Variable (Universe universe, LabelAlphabet outs) { this.universe = universe; this.outcomes = outs; if (outs.size() < 1) { throw new IllegalArgumentException ("Attempt to create variable with "+outs.size()+" outcomes."); } setName (); index = universe.add (this); } public Variable (int numOutcomes) { this (Universe.DEFAULT, numOutcomes); } public Variable (Universe universe, int numOutcomes) { this.universe = universe; if (numOutcomes > 0) outcomes = createBlankAlphabet (numOutcomes); setName (); index = universe.add (this); } private static LabelAlphabet createBlankAlphabet (int numOutcomes) { if (numOutcomes > 0) { LabelAlphabet outcomes = new LabelAlphabet (); /* Setup default outcomes */ for (int i = 0; i < numOutcomes; i++) { outcomes.lookupIndex (new Integer (i)); } return outcomes; } else return null; } private void setName () { setLabel ("VAR" + (counter++)); } public String getLabel () { return label; } public void setLabel (String label) { this.label = label; } public int getNumOutcomes () { if (outcomes == null) { // we're continuous return CONTINUOUS; } else { return outcomes.size(); } } public Object lookupOutcome (int i) { return outcomes.lookupObject (i); } public LabelAlphabet getLabelAlphabet () { return outcomes; } public int compareTo(Object o) { /* Variable var = (Variable) o; return getLabel().compareTo (var.getLabel()); */ int index = this.index; int index2 = ((Variable)o).index; if (index == index2) { return 0; } else if (index < index2) { return -1; } else { return 1; } /**/ } transient private PropertyList properties = null; public void setNumericProperty (String key, double value) { properties = PropertyList.add (key, value, properties); } public double getNumericProperty (String key) { return properties.lookupNumber (key); } public String toString () { return label; } /** Returns the index of this variable in its universe */ public int getIndex () { return index; } public Universe getUniverse () { return universe; } // Serialization garbage private static final long serialVersionUID = 1; private static final int CURRENT_SERIAL_VERSION = 1; private void writeObject (ObjectOutputStream out) throws IOException { out.defaultWriteObject (); out.writeInt (CURRENT_SERIAL_VERSION); } private void readObject (ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject (); in.readInt (); } public boolean isContinuous () { return outcomes == null; } }