View Javadoc
1   package org.wikimedia.search.extra.superdetectnoop;
2   
3   import static org.apache.lucene.util.TestUtil.randomSimpleString;
4   
5   import java.util.ArrayList;
6   import java.util.Comparator;
7   import java.util.List;
8   import java.util.Locale;
9   
10  import org.apache.logging.log4j.Logger;
11  import org.apache.lucene.util.CollectionUtil;
12  import org.elasticsearch.common.logging.Loggers;
13  import org.junit.Test;
14  import org.junit.runner.RunWith;
15  
16  import com.carrotsearch.randomizedtesting.RandomizedRunner;
17  import com.carrotsearch.randomizedtesting.RandomizedTest;
18  import com.google.common.collect.ArrayListMultimap;
19  import com.google.common.collect.ImmutableList;
20  import com.google.common.collect.ListMultimap;
21  
22  /**
23   * Runs Monte Carlo method to help you pick the best parameters for
24   * maxKeepAsList, minConvert, and maxConvert.
25   */
26  @RunWith(RandomizedRunner.class)
27  public class SetHandlerMonteCarlo extends RandomizedTest {
28      private static final Logger LOG = Loggers.getLogger(SetHandlerMonteCarlo.class, "monte carlo");
29      private static final int MAX_LIST = 10000;
30      private static final Comparator<List<Integer>> COMPARATOR = Comparator.comparingInt(l -> l.get(0));
31  
32      @Test
33      public void throwDarts() {
34          time(0, 100, 5);
35  
36          List<List<Integer>> times = new ArrayList<>();
37          for (int i = 0; i < 20; i++) {
38              // int maxConvert = randomIntBetween(0, MAX_LIST);
39              // int minConvert = randomIntBetween(0, maxConvert);
40              // int maxKeepAsList = randomIntBetween(0, 200);
41              int maxConvert = MAX_LIST;
42              int minConvert = randomIntBetween(0, 400);
43              int maxKeepAsList = randomIntBetween(20, 20);
44              int time = (int) printTime(minConvert, maxConvert, maxKeepAsList);
45              times.add(ImmutableList.of(time, minConvert, maxConvert, maxKeepAsList));
46          }
47          CollectionUtil.timSort(times, COMPARATOR);
48          for (Object t : times) {
49              LOG.info("{}", t);
50          }
51      }
52  
53      private long printTime(int minConvert, int maxConvert, int maxKeepAsList) {
54          long time = time(minConvert, maxConvert, maxKeepAsList);
55          LOG.info(String.format(Locale.ROOT, "%5d  %6d  %6d  %5d", time, minConvert, maxConvert, maxKeepAsList));
56          return time;
57      }
58  
59      private long time(int minConvert, int maxConvert, int maxKeepAsList) {
60          SetHandler d = new SetHandler(minConvert, maxConvert, maxKeepAsList);
61          List<String> strings = new ArrayList<>();
62          for (int i = 0; i < MAX_LIST; i++) {
63              strings.add(randomSimpleString(getRandom()));
64          }
65          long total = 0;
66          for (int i = 0; i < 5000; i++) {
67              int changes = randomIntBetween(1, 200);
68              total += testCase(d, strings, randomIntBetween(1, strings.size() - 1), changes);
69          }
70          return total;
71      }
72  
73      private long testCase(SetHandler d, List<String> strings, int listSize, int changesSize) {
74          List<String> list = new ArrayList<>();
75          for (int i = 0; i < listSize; i++) {
76              list.add(strings.get(i));
77          }
78          ListMultimap<String, Object> commands = ArrayListMultimap.create();
79          for (int i = 0; i < changesSize; i++) {
80              commands.put(randomBoolean() ? "add" : "remove", strings.get(randomIntBetween(0, strings.size() - 1)));
81          }
82          long start = System.currentTimeMillis();
83          d.handle(list, commands.asMap()).isCloseEnough();
84          return System.currentTimeMillis() - start;
85      }
86  }