xref: /aosp_15_r20/external/rappor/apps/rappor-sim/server.R (revision 2abb31345f6c95944768b5222a9a5ed3fc68cc00)
1*2abb3134SXin Lilibrary(shiny)
2*2abb3134SXin Lisource("../../analysis/R/decode.R")
3*2abb3134SXin Lisource("../../analysis/R/simulation.R")
4*2abb3134SXin Lisource("../../analysis/R/encode.R")
5*2abb3134SXin Li
6*2abb3134SXin LiPlot <- function(x, color = "grey") {
7*2abb3134SXin Li  n <- nrow(x)
8*2abb3134SXin Li  if (n < 16) {
9*2abb3134SXin Li    par(mfrow = c(n, 1), mai = c(0, .5, .5, 0))
10*2abb3134SXin Li  } else if (n < 64) {
11*2abb3134SXin Li    par(mfrow = c(n / 2, 2), mai = c(0, .5, .5, 0))
12*2abb3134SXin Li  } else {
13*2abb3134SXin Li    par(mfrow = c(n / 4, 4), mai = c(0, .5, .5, 0))
14*2abb3134SXin Li  }
15*2abb3134SXin Li  for (i in 1:nrow(x)) {
16*2abb3134SXin Li    barplot(x[i, ], main = paste0("Cohort ", i), col = color, border = color)
17*2abb3134SXin Li  }
18*2abb3134SXin Li}
19*2abb3134SXin Li
20*2abb3134SXin LishinyServer(function(input, output) {
21*2abb3134SXin Li  # Example state global variable.
22*2abb3134SXin Li  es <- list()
23*2abb3134SXin Li
24*2abb3134SXin Li  # Example buttons states.
25*2abb3134SXin Li  ebs <- rep(0, 3)
26*2abb3134SXin Li
27*2abb3134SXin Li  Params <- reactive({
28*2abb3134SXin Li    list(k = as.numeric(input$size),
29*2abb3134SXin Li         h = as.numeric(input$hashes),
30*2abb3134SXin Li         m = as.numeric(input$instances),
31*2abb3134SXin Li         p = as.numeric(input$p),
32*2abb3134SXin Li         q = as.numeric(input$q),
33*2abb3134SXin Li         f = as.numeric(input$f))
34*2abb3134SXin Li  })
35*2abb3134SXin Li
36*2abb3134SXin Li  PopParams <- reactive({
37*2abb3134SXin Li    list(as.numeric(input$nstrs),
38*2abb3134SXin Li      as.numeric(input$nonzero),
39*2abb3134SXin Li      input$decay,
40*2abb3134SXin Li      as.numeric(input$expo),
41*2abb3134SXin Li      as.numeric(input$background)
42*2abb3134SXin Li      )
43*2abb3134SXin Li  })
44*2abb3134SXin Li
45*2abb3134SXin Li  DecodingParams <- reactive({
46*2abb3134SXin Li    list(as.numeric(input$alpha),
47*2abb3134SXin Li         input$correction)
48*2abb3134SXin Li  })
49*2abb3134SXin Li
50*2abb3134SXin Li  Sample <- reactive({
51*2abb3134SXin Li    input$sample
52*2abb3134SXin Li    N <- input$N
53*2abb3134SXin Li    params <- Params()
54*2abb3134SXin Li    pop_params <- PopParams()
55*2abb3134SXin Li    decoding_params <- DecodingParams()
56*2abb3134SXin Li    prop_missing <- input$missing
57*2abb3134SXin Li    fit <- GenerateSamples(N, params, pop_params,
58*2abb3134SXin Li                    alpha = decoding_params[[1]],
59*2abb3134SXin Li                    correction = decoding_params[[2]],
60*2abb3134SXin Li                    prop_missing = prop_missing)
61*2abb3134SXin Li    fit
62*2abb3134SXin Li  })
63*2abb3134SXin Li
64*2abb3134SXin Li  # Results summary.
65*2abb3134SXin Li  output$pr <- renderTable({
66*2abb3134SXin Li    Sample()$summary
67*2abb3134SXin Li  },
68*2abb3134SXin Li                           include.rownames = FALSE, include.colnames = FALSE)
69*2abb3134SXin Li
70*2abb3134SXin Li  # Results table.
71*2abb3134SXin Li  output$tab <- renderDataTable({
72*2abb3134SXin Li     Sample()$fit
73*2abb3134SXin Li   },
74*2abb3134SXin Li                                options = list(iDisplayLength = 100))
75*2abb3134SXin Li
76*2abb3134SXin Li  # Epsilon.
77*2abb3134SXin Li  output$epsilon <- renderTable({
78*2abb3134SXin Li    Sample()$privacy
79*2abb3134SXin Li  },
80*2abb3134SXin Li                                include.rownames = FALSE, include.colnames = FALSE, digits = 4)
81*2abb3134SXin Li
82*2abb3134SXin Li  # True distribution.
83*2abb3134SXin Li  output$probs <- renderPlot({
84*2abb3134SXin Li    samp <- Sample()
85*2abb3134SXin Li    probs <- samp$probs
86*2abb3134SXin Li    detected <- match(samp$fit[, 1], samp$strs)
87*2abb3134SXin Li    detection_frequency <- samp$privacy[7, 2]
88*2abb3134SXin Li    PlotPopulation(probs, detected, detection_frequency)
89*2abb3134SXin Li  })
90*2abb3134SXin Li
91*2abb3134SXin Li  # True bits patterns.
92*2abb3134SXin Li  output$truth <- renderPlot({
93*2abb3134SXin Li    truth <- Sample()$truth
94*2abb3134SXin Li    Plot(truth[, -1, drop = FALSE], color = "darkblue")
95*2abb3134SXin Li  })
96*2abb3134SXin Li
97*2abb3134SXin Li  # Lasso plot.
98*2abb3134SXin Li  output$lasso <- renderPlot({
99*2abb3134SXin Li    fit <- Sample()$lasso
100*2abb3134SXin Li    if (!is.null(fit)) {
101*2abb3134SXin Li      plot(fit)
102*2abb3134SXin Li    }
103*2abb3134SXin Li  })
104*2abb3134SXin Li
105*2abb3134SXin Li  output$resid <- renderPlot({
106*2abb3134SXin Li    resid <- Sample()$residual
107*2abb3134SXin Li    params <- Params()
108*2abb3134SXin Li    plot(resid, xlab = "Bloom filter bits", ylab = "Residuals")
109*2abb3134SXin Li    abline(h = c(-1.96, 1.96), lty = 2, col = 2)
110*2abb3134SXin Li    sq <- qnorm(.025 / length(resid))
111*2abb3134SXin Li    abline(h = c(sq, -sq), lty = 2, col = 3, lwd = 2)
112*2abb3134SXin Li    abline(h = c(-3, 3), lty = 2, col = 4, lwd = 2)
113*2abb3134SXin Li    abline(v = params$k * (0:params$m), lty = 2, col = "blue")
114*2abb3134SXin Li    legend("topright", legend = paste0("SD = ", round(sd(resid), 2)), bty = "n")
115*2abb3134SXin Li  })
116*2abb3134SXin Li
117*2abb3134SXin Li  # Estimated bits patterns.
118*2abb3134SXin Li  output$ests <- renderPlot({
119*2abb3134SXin Li    ests <- Sample()$ests
120*2abb3134SXin Li    Plot(ests, color = "darkred")
121*2abb3134SXin Li  })
122*2abb3134SXin Li
123*2abb3134SXin Li  # Estimated vs truth.
124*2abb3134SXin Li  output$ests_truth <- renderPlot({
125*2abb3134SXin Li    plot(unlist(Sample()$ests), unlist(Sample()$truth[, -1]),
126*2abb3134SXin Li         xlab = "Estimates", ylab = "Truth", pch = 19)
127*2abb3134SXin Li    abline(0, 1, lwd = 4, col = "darkred")
128*2abb3134SXin Li  })
129*2abb3134SXin Li
130*2abb3134SXin Li  output$example <- renderPlot({
131*2abb3134SXin Li    params <- Params()
132*2abb3134SXin Li    strs <- Sample()$strs
133*2abb3134SXin Li    map <- Sample()$map
134*2abb3134SXin Li    samp <- Sample()
135*2abb3134SXin Li
136*2abb3134SXin Li    # First run on app start.
137*2abb3134SXin Li    value <- sample(strs, 1)
138*2abb3134SXin Li    res <- Encode(value, map, strs, params, N = input$N)
139*2abb3134SXin Li
140*2abb3134SXin Li    if (input$new_user > ebs[1]) {
141*2abb3134SXin Li      res <- Encode(es$value, map, strs, params, N = input$N)
142*2abb3134SXin Li      ebs[1] <<- input$new_user
143*2abb3134SXin Li    } else if (input$new_value > ebs[2]) {
144*2abb3134SXin Li      res <- Encode(value, map, strs, params, cohort = es$cohort, id = es$id,
145*2abb3134SXin Li                    N = input$N)
146*2abb3134SXin Li      ebs[2] <<- input$new_value
147*2abb3134SXin Li    } else if (input$new_report > ebs[3]) {
148*2abb3134SXin Li      res <- Encode(es$value, map, strs, params, B = es$B,
149*2abb3134SXin Li                    BP = es$BP, cohort = es$cohort, id = es$id, N = input$N)
150*2abb3134SXin Li      ebs[3] <<- input$new_report
151*2abb3134SXin Li    }
152*2abb3134SXin Li    es <<- res
153*2abb3134SXin Li    ExamplePlot(res, params$k, c(ebs, input$new_user, input$new_value, input$new_report))
154*2abb3134SXin Li  })
155*2abb3134SXin Li
156*2abb3134SXin Li})
157