/**
* Bobo Browse Engine - High performance faceted/parametric search implementation
* that handles various types of semi-structured data. Written in Java.
*
* Copyright (C) 2005-2006 spackle
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* To contact the project administrators for the bobo-browse project,
* please go to https://sourceforge.net/projects/bobo-browse/, or
* contact owner@browseengine.com.
*/
package com.browseengine.bobo.util.test;
import java.util.Random;
import junit.framework.TestCase;
import com.browseengine.bobo.util.MutableSparseFloatArray;
public class MutableSparseFloatArrayTest extends TestCase {
private static final long SEED = -7862018348108294439L;
public void testMute() throws Throwable {
try {
Random rand = new Random(SEED);
float[] orig = new float[1024];
MutableSparseFloatArray fromEmpty = new MutableSparseFloatArray(new float[1024]);
float density = 0.2f;
int idx = 0;
while (rand.nextFloat() > density) {
idx++;
}
while (idx < orig.length) {
float val = rand.nextFloat();
orig[idx] = val;
fromEmpty.set(idx, val);
idx += 1;
while (rand.nextDouble() > density) {
idx++;
}
}
float[] copy = new float[orig.length];
System.arraycopy(orig, 0, copy, 0, orig.length);
MutableSparseFloatArray fromPartial = new MutableSparseFloatArray(copy);
// do 128 modifications
int mods = 128;
for (int i = 0; i < mods; i++) {
float val = rand.nextFloat();
idx = rand.nextInt(orig.length);
orig[idx] = val;
fromEmpty.set(idx, val);
fromPartial.set(idx, val);
}
for (int i = 0; i < orig.length; i++) {
assertTrue("orig " + orig[i] + " wasn't the same as fromEmpty " + fromEmpty.get(i)
+ " at i=" + i, orig[i] == fromEmpty.get(i));
assertTrue("orig " + orig[i] + " wasn't the same as fromPartial " + fromPartial.get(i)
+ " at i=" + i, orig[i] == fromPartial.get(i));
}
System.out.println(getName() + " success!");
} catch (Throwable t) {
System.err.println("fail: " + t);
t.printStackTrace();
throw t;
}
}
public void testSpeed() throws Throwable {
try {
Random r = new Random(SEED);
float[] orig = new float[16 * 1024 * 1024];
MutableSparseFloatArray arr = new MutableSparseFloatArray(new float[orig.length]);
for (int i = 0; i < 32 * 1024; i++) {
int idx = r.nextInt(orig.length);
if (r.nextBoolean()) {
assertTrue("orig " + orig[idx] + " not the same as arr " + arr.get(idx) + " at idx="
+ idx, orig[idx] == arr.get(idx));
} else {
float val = r.nextFloat();
orig[idx] = val;
arr.set(idx, val);
}
}
// repeat it, but timed
orig = new float[orig.length];
arr = new MutableSparseFloatArray(new float[orig.length]);
int[] idxs = new int[1024 * 1024];
float[] vals = new float[idxs.length];
for (int i = 0; i < idxs.length; i++) {
idxs[i] = r.nextInt(orig.length);
vals[i] = r.nextFloat();
}
long markTime = System.currentTimeMillis();
for (int i = 0; i < idxs.length; i++) {
orig[i] = vals[i];
}
long elapsedTimePrim = System.currentTimeMillis() - markTime;
markTime = System.currentTimeMillis();
for (int i = 0; i < idxs.length; i++) {
arr.set(idxs[i], vals[i]);
}
long elapsedTimeMutable = System.currentTimeMillis() - markTime;
System.out.println("elapsed time on the primitive array: " + elapsedTimePrim
+ "; elapsed time on the mutable condensed arr: " + elapsedTimeMutable);
System.out
.println("ratio of time to do it on the mutable condensed arr, to time on primitive array: "
+ (double) elapsedTimeMutable / elapsedTimePrim);
} catch (Throwable t) {
System.err.println("fail: " + t);
t.printStackTrace();
throw t;
}
}
}