/** * edu.utexas.GeDBIT.type.ImageKeyObject 2006.06.19 Copyright Information: * Change Log: 2006.06.19: Copied from jdb 1.0, by Rui Mao */ package GeDBIT.type; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import GeDBIT.index.TableManager; /** * This is the key of Image Object. This object stores an array of floating * numbers representing the key for image object. It is designed only for GeDBIT * image dataset, might not work for other datasets. * * @author Wenguo Liu, Ru Mao, Willard * @version 2006.07.26 */ public class Image extends IndexObject { /** * */ private static final long serialVersionUID = -6207971406392822640L; private Table table; /** * Floating numbers represent the features for an image. */ private float[] m_Feas; private double[] max_Dist = { 1.0, 60.0, 1.0 }; public Image() { } public Image(Table table, int rowID, float[] feas) { this(table, rowID, feas, null); } /** * @param table * @param rowID * @param feas * an array of floats over which the feature values are defined. * @param maxDist */ public Image(Table table, int rowID, float[] feas, double[] maxDist) { super(rowID); this.table = table; m_Feas = new float[feas.length]; for (int i = 0; i < feas.length; i++) m_Feas[i] = feas[i]; if (maxDist != null) { max_Dist = new double[maxDist.length]; for (int i = 0; i < max_Dist.length; i++) max_Dist[i] = maxDist[i]; } } /** * @param index * @return */ public float getFeature(int index) { return m_Feas[index]; } @Override // TODO javadoc public int size() { return m_Feas.length; } /* * (non-Javadoc) * * @see GeDBIT.type.IndexObject#expand() */ @Override public IndexObject[] expand() { IndexObject[] dbO = new IndexObject[rowIDLength]; for (int i = 0; i < rowIDLength; i++) { dbO[i] = new Image(table, rowIDStart + i, m_Feas, max_Dist); } return dbO; } /* * (non-Javadoc) * * @see GeDBIT.type.IndexObject#compareTo(GeDBIT.type.IndexObject) */ @Override public int compareTo(IndexObject oThat) { if (!(oThat instanceof Image)) throw new Error("not compatible"); Image that = (Image) oThat; if (this == that) return 0; if (this.m_Feas.length < that.m_Feas.length) return -1; else if (this.m_Feas.length > that.m_Feas.length) return 1; else { for (int i = 0; i < m_Feas.length; i++) { if (m_Feas[i] < that.m_Feas[i]) return -1; else if (m_Feas[i] > that.m_Feas[i]) return 1; } return 0; } } /* * (non-Javadoc) * * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object other) { if (other == this) return true; if (!(other instanceof Image)) return false; Image image = (Image) other; if (this.m_Feas.length != image.m_Feas.length) return false; for (int i = 0; i < this.m_Feas.length; i++) if (Math.abs(m_Feas[i] - image.m_Feas[i]) > 1.0e-10) { return false; } return true; } /* * (non-Javadoc) * * @see java.lang.Object#hashCode() */ public int hashCode() { int result = 17; for (int i = 0; i < m_Feas.length; i++) { result = 37 * result + Float.floatToIntBits(m_Feas[i]); } return result; } /* * (non-Javadoc) * * @see java.lang.Object#toString() */ public String toString() { StringBuffer result = new StringBuffer("ImageKeyObject, length :"); result.append(m_Feas.length).append(", offset : "); for (int i = 0; i < m_Feas.length; i++) result.append(m_Feas[i]).append(", "); return result.toString(); } /* * (non-Javadoc) * * @see java.io.Externalizable#writeExternal(java.io.ObjectOutput) */ public void writeExternal(ObjectOutput out) throws IOException { super.writeExternal(out); out.writeInt(m_Feas.length); for (int i = 0; i < m_Feas.length; ++i) out.writeFloat(m_Feas[i]); out.writeInt(max_Dist.length); for (int i = 0; i < max_Dist.length; i++) { out.writeDouble(max_Dist[i]); } out.writeObject(table.getIndexPrefix()); out.writeInt(table.getTableLocation()); } /* * (non-Javadoc) * * @see java.io.Externalizable#readExternal(java.io.ObjectInput) */ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { super.readExternal(in); this.m_Feas = new float[in.readInt()]; for (int i = 0; i < m_Feas.length; ++i) m_Feas[i] = in.readFloat(); this.max_Dist = new double[in.readInt()]; for (int i = 0; i < max_Dist.length; i++) { max_Dist[i] = in.readDouble(); } String indexPrefix = (String) in.readObject(); table = TableManager.getTableManager(indexPrefix) .getTable(in.readInt()); } }