/src/main/java/stream/quantiles/SumQuantiles.java

https://bitbucket.org/cbockermann/stream-analysis · Java · 163 lines · 116 code · 30 blank · 17 comment · 11 complexity · c8fbcfddfc490289cfe2a0b7284c9069 MD5 · raw file

  1. package stream.quantiles;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. import java.util.Map;
  5. import java.util.concurrent.ConcurrentHashMap;
  6. import java.util.concurrent.CopyOnWriteArrayList;
  7. import stream.quantiles.impl.AbstractQuantileLearner;
  8. public class SumQuantiles extends AbstractQuantileLearner {
  9. private int slidingWindowSize = 5000;
  10. private int maxBucketCount = 10;
  11. private int elementPerBucket = slidingWindowSize / maxBucketCount;
  12. private int biggestSeenElement = 0;
  13. Bucket newestBucket = null;
  14. final List<Bucket> buckets = new CopyOnWriteArrayList<Bucket>();
  15. public SumQuantiles(int slidingWindowSize, int bucketCount) {
  16. this.slidingWindowSize = slidingWindowSize;
  17. this.maxBucketCount = bucketCount;
  18. elementPerBucket = slidingWindowSize / maxBucketCount;
  19. addNewBucket();
  20. }
  21. /**
  22. * @see stream.service.Service#reset()
  23. */
  24. @Override
  25. public void reset() throws Exception {
  26. buckets.clear();
  27. }
  28. public void init() {
  29. }
  30. private void addNewBucket() {
  31. Bucket newBucket = new Bucket();
  32. buckets.add(newBucket);
  33. newestBucket = newBucket;
  34. deleteExcessiveBuckets();
  35. // System.out.println("new");
  36. }
  37. /**
  38. * delete oldest {@link Bucket} while we have too many of them.
  39. */
  40. private void deleteExcessiveBuckets() {
  41. while (buckets.size() > maxBucketCount) {
  42. buckets.remove(0);
  43. }
  44. }
  45. public Double getQuantile(Double phi) {
  46. int overallElementCount = 0;
  47. for (Bucket bucket : buckets) {
  48. overallElementCount += bucket.getElementCount();
  49. }
  50. int wantedRank = (int) ((double) overallElementCount * phi);
  51. int sum = 0;
  52. // System.out.println("--------------------------------------" );
  53. // System.out.println("ElementCount " + overallElementCount);
  54. // System.out.println("wantedRank " + wantedRank);
  55. for (int i = 0; i < biggestSeenElement; i++) {
  56. long predict = getAllBucketPrediction(i);
  57. sum += predict;
  58. // System.out.println(sum);
  59. if (sum >= wantedRank) {
  60. return (double) i;
  61. }
  62. }
  63. return 0.0;
  64. }
  65. private int getAllBucketPrediction(int item) {
  66. int prediction = 0;
  67. for (Bucket bucket : buckets) {
  68. prediction += bucket.predict(item);
  69. }
  70. return prediction;
  71. }
  72. public void printBuckets() {
  73. for (Bucket bucket : buckets) {
  74. System.out.println(bucket);
  75. }
  76. }
  77. /**
  78. * @see edu.udo.cs.pg542.util.DataStreamProcessor#process(java.lang.Object)
  79. */
  80. @Override
  81. public void learn(Double item) {
  82. biggestSeenElement = Math.max(biggestSeenElement, item.intValue());
  83. newestBucket.learn(item);
  84. if (newestBucket.isFull()) {
  85. addNewBucket();
  86. }
  87. }
  88. private class Bucket implements Serializable {
  89. /**
  90. *
  91. */
  92. private static final long serialVersionUID = -2211156505869843563L;
  93. int elementCount = 0;
  94. Map<String, Integer> counterMap;
  95. public Bucket() {
  96. counterMap = new ConcurrentHashMap<String, Integer>();
  97. }
  98. public long predict(int item) {
  99. String asString = ((Integer) item).toString();
  100. if (counterMap.containsKey(asString)) {
  101. return counterMap.get(asString);
  102. }
  103. return 0;
  104. }
  105. public void learn(Double item) {
  106. int value = item.intValue();
  107. String asString = ((Integer) value).toString();
  108. if (counterMap.containsKey(asString)) {
  109. int counter = counterMap.get(asString);
  110. counter++;
  111. counterMap.put(asString, counter);
  112. } else {
  113. counterMap.put(asString, 1);
  114. }
  115. elementCount++;
  116. }
  117. public int getElementCount() {
  118. return elementCount;
  119. }
  120. public boolean isFull() {
  121. return elementCount >= elementPerBucket;
  122. }
  123. @Override
  124. public String toString() {
  125. System.out.println("--------------------------------------");
  126. String out = "Bucket: \n";
  127. for (String key : counterMap.keySet()) {
  128. out = out + key + " " + counterMap.get(key) + "\n";
  129. }
  130. return out;
  131. }
  132. }
  133. }