View Javadoc

1   package net.obsearch.example.vectors;
2   
3   import java.io.ByteArrayInputStream;
4   import java.io.ByteArrayOutputStream;
5   import java.io.DataInputStream;
6   import java.io.DataOutputStream;
7   import java.io.IOException;
8   import java.nio.ByteBuffer;
9   import java.nio.FloatBuffer;
10  import java.nio.IntBuffer;
11  import java.nio.ShortBuffer;
12  import java.util.Arrays;
13  
14  
15  
16  import net.obsearch.asserts.OBAsserts;
17  import net.obsearch.constants.ByteConstants;
18  import net.obsearch.exception.OBException;
19  import net.obsearch.ob.OBFloat;
20  import net.obsearch.ob.OBInt;
21  import net.obsearch.ob.OBLong;
22  import net.obsearch.ob.OBShort;
23  import net.obsearch.utils.bytes.ByteConversion;
24  
25  
26  public class L1Float implements OBFloat {
27  	
28  	private float[] vector;
29  	
30  	public L1Float(){
31  		// required by OBSearch
32  	}
33  	
34  	/**
35  	 * Construct an object from an array.
36  	 * @param vector
37  	 */
38  	public L1Float(float[] vector){
39  		this.vector = vector;
40  	}
41  	/**
42  	 * Parses a string with numbers separated by spaces
43  	 * @param data
44  	 */
45  	public L1Float(String data)throws OBException{
46  		String[] split = data.split("[ |,]");
47  		vector = new float[split.length];
48  		//OBAsserts.chkAssert(vector.length == 64, "Size wrong for vector: " + vector.length);
49  		
50  		int i = 0;
51  		for(String s : split){
52  			vector[i] = Float.parseFloat(s);
53  			i++;
54  		}
55  	}
56  
57  	@Override
58  	public float distance(OBFloat object) throws OBException {
59  		L1Float other = (L1Float)object;
60  		int i = 0;
61  		float res = 0;
62  		OBAsserts.chkAssert(vector.length == other.vector.length, "Vector size mismatch");
63  		while(i < vector.length){
64  			res += Math.abs(vector[i] - other.vector[i]);
65  			i++;
66  		}
67  		OBAsserts.chkAssert(res <= Long.MAX_VALUE, "max value exceeded");
68  		return res; 
69  	}
70  
71  	@Override
72  	public void load(byte[] input) throws OBException, IOException {
73  		FloatBuffer s = ByteConversion.createByteBuffer(input).asFloatBuffer();
74  		vector = new float[input.length / ByteConstants.Float.getSize()];
75  		s.get(vector);		
76  	}
77  	
78  	/**
79       * 6) Equals method. Implementation of the equals method is required. A
80       * casting error can happen here, but we don't check it for efficiency
81       * reasons.
82       * @param object
83       *            The object to compare.
84       * @return true if this and object are equal.
85       */
86      public final boolean equals(final Object object) {
87          L1Float o = (L1Float) object;
88          return Arrays.equals(vector, o.vector);
89      }
90  
91  
92  
93  	@Override
94  	public byte[] store() throws OBException, IOException {
95  		ByteBuffer b = ByteConversion.createByteBuffer(ByteConstants.Float.getSize() * vector.length);
96  		FloatBuffer s = b.asFloatBuffer();
97  		s.put(vector);
98  		return b.array();		
99  	}
100 
101 }