package org.streaminer.stream.frequency;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.mahout.math.Arrays;
import org.junit.Test;
import static org.junit.Assert.*;
import org.streaminer.stream.frequency.util.CountEntry;
import org.streaminer.util.hash.HashUtils;
/**
*
* @author Maycon Viana Bordin <mayconbordin@gmail.com>
*/
public class CCFCSketchTest {
public CCFCSketchTest() {
}
/**
* Test of add method, of class CCFCSketch.
*/
@Test
public void testFrequency() {
int n=1048575, lgn=10, range=123456;
int width = 512, depth = 5, gran = 1;
double phi = 0.01;
StreamGenerator gen = new StreamGenerator(1.1, n, range);
gen.generate();
lgn = 20;
double thresh = Math.floor(phi*(double)range);
if (thresh == 0) thresh = 1.0;
int hh = gen.exact((int) thresh);
long[] stream = gen.stream;
CCFCSketch sketch = new CCFCSketch(width, depth, lgn, gran);
for (int i=1; i<=range; i++)
//if (stream[i]>0)
sketch.add((int)stream[i], 1);
// else
// sketch.add((int)-stream[i], -1);
// actual frequency
RealCounting<Integer> actualFreq = new RealCounting<Integer>();
for (int i=1; i<=range; i++)
actualFreq.add((int)stream[i], 1);
List<CountEntry<Integer>> topk = actualFreq.peek(10);
System.out.println("Frequency Table\n" + StringUtils.repeat("-", 80));
System.out.println("Item\tactual\testimated");
for (CountEntry<Integer> item : topk) {
System.out.println(item.getItem() + "\t"
+ item.getFrequency() + "\t"
+ sketch.estimateCount(item.getItem(), 0));
}
/*
int[] outlist = sketch.output((int) thresh);
System.out.println("Output: " + Arrays.toString(outlist));
int val = 96699;
System.out.println("Estimative for " + val + ": " + sketch.estimateCount(96699, depth));
gen.checkOutput(outlist, (int) thresh, hh);*/
}
@Test
public void testF2Estimative() {
int n = 1048575;
int range = 12345;
CCFCSketch sketch = new CCFCSketch(512,5,1,1);
StreamGenerator gen = new StreamGenerator(0.8, n, range);
gen.generate();
gen.exact();
long[] stream = gen.stream;
long sumsq = gen.sumsq;
for (int i=1; i<=range; i++)
sketch.add((int)stream[i], 1);
System.out.println("Exact F2: " + sumsq);
System.out.println("Estimated F2: " + sketch.estimateF2());
}
}