001/* 002 AUTOMATICALLY GENERATED BY jTemp FROM 003 /Users/jsh2/Work/openimaj/target/checkout/core/core-feature/src/main/jtemp/org/openimaj/feature/Sparse#T#FV.jtemp 004*/ 005/** 006 * Copyright (c) 2011, The University of Southampton and the individual contributors. 007 * All rights reserved. 008 * 009 * Redistribution and use in source and binary forms, with or without modification, 010 * are permitted provided that the following conditions are met: 011 * 012 * * Redistributions of source code must retain the above copyright notice, 013 * this list of conditions and the following disclaimer. 014 * 015 * * Redistributions in binary form must reproduce the above copyright notice, 016 * this list of conditions and the following disclaimer in the documentation 017 * and/or other materials provided with the distribution. 018 * 019 * * Neither the name of the University of Southampton nor the names of its 020 * contributors may be used to endorse or promote products derived from this 021 * software without specific prior written permission. 022 * 023 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 024 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 025 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 026 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 027 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 028 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 029 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 030 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 031 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 032 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 033 */ 034package org.openimaj.feature; 035 036import java.io.DataInput; 037import java.io.DataOutput; 038import java.io.IOException; 039import java.io.PrintWriter; 040import java.util.List; 041import java.util.Scanner; 042 043import org.openimaj.util.array.SparseBinSearchByteArray; 044import org.openimaj.util.array.SparseByteArray; 045import org.openimaj.util.array.SparseByteArray.Entry; 046import org.openimaj.util.concatenate.Concatenatable; 047 048/** 049 * A sparse one-dimensional feature vector of byte-valued elements. 050 * 051 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk) 052 * 053 */ 054public class SparseByteFV implements FeatureVector, Concatenatable<SparseByteFV, SparseByteFV> { 055 private static final long serialVersionUID = 1L; 056 057 /** 058 * The underlying data backing the feature vector 059 */ 060 public SparseByteArray values; 061 062 /** 063 * Construct an empty FV with zero length 064 */ 065 protected SparseByteFV() { 066 } 067 068 /** 069 * Construct empty FV with given number of bins 070 * @param nbins the number of bins in each dimension 071 */ 072 public SparseByteFV(int nbins) { 073 values = new SparseBinSearchByteArray(nbins); 074 } 075 076 /** 077 * Construct from sparse array 078 * @param values the array of values 079 */ 080 public SparseByteFV(SparseByteArray values) { 081 this.values = values; 082 } 083 084 /** 085 * Construct from native array 086 * @param values the array of values 087 */ 088 public SparseByteFV(byte[] values) { 089 this.values = new SparseBinSearchByteArray(values); 090 } 091 092 /* (non-Javadoc) 093 * @see org.openimaj.io.ReadableASCII#readASCII(java.util.Scanner) 094 */ 095 @Override 096 public void readASCII(Scanner in) throws IOException { 097 values = new SparseBinSearchByteArray(0); 098 values.readASCII(in); 099 } 100 101 /* (non-Javadoc) 102 * @see org.openimaj.io.ReadableASCII#asciiHeader() 103 */ 104 @Override 105 public String asciiHeader() { 106 return "SByteFV"; 107 } 108 109 /* (non-Javadoc) 110 * @see org.openimaj.io.ReadableBinary#readBinary(java.io.DataInput) 111 */ 112 @Override 113 public void readBinary(DataInput in) throws IOException { 114 values = new SparseBinSearchByteArray(0); 115 values.readBinary(in); 116 } 117 118 /* (non-Javadoc) 119 * @see org.openimaj.io.ReadableBinary#binaryHeader() 120 */ 121 @Override 122 public byte[] binaryHeader() { 123 return "SByteFV".getBytes(); 124 } 125 126 /* (non-Javadoc) 127 * @see org.openimaj.io.WriteableASCII#writeASCII(java.io.PrintWriter) 128 */ 129 @Override 130 public void writeASCII(PrintWriter out) throws IOException { 131 values.writeASCII(out); 132 } 133 134 /* (non-Javadoc) 135 * @see org.openimaj.io.WriteableBinary#writeBinary(java.io.DataOutput) 136 */ 137 @Override 138 public void writeBinary(DataOutput out) throws IOException { 139 values.writeBinary(out); 140 } 141 142 /* (non-Javadoc) 143 * @see org.openimaj.feature.FeatureVector#getVector() 144 */ 145 @Override 146 public SparseByteArray getVector() { 147 return values; 148 } 149 150 /* (non-Javadoc) 151 * @see org.openimaj.feature.FeatureVector#length() 152 */ 153 @Override 154 public int length() { 155 return values.length; 156 } 157 158 /* (non-Javadoc) 159 * @see org.openimaj.feature.FeatureVector#normaliseFV(double[], double[]) 160 */ 161 @Override 162 public DoubleFV normaliseFV(double [] min, double [] max) { 163 double [] dvals = asDoubleVector(); 164 165 for (int i=0; i<dvals.length; i++) { 166 dvals[i] -= min[i]; 167 dvals[i] /= (max[i]-min[i]); 168 169 if (dvals[i]<0) dvals[i] = 0; 170 if (dvals[i]>1) dvals[i] = 1; 171 } 172 173 return new DoubleFV(dvals); 174 } 175 176 /* (non-Javadoc) 177 * @see org.openimaj.feature.FeatureVector#normaliseFV(double, double) 178 */ 179 @Override 180 public DoubleFV normaliseFV(double min, double max) { 181 double [] dvals = asDoubleVector(); 182 183 for (int i=0; i<dvals.length; i++) { 184 dvals[i] -= min; 185 dvals[i] /= (max-min); 186 187 if (dvals[i]<0) dvals[i] = 0; 188 if (dvals[i]>1) dvals[i] = 1; 189 } 190 191 return new DoubleFV(dvals); 192 } 193 194 /* (non-Javadoc) 195 * @see org.openimaj.feature.FeatureVector#normaliseFV() 196 */ 197 @Override 198 public DoubleFV normaliseFV() { 199 double [] dvals = asDoubleVector(); 200 double sum = 0; 201 202 for (int i=0; i<dvals.length; i++) 203 sum += dvals[i]; 204 205 for (int i=0; i<dvals.length; i++) 206 dvals[i] /= sum; 207 208 return new DoubleFV(dvals); 209 } 210 211 /* (non-Javadoc) 212 * @see org.openimaj.feature.FeatureVector#normaliseFV(double) 213 */ 214 @Override 215 public DoubleFV normaliseFV(double p) { 216 return asDoubleFV().normaliseFV(p); 217 } 218 219 /* (non-Javadoc) 220 * @see org.openimaj.feature.FeatureVector#asDoubleFV() 221 */ 222 @Override 223 public DoubleFV asDoubleFV() { 224 return new DoubleFV(asDoubleVector()); 225 } 226 227 /* (non-Javadoc) 228 * @see org.openimaj.feature.FeatureVector#asDoubleVector() 229 */ 230 @Override 231 public double[] asDoubleVector() { 232 double [] d = new double[values.length]; 233 234 for (Entry e : values.entries()) { 235 d[e.index] = e.value; 236 } 237 238 return d; 239 } 240 241 @Override 242 public SparseByteFV concatenate(SparseByteFV... ins) { 243 SparseByteArray [] insValues = new SparseByteArray[ins.length]; 244 245 for (int i=0; i<ins.length; i++) 246 insValues[i] = ins[i].values; 247 248 SparseByteArray vals = values.concatenate(insValues); 249 250 return new SparseByteFV(vals); 251 } 252 253 @Override 254 public SparseByteFV concatenate(List<SparseByteFV> ins) { 255 SparseByteArray [] insValues = new SparseByteArray[ins.size()]; 256 257 for (int i=0; i<ins.size(); i++) 258 insValues[i] = ins.get(i).values; 259 260 SparseByteArray vals = values.concatenate(insValues); 261 262 return new SparseByteFV(vals); 263 } 264 265 @Override 266 public double getAsDouble(int i) { 267 return values.get(i); 268 } 269 270 @Override 271 public void setFromDouble(int i, double v) { 272 values.set(i, (byte) v); 273 } 274 275 @Override 276 public SparseByteFV newInstance() { 277 return new SparseByteFV(length()); 278 } 279}