xref: /aosp_15_r20/external/rappor/demo.sh (revision 2abb31345f6c95944768b5222a9a5ed3fc68cc00)
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