1*2abb3134SXin Li#!/bin/bash 2*2abb3134SXin Li# 3*2abb3134SXin Li# Demo of RAPPOR. Automating Python and R scripts. See README. 4*2abb3134SXin Li# 5*2abb3134SXin Li# Usage: 6*2abb3134SXin Li# ./demo.sh [function name] 7*2abb3134SXin Li# 8*2abb3134SXin Li# End to end demo of rappor. Notable functions include: 9*2abb3134SXin Li# quick-python: Runs a demo using the python client 10*2abb3134SXin Li# quick-cpp: Runs a demo using the c++ client 11*2abb3134SXin Li# If no function is specified the above two will be run consecutivly. 12*2abb3134SXin Li# 13*2abb3134SXin Li# This takes a minute or so. It runs a subset of tests from regtest.sh and 14*2abb3134SXin Li# writes an HTML summary. 15*2abb3134SXin Li 16*2abb3134SXin Liset -o nounset 17*2abb3134SXin Liset -o pipefail 18*2abb3134SXin Liset -o errexit 19*2abb3134SXin Li 20*2abb3134SXin Li. util.sh 21*2abb3134SXin Li 22*2abb3134SXin Lireadonly THIS_DIR=$(dirname $0) 23*2abb3134SXin Lireadonly REPO_ROOT=$THIS_DIR 24*2abb3134SXin Lireadonly CLIENT_DIR=$REPO_ROOT/client/python 25*2abb3134SXin Li 26*2abb3134SXin Li# All the Python tools need this 27*2abb3134SXin Liexport PYTHONPATH=$CLIENT_DIR 28*2abb3134SXin Li 29*2abb3134SXin Li# 30*2abb3134SXin Li# Semi-automated demos 31*2abb3134SXin Li# 32*2abb3134SXin Li 33*2abb3134SXin Li# Run rappor-sim through the Python profiler. 34*2abb3134SXin Lirappor-sim-profile() { 35*2abb3134SXin Li local dist=$1 36*2abb3134SXin Li shift 37*2abb3134SXin Li 38*2abb3134SXin Li # For now, just dump it to a text file. Sort by cumulative time. 39*2abb3134SXin Li time python -m cProfile -s cumulative \ 40*2abb3134SXin Li tests/rappor_sim.py \ 41*2abb3134SXin Li -i _tmp/$dist.csv \ 42*2abb3134SXin Li "$@" \ 43*2abb3134SXin Li | tee _tmp/profile.txt 44*2abb3134SXin Li} 45*2abb3134SXin Li 46*2abb3134SXin Liquick-python() { 47*2abb3134SXin Li ./regtest.sh run-seq '^demo3' python 48*2abb3134SXin Li} 49*2abb3134SXin Li 50*2abb3134SXin Liquick-cpp() { 51*2abb3134SXin Li # For now we build it first. Don't want to build it in parallel. 52*2abb3134SXin Li ./build.sh cpp-client 53*2abb3134SXin Li 54*2abb3134SXin Li ./regtest.sh run-seq '^demo3' cpp 55*2abb3134SXin Li} 56*2abb3134SXin Li 57*2abb3134SXin Liquick() { 58*2abb3134SXin Li quick-python 59*2abb3134SXin Li quick-cpp 60*2abb3134SXin Li} 61*2abb3134SXin Li 62*2abb3134SXin Li# TODO: Port these old bad cases to regtest_spec.py. 63*2abb3134SXin Li 64*2abb3134SXin Li# Running the demo of the exponential distribution with 10000 reports (x7, 65*2abb3134SXin Li# which is 70000 values). 66*2abb3134SXin Li# 67*2abb3134SXin Li# - There are 50 real values, but we add 1000 more candidates, to get 1050 candidates. 68*2abb3134SXin Li# - And then we remove the two most common strings, v1 and v2. 69*2abb3134SXin Li# - With the current analysis, we are getting sum(proportion) = 1.1 to 1.7 70*2abb3134SXin Li 71*2abb3134SXin Li# TODO: Make this sharper by including only one real value? 72*2abb3134SXin Li 73*2abb3134SXin Libad-case() { 74*2abb3134SXin Li local num_additional=${1:-1000} 75*2abb3134SXin Li run-dist exp 10000 $num_additional 'v1|v2' 76*2abb3134SXin Li} 77*2abb3134SXin Li 78*2abb3134SXin Li# Force it to be less than 1 79*2abb3134SXin Lipcls-test() { 80*2abb3134SXin Li USE_PCLS=1 bad-case 81*2abb3134SXin Li} 82*2abb3134SXin Li 83*2abb3134SXin Li# Only add 10 more candidates. Then we properly get the 0.48 proportion. 84*2abb3134SXin Liok-case() { 85*2abb3134SXin Li run-dist exp 10000 10 'v1|v2' 86*2abb3134SXin Li} 87*2abb3134SXin Li 88*2abb3134SXin Liif test $# -eq 0 ; then 89*2abb3134SXin Li quick 90*2abb3134SXin Lielse 91*2abb3134SXin Li "$@" 92*2abb3134SXin Lifi 93