/* Copyright (C) 2002 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. */
/**
@author Andrew McCallum <a href="mailto:mccallum@cs.umass.edu">mccallum@cs.umass.edu</a>
*/
package cc.mallet.types;
import cc.mallet.types.Label;
import cc.mallet.types.RankedFeatureVector;
public class LabelVector extends RankedFeatureVector implements Labeling
{
public LabelVector (LabelAlphabet dict,
int[] features,
double[] values)
{
super (dict, features, values);
}
private static int[] indicesForLabels (Label[] labels)
{
int[] indices = new int[labels.length];
for (int i = 0; i < labels.length; i++)
indices[i] = labels[i].getIndex();
return indices;
}
public LabelVector (Label[] labels,
double[] values)
{
super (labels[0].dictionary, indicesForLabels(labels), values);
}
public LabelVector (LabelAlphabet dict, double[] values)
{
super (dict, values);
}
public final Label labelAtLocation (int loc)
{
return ((LabelAlphabet)dictionary).lookupLabel(indexAtLocation (loc));
}
public LabelAlphabet getLabelAlphabet ()
{
return (LabelAlphabet) dictionary;
}
// Labeling interface
// xxx Change these names to better match RankedFeatureVector?
public int getBestIndex ()
{
if (rankOrder == null)
setRankOrder ();
return rankOrder[0];
}
public Label getBestLabel ()
{
return ((LabelAlphabet)dictionary).lookupLabel (getBestIndex());
}
public double getBestValue ()
{
if (rankOrder == null)
setRankOrder ();
return values[rankOrder[0]];
}
public double value (Label label)
{
assert (label.dictionary == this.dictionary);
return values[this.location (label.toString ())];
}
public int getRank (Label label)
{
//throw new UnsupportedOperationException ();
// CPAL - Implemented this
if (rankOrder == null)
setRankOrder();
int ii=-1;
int tmpIndex = ((LabelAlphabet)dictionary).lookupIndex(label.entry);
// Now find this index in the ordered list with a linear search
for(ii=0; ii<rankOrder.length ; ii++) {
if (rankOrder[ii] == tmpIndex)
break;
}
// CPAL if ii == -1 we have a problem
return ii;
}
public int getRank (int labelIndex)
{
return getRank(((LabelAlphabet)dictionary).lookupLabel(labelIndex));
}
public Label getLabelAtRank (int rank)
{
if (rankOrder == null)
setRankOrder ();
return ((LabelAlphabet)dictionary).lookupLabel (rankOrder[rank]);
}
public double getValueAtRank (int rank)
{
if (rankOrder == null)
setRankOrder ();
return values[rankOrder[rank]];
}
public LabelVector toLabelVector ()
{
return this;
}
// Inherited from FeatureVector or SparseVector
// public void addTo (double[] values)
// public void addTo (double[] values, double scale)
// public int numLocations ();
// public double valueAtLocation (int loc)
}