1*2abb3134SXin Li#!/usr/bin/python 2*2abb3134SXin Li"""Print a test spec on stdout. 3*2abb3134SXin Li 4*2abb3134SXin LiEach line has parmaeters for a test case. The regtest.sh shell script reads 5*2abb3134SXin Lithese lines and runs parallel processes. 6*2abb3134SXin Li 7*2abb3134SXin LiWe use Python data structures so the test cases are easier to read and edit. 8*2abb3134SXin Li""" 9*2abb3134SXin Li 10*2abb3134SXin Liimport sys 11*2abb3134SXin Li 12*2abb3134SXin Li# 13*2abb3134SXin Li# TEST CONFIGURATION 14*2abb3134SXin Li# 15*2abb3134SXin Li 16*2abb3134SXin Li# For gen_sim_input.py 17*2abb3134SXin LiINPUT_PARAMS = { 18*2abb3134SXin Li # distribution, num unique values, num clients, values per client 19*2abb3134SXin Li 'exp-100k': ('exp', 100, 100000, 1), 20*2abb3134SXin Li 'exp-1m': ('exp', 100, 1000000, 1), 21*2abb3134SXin Li} 22*2abb3134SXin Li 23*2abb3134SXin Li# For rappor_sim.py 24*2abb3134SXin Li# 'k, h, m, p, q, f' as in params file. 25*2abb3134SXin LiRAPPOR_PARAMS = { 26*2abb3134SXin Li # Initial chrome params from 2014. 27*2abb3134SXin Li # NOTE: fastrand simulation only supports 64 bits! Make sure to use the 28*2abb3134SXin Li # 'fast_counts' code path. 29*2abb3134SXin Li 'chrome128': (128, 2, 128, 0.25, 0.75, 0.50), 30*2abb3134SXin Li 31*2abb3134SXin Li # Chrome params from early 2015 -- changed to 8 bit reports. 32*2abb3134SXin Li 'chrome8': (8, 2, 128, 0.25, 0.75, 0.50), 33*2abb3134SXin Li 34*2abb3134SXin Li # Original demo params 35*2abb3134SXin Li 'demo': (16, 2, 64, 0.5, 0.75, 0.5), 36*2abb3134SXin Li} 37*2abb3134SXin Li 38*2abb3134SXin Li# For deriving candidates from true inputs. 39*2abb3134SXin LiMAP_PARAMS = { 40*2abb3134SXin Li # 1. Number of extra candidates to add. 41*2abb3134SXin Li # 2. Candidate strings to remove from the map. This FORCES false 42*2abb3134SXin Li # negatives, e.g. for common strings, since a string has to be in the map 43*2abb3134SXin Li # for RAPPOR to choose it. 44*2abb3134SXin Li 'add-100': (100, []), 45*2abb3134SXin Li 'add-1000': (1000, []), 46*2abb3134SXin Li 'add-2000': (2000, []), 47*2abb3134SXin Li # also thrashes on 128 bits 48*2abb3134SXin Li 'add-3000': (3000, []), 49*2abb3134SXin Li 'add-10000': (10000, []), 50*2abb3134SXin Li 'add-15000': (15000, []), # approx number of candidates for eTLD+1 51*2abb3134SXin Li 'add-100000': (100000, []), 52*2abb3134SXin Li 'remove-top-2': (20, ['v1', 'v2']), 53*2abb3134SXin Li} 54*2abb3134SXin Li 55*2abb3134SXin Li# test case name -> (input params name, RAPPOR params name, map params name) 56*2abb3134SXin LiTEST_CASES = [ 57*2abb3134SXin Li ('chrome128-100k-100', 'exp-100k', 'chrome128', 'add-100'), 58*2abb3134SXin Li ('chrome128-100k-1000', 'exp-100k', 'chrome128', 'add-1000'), 59*2abb3134SXin Li ('chrome128-100k-2000', 'exp-100k', 'chrome128', 'add-2000'), 60*2abb3134SXin Li ('chrome128-100k-3000', 'exp-100k', 'chrome128', 'add-3000'), 61*2abb3134SXin Li # 128 bits and 15k candidates fails on a machine with 8 GB memory. 62*2abb3134SXin Li # Lasso finishes with 7508 non-zero coefficients, and then allocation 63*2abb3134SXin Li # fails. TODO: just take the highest ones? 64*2abb3134SXin Li #('chrome128-100k-15000', 'exp-100k', 'chrome128', 'add-15000'), 65*2abb3134SXin Li #('chrome128-100k-100000', 'exp-100k', 'chrome128', 'add-100000'), 66*2abb3134SXin Li 67*2abb3134SXin Li # NOTE: Adding more candidates exercises LASSO 68*2abb3134SXin Li ('chrome8-100k-100', 'exp-100k', 'chrome8', 'add-100'), 69*2abb3134SXin Li ('chrome8-100k-1000', 'exp-100k', 'chrome8', 'add-1000'), 70*2abb3134SXin Li ('chrome8-100k-2000', 'exp-100k', 'chrome8', 'add-2000'), 71*2abb3134SXin Li ('chrome8-100k-3000', 'exp-100k', 'chrome8', 'add-3000'), 72*2abb3134SXin Li ('chrome8-100k-15000', 'exp-100k', 'chrome8', 'add-15000'), 73*2abb3134SXin Li 74*2abb3134SXin Li # NOTE: This one takes too much memory! More than 4 GB. This is because 75*2abb3134SXin Li # Lasso gets a huge matrix (100,000). We got 1564 non-zero coefficients. 76*2abb3134SXin Li ('chrome8-100k-100000', 'exp-100k', 'chrome8', 'add-100000'), 77*2abb3134SXin Li 78*2abb3134SXin Li # What happens when the the candidates are missing top values? 79*2abb3134SXin Li ('chrome8-badcand', 'exp-100k', 'chrome8', 'remove-top-2'), 80*2abb3134SXin Li 81*2abb3134SXin Li # TODO: Use chrome params with real map from Alexa 1M ? 82*2abb3134SXin Li] 83*2abb3134SXin Li 84*2abb3134SXin Li# 85*2abb3134SXin Li# END TEST CONFIGURATION 86*2abb3134SXin Li# 87*2abb3134SXin Li 88*2abb3134SXin Li 89*2abb3134SXin Lidef main(argv): 90*2abb3134SXin Li rows = [] 91*2abb3134SXin Li for test_case, input_name, rappor_name, map_name in TEST_CASES: 92*2abb3134SXin Li input_params = INPUT_PARAMS[input_name] 93*2abb3134SXin Li rappor_params = RAPPOR_PARAMS[rappor_name] 94*2abb3134SXin Li map_params = MAP_PARAMS[map_name] 95*2abb3134SXin Li row = tuple([test_case]) + input_params + rappor_params + map_params 96*2abb3134SXin Li rows.append(row) 97*2abb3134SXin Li 98*2abb3134SXin Li for row in rows: 99*2abb3134SXin Li for cell in row: 100*2abb3134SXin Li if isinstance(cell, list): 101*2abb3134SXin Li if cell: 102*2abb3134SXin Li cell_str = '|'.join(cell) 103*2abb3134SXin Li else: 104*2abb3134SXin Li cell_str = 'NONE' # we don't want an empty string 105*2abb3134SXin Li else: 106*2abb3134SXin Li cell_str = cell 107*2abb3134SXin Li print cell_str, # print it with a space after it 108*2abb3134SXin Li print # new line after row 109*2abb3134SXin Li 110*2abb3134SXin Li 111*2abb3134SXin Liif __name__ == '__main__': 112*2abb3134SXin Li try: 113*2abb3134SXin Li main(sys.argv) 114*2abb3134SXin Li except RuntimeError, e: 115*2abb3134SXin Li print >>sys.stderr, 'FATAL: %s' % e 116*2abb3134SXin Li sys.exit(1) 117