package com.kennycason.kumo;
import com.kennycason.kumo.nlp.FrequencyAnalyzer;
import com.kennycason.kumo.placement.LinearWordPlacer;
import com.kennycason.kumo.placement.RTreeWordPlacer;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import java.awt.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* Created by kenny on 6/29/14.
*
* Diminishing returns on placement is primarily caused by WordCloud's method of determining to
* re-place words in new locations. These results demonstrate the R-Tree is faster than linear brute-force.
*
100 frequencies (average)
===============
linear 1090ms to build
rtree 120ms to build
500 frequencies (average)
===============
linear 1315ms to build
rtree 372ms to build
800 frequencies (average)
==============
linear 2169ms to build
rtree 1626ms to build
1000 frequencies (average)
==============
linear 19596ms to build
rtree 16798ms to build
*/
@Category(IntegrationTest.class)
public class WordPlacerPerfTest {
private static final Logger LOGGER = Logger.getLogger(WordPlacerPerfTest.class);
private static final int FREQUENCIES_TO_PLACE = 500;
@Test
public void linearPlacement() throws IOException {
final FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();
frequencyAnalyzer.setWordFrequenciesToReturn(FREQUENCIES_TO_PLACE);
final List<WordFrequency> wordFrequencies = frequencyAnalyzer.load(getInputStream("text/datarank.txt"));
final WordCloud wordCloud = new WordCloud(new Dimension(1000, 1000), CollisionMode.RECTANGLE);
wordCloud.setWordPlacer(new LinearWordPlacer());
final long startTime = System.currentTimeMillis();
wordCloud.build(wordFrequencies);
LOGGER.info("linear " + (System.currentTimeMillis() - startTime) + "ms to build");
}
@Test
public void rTreePlacement() throws IOException {
final FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();
frequencyAnalyzer.setWordFrequenciesToReturn(FREQUENCIES_TO_PLACE);
final List<WordFrequency> wordFrequencies = frequencyAnalyzer.load(getInputStream("text/datarank.txt"));
final WordCloud wordCloud = new WordCloud(new Dimension(1000, 1000), CollisionMode.RECTANGLE);
wordCloud.setWordPlacer(new RTreeWordPlacer());
final long startTime = System.currentTimeMillis();
wordCloud.build(wordFrequencies);
LOGGER.info("rtree " + (System.currentTimeMillis() - startTime) + "ms to build");
}
private static InputStream getInputStream(final String path) {
return Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
}
}